java yahtzee游戏检查满屋

时间:2014-10-08 20:21:02

标签: java

我正在制作java yahtzee游戏,我只是想知道以下代码是否会在任何情况下产生误报

die是一个包含每个骰子的伪随机(Math.random())数字的数组,我已经使用冒泡排序对它们进行了排序 例如: 如果随机抛出死在{1,2,1,2,1),那么在被下面的代码检查之前它们将被排序到{1,1,1,2,2},该代码在返回布尔值的方法内

int count = 0;
if(die[0] == die[1] && die[1] == die[2] || die[0] == die[1] && die[2] != die[1]){
    count++;
}
    if(die[3] == die[4]){
        count++;
    }
    if(count > 1){
        return true;
    }
    return false;

3 个答案:

答案 0 :(得分:1)

比排序然后测试需要的更复杂。它也慢了。试试这个,计算每个数字的出现次数,并检查你是否有3和2.你不需要先对数组进行排序。

int[] counts = new int[6];
for (int i=0; i<die.length; i++)
    //increase the relevant counter
    counts[die[i]-1]++;
//now check we've got a 2 and a 3
boolean check2 = false;
boolean check3 = false;
for (int i: counts) {
    check2 |= (i==2); //found 2 of some number
    check3 |= (i==3); //found 3 of some number
}
return (check2 && check3);

请注意,对于Yahtzee,这将返回false,其中所有五个都相同。如果您希望返回check5,添加true以允许此操作会很容易。 (实际上它应该返回true,因为如果你愿意的话,可以将Yahtzee算作满屋。)它会变成:

int[] counts = new int[6];
for (int i=0; i<die.length; i++)
    //increase the relevant counter
    counts[die[i]-1]++;
//now check we've got a 2 and a 3
boolean check2 = false;
boolean check3 = false;
for (int i: counts) {
    check2 |= (i==2); //found 2 of some number
    check3 |= (i==3); //found 3 of some number
    if (i==5) return true; //found a Yahtzee so stop and return true
}
return (check2 && check3);

顺便说一下,你真的不应该对任何东西使用冒泡排序,即使你不会注意到它只有五个元素的数组的低效率......

答案 1 :(得分:0)

如果您想检查代码的正确性,我会推荐单元测试(例如,使用Junit)。 尝试尽可能多地测试案例,使用参数化测试可能有所帮助。 请参阅:http://examples.javacodegeeks.com/core-java/junit/junit-parameterized-test-example/

答案 2 :(得分:0)

你会检查有多少数字,所以你的基础算法是这样的:

int[] amount = { 0, 0, 0, 0, 0, 0 }

for(int i = 0; i < dices.length; i++ ) { // dices is your integer array
   switch( dices[i] ) {
      case 1: amount[1] += 1; break;
      // all other cases up to 6
    }
 }

 // from the amount array you can check for other things too, here it is for the full house:
 boolean got3same = false;
 boolean got2same = false;
 for(int i = 0; i < amount.ength && (!got3same || !got2same); i++) {
       if(!got3same && amount[i] == 3) {
          got3same = true; 
       } else if(!got2same && amount[i] == 2) {
          got2same = true;
       }
  }

  if(got3same && got2same) {
      System.out.println("Full House!");
  }