[英]Comparing int's in java
我有这个脚本来模拟java中的2个掷骰子。 这是两次完成,一次由用户完成,一次由计算机完成(两次都是自动)。 程序输出卷并总结它们。 然而,我无法获得if / else语句来比较滚动并确定赢家/或领带。 到目前为止,我有:
import java.util.Scanner;
import java.util.Random;
import java.text.DecimalFormat;
/*
Program to simulate die roll
*/
public class Dice
{
Scanner scan = new Scanner (System.in);
Random generator= new Random();
int roll1;
int roll2;
int roll3;
int roll4;
int addroll1;
int addroll2;
public void userdieroll() // Simulates users role
{
roll1 = (generator.nextInt(7) +1); // Generate number from 1-6
System.out.println("Your first roll is "+roll1+"");// Says users first role
roll2 = (generator.nextInt(7) +1); // Generate number from 1-6
System.out.println("Your second roll is "+roll2+"");// Says users second roll
addroll1= roll1 +roll2;// Sums users roles
System.out.println("The sum of your two roles is "+addroll1+" \n");
}
public void compdieroll()// Simulates computers role
{
roll3 = (generator.nextInt(7) +1); // Generate number from 1-6
System.out.println("The computers first role is "+roll3+""); // Says computers first role
roll4 = (generator.nextInt(7) +1); // Generate number from 1-6
System.out.println("The computers second role is "+roll4+""); // Says computers second role
addroll2= roll3 +roll4;// Sums computers roles
System.out.println("The sum of the computers roles is "+addroll2+"");
}
public void findwinner()
{
if (addroll1 == addroll2)
{
System.out.println("Its a tie!");
}
else
{
if (addroll1 > addroll2)
{
System.out.println("You Won!");
}
else
{
System.out.println("You lost!");
}
}
}
public static void main(String[] args)
{
Dice userroll = new Dice();
userroll.userdieroll();
Dice comproll = new Dice();
comproll.compdieroll();
Dice looper = new Dice();
looper.findwinner();
}
}
每次调用方法时都会创建一个新的Dice
对象。 执行此操作时,您不会将addroll1
和addroll2
存储在同一个对象中,因此.findwinner()
在第三个对象中没有按预期工作是很自然的,在第三个对象中,您没有在addroll1
和addroll2
存储任何值。 要解决此问题,请对所有三种方法使用相同的Dice
对象,如下所示:
Dice tester = new Dice();
tester.userdieroll();
tester.compdieroll();
tester.findwinner();
嗯,从第一眼看你正在实例化三个不同的对象。 并且findwinner()
正在处理addroll1 = 0
和addroll2 = 0
因为0
是此类属性的默认值。
如果要处理来自不同对象的相同数据,则需要使属性为static
。 无论如何,正如其他建议的那样,在单个实例上完成工作。
只是为了让您了解我将如何实现它(具有大约20年的Java编程经验):
package nl.owlstead.stackoverflow;
import java.util.Random;
/*
* Program to simulate a double die roll.
*/
public class DiceGame {
private Random generator = new Random();
enum Result {
LOSER,
TIE,
WINNER;
}
public DiceGame() {
// nothing to do in constructor
}
public int rollDice() {
int zeroToFive = generator.nextInt(6);
int oneToSix = zeroToFive + 1;
return oneToSix;
}
public Result findWinner(int totalRollComp, int totalRollUser) {
if (totalRollComp > totalRollUser) {
return Result.LOSER;
}
if (totalRollComp < totalRollUser) {
return Result.WINNER;
}
return Result.TIE;
}
public static void main(String[] args) {
DiceGame game = new DiceGame();
int firstRollComp = game.rollDice();
int secondRollComp = game.rollDice();
int totalRollComp = firstRollComp + secondRollComp;
System.out.printf("Comp rolled: %d and %d, totalling %d%n", firstRollComp, secondRollComp,
totalRollComp);
int firstRollUser = game.rollDice();
int secondRollUser = game.rollDice();
int totalRollUser = firstRollUser + secondRollUser;
System.out.printf("User rolled: %d and %d, totalling %d%n", firstRollUser, secondRollUser,
totalRollUser);
Result userResult = game.findWinner(totalRollComp, totalRollUser);
switch (userResult) {
case LOSER:
System.out.println("You lost!");
break;
case TIE:
System.out.println("Its a tie!");
break;
case WINNER:
System.out.println("You Won!");
break;
}
}
}
特别有用的是尽可能少地使用字段。 正如您已经发现的那样使用字段(代表程序中的状态 )非常危险。 如果你可以避免国家,你应该这样做。 所以在这个程序中只有一个字段:随机数生成器(当然我会使用new SecureRandom()
代替)。
此外,它还显示了为变量和分割输出( System.out
)和游戏本身选择好名称的强度。 我试图不介绍除此之外的太多技术,但我无法抗拒使用枚举结果和printf
来简化各种println
语句。
只使用一个对象,您正在创建3个骰子,并且这些值在实例之间不是静态共享的...
这将有效:
Dice userroll = new Dice();
userroll.userdieroll();
userroll.compdieroll();
userroll.findwinner();
在你的班级中,有两个用户骰子而不是计算机骰子变量。 在你的主要你应该只创建一个类:
Dice d = new Dice();
d.userdieroll();
d.compdieroll();
d.findwinner();
你的代码在你写的时候用三个不同的roll1
, roll2
,......创建三个不同的Dice实例
...
Dice looper = new Dice();
looper.findwinner();
它将varlable looper.addroll1
与looper.addroll2
(即looper类中的那些)进行比较,但这些变量仍为0(默认值),在填充userroll.addroll1
和comproll.addroll2
之前的行中。
Vjncenzo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.