我正在尝试使用ProgrammingByDoing(https://programmingbydoing.com/a/baby-nim.html)的教程在Java中创建Nim游戏。在第一次尝试中,我并不那么担心错误检查或过零,但似乎只要三组/桩中的两个达到零,那么游戏结束。但是,我希望在比赛结束前所有三个桩都达到或超过零。
我的代码是:
import java.util.Scanner;
public class BabyNim
{
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int pile1 = 10;
int pile2 = 10;
int pile3 = 10;
String pileChoice = "";
int amount;
System.out.print("A: " + pile1 + "\t" + "B: " + pile2 + "\t" + "C: " + pile3 + "\n" );
System.out.print("Choose a pile: ");
pileChoice = keyboard.next();
System.out.print("How many to remove from pile " + pileChoice + ": ");
amount = keyboard.nextInt();
System.out.println("");
while ( pile1 > 0 && pile2 > 0 && pile3 > 0 )
{
if ( pileChoice.equals("A") ) {
pile1 -= amount;
} else if ( pileChoice.equals("B") ) {
pile2 -= amount;
} else {
pile3 -= amount;
}
System.out.print("A: " + pile1 + "\t" + "B: " + pile2 + "\t" + "C: " + pile3 + "\n" );
System.out.print("Choose a pile: ");
pileChoice = keyboard.next();
System.out.print("How many to remove from pile " + pileChoice + ": ");
amount = keyboard.nextInt();
System.out.println("");
}
System.out.println("");
System.out.println("All piles are empty. Good job!");
}
}
我的问题是我得到的结果如下:
A: 10 B: 10 C: 10 Choose a pile: B How many to remove from pile B: 8 A: 10 B: 2 C: 10 Choose a pile: C How many to remove from pile C: 9 A: 10 B: 2 C: 1 Choose a pile: A How many to remove from pile A: 8 A: 2 B: 2 C: 1 Choose a pile: C How many to remove from pile C: 1 A: 2 B: 2 C: 0 Choose a pile: A How many to remove from pile A: 1 All piles are empty. Good job!
答案 0 :(得分:2)
您使用了while ( pile1 > 0 && pile2 > 0 && pile3 > 0 )
。根据{{1}}运算符,如果其中任何一个AND
,则整个结果变为false
。这就是为什么循环退出,如果它们中的任何一个是false
。
因此,只有当所有桩都是空的时候才能退出循环,你应该使用
<=0
。根据{{1}}运算符,如果它们都是while( pile1>0 || pile2>0 || pile3>0)
,则只有整个结果变为OR
(您需要)。即使其中一个是false
,整个结果也会是false
。
希望您了解运营商。
<强>更新强>
我已编辑您的代码以获取您在链接中显示的输出。它工作正常。
true
而不是true
使用import java.util.Scanner;
public class BabyNim
{
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int pile1 = 10;
int pile2 = 10;
int pile3 = 10;
String pileChoice = "";
int amount;
do
{
System.out.print("A: " + pile1 + "\t" + "B: " + pile2 + "\t" + "C: " + pile3 + "\n" );
System.out.print("Choose a pile: ");
pileChoice = keyboard.next();
System.out.print("How many to remove from pile " + pileChoice + ": ");
amount = keyboard.nextInt();
System.out.println("");
if ( pileChoice.equals("A") )
{
pile1 -= amount;
} else if ( pileChoice.equals("B") )
{
pile2 -= amount;
} else
{
pile3 -= amount;
}
}while ( pile1 > 0 || pile2 > 0 || pile3 > 0 );
System.out.print("A: " + pile1 + "\t" + "B: " + pile2 + "\t" + "C: " + pile3 + "\n" );
System.out.println("All piles are empty. Good job!");
}
}
,因为它是基于退出的循环。您也可以使用while()
,但do{}while();
很方便,因为我们不想检查进入循环的初始条件。
你不需要在循环的内部和外部写2次询问用户的输入。只需在进入循环后写一次。
希望它有所帮助。
答案 1 :(得分:1)
只要任何桩都是空的,你的循环就会结束。相反,它需要在所有堆都为空时结束。换句话说,它应该继续,而至少有一个桩是空的。
应该是:
while (pile1 > 0 || pile2 > 0 || pile3 > 0)
或许这会更有意义:
while (pile1 + pile2 + pile3 > 0)
此外,在使用do..while
循环进行检查之前,您应该要求输入:
import java.util.Scanner;
public class BabyNim {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int pile1 = 10, pile2 = 10, pile3 = 10;
do {
System.out.printf("A: %d\tB: %d\tC: %d%n", pile1, pile2, pile3);
System.out.print("Choose a pile: ");
String pileChoice = in.next();
System.out.printf("How many to remove from pile %s: ", pileChoice);
int amount = in.nextInt();
System.out.println();
if (pileChoice.equals("A")) {
pile1 -= amount;
} else if (pileChoice.equals("B")) {
pile2 -= amount;
} else {
pile3 -= amount;
}
} while (pile1 + pile2 + pile3 > 0);
System.out.println("\nAll piles are empty. Good job!");
}
}
答案 2 :(得分:1)
这是循环条件的问题,其中说:
while ( pile1 > 0 && pile2 > 0 && pile3 > 0 )
如果任何一个堆是0,那么不要进入while循环,所以你的代码应该是这样的:
while ( pile1 > 0 || pile2 > 0 || pile3 > 0 )
你还必须添加一些支票,否则当你从桩中减去金额时你输入的金额应该小于当前的桩尺寸,否则桩的尺寸将是负的。
例如。
if ( pileChoice.equals("A") && amount <= pile1) {
pile1 -= amount;
}
答案 3 :(得分:0)
我真的很开心做这个节目:D,好像我不是唯一一个
这是我的建议
1-通过do ... while在循环之前删除冗余代码,并查看条件
2-用if替换最后的else(你期待C,但是除了A B之外的任何字母被接受为C)
3-因为你没有检查剩余部分,你最终会得到负数。
import java.util.Scanner;
public class BabyNim
{
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int pile1 = 10;
int pile2 = 10;
int pile3 = 10;
String pileChoice = "";
int amount;
do{
// the incorrect inputs (other letters or values greater the amount) are ignored by the loop
System.out.print("A: " + pile1 + "\t" + "B: " + pile2 + "\t" + "C: " + pile3 + "\n" );
System.out.print("Choose a pile: ");
pileChoice = keyboard.next();
System.out.print("How many to remove from pile " + pileChoice + ": ");
amount = Math.abs(keyboard.nextInt());// only positive numbers
System.out.println("");
if ( pileChoice.equals("A") && pile1 >= amount) {
pile1 -= amount;
}
if ( pileChoice.equals("B") && pile2 >= amount) {
pile2 -= amount;
}
if ( pileChoice.equals("C") && pile3 >= amount){
pile3 -= amount;
}
}while ( pile1 > 0 || pile2 > 0 || pile3 > 0 );
System.out.println("All piles are empty. Good job!");
}
}