0

这是我使用 5 个骰子计算满屋的代码。现在有些数字会起作用,比如如果我掷出 1、6、6、6、1。但如果我掷出 4、4、5、5、4。它不会起作用,我也不知道。我知道有很多 if 语句,它本来可以做得更好,但我是一个初学者程序员,这是我觉得很舒服的事情,因为我不能做一个复杂的逻辑算法。谢谢。

        Arrays.sort(die);
        int score = 0;

        int d1 = die[0];
        int d2 = die[1];
        int d3 = die[2];
        int d4 = die[3];
        int d5 = die[4];


        if (d1 == 1)
        {
            if (d1 == 1 && d2 == 1)
            {
                if (d3 == 2 && d4 == 2 && d5 == 2)
                {
                    score = 25;
                }
                if (d3 == 3 && d4 == 3 && d5 == 3)
                {
                    score = 25;
                }
                if (d3 == 4 && d4 == 4 && d5 == 4)
                {
                    score = 25;
                }
                if (d3 == 5 && d4 == 5 && d5 == 5)
                {
                    score = 25;
                }
                if (d3 == 6 && d4 == 6 && d5 == 6)
                {
                    score = 25;
                }
            }
            else if (d1 == 1 && d2 == 1 && d3 == 1)
            {
                if (d4 == 2 && d5 == 2)
                {
                    score = 25;
                }
                if (d4 == 3 && d5 == 3)
                {
                    score = 25;
                }
                if (d4 == 4 && d5 == 4)
                {
                    score = 25;
                }
                if (d4 == 5 && d5 == 5)
                {
                    score = 25;
                }
                if (d4 == 6 && d5 == 6)
                {
                    score = 25;
                }
            }
        }
        if (d1 == 2)
        {
            if (d1 == 2 && d2 == 2)
            {
                if (d3 == 3 && d4 == 3 && d5 == 3)
                {
                    score = 25;
                }
                if (d3 == 4 && d4 == 4 && d5 == 4)
                {
                    score = 25;
                }
                if (d3 == 5 && d4 == 5 && d5 == 5)
                {
                    score = 25;
                }
                if (d3 == 6 && d4 == 6 && d5 == 6)
                {
                    score = 25;
                }
            }
            else if (d1 == 2 && d2 == 2 && d3 == 2)
            {
                if (d4 == 3 && d5 == 3)
                {
                    score = 25;
                }
                if (d4 == 4 && d5 == 4)
                {
                    score = 25;
                }
                if (d4 == 5 && d5 == 5)
                {
                    score = 25;
                }
                if (d4 == 6 && d5 == 6)
                {
                    score = 25;
                }   
            }
        }
        if (d1 == 3)
        {
            if (d1 == 3 && d2 == 3)
            {
                if (d3 == 4 && d4 == 4 && d5 == 4)
                {
                    score = 25;
                }
                if (d3 == 5 && d4 == 5 && d5 == 5)
                {
                    score = 25;
                }
                if (d3 == 6 && d4 == 6 && d5 == 6)
                {
                    score = 25;
                }
            }
            else if (d1 == 3 && d2 == 3 && d3 == 3)
            {
                if (d4 == 4 && d5 == 4)
                {
                    score = 25;
                }
                if (d4 == 5 && d5 == 5)
                {
                    score = 25;
                }
                if (d4 == 6 && d5 == 6)
                {
                    score = 25;
                }
            }
        }
        if (d1 == 4)
        {
            if (d1 == 4 && d2 == 4)
            {
                if (d3 == 5 && d4 == 5 && d5 == 5)
                {
                    score = 25;
                }
                if (d3 == 6 && d4 == 6 && d5 == 6)
                {
                    score = 25;
                }
            }
            else if (d1 == 4 && d2 == 4 && d3 == 4)
            {
                if (d4 == 5 && d5 == 5)
                {
                    score = 25;
                }
                if (d4 == 6 && d5 == 6)
                {
                    score = 25;
                }
            }
        }
        if (d1 == 5)
        {
            if (d1 == 5 && d2 == 5)
            {
                if (d3 == 6 && d4 == 6 && d5 == 6)
                {
                    score = 25;
                }
            }
            else if (d1 == 5 && d2 == 5 && d3 == 5)
            {
                if (d4 == 6 && d5 == 6)
                {
                    score = 25;
                }
            }
        }
        return score;
    }
    else
        return 0;
}
4

3 回答 3

3

首先 - { 4, 4, 4, 5, 5 } 不起作用的原因是这个结构:

    if (d1 == 4)
    {
        if (d1 == 4 && d2 == 4)
        {
            // ...
        }
        else if (d1 == 4 && d2 == 4 && d3 == 4)
        {
            // ...
        }
    }

永远不会运行第二个...:第二个条件只有在第一个条件已经满足的情况下才会满足。

最小的解决方法是重新排序这两个if块。

更好的解决方法是,不要将所有这些骰子与固定值进行比较,而是将它们相互比较。你已经有了Arrays.sort(die),这是个好主意。完成此操作后,您只需编写以下代码即可检测到满屋:

if (d1 == d5)
{
     // five of a kind
}
else if ((d1 == d2 && d3 == d5) || (d1 == d3 && d4 == d5))
{
     // full house
}

你明白为什么吗?

于 2013-03-27T22:38:36.343 回答
1

我会这样解决它:

Arrays.sort(die);
Set<Integer> set = new HashSet<>();
for (int i : die) {
    set.add(i);
}
boolean isFullHouse = (set.size() == 2) && (die[0] == die[1]) && (die[3] == die[4]);

isFullHouse如果你true只有两个不同的数字,并且在排序后的数组中,第一个等于第二个,倒数第二个与最后一个相同。

这避免了你所有的ifs 并且不是一个复杂的逻辑算法,它是一个简单的逻辑算法。

于 2013-03-27T22:24:03.830 回答
0

通过像您正在做的那样检查所有骰子值,您几乎肯定会丢失案例。

这是我要做的:

取第一个值并计算有多少骰子等于该值。如果有第二个值,请计算您的骰子中有多少等于该值。如果 2 计数是 2 和 3(或 3 和 2),那么你有满堂彩。

这看起来像 Yahtzee,所以这样的算法可以很容易地修改为三种类型、四种类型和一种 Yahtzee。

于 2013-03-27T22:27:57.473 回答