0
 **

这导致在这个五子棋游戏中除了获胜移动之外还有一个额外的移动,额外移动之后的 checkForWin 方法是检测胜利的方法,但它应该是相应的 makeMove 方法之后的 checkForWin 方法。

**

import java.io.File;  
boolean hasWinner = false;
File gameFile = new File("src/centralGameFile.txt");

do{
    //player 1
    makeMove(gameFile);
    // check for win
    if (checkForWin(gameFile)){ 
        hasWinner = true;
        break;
    }
    // player 2
    makeMove(gameFile);
    // check for win
    if (checkForWin(gameFile)){
        hasWinner = true;
        break;
    }
}while(hasWinner == false);

System.out.println("somebody has won the game");

 /*this method is located in another class in the same package and is
  called from an instance of the class using the access operator */

protected boolean checkForWin(File f){
//return true if the file  has a winner in it using scanner to look for it
//this method works correctly when tested with just a file in a test class
}

// 为简洁起见省略了 try/catch 块

/* makeMove(File f) method copies the text from f and over writes 
it adding another character; in context this is a gomoku/tic-tac-toe
style game but on a bigger board.
*/
4

2 回答 2

2
checkForWin works correctly when tested with just a file in a test class

您的代码的一部分:

do{
    //player 1
    makeMove(gameFile);
    // check for win
    if (checkForWin(gameFile)){ 
        hasWinner = true;
        break;
    }
    // player 2
    makeMove(gameFile);
    // check for win
    if (checkForWin(gameFile)){
        hasWinner = true;
        break;
    }
}while(hasWinner == false);

System.out.println("somebody has won the game");

如果checkForWin返回true,您的方法必须挂在makeMove(gameFile). 这可能会陷入某种无限循环。

于 2013-08-11T01:58:56.263 回答
1

我建议您的问题的原因checkForWin是实际上不起作用。这可能是因为:

  • 您对该方法的测试不充分,或
  • 更新文件的代码没有做正确的事情(例如,它没有关闭/刷新文件),或者
  • 您正在调用checkForWin错误的文件。

无论哪种方式,您的问题中都没有足够的信息来说明这里实际发生了什么。至少我们需要查看checkForWin方法的代码,并且可能我们还需要查看更新文件的代码。


虽然我引起了您的注意...您的代码中有几个小错误...但不足以引起您询问的问题:

  1. 您的hasWinner标志是多余的,设置它并测试它的代码也是如此。您编写循环的方式,在循环之后获得语句的唯一方法是执行两个break语句之一。

  2. 这是不好的风格......并且有潜在的危险(在其他情况下):

     ... while (hasWinner == false);
    

    应该写成

     ... while (!hasWinner);
    

    首先,它更具可读性。每个 Java 程序员都应该知道!运算符的含义,而使用!是表达这一点的惯用方式。

    其次,您的方法容易出错。考虑一下:

     ... while (hasWinner = false);
    

    在这里,您不小心写成===. 不幸的是,该=表单是合法的 Java ......它的含义与您的意图不同。如果你使用惯用的版本,你就不会犯这个错误。

于 2013-08-11T02:03:51.000 回答