1

所以我的数组目前分配了 5 个骰子对象的实例。我的问题是我有另一个类需要锁定骰子以防使用。

   public class Yahtzee {
        OneDice[] dice = new OneDice[5];

        public Yahtzee() {
            yahtzeeRoll(); //constructor
        }

        public void yahtzeeRoll() {
            for (int i = 0; i != dice.length; i++) {
                dice[i] = new OneDice();
            }
  public void lock(int which) {

        dice[which - 1].lockDice();
        }
  }

但是我的 dice[i] = new OneDice(); 每次调用 yahtzeeRoll 时都会创建一组全新的随机数。

这是传递 which 参数的方法。

   @Override
    public void choose() {
        int which;
        Scanner sc = new Scanner(System.in);
        System.out.println(getName() + " Rolling.");
        hand.printYahtzee();

        System.out.println("Would you like to lock dice 1? 1 for yes");
        choice = sc.nextInt();
        if (choice == 1) {
            which = 1;
            hand.lock(which);
        }

我怎样才能为每个骰子索引分配一个随机值,而不创建一组全新的否定锁定的掷骰子。至少这对我来说似乎是个问题?

4

3 回答 3

2

听起来您只需要跳过锁定的条目:

for (int i = 0; i < dice.length; i++) {
    if (dice[i] == null || !dice[i].isLocked()) {
        dice[i] = new OneDice();
    }
}

要么,要么更改您的代码以dice使用新实例在构造函数中进行初始化,但让您的yahtzeeRoll方法仅更改现有解锁实例中的值而不是创建新实例。例如:

public Yahtzee() {
    for (int i = 0; i  < dice.length; i++) {
        dice[i] = new OneDice();
    }
    rollUnlocked();
}

public void rollUnlocked() { // Renamed from yahtzeeRoll for clarity
    for (OneDice die : dice) {
        die.rollIfUnlocked(); // Or whatever method you want
    }
}

rollIfUnlocked只有在它以前没有被锁定的情况下才会重新滚动单个骰子)。

于 2013-08-12T14:23:06.210 回答
0

不要在每次滚动时重新初始化整个数组。在现实生活中玩 yahtzee 时,您不会每次滚动都去抓 5 个新骰子。

于 2013-08-12T14:25:13.633 回答
0

创建 OneDice 如下:

class OneDice {
   int value;
   boolean locked;

   void roll(){
      if(!locked)
         value = Math.nextInt(6);
   }

   int getValue(){
      return value;
   }
   void setLock(boolean lock){
      locked = lock;
   }
   boolean isLocked(){
      return locked;
   }
}
于 2013-08-12T14:27:30.130 回答