Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的游戏无限长_Java_Loops - Fatal编程技术网

Java 我的游戏无限长

Java 我的游戏无限长,java,loops,Java,Loops,我有一个任务要创建一个 我创建了两个类,一个用于游戏: import java.util.*; /** * * @author Surge */ public class Nim implements InteractiveGame { private int pilesize; private boolean playSmart; //true iff the computer plays smart private boolean playersT

我有一个任务要创建一个

我创建了两个类,一个用于游戏:

import java.util.*;

/**
 *
 * @author Surge
 */
public class Nim implements InteractiveGame
{

    private int pilesize;
    private boolean playSmart;  //true iff the computer plays smart
        private boolean playersTurn;    //true iff it is the human player’s turn to move
        private String gameRecord;  //Complete history of the game’s progression

    public Nim(boolean playSmart, boolean playerFirst)
        {
           this.playSmart = playSmart;
           this.playersTurn = playerFirst;
           pilesize = (int)((Math.random() * 91) + 10);
           this.gameRecord = " Marble Game";
        }

 @Override
    public boolean isCompleted()
    {
        return pilesize == 0;
    }

    @Override
    public boolean isValidMove(String move) 
    {

      try
      {  //Interpret move as an integer, check if in range
           int number = Integer.parseInt(move);
         return number >= 1  && number <= pilesize / 2 ;
      }
      catch (NumberFormatException nfex)
      {  //The move could not be parsed as an integer
         return false;
      }


    }

    @Override
    public boolean isPlayersTurn()
    {
        return this.playersTurn;
    }

    @Override
    public void makePlayersMove(String move) 
    {
        Scanner input = new Scanner(System.in);
        int marbles_to_remove = input.nextInt(); 
        this.gameRecord = "How many marbles do you want to remove:";

        while ((marbles_to_remove != 1) && (marbles_to_remove <= 0 || marbles_to_remove > pilesize / 2))
                playersTurn = false;


        pilesize -= marbles_to_remove;
    }



    @Override
    public void makeComputersMove() {
         while (pilesize > 0) 
          {
        System.out.println("Current number of marlbes in pile: " +  pilesize);
        int marbles_to_remove = 0;
        if (!playersTurn) {
        if (playSmart || (pilesize == 1 || pilesize == 3
                    || pilesize== 7 || pilesize == 15 || pilesize == 31
                    || pilesize == 63)) {
            marbles_to_remove = (int) (Math.random() * (pilesize / 2 + 1)) + 1;
        }
        else {
            if (pilesize > 63) {
            marbles_to_remove = pilesize - 63;
            }
            else if (pilesize > 31) {
            marbles_to_remove = pilesize - 31;
            }
            else if (pilesize > 15) {
            marbles_to_remove = pilesize - 15;
            }
            else if (pilesize > 7) {
            marbles_to_remove = pilesize - 7;
            }
            else if (pilesize > 3) {
            marbles_to_remove = pilesize - 3;
            }
            else {
            marbles_to_remove = pilesize - 1;
            }
        }
        System.out.println("Computer removes " + marbles_to_remove  + " marble" + ((marbles_to_remove > 1)? "s": ""));
        playersTurn = true;
        }

    }


    }

    @Override
    public boolean playerHasWon() 
    {
        boolean win = false;
        if(pilesize == 1 && !playersTurn)
            win = true;
        return win;
    }

    @Override
    public String movePrompt() 
    {
        return this.gameRecord + "\nGuess a number";
    }



}
但当我运行我的程序时,无论我给它什么输入,我都得不到输出。程序只是无限运行,输出为空。我做错了什么? movePrompt方法也有这些规范
玩家移动提示必须包括游戏当前状态的清晰表示;提示必须显示足够的信息,以便玩家决定下一步行动。假设人类玩家不熟悉尼姆。必须使用JOptionPane方法实现提示

至少在
makePlayersMove(…)
方法中的这个构造很容易创建一个无限循环:

while ((marbles_to_remove != 1) && (marbles_to_remove <= 0 || marbles_to_remove > pilesize / 2))
    playersTurn = false;
while((大理石移除!=1)和&(大理石移除桩/2))
playersTurn=false;
由于
marbles\u to\u remove
的值在循环内从未更改,因此如果循环条件满足一次,则将再满足无限次

您应该扩展循环,不断向用户请求新的输入(现在只在循环外部请求一次),直到输入在定义的参数内



另外,
makeComputersMove(…)
中的while循环变成了一个无限循环,因为循环条件是
while(pilesize>0)
pilesize
在循环内不会改变。因此,如果它在进入循环时高于零,它将永远保持在零以上。如果您只想让计算机一次移动一步,根本不明白为什么需要循环。

您能在程序运行时使用调试器单步执行程序吗?这通常有助于解决问题的原因,例如,一个无限循环,非常快。我没有,但感谢@dave的建议,调试器在这种情况下是一个非常方便的工具。事实上,从长远来看,学习使用调试器将为帮助调试您自己的程序节省大量精力。我尝试在MakePlayerMove中注释while循环,但它仍然会给出infinte循环,其中包含MakeComputerMove的输出,这基本上是相同的问题。当和
执行时,您需要小心使用
。。。当
循环时,它们很容易创建无限循环。
while ((marbles_to_remove != 1) && (marbles_to_remove <= 0 || marbles_to_remove > pilesize / 2))
    playersTurn = false;