Java While Loop中的奇怪行为

时间:2014-11-17 19:26:51

标签: java while-loop infinite-loop system.out

我正在使用基本的摆动图形编写一个基本的Tic-Tac-Toe单人游戏。我完成了比赛,但我面临一个奇怪的问题。在一个地方,我使用带有SOP语句的while循环。如果我省略这个语句,程序的工作方式不同,没有任何反应(比如某种无限循环),如果我保留它,它就可以正常工作。我不知道代码中发生了什么。请帮忙。

以下是导致问题的源代码。对不起我的业余编码风格。

import java.util.Random;

public class SinglePlayer implements Runnable{

    public final int MINIMUM = -1000000;
    private GameBoard game;

    public SinglePlayer(){
        game = new GameBoard("Single Player");
    }

    public static void main(String[] args){
        SinglePlayer gameSingle = new SinglePlayer();
        gameSingle.run();
    }

    public void run(){
        boolean machinePlayed = true, userPlayed = false;

        // Outer loop is to maintain re-match option of program
        while(this.game.quitTwoPlayer == false){
            // Inner loop is a single game b/w user and machine
            while(this.game.GameQuitStatus() == false){

                /* I kept two conditions to switch b/w machine and user mode 
                 * of game and they just keep changing to simulate the game
                 * b/w machine and user.
                 */
                if(machinePlayed == false && userPlayed){
                    try {
                        MachineMove("O");
                    } catch (CloneNotSupportedException e) {
                        e.printStackTrace();
                        break;
                    }
                    this.game.ChangePlayerLabels();
                    machinePlayed = true;
                    userPlayed = false;
                }
                else if(machinePlayed && userPlayed == false){
                    int earlierCount = this.game.CountSteps();

                    /* THIS IS THE WHILE LOOP I AM TALKING ABOUT. 
                     * If I omit the print statement inside the body of loop,
                     * program behaves differently, but when I keep it,
                     * it working just fine. 
                     * */ 
                    while(earlierCount == this.game.CountSteps()){
                        System.out.println("Player User thinking");
                    }

                    this.game.ChangePlayerLabels();
                    machinePlayed = false;
                    userPlayed = true;                  
                }
                this.game.DeclareResult();
            }
            this.game.dispose();
        }
    }

    public void MachineMove(String player) throws CloneNotSupportedException{

        /* If board is empty, play at center of the board */
        if(this.game.CountSteps() == 0){
            this.game.MakeMove(1, 1);
        }

        /* If center is blank, play it there. Otherwise, pick a corner randomly */
        else if(this.game.CountSteps() == 1){
            if(this.game.IsEmpty(1, 1))
                this.game.MakeMove(1, 1);
            else{
                Random randomNum = new Random();
                int num = randomNum.nextInt(4);
                if(num == 0)
                    this.game.MakeMove(0, 0);
                else if(num == 1)
                    this.game.MakeMove(2, 0);
                else if(num == 2)
                    this.game.MakeMove(0, 2);
                else if(num == 3)
                    this.game.MakeMove(2, 2);
            }
        }
        else{           
            /* If the next move is such that it should be taken, otherwise opponent will win */
            String opponent = "";
            if(this.game.GetCurrentPlayer().equals("O"))
                opponent = "X";
            else
                opponent = "O";
            for(int i = 0; i<3; i++){
                for(int j = 0; j<3; j++){
                    if(this.game.IsEmpty(i,j)){
                        GameBoard tempGame = new GameBoard(this.game, "Single Player");
                        tempGame.MakePossibleMove(i, j, opponent);
                        if(tempGame.GameWinner().equals(opponent + " wins")){
                            this.game.MakeMove(i,j);
                            return;
                        }
                    }
                }
            }

            /* If the next move is not such that if missed, game is lost, then play most optimal move towards winning */
            Move tempMove = new Move(MINIMUM, 0, 0);
            Move bestMove = new Move(MINIMUM, 0, 0);
            for(int i = 0; i<3; i++){
                for(int j = 0; j<3; j++){
                    if(this.game.IsEmpty(i,j)){
                        GameBoard tempGame = new GameBoard(this.game, "Single Player");
                        tempMove = MakeMoves(tempGame, i, j);
                        if(tempMove.score > bestMove.score){
                            bestMove.row = tempMove.row;
                            bestMove.col = tempMove.col;
                            bestMove.score = tempMove.score;
                        }
                    }
                }
            }
            this.game.MakeMove(bestMove.row, bestMove.col);
        }
    }

    public Move MakeMoves(GameBoard tempGame, int row, int col){
        String player = tempGame.GetCurrentPlayer(); 
        tempGame.MakeMove(row, col);
        if(tempGame.GameWinner().equals("Match Draw")){
            return new Move(0, row, col);
        }
        else if(tempGame.GameWinner().equals("X wins")){
            if(player.equals("X")){ 
                return new Move(1, row, col);
            }
            else{
                return new Move(-1, row, col);
            }
        }
        else if(tempGame.GameWinner().equals("O wins")){
            if(player.equals("O")){
                return new Move(1, row, col);
            }
            else{
                return new Move(-1, row, col);
            }
        }
        else{
            Move bestMove = new Move(MINIMUM, 0, 0);
            Move tempBestMove = new Move(0, 0, 0);
            for(int i = 0; i<3; i++){
                for(int j = 0; j<3; j++){
                    if(tempGame.IsEmpty(i,j)){
                        GameBoard newGame = new GameBoard(tempGame, "Single Player");
                        tempBestMove = MakeMoves(newGame, i, j);
                        if(tempBestMove.score > bestMove.score)
                            bestMove = tempBestMove;
                    }
                }
            }
            return bestMove;
        }
    }
}

class Move{
    public int score;
    public int row;
    public int col;

    public Move(int score, int row, int col){
        this.score = score;
        this.row = row;
        this.col = col;
    }
}

1 个答案:

答案 0 :(得分:2)

您的循环可能正在键入您的处理器,并且SOP会使循环速度变慢以允许其他进程发生。但无论如何,最重要的是,你不希望首先出现这个循环。你声明你有一个,

  

Tic-Tac-Toe使用基本 摆动 图形的单人游戏

请记住,Swing是一个事件驱动的GUI库,所以不要像在线性控制台程序中那样循环,而是让事件发生,但是根据程序的状态来响应它们。 / p>

换句话说,给你的类几个字段,包括一个布尔变量,它告诉它是谁,例如boolean playersTurn,一个布尔变量gameOver,...,并将这些变量的状态更改为游戏播放,并根据这些状态确定游戏行为。例如,如果轮到他的话,游戏会忽略玩家的输入。