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)
        {
            // ...
        }
    }

2 番目の条件は決して実行されません...。2 番目の条件は、最初の条件がすでに満たされている場合にのみ満たされます。

最小限の修正は、これらの 2 つのブロックの順序を変更すること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]);

isFullHousetrue正確に2つの異なる数値のみであり、ソートされた配列では、最初の数値が2番目の数値と等しく、最後から2番目の数値が最後の数値と同じである場合になります。

これはすべての を回避しif、複雑な論理アルゴリズムではなく、簡単な論理アルゴリズムです。

于 2013-03-27T22:24:03.830 に答える
0

あなたがやっているように、すべてのサイコロの値をチェックすることで、ほぼ確実にケースを見逃しています。

これが私がすることです:

最初の値を取り、その値に等しいサイコロの数を数えます。2 番目の値がある場合は、その値に等しいサイコロの数を数えます。2 カウントが 2 と 3 (または 3 と 2) の場合は、フルハウスです。

これはヤッツィーに似ているため、このようなアルゴリズムは、スリーオブアカインド、フォーオブアカインド、およびヤッツィー用に簡単に変更できます。

于 2013-03-27T22:27:57.473 に答える