0
import java.util.ArrayList;
import java.lang.Math;

public class War {
    ArrayList deck = new ArrayList(0);
    ArrayList player1 = new ArrayList(0);
    ArrayList player2 = new ArrayList(0);
    int sum1 = 0;
    int sum2 = 0;
    int count = 0;

private void setup ()
{
    for (int x = 1; x <= 13; x++)
    {
        for (int y = 1; y <= 4; y++)
        {
            deck.add(x);
        }
    }

    while (deck.size() > 26)
    {
        double x = Math.random() * deck.size();
        int y = (int) x;

        player1.add(deck.remove(y));
    }

    while (deck.size() > 0)
    {
        double x = Math.random() * deck.size();
        int y = (int) x;

        player2.add(deck.remove(y));
    }

    for (int x = 0; x < 26; x++)
    {
        sum1 += (int) player1.get(x);
        sum2 += (int) player2.get(x);
    }

    System.out.println("Player 1's starting power is " + sum1 + ".");
    System.out.println();
    System.out.println("Player 2's starting power is " + sum2 + ".");
    System.out.println();

    if (sum1 == sum2)
    {
        System.out.println("The two player's starting powers are equal! This'll be a good one, folks!");
    }
}

public void play ()
{
    if (hasSomeoneWon() || count == 0)
    {
        setup();
    }

    while (!player1.isEmpty() && !player2.isEmpty())
    {
        int a = (int) player1.get(0);
        int b = (int) player2.get(0);

        if (a > b)
        {
            player1.add(player1.remove(0)); // The winner's card is re-added to his deck before
            player1.add(player2.remove(0)); // the loser's is added to the winner's deck.
        }

        if (a < b)
        {
            player2.add(player2.remove(0));
            player2.add(player1.remove(0));
        }

        if (a == b)
        {
            war();
        }
    }

    victory();
}

private void war ()
{
    ArrayList temp1 = new ArrayList(0);
    ArrayList temp2 = new ArrayList(0);
    temp1.add(player1.remove(0));
    temp2.add(player2.remove(0));
    int x = 0;

    while (!(player1.isEmpty() || player2.isEmpty()) && x < 3)
    {
        temp1.add(player1.remove(0));
        temp2.add(player2.remove(0));
        x++;
    }

    int a = (int) temp1.get(temp1.size() - 1);
    int b = (int) temp2.get(temp2.size() - 1);

    if (a == b)
    {
        if (temp1.size() != temp2.size())
        {
            if (temp1.size() > temp2.size())
            {
                while (!temp1.isEmpty())
                {
                    player1.add(temp1.remove(0));
                }

                while (!temp2.isEmpty())
                {
                    player1.add(temp2.remove(0));
                }
            }

            else
            {
                while (!temp2.isEmpty())
                {
                    player2.add(temp2.remove(0));
                }

                while (!temp1.isEmpty())
                {
                    player2.add(temp1.remove(0));
                }
            }
        }

        else
        {
            if (player1.isEmpty() || player2.isEmpty())
            {
                if (player1.isEmpty())
                {
                    while (!temp2.isEmpty())
                    {
                        player2.add(temp2.remove(0));
                    }

                    while (!temp1.isEmpty())
                    {
                        player2.add(temp1.remove(0));
                    }
                }

                else
                {
                    while (!temp1.isEmpty())
                    {
                        player1.add(temp1.remove(0));
                    }

                    while (!temp2.isEmpty())
                    {
                        player1.add(temp2.remove(0));
                    }
                }
            }

            else
            {
                war();
            }
        }
    }

    else
    {
        if (a > b)
        {
            while (!temp1.isEmpty())
            {
                player1.add(temp1.remove(0));
            }

            while (!temp2.isEmpty())
            {
                player1.add(temp2.remove(0));
            }
        }

        else
        {
            while (!temp2.isEmpty())
            {
                player2.add(temp2.remove(0));
            }

            while (!temp1.isEmpty())
            {
                player2.add(temp1.remove(0));
            }
        }

        play();
    }
}

private void victory ()
{
    if (player1.isEmpty() && sum2 > sum1)
    {
        System.out.println("Player 2 has won!");
    }

    if (player1.isEmpty() && sum1 > sum2)
    {
        System.out.println("Upset! Player 2 has won!");
    }

    if (player2.isEmpty() && sum1 > sum2)
    {
        System.out.println("Player 1 has won!");
    }

    if (player2.isEmpty() && sum2 > sum1)
    {
        System.out.println("Upset! Player 1 has won!");
    }

    hasSomeoneWon();
}

private boolean hasSomeoneWon ()
{
    if (player1.isEmpty() || player2.isEmpty())
    {
        count++;
        return true;
    }

    return false;
}

}

すべてのコードを含めて申し訳ありませんが、どの部分が余分な印刷を引き起こしているのかわかりません。

これはカードゲーム戦争です。2人のプレイヤー間でゲームをプレイし、勝者を印刷することになっています。しかし、私がそれをプレイするたびに、勝利メッセージ(どちらが印刷されるか)は可変回数印刷されます。これは、いくつかのメソッドへの呼び出し、またはwar()メソッド内のwarへの再帰呼び出しをどこにどのくらいの頻度で含めたかに関係していると思います。

私がJavaを使った唯一の経験は、この学年に受講したAP Computer Scienceのクラスです。したがって、これを読んでいるすべての人の基準からすると、間違いなく初心者です。

4

1 に答える 1

0

このwar()メソッドでは、再帰的に呼び出しwar()ており、war()最終的にはを呼び出すことで終了しplay()ます。したがって、を実行する複数のインスタンスがありますplay()。最終的に、1人のプレーヤーのカードがなくなると、スタックが巻き戻されて実行が継続されるため、このすべてのインスタンスが復活しますplay()。そして最後にもちろんvictory()、それを複数回呼び出して印刷します(呼び出された回数である必要がありますwar())。

したがって、各war()は、再帰の最下部に到達すると、プレーヤーが勝ったことを出力する場合があります。play()inの呼び出しは必要ないと思います。とにかくメソッドを終了するwar()と、メソッドに戻ります。play()war()

于 2012-05-26T03:45:42.807 に答える