为什么checkforWin(File f)会在true时返回true?

时间:2013-08-11 01:49:52

标签: java methods gomoku

 **
  

这导致在这个gomoku游戏之外做出额外的动作   获胜的举动        额外移动后的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.
*/

2 个答案:

答案 0 :(得分: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)。这可能会陷入一些无限循环。

答案 1 :(得分:1)

我建议问题的原因是checkForWin实际上正在工作。这可能是因为:

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

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


虽然我引起了你的注意......你的代码中有一些小错误......但不足以引起你问的问题:

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

  2. 这是糟糕的风格......而且有潜在危险(在其他情况下):

     ... while (hasWinner == false);
    

    应该写成

     ... while (!hasWinner);
    

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

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

     ... while (hasWinner = false);
    

    您在这里意外地写了=而不是==。不幸的是,=表单是合法的Java ...它意味着与您的意图不同。如果您使用惯用版,则不能犯这个错误。