【问题标题】:Method for calculating Full House not working计算满屋不工作的方法
【发布时间】:2013-03-27 22:17:17
【问题描述】:

这是我使用 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;
}

【问题讨论】:

    标签: java if-statement methods


    【解决方案1】:

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

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

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

    最小的解决办法是重新排序这两个if-blocks。

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

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

    你明白为什么吗?

    【讨论】:

    • 我想我明白了。所以只要d1 != d5,就可以用else if判断是否满座?
    • 顺便感谢您的帮助,不胜感激。
    • @Castellanos:是的; d1 == d5 检查确保有(至少)两个不同的 die 值,(d1 == d2 && d3 == d5) || (d1 == d3 && d4 == d5) 检查确定我们是否有 {a,a,b,b,b} 或 {a,a,a,b, b}(两种类型的满堂彩,前提是 ab 是不同的)。而且——不客气。 :-)
    • 是的,它有效!感谢您的解释,这真的很有帮助!
    【解决方案2】:

    我会这样解决:

    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 如果您只有 2 个不同的数字,并且在已排序的数组中,第一个等于第二个,倒数第二个与最后一个相同。

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

    【讨论】:

    • 我同意你的解决方案,但没有必要测试 die[0] == die[1] 和 die[3] == die[4]。如果 set.size() == 2,那么其余的总是正确的。你不同意吗?
    • 我们还没有学习过 HashSets,所以我会觉得使用其中一个会很不舒服。不过感谢您的帮助,我真的很感激。
    • @DiogoSantana:不,想想 1,1,1,1,6。 set.size() == 2,但它不是满座。
    • 听起来像番石榴这样的多重集合的工作
    • @MichaelDeardeuff:虽然我是番石榴的忠实粉丝,但我不明白MultiMap 如何改进代码以检查int[] 是否代表满座。
    【解决方案3】:

    通过像您一样检查所有骰子值,您几乎肯定会丢失案例。

    我会这样做:

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

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

    【讨论】:

    • 是的,是的。这三个功能对我有用。这只是满屋和小直
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2018-01-13
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多