1

簡単なサッカー シミュレーション プログラムを作成しようとしていますが、チーム同士のマッチングに問題があります。if ステートメントは、1 つの条件を見つけた後にループを終了します。しかし、私は2つの条件と2つの操作をしたいです。出来ますか?

package soccer.simulator;
import java.util.Random;
/**
 * @author Sertac
 */
public class SoccerSimulator {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int HomeTeamScore = 0;
        int AwayTeamScore = 0;
        Random randomGenerator = new Random();

        String HomeTeam = new String();
        String AwayTeam = new String();
        int HomeTeamID = randomGenerator.nextInt(10);
        int AwayTeamID = randomGenerator.nextInt(10);

        if(HomeTeamID == AwayTeamID){
            while (HomeTeamID != AwayTeamID){
                AwayTeamID = randomGenerator.nextInt(10);
            }
        }

        if(HomeTeamID == 0 || AwayTeamID == 0){
            if(HomeTeamID == 0){
                HomeTeam = "Arsenal";
            }else{
                AwayTeam = "Arsenal";
            }
        } else if(HomeTeamID == 1 || AwayTeamID == 1){
            if(HomeTeamID == 1){
                HomeTeam = "Barcelona";
            }else{
                AwayTeam = "Barcelona";
            }
        } else if(HomeTeamID == 2 || AwayTeamID == 2){
            if(HomeTeamID == 2){
                HomeTeam = "Bayern Munich";
            }else{
                AwayTeam = "Bayern Munich";
            }
        } else if(HomeTeamID == 3 || AwayTeamID == 3){
            if(HomeTeamID == 3){
                HomeTeam = "Chelsea";
            }else{
                AwayTeam = "Chelsea";
            }
        } else if(HomeTeamID == 4 || AwayTeamID == 4){
            if(HomeTeamID == 4){
                HomeTeam = "Borussia Dortmund";
            }else{
                AwayTeam = "Borussia Dortmund";
            }
        } else if(HomeTeamID == 5 || AwayTeamID == 5){
            if(HomeTeamID == 5){
                HomeTeam = "Galatasaray";
            }else{
                AwayTeam = "Galatasaray";
            }
        } else if(HomeTeamID == 6 || AwayTeamID == 6){
            if(HomeTeamID == 6){
                HomeTeam = "Juventus";
            }else{
                AwayTeam = "Juventus";
            }
        } else if(HomeTeamID == 7 || AwayTeamID == 7){
            if(HomeTeamID == 7){
                HomeTeam = "Manchester United";
            }else{
                AwayTeam = "Manchester United";
            }
        } else if(HomeTeamID == 8 || AwayTeamID == 8){
            if(HomeTeamID == 8){
                HomeTeam = "Milan";
            }else{
                AwayTeam = "Milan";
            }
        } else if(HomeTeamID == 9 || AwayTeamID == 9){
            if(HomeTeamID == 9){
                HomeTeam = "Real Madrid";
            }else{
                AwayTeam = "Real Madrid";
            }
        }

        //Generating each random integers in range 0..99 for 90 minutes
        for(int minutes = 0; minutes <= 90; minutes++){
            int randomInt = randomGenerator.nextInt(100);

            //if random int equals 0,1,2 home team scores
            if(randomInt < 3){ HomeTeamScore = HomeTeamScore + 1; }

            //if random int equals 98,99 away team scores
            //home team has 1 more int because playing at home is better
            if(randomInt > 97){ AwayTeamScore = AwayTeamScore + 1; }                         
        }
        System.out.println ("Simulation for match of the week:");
        System.out.println (HomeTeam + " " + HomeTeamScore + " - " + AwayTeamScore + " " + AwayTeam);

        }   
    }

出力は次のとおりです。 3 - 1 Arsenal

また: Arsenal 2 - 1

4

5 に答える 5

5

ループがまったくないため、チーム名を 1 つだけ設定します。巨大なif-elseステートメントで最終条件が 1 つだけ真になります。より簡単なアプローチ (近い将来コードに触れる他の人のために正気を保つために強くお勧めします) は、チーム名を配列に保存することです.-

String[] teamNames = new String[] {"Arsenal", "Barcelona", "Bayern Munich", "Chelsea", "Borussia Dortmund", "Galatasaray", "Juventus", "Manchester United", "Milan", "Real Madrid"};

そして、全体をif-elsefor.-に置き換えます。

HomeTeam = teamNames[HomeTeamID];
AwayTeam = teamNames[AwayTeamID];

補足として、変数の命名には Java の規則に従い、小文字のキャメルケース ( homeTeam, awayTeam, homeTeamID, awayTeamId) を使用する必要があります。

于 2013-11-03T10:13:44.260 に答える
0

else if を if に置き換えれば、コードは正常に動作するはずです。

于 2013-11-03T10:16:02.007 に答える
0

私は最初から始めます。あなたがやろうとしていることは何ですか。

いくつかのチームが与えられた場合、2 つのランダムなチームを選択して対戦させたいとします。1 つはホーム、もう 1 つはアウェイです。

int現在、 から 2 つのランダム ID を選択Randomし、それらを使用して暗黙のチーム配列でチームを検索しています。

したがって、最初に @ssantos の提案に従います。配列を明示的にして、そこからインデックスを取得するだけです。

しかし、私たちには問題があります - チームは自分自身をプレイすることはできません. したがって、実際には少し異なるアプローチが必要です。必要なことは、すべてのチームの配列を取得してシャッフルし、配列からペアを読み取ることです。これは実際、トーナメントでの選択がどのように機能するかです。

これが私の提案するコードです:

private static final String[] TEAM_NAMES = new String[]{"Arsenal", "Barcelona", "Bayern Munich", "Chelsea", "Borussia Dortmund", "Galatasaray", "Juventus", "Manchester United", "Milan", "Real Madrid"};
private static final Random RANDOM = new Random();

public static void main(final String args[]) {
    List<String> teams = new ArrayList<>(Arrays.asList(TEAM_NAMES));
    while (teams.size() > 1) {
        teams = playRound(teams);
    }
    System.out.println("The champion is " + teams);
}

public static List<String> playRound(final List<String> teams) {
    Collections.shuffle(teams);
    final Iterator<String> teamsIter = teams.iterator();
    final List<String> winners = new ArrayList<>();
    while (teamsIter.hasNext()) {
        final String winner = play(teamsIter.next(), teamsIter.next());
        winners.add(winner);
    }
    return winners;
}

public static String play(final String team1, final String team2) {
    return RANDOM.nextBoolean() ? team1 : team2;
}

上から:

まず、チームの配列とRandomインスタンスの定数を宣言します。これらの変数はstatic final、 で名前が付けられているためBLOCK_CAPITALSです。

主要

次に outmainメソッドです。このメソッドは、チームを受け取り、List. team 配列をいじらないように、teams のコピーを作成する必要があります。List後で説明するように、Aはより柔軟な構造です。また、チームの 2 の累乗が必要であることに注意してください。チームがペアでプレーする場合、各ラウンドで 2 で割り切れる数が必要です。

メソッドはwhileループに入ります。この構造は、最終的な勝者であるトーナメント チャンピオンに到達するまで、各ラウンドのすべての勝者チームを互いに対戦させ続けます。チャンピオンの名前を出力します。

プレイラウンド

ここで魔法が起こります。

このメソッドは、最初にshuffles着信するチームをランダムに取得するようにします。Iterator次に、 forを取得します。これにより、要素Listごとに移動できます。Listこれは、チームの数が偶数でない場合にエラーがスローされる場所でもあります - 2番目next()NoSuchElementException.

次に、メソッドは別のwhileループに入ります -Iteratorが空でない間、 play2 つのチームで呼び出します。勝ったチームを に入れwinners Listます。これがList最終的に返される です。

動的に入力できるようにaListにメソッドがあるわけではありません。これは、固定サイズの配列とは異なります。add

遊ぶ

これは、実際のシミュレーションが行われる場所です。現在、勝者をランダムに選択します - 現在の方法を入れることができます.

于 2013-11-03T10:28:21.447 に答える
0

問題はここにあります:

if(HomeTeamID == 0 || AwayTeamID == 0){
            if(HomeTeamID == 0){
                HomeTeam = "Arsenal";
            }else{
                AwayTeam = "Arsenal";
            }
        } else if(HomeTeamID == 1 || AwayTeamID == 1){
            if(HomeTeamID == 1){
                HomeTeam = "Barcelona";
            }else{
                AwayTeam = "Barcelona";
            }
        } else if(HomeTeamID == 2 || AwayTeamID == 2){
            if(HomeTeamID == 2){
                HomeTeam = "Bayern Munich";
            }else{
                AwayTeam = "Bayern Munich";
            }
        } else if(HomeTeamID == 3 || AwayTeamID == 3){
            if(HomeTeamID == 3){
                HomeTeam = "Chelsea";
            }else{
                AwayTeam = "Chelsea";
            }
        } else if(HomeTeamID == 4 || AwayTeamID == 4){
            if(HomeTeamID == 4){
                HomeTeam = "Borussia Dortmund";
            }else{
                AwayTeam = "Borussia Dortmund";
            }
        } else if(HomeTeamID == 5 || AwayTeamID == 5){
            if(HomeTeamID == 5){
                HomeTeam = "Galatasaray";
            }else{
                AwayTeam = "Galatasaray";
            }
        } else if(HomeTeamID == 6 || AwayTeamID == 6){
            if(HomeTeamID == 6){
                HomeTeam = "Juventus";
            }else{
                AwayTeam = "Juventus";
            }
        } else if(HomeTeamID == 7 || AwayTeamID == 7){
            if(HomeTeamID == 7){
                HomeTeam = "Manchester United";
            }else{
                AwayTeam = "Manchester United";
            }
        } else if(HomeTeamID == 8 || AwayTeamID == 8){
            if(HomeTeamID == 8){
                HomeTeam = "Milan";
            }else{
                AwayTeam = "Milan";
            }
        } else if(HomeTeamID == 9 || AwayTeamID == 9){
            if(HomeTeamID == 9){
                HomeTeam = "Real Madrid";
            }else{
                AwayTeam = "Real Madrid";
            }
        }

ここで間違った構造を使用しているため、U は常にホーム チームまたはアウェイ チームのいずれか 1 つのチームのみを割り当てます。次のようなものを試してください:

switch(HomeTeamID)
{
case 0: HomeTeam = "Arsenal";
        break;
case 1: HomeTeam = "Barcelona";
...
break
}

離れたチームでも同じ:

switch(HomeTeamID)
{
case 0: AwayTeam = "Arsenal";
        break;
case 1: AwayTeam = "Barcelona";
...
break
}

また、Java コードの規則を確認する必要があります。変数名は小文字で始める必要があります。

于 2013-11-03T10:13:59.193 に答える