我正在制作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;
答案 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!");
}