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;