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.