java - 如何为 Nim 游戏制作这个循环?
问题描述
基本上,我正在制作一个 Nim 游戏,并且代码在游戏的前 2 个序列之后停止循环。首先是玩家取出石头,然后是计算机取出石头。我正在努力让它不断重复循环,直到石头击中 0。我需要在哪里更改我的 while 语句才能解决这个问题?
import java.util.Scanner;
import java.lang.Math;
public class Nim {
public static int validEntry2(int comp) {
int cm = 1;
int newStones = 1;
while (cm == 1) {
comp = drawStones(comp);
if ( comp < 1 || comp > 3 || comp < newStones) {
System.out.println("Invalid parameters. Please enter something between 1-3.");
} else
System.out.println("Computer picks " + comp + " stones");
cm = 2;
}
return comp;
}
public static int validEntry(int player) {
int pl = 1;
int newStones = 1;
while (pl == 1) {
player = playerStones(player);
if (player < 1 || player > 3 || player < newStones) {
System.out.println("Invalid parameters. Please enter something between 1-3.");
} else
pl = 2;
}
return player;
}
public static int drawStones(int comp) {
comp = (int)(3 * Math.random() + 1);
return comp;
}
public static int playerStones(int player) {
Scanner input = new Scanner(System.in);
System.out.println("How many stones do you want to take?");
player = input.nextInt();
return player;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int stones;
stones = (int)(16 * Math.random() + 15);
int newStones = stones;
int player = 1;
int comp = 1;
int pl = 1;
// Display how many stones there are.
System.out.println("There are currently " + stones + " stones left");
//Players turn
while (pl == 1) {
player = validEntry(player);
if ( (newStones - player) < 0 ) {
System.out.println("Invalid input.");
} else {
pl = 2;
newStones -= player;
}
// Does the player lose?
if (newStones == 0) {
System.out.println("You just lost to a computer.");
} else {
System.out.println("There are " + newStones + " stones left");
}
// Computer Turn
int cm = 1;
while (cm == 1) {
comp = validEntry2(comp);
if ( (newStones - comp) < 0) {
System.out.println("Invalid Input.");
} else {
cm = 2;
newStones -= comp;
}
// Does Computer Lose?
if (newStones == 0) {
System.out.println("You just beat the computer!");
} else {
System.out.println("There are " + newStones + " stones left");
}
}
}
}
}
解决方案
您的第一个 if 的 else 子句没有 {},因此始终执行 cm=2 并立即中断 while 循环。
由于那部分代码是缩进的,我高度怀疑这不是你的意图吗?
编辑:您的 main 函数有一个 while 循环,只要pl
设置为 1,该循环就会运行。一旦pl
设置为 2,循环就会退出并因此终止您的程序。所以你可能想考虑一下这个循环的退出条件。
一般来说,有几件事我会改进以使调试代码更容易。例如,不要在 main 函数中嵌套两个 while 循环,而是一个接一个地执行它们(最好是在单独的函数中,这样你的代码会变得更整洁一些)。然后你可以在两个转弯上循环,直到没有更多的石头离开。
推荐阅读
- sharepoint - Powerapps 是否在对应用程序执行不可委派过滤之前返回可委派过滤结果?
- amazon-web-services - OpenFOAM:GCE 与 AWS EC2 性能对比
- c# - 如何在 c# 控制台应用程序中与标签一起在同一行输入值?
- javascript - 滚动时激活 Divi 主题导航菜单
- angular - 在使用 Angular 6 时,我发现无法将常量打字稿文件用于路由路径
- jquery - 使用 jQuery 求和元素
- flutter - 未处理的异常:输入“未来”
' 不是类型 'Future 的子类型 ' 在 Firestore 上 - javascript - ReactJS - 当标签顺序在我的表中移动时,如何关联我的数据在 td 标签中移动?
- angular - 通过 datePipe 显示带有异步数据的日期
- sql - 如何对另一列等于其他表的列求和