My assignment:
创建一个创建两个HandGamePlayer对象的测试器(人类cpu完全构造函数的默认构造函数),通过询问用户选择符号(现在为1-5),输出两个玩家标志,输出谁赢了来玩3轮 . 一旦完成所有轮次,输出统计数据并宣布总冠军!
一直在这个工作,任何人都可以向我解释如何识别标志符号?我的教授试图向我解释该怎么做,但我只是迷失了......
这就是他所说的,但我甚至不知道这意味着什么:
“符号未在main中声明,因此它表示无法找到该符号 . 您生成了一个手势,但打印出来并没有存储它!而是创建一个int符号;变量并将手势存储在那里(仍然打印出来,但现在你可以在你的多方面使用它,如果/其他)“
查看我的代码,如果你们有任何想法,请告诉我 .
HandGameTester.java
//MAIN
import java.util.Scanner;
public class HandGameTester
{
public static void main(String[] args)
{
Scanner keyboard;
HandSign hs;
int sign;
int handSign;
int win = 0;
int loose = 0;
int tied = 0;
int loopCount;
keyboard = new Scanner(System.in);
hs = new HandSign();
hs = sign;
System.out.println("Pick A Choice Below To Play");
System.out.println("1: Rock");
System.out.println("2: Paper");
System.out.println("3: Scissors");
System.out.println("4: Lizard");
System.out.println("5: Spock");
handSign = keyboard.nextInt();
System.out.println("You chose " + handSign);
hs.printHandSign(hs.getHandSign());
if(handSign == sign) {
System.out.println("You tied!");
tied++;
loopCount++;
} else if(handsign == 1 && sign == 2 || sign == 5) {
System.out.println("You loose!");
loose++;
loopCount++;
} else if(handsign == 1 && sign == 3 || sign == 4) {
System.out.println("You win!");
win++;
loopCount++;
} else if(handsign == 2 && sign == 1 || sign == 5) {
System.out.println("You win!");
win++;
loopCount++;
} else if(handsign == 2 && sign == 3 || sign == 2) {
System.out.println("You loose!");
loose++;
loopCount++;
} else if(handsign == 3 && sign == 2 || sign == 4) {
System.out.println("You win!");
win++;
loopCount++;
} else if(handsign == 3 && sign == 3 || sign == 5) {
System.out.println("You loose!");
loose++;
loopCount++;
} else if(handsign == 4 && sign == 2 || sign == 5) {
System.out.println("You win!");
win++;
loopCount++;
} else if(handsign == 4 && sign == 3 || sign == 4) {
System.out.println("You loose!");
loose++;
loopCount++;
} else if(handsign == 5 && sign == 1 || sign == 3) {
System.out.println("You win!");
win++;
loopCount++;
} else if(handsign == 5 && sign == 2 || sign == 4) {
System.out.println("You loose!");
loose++;
loopCount++;
} else {
System.out.println("You win!");
win++;
loopCount++;
} if((win > loose) || (win > tied)) {
System.out.println("You Win Best Out of Three!");
} else if(tied > win || tied > loose) {
System.out.println("You Tied!");
} else if(loose > win || loose > win) {
System.out.println("You loose!");
} else if(win == loose || win == tied) {
System.out.println("You tied!");
} else {
System.out.println("You Win Best Out of Three!");
}
}
}
HandSign.java
public class HandSign
{
public static final int ROCK = 1;
public static final int PAPER = 2;
public static final int SCISSOR = 3;
public static final int LIZARD = 4;
public static final int SPOCK = 5;
public static int getHandSign();
{
return (int)Math.random() * 5;
}
public static int printHandSign(int sign)
{
switch(sign)
{
case 1:
System.out.println("Rock");
return sign;
case 2:
System.out.println("Paper");
return sign;
case 3:
System.out.println("Scissor");
return sign;
case 4:
System.out.println("Lizard");
return sign;
case 5:
System.out.println("Spock");
return sign;
default:
System.out.println("Fatal Error");
System.exit(0);
}
}
}
}
4 回答
代码中有许多错误(但主要是不必要的变量) .
我想你可以告诉你的教授他或她错了
sign
实际上是 declared, 但是它不是 initialized. 检查你的main()
方法的开头 . 一行简单地说,int sign;
这是 declaration - 您告诉程序
sign
变量存在 . 但是,你没有把它设置为任何东西 - 你不是 initializing 它 .但是,这肯定不是说您的代码没有其他缺陷 .
首先,如上所述,你从未初始化
sign.
正如你后来将handSign
设置为等于System.in Scanner的nextInt,我们可以假设handSign
是用户选择的标志(无论是摇滚,纸张,剪刀,蜥蜴还是spok) . 然后将handSign
与sign
进行比较,并说明如果它们彼此相等,那么你就与计算机绑在一起了 . 通过这个我们可以假设sign
是计算机选择的符号 . 当你的教授告诉你,你没有在sign
中存储变量时,他已经死了!你宣布了标志,但从未让计算机选择sign
是什么 - 你从未将它设置为等于任何东西 .看看你的HandSign课程 . 您创建了
getHandSign()
方法,该方法返回一个随机值,但您从未调用过该方法!其次,你有很多不必要的变量 .
这是你想要做的:
在main方法中,去掉
hs
变量 . 为什么?想一想 - 只有两个玩家,所以只有两个标志 . 标志有三个变量 -hs, handSign, and sign
. 然后你暗示handSign
是用户的标志,sign
是你的if语句中的计算机标志 .hs
不仅是不必要的,而且暗示在您的程序中,符号通常是Integer
而hs
的类型是HandSign
. 此外,HandSign类中的每个变量和方法都是静态的,这意味着HandSign类的任何实例本质上都是无用的 .其次,您在HandSign类中创建了几个常量,但从未使用过它们 . 你可以完全摆脱它们,或者用switch语句中的数字代替常量 . 例如,它说:
case 1:
您可以(并且应该)将其更改为:
case ROCK:
您可以(并且应该)在HandGameTester
main()
方法中的几个if / else语句中执行相同的操作 . (注意,您必须通过HandSign类引用常量 -HandSign.ROCK
等)最后,最重要的是,初始化
sign
变量!您创建了静态方法,该方法生成1到5之间的随机值,但从未调用它,因此请调用它:
int sign = HandSign.getHandSign();
这将调用
getHandSign()
方法并将sign
设置为等于1到5之间的返回随机值 .看起来你添加了
int sign;
这意味着您有两个
HandSign
变量,一个是您生成的(hs
),另一个是您从用户读入的(sign
) . 但是,sign
是一个int而hs
不是 . 因此,您需要通过调用HandSign.getHandSign()
来获取HandSign
中的int一个来自电脑播放器 .你永远不记得getHandSign生成的符号 . 你打电话
其中打印出计算机生成的符号,但您从未记住变量中的这个符号 .
你似乎有一个变量,你永远不会给它一个值 .
在执行
if...else if...
之前,您应该指定一个值进行签名 . 这个任务看起来应该是这样的将问号替换为有效的整数表达式 .
其他一些海报已经评论过,但我只想加2美分 . 我可以立即看到一些问题 .
主要没有循环(除非我产生幻觉),这意味着只会播放一轮 .
如果打印出计算机的选择,用户界面会很好 .
你错误地将"lose"拼错为"loose",这使代码更难阅读 .
空行显示在错误的位置,或根本不显示,这也使代码难以阅读和调试 .
巨大的问题:(int)Math.random()* 5没有't do what you want it to do. Just create a small program that prints the result of that calculation 10 times and you'我会看到 . 你需要更多的括号,而且你需要加1,因为你开始计数为1而不是0.或者,你可以从0开始计数,而(IMHO)更好 .
使用System.exit(0)时出现致命错误,但如果确实是错误,则参数应为> 0,例如System.exit(1) .
另外,我同意其他海报 . 但是,它不应该太难修复,真的只需几分钟 . 大部分的辛勤工作都已完成 .