1

ゲームのルール (game=hra) を定義するクラス Hra1 があります。問題は、コンストラクターで配列poleMinciが作成されているにもかかわらず、null値、たとえばpoleMinci==nullを取得していることです。つまり、プレイヤーの move メソッドは常に false を返します。

コンストラクタ:

public Hra1()
{
    Mince [] poleMinci = new Mince[20];
    poleMinci[0] = new Mince("stříbrná", "coin.png");
    poleMinci[3] = new Mince("stříbrná", "coin.png");
    poleMinci[4] = new Mince("zlatá", "coin_gold.png");
    poleMinci[8] = new Mince("stříbrná", "coin.png");
    poleMinci[10] = new Mince("stříbrná", "coin.png");
    poleMinci[12] = new Mince("stříbrná", "coin.png");
}

プレイヤーの移動方法:

public boolean tahHrace(Tah tah){
    if (poleMinci != null){
        int odkud = tah.getZPozice();
        int kam = tah.getNaPozici();
        boolean kamPrazdne;
        if (poleMinci [kam] != null) 
            kamPrazdne = false;
            else 
            kamPrazdne = true;

        if (kam > odkud && poleMinci [odkud] != null && kamPrazdne == true){
            poleMinci [kam] = poleMinci [odkud];
            poleMinci [odkud] = null;
            System.out.println("hráč táhl z pozice "+tah.getZPozice()
            + " na pozici "+tah.getNaPozici());
            return true;
        }
        else
             return false;

    }
    else
    return false;
}
4

1 に答える 1

6

変数をシャドウしています:

public Hra1()
{
    // the following variable's *scope* is inside of this constructor only
    // outside of the constructor, the local variable below doesn't exist.
    Mince [] poleMinci = new Mince[20]; 

    poleMinci[0] = new Mince("stříbrná", "coin.png");
    poleMinci[3] = new Mince("stříbrná", "coin.png");
    poleMinci[4] = new Mince("zlatá", "coin_gold.png");
    poleMinci[8] = new Mince("stříbrná", "coin.png");
    poleMinci[10] = new Mince("stříbrná", "coin.png");
    poleMinci[12] = new Mince("stříbrná", "coin.png");
}

そのコンストラクターでは、poleMinci がコンストラクター内で宣言されているため、コンストラクター内でのみ表示されます。クラスに同じ名前の変数がある場合、それは null になります。これを修正するには、変数をローカルで再宣言しないでください。行う:

public Hra1()
{

    // Mince [] poleMinci = new Mince[20]; // **** not this ****
    poleMinci = new Mince[20]; // **** but this. note the difference? ****

    poleMinci[0] = new Mince("stříbrná", "coin.png");
    poleMinci[3] = new Mince("stříbrná", "coin.png");
    poleMinci[4] = new Mince("zlatá", "coin_gold.png");
    poleMinci[8] = new Mince("stříbrná", "coin.png");
    poleMinci[10] = new Mince("stříbrná", "coin.png");
    poleMinci[12] = new Mince("stříbrná", "coin.png");
}

この問題の詳細については、Variable Shadowingを参照してください。ほとんどの IDE は、これを行っている可能性があることを警告するか、またはこれを許可する設定を持っています。私は Eclipse を使用しており、IDE を警告するように設定しています。あなたもこれをしたいかもしれません。

于 2013-11-02T14:18:18.870 に答える