0

IB Math の内部評価用のプログラムを書いています。

クラス Calc、Gamble、Inventory、Player、および Test があります。フィールド インスタンス変数 Players (コンストラクターでインスタンス化) とメソッド playrounds があり、そこに問題があります。メソッドのソースは次のとおりです。

    ArrayList<Player> Players;

    public ArrayList<ArrayList<ArrayList<Player>>> playrounds(boolean randombets, double initialmoney, double initialbet,
        double betrange, int numberofrounds){

    ArrayList<Player> winningPlayers = new ArrayList<>(0);
    ArrayList<ArrayList<Player>> m = new ArrayList<>(0);
    for(int b = 0; b < numberofrounds; b++){
        if(firstround){
            firstround = false;
            preparePlayersfirst(randombets, initialmoney, initialbet, betrange);
            winningPlayers.clear();
            winningPlayers.trimToSize();
            m.clear();
            m.trimToSize();
        }
        else{
            preparePlayersnext(randombets, initialbet, betrange);
        }
        for(int a = 0; a < playingPlayers.size(); a++){
            Player u = playingPlayers.get(a);
            u.rolldice();
            u.checkdice();
            Players.set(a, u);
            playingPlayers.set(a, u);
        }
        Player t = getwinningPlayer();
        for(int a = 0; a < playingPlayers.size(); a++){
            Player u = playingPlayers.get(a);
            u.setprofits(t, this);
            Players.set(a, u);
            playingPlayers.set(a, u);
        }
        distributegainslosses();
        removebankruptPlayers();
        winningPlayers.add(t);
        m.add(Players);
        for(int x = 0; x < m.size(); x++){
            for(Player y: m.get(x)){
                for(int z = 0; z < y.getdice().size(); z++){
                    System.out.print(y.getdie(z) + " ");
                }
                System.out.print("\t");
            }
            System.out.println();
        }
        System.out.println();
    }
    ArrayList<ArrayList<ArrayList<Player>>> results = new ArrayList<>(0);
    ArrayList<ArrayList<Player>> t = new ArrayList<>(0);
    t.add(winningPlayers);
    results.add(t);
    results.add(m);

    return results;

}

変数 m 内の値を表示する for ループは、次のような出力を提供します

6 4
6 4

5 5
5 5
5 5

6 1
6 1
6 1
6 1

予想される出力は次のようなものです:
2 3

2 3
6 4

2 3
6 4
5 5

2 3
6 4
5 5
6 1

値を出力する方法が間違っていないことはわかっています。重複を印刷しません。if(firstround) と else は問題とは関係ありません。
どんな助けでも大歓迎です。

-編集- @NPE
:あなたが提案した場所から解決策の1つを試しました。それでもうまくいきません。私がやったことのコードは次のとおりです。

    public ArrayList<Player> clonePlayers(){

        ArrayList<Player> clone = new ArrayList<>(0);
        for(Player a: Players){
            clone.add(new Player(a));
        }

        return clone;

    }

私は何か間違ったことをしましたか?

4

1 に答える 1

3

m問題は、同じ参照を何度も何度も挿入することです。

   m.add(Players);

のエントリをm互いに独立させる必要がある場合は、同じオブジェクトへの参照ではなく、異なるオブジェクトである必要があります。

于 2013-01-30T09:04:41.557 に答える