我必须为一个类似于boggle的游戏编写一个程序,我现在让它检查当前字母下面的每个字母,看看它们是否构成一个单词。对于像这样的板:
W O Y R
F U M F
H T R V
I G S W
它能找到的唯一的单词是从上到下的"OUT"。当它找到一个单词的一部分时,它将该字母放入字符串并将其设置为null,这样它就不会在同一个单词中使用同一个字母两次(完整的算法必须能够在多个方向上搜索)。我使用堆栈来跟踪我使用过的字母的坐标,这样我就可以回溯,每次我打开堆栈时,我都会取出字符串的最后一个字母,并将其放回棋盘的原始位置。但问题是,如果删除多个字母,它会将它们全部放在同一个索引中,覆盖前一个。因此,在"OUT"的情况下,替换了三个字母后,板最终看起来像这样:
W null Y R
F null M F
H O R V
I G S W
我已经检查了我的代码,并试图重写它两次,但它总是这样。你对发生这种情况的原因有什么见解吗?
private void checkNeighbors(LetterCoor center){
String check = out;
while (!path.empty()){
if(center.getDirec()==0){//If the direction to check is down
System.out.println("Bottom");
if((center.getRow())+1<sideLength && board[(center.getRow())+1][center.getCol()]!=null){//makes sure the space below is !null and !out of bounds
check+=board[center.getRow()+1][center.getCol()];
System.out.println("Checking " + check);
if(isValidWord(check)){//checks if string is part of the lexicon
center.nextNeighbor();
board[center.getRow()+1][center.getCol()]=null;
center = new LetterCoor(center.getRow()+1, center.getCol(), 0);
System.out.println("push " + check.substring(check.length()-1));
path.push(center);
out=check;
}
else{
center=(LetterCoor) path.pop();
center.nextNeighbor();
path.push(center);
}
}//end of null if
else{
System.out.println("Null or end of board");
center=(LetterCoor) path.pop();
center.nextNeighbor();
path.push(center);
}
}//end of direc 0 if
else{
System.out.println("pop " + out.substring(out.length()-1,out.length()));
center=(LetterCoor) path.pop();
center.nextNeighbor();
board[center.getRow()][center.getCol()]=out.substring(out.length()-1,out.length());
out=out.substring(0,out.length()-1);
if (center.getDirec()<1){
path.push(center);
}
}
System.out.println("Current string is " + out);
}//end of while loop
}
如果你需要澄清我的代码,请告诉我。
同样,作为说明,lettercoor对象存储了三个整型。第一个是字母的行索引,第二个是列索引第三个表示搜索的方向(0=向下,1=向右,2=向右,等等)
我最终自己找到了解决方案。问题出在我的LetterCoor对象上。Eclipse要求将变量设置为静态,因为我在一个单独的文件中拥有对象类,所以当我更新一个LetterCoor对象中的坐标数据时,它将每个LetterCoor对象的数据设置为该坐标。我通过将对象类移动到与该类相同的文件中并从变量中删除静态声明来解决这个问题。