[Java] Word Search Puzzle

I was bored so I wrote this in about an hour. It will generate a word search puzzle (horizontal, vertical, diagonal & forwards, backwards) from a text file of strings.

WordSearch.java


import java.util.Random;

public class WordSearch {
	char[][] data;	// Puzzle without random filler characters
	char[][] dataF; // Puzzle with    random filler characters
	
	String[] words;
	
	public WordSearch(String[] wordList, int size) {
		data = new char[size][size];
		
		for(int i=0; i<data.length; i++)
			for(int j=0; j<data.length; j++)
				data*[j] = ' ';
		
		for(String word : wordList) {
			add(word, data);
		}
		
		dataF = fill(data);
	}
	
	public String toString() {
		StringBuilder ret = new StringBuilder();
		
		ret.append("Puzzle:
");
		for(int i=0; i<data.length; i++) {
			for(int j=0; j<data.length; j++) {
				ret.append(dataF*[j]);
			}
			ret.append("
");
		}
		
		ret.append("
");
		
		ret.append("Solution:
");
		for(int i=0; i<data.length; i++) {
			for(int j=0; j<data.length; j++) {
				ret.append(data*[j]);
			}
			ret.append("
");
		}
		
		return ret.toString();
	}
	
	public String getPuzzle() {
		StringBuilder ret = new StringBuilder();
		
		for(int i=0; i<dataF.length; i++) {
			for(int j=0; j<dataF.length; j++) {
				ret.append(dataF*[j]);
			}
			ret.append("
");
		}
		
		return ret.toString();
	}
	
	public String getSolution() {
		StringBuilder ret = new StringBuilder();
		
		for(int i=0; i<data.length; i++) {
			for(int j=0; j<data.length; j++) {
				ret.append(data*[j]);
			}
			ret.append("
");
		}
		
		return ret.toString();
	}
	
	private boolean add(String word, char[][] puzzle) {
		word = word.toUpperCase();
		
		char[][] origPuzzle = new char[puzzle.length][puzzle.length];
		for(int i=0; i<puzzle.length; i++)
			for(int j=0; j<puzzle.length; j++)
				origPuzzle*[j] = puzzle*[j];
		
		for(int tries=0; tries<100; tries++) {
			Random r = new Random();
			
			int orientation = r.nextInt(2); // 0 = Forwards,   1 = Backwards
			if(orientation == 1) word = flip(word);
			
			int direction   = r.nextInt(3); // 0 = Horizontal, 1 = Vertical,  2 = Diagonal
			
			int row			= r.nextInt(puzzle.length - word.length());
			int col			= r.nextInt(puzzle.length - word.length());
			
			int i=0;
			for(i=0; i<word.length(); i++) {
				if(puzzle[row][col] == ' ' || puzzle[row][col] == word.charAt(i)) {
					puzzle[row][col] = word.charAt(i);
					
					if(direction == 0) col++;
					if(direction == 1) row++;
					if(direction == 2) { col++; row++; }
				} else {
					for(int j=i; j>0; j--) {
						if(direction == 0) col--;
						if(direction == 1) row--;
						if(direction == 2) { col--; row--; }
						
						puzzle[row][col] = origPuzzle[row][col]; 
					}
					break;
				}
			}
			if(--i > 0) return true;
		}
		return false;
	}
	
	private String flip(String in) {
		StringBuilder ret = new StringBuilder();
		for(int i=in.length()-1; i>=0; i--)
			ret.append(in.charAt(i));
		return ret.toString();
	}
	
	private char[][] fill(char[][] puzzle) {
		char[][] ret = new char[puzzle.length][puzzle.length];
		RandChar r = new RandChar();
		
		for(int i=0; i<ret.length; i++) {
			for(int j=0; j<ret.length; j++) {
				if(puzzle*[j] != ' ') {
					ret*[j] = puzzle*[j];
				} else {
					ret*[j] = r.nextChar();
				}
			}
		}
		
		return ret;
	}
}

RandChar.java


import java.util.Random;
public class RandChar {
	private Random r = new Random();
	
	private final char[] alphabet = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
									  'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 
									  'U', 'V', 'W', 'X', 'Y', 'Z' };
	
	public char nextChar() {
		int c = r.nextInt(26);
		
		return alphabet[c];
	}
}

SampleClient.java


import java.util.Scanner;
import java.io.*;

public class SampleClient {
	public static void main(String[] args) {
		Scanner stdin = null;
		try {
			stdin = new Scanner(new File("wordlist.txt"));
		} catch(FileNotFoundException e) {
			System.out.println("Couldn't open file \"wordlist.txt\"");
		}
		
		StringBuilder wordList = new StringBuilder();
		while(stdin.hasNext()) {
			wordList.append(stdin.next() + " ");
		}
		wordList.deleteCharAt(wordList.length()-1);
		
		String[] list = wordList.toString().split(" ");
		
		WordSearch w = new WordSearch(list, 50);
		
		System.out.println(w);
	}
}

wordlist.txt


One
Two
Three
Four
Five
Six
Seven
Eight
Nine
Ten
Eleven
Twelve
Thirteen
Fourteen
Fifteen
Sixteen
Seventeen
Eighteen
Nineteen
Twenty

Sample Output
(from running “java SampleClient”)

Puzzle:
TIRQHHVZZRDAPOBVPSUJIODEZMYPYNGQIODWBXKCTOTRGZZEMP
MLWLOPBIEWVOGGODRFVRZNATTNOYMMQGAWLYYEPZTZLKDZNNOV
YQBSITHGIEQLQOILXJZRMZOAZPUKBBHEZEWRIOXKQITJQYJWYA
WRMHAKAEDTERKFXPNQSHSUOOTCCQDNNSTUNICGHKPSAEBVZCEK
GLHKDMIXJVBGKGDURNOKKDTUVYKKFJIPUCCIKQLUTGXUBVDDWE
IMLOXJTMXFBTOPIHAXCMLDSVOYKJVKPNITIFNHLSBUSKOQYEVE
FIMTDKSLPLOGDPSQNRYKNZWESINHKUAUAJNLQRBESGDIJAZXCZ
XPASOKPBHLESOVQNWHWCJQVKQPAVQWORDJLDEQTZLWVRVCECQE
VSRWFOURTEENPCSZYKJXKDSYMZYFBNNUMKPTPYUYESFMJPQWAX
OFTMDZFHVAGAXAVIMCDFFTYTMBZJXGSTHTWBFKOFMCPMYSDBHW
ZTTDOSGXMRHCWWJZTGRVYZBYAUWGADVBMNPGXISWWQOGYCOJQI
WKCLDAPLTYUACEWYDPFKENVEBQUCRILMZMOTYTZASQZHDKJCUD
YLNPTATVKWKQCKXDOLOTTINLECNSFQAYWXKVGQPUTOCTQRHPLD
KVIDVLMOLCWQOCPIIUMEFEKVLBRJBOOANJVAGENXLDJSZHQEZO
WVMXYCURWDEWZMYQWNDJEWSAEGKXUJSNVDQNYPLGASVJPJTTTK
QYHETHVZXHXLXOFLOYEERHTRVUZUGTTVXSDXGFPLFNJKYEGITB
EOEALPUNSRSAVAMRFKADVNLUEKWPHINLQIRFADMPHBLRABBDYD
WJCFVKAJXQAJGGFTVMHEHEIQNOQVNYCKBETIDJFWGAFHETDFLW
UHJLWHNZRBYPBFUZLDYZRHDZRWUHIOTNXGHTJWUPOWMOLUAJPN
UQEVRGNDRVLCDCZVMUJKXEJESRJWCWPHLSFJRSNZHSIQFCXJCA
ADLEPOVWXCMSZNDJCDLZXSEXBILSTACOZEIKEPWXJROWVWZEKO
ENIUTYQLIPJCGDICMKLBFYYCLAYAGETKJVVROTFUOXWKKRZPQB
WESALMTALHTRUPJDTEIMXBGBYBQVCPHSDEEZJWSJPVQFQBDYYB
EEOUDWUQBQCCRXTSPOEFWAOFPATICKATVNHVGMJVLDJRXAVHXG
RTWDJHUOTLSIKAOEGFTWREHWVOYEVNHNOUENUJYBJPSDMDMLCN
KRDXWECKGIXTRQDSQMYREUTUTQSIBOIQEZDTMKSGCWJJVRQVSY
MIGDSUXFWBDUVPRHYLUQIVMLFYFRVOENPUZTIWBLODVAFNKEFF
AHIOOZHGDARPHSMSLQWAGWUKSACUZQZZERYGRPYXHLXSWYXWUP
RTOCFOMDMMLTRQHYUPIJHDZPGFYZLYGPHTTFSEVENTEENLJOUE
JAQULXRCFGYACYOKILEATGLRQJORZEFNPCEIFIEOJGWJFIFBJU
ABWTYDWZDLNHITFALZHMEICJTIQMCMPELZYEOJHTSOSOLDKCIH
KZELECUWWFKZWWVEFOUREFHDBQLODRKXNQYZNCECIUTXEHUZIF
TUWDRQQXZSGGBEPOUCRDNBHIISRGOQPDLOFPPDJPXKNHSSSBWK
QJUTINZTCTEXCNHEUUTLUWAFXNVHWYQNWTJKPXTZTVJSWTFJYX
ESXMYTZXQNQLNTTTLWURFPRZJONBUJZNMOCAXEXJEXRTHUAZBP
HEWRYQKJHTWFBYLVXAWRLZUCHBNECQAQEUWVTMVUEUAEZGOLVJ
KJJCWQPEKOMYBUQASGHPTBLDAIXGZHSSCELCGQFCNFAQPKALHQ
IFLROSXWZSGPBTCZBGMRVTHCIJLDLBIRFDTNXBYWQQOFXENAAZ
IWFOWBGUXPVMBXVVMKIUCTZTQKECNSJLNVKFGKZCPOEGDEZWSW
GBNMJKZMEETSFTWTCNOHKFAPEXVRIMJVADKOIAMTASKAHGQKGL
TIXKEOHXLBLFQQGXNCWRYWLNYPLKADPCILWKQFHXCKXSFTWESE
YPZRVDVSZYSSVHEQRQOYUUTAAQEZFBQTCRVTLXVJWHWQSKNJUD
WAZETCDRIUDDQYOKPMFYIVCQJUWVPTYWXKIRJJBEOAXJUAZUSI
GYSWSAWRLXIFICREJUESOBJBYCTSTAXMMMIUVMDTJMZQBUAGTX
XIELYZYXIEDZUULIAAMZMRTEVCUDQRQOYEXPDQUZHCUCOFBUJH
KJYUWVRLIRFPJJTWWHHEUQYZKJBNAUEUOFOSNJQPVGBCJDAZVN
NYMKHEVUWTSONMYOLSSOYHYLHCZJBTLEVSOYMCAYDALDYSMYZJ
BNKEQXFQNLEUBLTEJPZXCHYSRLHYVCKGLHTJBTJUNNHCXEIXNW
VUYPYWZIEVXDRTCMJZQZENNWQPGCQODHEGXQCNJRVYZUSTPYYQ
EAVVSGHIROLJFPRAFPBJTAWYYTLUTTYNJPZBVLSJUNYBFHEPED

Solution:
                                                  
                                                  
     THGIE                       E                
                                  N               
                                   I              
                                    N             
                                                  
                                                  
    FOURTEEN                                      
                                                  
                                                  
                                                  
                        E                         
                        L                         
                        E                         
                  EERHT V                         
                        E                         
                        N                         
                                                  
                                 SF               
                                 EI               
 N                               VV               
 E                               EE               
 E                    O          N                
 T                     W     N    E               
 R                  E   T     I    T              
 I                  I          N                  
 H                  G           E                 
 T                  H            T  SEVENTEEN     
                    T             E               
             T      E          E   E    S         
             W  FOURE           N   N   I         
             E      N            O      X         
             N                          T         
             T                 N        E         
             Y                  E       E         
                                 E      N         
                                  T               
                          E        F              
                          V         I             
                          L          F            
       S                  E                       
        I                 W                       
         X                T                       
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  



I might add a method that will tell you the words that were omitted and one that tells you the words that are in the puzzle, but I don’t know if I will.

Edit: I added a zip file.