Mel, não sei se servirá para vc, mas quando eu precisei de uma palavra cruzada, eu me baseei nesse exemplo(créditos ao autor que eu não lembro quem é):
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.applet.Applet;
import java.awt.image.BufferStrategy;
import java.util.Random;
public class CrossWord extends Applet implements MouseListener, MouseMotionListener, Runnable {
// Game Setup Variables
static final Random rnd = new Random();
static final Canvas canvas = new Canvas();
BufferStrategy bufferStrategy;
int width, height;
// Game Variables
Image box, box2;
int state, level;
int gapy;
int[] posx, posy;
int startx=-1, starty=-1, endx=-1, endy=-1; // head & tail position
char[][] huruf;
String[] soal;
Point[][] posSoal;
boolean[] answered;
int totalAnswer;
String[] kumpulanSoal = { "MONKEY","HORSE","COW","BUFFALO","WORM","MOUSE","CAT","DOG",
"ANT","FLY","MOSQUITO","CROCODILE","SHEEP","GOAT","DRAGONFLY","LIZARD",
"TIGER","PANTHER","LION","ANTELOPE","ELEPHANT","FISH","PANDA","GORILLA","BEAR","SNAKE",
"DEER","RABBIT","PORCUPINE","BULL","FROG","ZEBRA","BAT" };
static final String STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // all alphabet string
static final String CATEGORY = "CATEGORY: ANIMALS";
static final String SOLVED = "SOLVED.. EXCELLENT!!!";
//static final BasicStroke stroke = new BasicStroke(2.7f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
static final Font font1 = new Font("Verdana",Font.BOLD,20);
static final Font font2 = new Font("Verdana",Font.BOLD,12);
public void start() {
if (bufferStrategy != null) return;
setIgnoreRepaint(true);
width = getSize().width;
height = getSize().height;
canvas.setIgnoreRepaint(true);
canvas.setSize(width,height);
setLayout(null);
add(canvas);
// using buffer strategy as backbuffer
canvas.createBufferStrategy(2);
bufferStrategy = canvas.getBufferStrategy();
createQuestion();
Graphics g = (box = canvas.createImage(40,40)).getGraphics();
g.setColor(Color.GREEN); g.fillRect(0,0,40,40);
g.setColor(Color.BLACK); g.drawRect(0,0,40,40);
g = (box2 = canvas.createImage(40,40)).getGraphics();
g.setColor(Color.GREEN.darker()); g.fillRect(0,0,40,40);
g.setColor(Color.BLACK); g.drawRect(0,0,40,40);
canvas.addMouseListener(this);
canvas.addMouseMotionListener(this);
new Thread(this).start();
canvas.requestFocus();
}
public void stop() { bufferStrategy = null; }
public void run() {
while (bufferStrategy != null) {
try { Thread.sleep(25);
} catch (InterruptedException e) { }
Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics();
g.setColor(Color.ORANGE);
g.fillRect(0,0,width,height);
for (int j=0;j < posy.length;j++)
for (int i=0;i < posx.length;i++) // draw box
g.drawImage(box,posx[i],posy[j],null);
g.setFont(font1);
g.setColor(Color.black);
if (state == 0) {
if (startx >= 0) g.drawImage(box2,posx[startx],posy[starty],null);
} else if (state == 1) {
g.drawImage(box2,posx[startx],posy[starty],null);
if (endx >= 0) {
if (endx == startx) { // vertical
int y1 = (starty < endy) ? starty : endy;
int y2 = (starty < endy) ? endy : starty;
for (int j=y1;j <= y2;j++)
g.drawImage(box2,posx[startx],posy[j],null);
} else if (endy == starty) { // horizontal
int x1 = (startx < endx) ? startx : endx;
int x2 = (startx < endx) ? endx : startx;
for (int i=x1;i <= x2;i++)
g.drawImage(box2,posx[i],posy[starty],null);
} else { // diagonal
int x1, y1, x2, y2;
if (startx < endx) {
x1 = startx; y1 = starty;
x2 = endx; y2 = endy;
} else {
x1 = endx; y1 = endy;
x2 = startx; y2 = starty;
}
for (int i=0;i <= x2-x1;i++) {
if (y1 < y2)
g.drawImage(box2,posx[x1+i],posy[y1+i],null); // diagonal down
else g.drawImage(box2,posx[x1+i],posy[y1-i],null); // diagonal up
}
}
}
//for (int i=0;i < soal.length;i++)
// g.drawString(soal[i],400,40+(i*45));
} else g.drawString(SOLVED,110,390+gapy);
// draw char
for (int j=0;j < posy.length;j++)
for (int i=0;i < posx.length;i++)
g.drawString(String.valueOf(huruf[i][j]),posx[i]+15,posy[j]+28);
// draw answered question
g.setColor(Color.RED);
//g.setStroke(stroke);
for (int i=0;i < soal.length;i++) {
int x1 = posSoal[i][0].x, y1 = posSoal[i][0].y,
x2 = posSoal[i][1].x, y2 = posSoal[i][1].y;
if (answered[i]) {
if (x1 == x2 || y1 == y2) {
// horizontal or vertical
g.drawRect(posx[x1]+5, posy[y1]+5,
((x2-x1)*40)+30, ((y2-y1)*40)+30);
} else { // diagonal
if (y1 < y2) { // diagonal down
g.drawLine(posx[x1]+20,posy[y1],posx[x2]+40,posy[y2]+20);
g.drawLine(posx[x1],posy[y1]+20,posx[x2]+20,posy[y2]+40);
g.drawLine(posx[x1]+20,posy[y1],posx[x1],posy[y1]+20);
g.drawLine(posx[x2]+40,posy[y2]+20,posx[x2]+20,posy[y2]+40);
} else { // diagonal up
g.drawLine(posx[x1],posy[y1]+20,posx[x2]+20,posy[y2]);
g.drawLine(posx[x1]+20,posy[y1]+40,posx[x2]+40,posy[y2]+20);
g.drawLine(posx[x1],posy[y1]+20,posx[x1]+20,posy[y1]+40);
g.drawLine(posx[x2]+20,posy[y2],posx[x2]+40,posy[y2]+20);
}
}
}
}
// level
g.drawString(CATEGORY,30,30);
g.drawString("Lv. "+level,30,390+gapy);
// questions remaining
g.setColor(Color.black);
g.setFont(font2);
g.drawString("Remaining : "+(soal.length-totalAnswer),300+gapy,35);
g.dispose();
bufferStrategy.show();
}
}
public void mouseClicked(MouseEvent e) {
if (checkPosMouse(e,29,372+gapy,84,392+gapy)) createQuestion();
}
public void mousePressed(MouseEvent e) {
if (state == 0 && e.getButton() == MouseEvent.BUTTON1 && startx != -1) {
state = 1;
} else if (state == 1) {
if (e.getButton() == MouseEvent.BUTTON1) {
state = 0;
if (endx != -1) { // valid
if ((startx == endx && starty > endy) ||
(starty == endy && startx > endx) ||
(startx != endx && starty != endy && startx > endx)) {
// reverse head to tail
int tempx, tempy;
tempx = startx; tempy = starty;
startx = endx; starty = endy;
endx = tempx; endy = tempy;
}
// check is true
for (int i=0;i < soal.length;i++)
if (!answered[i]) {
if (startx == posSoal[i][0].x && starty == posSoal[i][0].y &&
endx == posSoal[i][1].x && endy == posSoal[i][1].y) {
answered[i] = true;
if (++totalAnswer >= answered.length) state = 3;
break;
}
}
}
startx = -1;
endx = -1;
}
if (e.getButton() == MouseEvent.BUTTON3) { startx = -1; endx = -1; state = 0; }
}
}
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mouseDragged(MouseEvent e) { }
public void mouseMoved(MouseEvent e) {
if (state == 0 || state == 1) {
if (checkPosMouse(e, 30, 40, posx[posx.length-1]+40, posy[posy.length-1]+40)) {
out:
for (int j=0;j < posy.length;j++)
for (int i=0;i < posx.length;i++)
if (checkPosMouse(e, posx[i], posy[j], posx[i]+40, posy[j]+40)) {
// head or tail find
if (state == 0) { startx = i; starty = j; } else { endx = i; endy = j; }
break out;
}
if (state == 1) {
// tail validation
if (startx == endx && starty == endy) endx = -1;
if (endx != startx && endy != starty) // check diagonal validity
if (Math.abs(endx-startx) != Math.abs(endy-starty))
endx = -1; // not valid
}
} else { if (state == 0) startx = -1; else endx = -1; }
}
}
boolean checkPosMouse(MouseEvent e, int x1, int y1, int x2, int y2) {
return (e.getX() >= x1 && e.getX() <= x2 &&
e.getY() >= y1 && e.getY() <= y2);
}
void createQuestion() {
if (++level > 3) level = 1; // change level
posx = new int[(level == 1) ? 9 : 10]; posy = new int[(level == 1) ? 8 : 9];
for (int i=0;i < posx.length;i++) posx[i] = 30+(40*i);
for (int i=0;i < posy.length;i++) posy[i] = 40+(40*i);
huruf = new char[posx.length][posy.length];
gapy = (level > 1) ? 40 : 0;
// mix elements
int size = kumpulanSoal.length;
String tempval; int temppos;
for (int i=0;i < size;i++) {
temppos = getRandom(i,size-1);
tempval = kumpulanSoal[temppos];
kumpulanSoal[temppos] = kumpulanSoal[i];
kumpulanSoal[i] = tempval;
}
// variables to avoid dead lock
boolean valid; // position validity
int trycount, globaltry; // try count on a word and global try on each word
String tmpsoal;
int soalke, jlhsoal = 6;
int xsoal, ysoal; // posisi x, y soal
int arah; // posisi arah soal (horizontal, vertikal, diagonal)
state = 0;
jlhsoal = getRandom(5+level,6+level);
soal = new String[jlhsoal];
size = soal.length;
for (int i=0;i < size;i++)
soal[i] = kumpulanSoal[i];
posSoal = new Point[size][2];
answered = new boolean[size];
totalAnswer = 0;
soalke = 0; globaltry = 0;
xsoal = 0; ysoal = 0;
while (soalke < soal.length) {
if (++globaltry > 10) { // exceed maximum try (10 globaltry x 10 trycount)
// try another combination
for (int j=0;j < posy.length;j++)
for (int i=0;i < posx.length;i++)
huruf[i][j] = ' ';
globaltry = 0;
soalke = 0;
}
arah = 1;
int rndVal = getRandom(1,20);
if (rndVal >= 21-(level*2)) arah = 4; else if (rndVal >= 21-(level*2)-3) arah = 3;
else if (rndVal >= 9-level) arah = 2; else arah = 1;
tmpsoal = soal[soalke];
trycount = 0;
valid = true;
int a = 0, b = 0;
if (arah == 1) { a = 1; // horizontal
} else if (arah == 2) { b = 1; // vertical
} else if (arah == 3) { a = 1; b = 1; // diagonal down
} else { a = 1; b = -1; } // diagonal up
int tmpsoallen = tmpsoal.length();
try {
do {
valid = true;
xsoal = getRandom(0,posx.length-((a==0) ? 1 : tmpsoallen));
ysoal = getRandom(0,posy.length-((b==0) ? 1 : tmpsoallen));
if (arah == 4) ysoal += tmpsoallen-1;
for (int i=0;i < tmpsoallen;i++)
if (huruf[xsoal+(i*a)][ysoal+(i*b)] != ' ')
if (huruf[xsoal+(i*a)][ysoal+(i*b)] != tmpsoal.charAt(i))
{ trycount++; valid = false; break; }
} while (!valid && trycount < 10);
} catch(Exception e) { valid = false; }
if (valid) {
int len = tmpsoallen-1;
for (int i=0;i <= len;i++)
huruf[xsoal+(i*a)][ysoal+(i*b)] = tmpsoal.charAt(i);
posSoal[soalke][0] = new Point(xsoal,ysoal);
posSoal[soalke][1] = new Point(xsoal+(len*a),ysoal+(len*b));
soalke++; globaltry = 0;
}
}
startx = -1; endx = -1; // refresh
// draw random string
for (int j=0;j < posy.length;j++)
for (int i=0;i < posx.length;i++)
if (huruf[i][j] == ' ')
huruf[i][j] = STRING.charAt(getRandom(0,STRING.length()-1));
}
int getRandom(int lo, int hi) { return lo + rnd.nextInt(hi-lo+1); }
}
É uma applet, mas não há grandes dificuldades em passá-la para Swing.(OBS.Pena que eu não achei o que eu fiz baseado nesse, que funcionava legal, mas não tô achando)