【发布时间】:2012-05-04 20:56:09
【问题描述】:
首先,这是额外功课的一部分,所以请不要给我答案。请帮助我了解我可能对正在发生的事情有什么问题。它是一个井字游戏生成器,游戏在其中递归地根据玩家确定最佳移动。 (教授用白色'W'和黑色'B'代替X和O)
我的主要递归方法根据 TTT 板上的输入位置返回状态分数; 1 如果白方从该位置强制获胜,0 如果是平局,-1 如果黑色将强制从该位置获胜:
public int stateScore(boolean whiteMove, int[] BestMove) {
return stateScore(whiteMove,BestMove,TTTBoard);
}
调用我的底层私有递归方法:
private int stateScore(boolean whiteMove, int[] BestMove,char[][] TestBoard) {
char [][] newTestBoard = new char [3][3];
for(int rowVal = 0; rowVal < 3; rowVal++){
for(int colVal = 0; colVal < 3; colVal++){
newTestBoard[rowVal][colVal] = TestBoard[rowVal][colVal];
}
}
int [] bestMove = new int [2];
for(int rowVal = 0; rowVal < 3; rowVal++){
for(int colVal = 0; colVal < 3; colVal++){
if(isFull(newTestBoard) == true){
return 0;
}
else if(newTestBoard[rowVal][colVal] == '-'){
bestMove[0] = rowVal;
bestMove[1] = colVal;
//if boolean is white
if(whiteMove == true){
newTestBoard = testEntry(rowVal,colVal,'W',newTestBoard);
if(threeInRow(newTestBoard) == 1){
return 1;
}
else if(threeInRow(newTestBoard) == 0 && isFull(newTestBoard) == true){
return 0;
}
else if(threeInRow(newTestBoard) == -1 && isFull(newTestBoard) == true){
return -1;
}
else{
return stateScore(!whiteMove,bestMove,newTestBoard);
}
}
//if boolean is black
else{
newTestBoard = testEntry(rowVal,colVal,'B',newTestBoard);
if(threeInRow(newTestBoard) == -1){
return -1;
}
else if(threeInRow(newTestBoard) == 0 && isFull(newTestBoard) == true){
return 0;
}
else if(threeInRow(newTestBoard) == 1 && isFull(newTestBoard) == true){
return 1;
}
else{
return stateScore(!whiteMove,bestMove);
}
}
}
}
}
return 0;
}
whiteMove 的布尔值如果是白方走,则为真,如果是黑方走,则为假。函数内的辅助方法包括threeInRow:
public int threeInRow(char[][] TTTBoard){
boolean whiteIs = false;
boolean blackIs = false;
//Horizontal?
char [] colChar = new char [3];
for(int rowVal = 0; rowVal < 3; rowVal ++){
for(int colVal = 0; colVal < 3; colVal++){
colChar[colVal] = TTTBoard[rowVal][colVal];
}
if(colChar[0] == colChar[1] && colChar[1] == colChar[2]){
if(colChar[0] == 'W'){
whiteIs = true;
}
if(colChar[0] == 'B'){
blackIs = true;
}
}
}
//Vertical?
char [] rowChar = new char [3];
for(int colVal = 0; colVal < 3; colVal ++){
for(int rowVal = 0; rowVal < 3; rowVal++){
rowChar[colVal] = TTTBoard[rowVal][colVal];
}
if(rowChar[0] == rowChar[1] && rowChar[1] == rowChar[2]){
if(rowChar[0] == 'W'){
whiteIs = true;
}
else if(rowChar[0] == 'B'){
blackIs = true;
}
}
}
//Diagonal
//topLeft to bottomRight
if(TTTBoard[0][0] == TTTBoard[1][1] && TTTBoard[1][1] == TTTBoard[2][2]){
if(TTTBoard[0][0] == 'W'){
whiteIs = true;
}
else if(TTTBoard[0][0] == 'B'){
blackIs = true;
}
}
//topRight to bottomLeft
if(TTTBoard[0][2] == TTTBoard[1][1] && TTTBoard[1][1] == TTTBoard [2][0]){
if(TTTBoard[1][1] == 'W'){
whiteIs = true;
}
else if(TTTBoard[1][1] == 'B'){
blackIs = true;
}
}
//Return Vals
if(whiteIs == true && blackIs == true){
return 0;
}
else if(blackIs == true && whiteIs == false){
return -1;
}
else if(blackIs == false && whiteIs == true){
return 1;
}
else if(blackIs == false && whiteIs == false){
return 0;
}
else{
return 0;
}
}
和 testEntry:
public char[][] testEntry(int row,int col,char newChar, char[][] TestBoard){
char [][] returnBoard = new char[3][3];
for(int rowVal = 0; rowVal < 3; rowVal++){
for(int colVal = 0; colVal < 3; colVal++){
returnBoard[rowVal][colVal] = TestBoard[rowVal][colVal];
}
}
returnBoard[row][col] = newChar;
return returnBoard;
}
我不明白堆栈溢出是从哪里来的。似乎我的回报涵盖了所有情况,并且我的方法具有适当的回报。我从来没有使用过带有递归的for循环,我是不是搞砸了。另外,我说type [] name = name(相同类型)不起作用,对吗?这就是我在这种情况下使用 for 循环的原因。
【问题讨论】:
-
这是很多代码,请将其最小化为仍然涵盖手头问题的最小可编译快照。
-
抱歉无法抗拒:一个奇怪的游戏。唯一获胜的举措是不玩。来一盘漂亮的国际象棋怎么样?
-
我是第二个 Marko,Zach - 您能花几分钟时间回顾一下您之前的六个问题吗?他们都有答案(尽管如果您认为没有任何答案有帮助,则可以在特定情况下不授予接受)。
-
对不起,我没有意识到我是接受它的人,我认为其他人认为它是一个可以接受的答案。我会尽快跳上去的。
-
已修复,感谢 halfer 和 marko。阿米特,问题在于,“返回 stateScore(whiteMove,BestMove,TTTBoard);”在 stateScore(boolean whiteMove,int [] BestMove) 方法中返回的是 SO,我不知道要列出哪些代码。而弗洛洛,一个棋盘被传递到游戏中,该棋盘有一个带有 W 和 B 的预设棋盘。然后你选择一个放置 W 的地方,然后黑棋做出“最佳移动”。
标签: java recursion stack-overflow tic-tac-toe