繁体   English   中英

比较java中的int

[英]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对象。 执行此操作时,您不会将addroll1addroll2存储在同一个对象中,因此.findwinner()在第三个对象中没有按预期工作是很自然的,在第三个对象中,您没有在addroll1addroll2存储任何值。 要解决此问题,请对所有三种方法使用相同的Dice对象,如下所示:

Dice tester = new Dice();
tester.userdieroll();
tester.compdieroll();
tester.findwinner();

嗯,从第一眼看你正在实例化三个不同的对象。 并且findwinner()正在处理addroll1 = 0addroll2 = 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();

你的代码在你写的时候用三个不同的roll1roll2 ,......创建三个不同的Dice实例

...
Dice looper = new Dice();
looper.findwinner();

它将varlable looper.addroll1looper.addroll2 (即looper类中的那些)进行比较,但这些变量仍为0(默认值),在填充userroll.addroll1comproll.addroll2之前的行中。

Vjncenzo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM