3

RPG スタイルのプログラムを作成していますが、宝物オブジェクトの配列を機能させるのに苦労しています。配列で見つけたすべての宝物を保存して、後で印刷したいと考えています。トレジャークラスのコードは次のとおりです。

private static int x = 0;
Treasure treasureArray[] = new Treasure[20];

public void collectedTreasures(Treasure t){
treasureArray[x] = t;
x++;
}

そしてメインプログラムでは:

GoldTreasure t = new Coin();
hero1.setPoints(t.getCoin());
t.collectedTreasures(t);

お宝オブジェクトの作成は、無限ループ内のスイッチ内です。メソッドを使用して配列を印刷するとき

public void printTreasures(){
        for (int y=0 ; y<x ; y++){
            System.out.print(treasureArray[y] + ", ");

配列に必要な数の宝物に対してのみ「null」を取得します。t.collectedTreasures(t) の後に配列を出力すると、最後の宝物だけがそこにあり、そのオブジェクトの前のインデックスは null であることがわかります。私は何を間違えましたか?

はい、初心者です。優しくしてください。

4

3 に答える 3

6

このコードは非常に疑わしいです:

GoldTreasure t = new Coin();
hero1.setPoints(t.getCoin());
t.collectedTreasures(t);

それはあなたが次のことを意味します:

  1. 新しい宝物を作成しtます。
  2. collectedTreasuresまさにそのインスタンスを呼び出します。

宝物自体ではなく、ヒーローに宝物の配列を割り当てる必要があります。

またx、すべてのインスタンス間で共有されるため、静的変数であってはなりません。宝の配列はインスタンスごとであるため、明らかにあなたの意図ではありません。

于 2013-01-18T13:10:48.520 に答える
0

問題は、宝物に属する collect 関数を呼び出してそれ自体を収集するため、宝物自体を収集することです。

後で printTreasures を呼び出すと、どのオブジェクトが実行されるのでしょうか? 宝物の新しいインスタンスを作成し、収集したものを印刷するように依頼しますか? その場合、結果はコードどおりで問題はありませんが、ロジックに問題があります。

あなたがすべきこと: 英雄は宝物を集める人なので、宝物の配列、カウンター、および 2 つの関数 (collectedTreasures と printTreasures) の定義を hero クラスに移動します。さらに、その値はヒーロー間で共有されるため、X を静的にしないでください。たぶん、さらにエレガントに、宝物を処理する追加のクラスを作成し、さまざまなクラスを使用してヒーローを構成します.

また、collectedTreasures(Treasure t) 関数を collectTreasure(Treasure t) に変更することをお勧めします。

于 2013-01-18T13:17:31.610 に答える
0

Treasure詳細な回答を得るには完全なコードを確認する必要がありますが、多くのサブクラスを作成し、それぞれを呼び出していると思われますcollectedTreasure。これにより、グローバルxカウンターが毎回インクリメントされますが、各個人treasureArrayには 1 つのエントリしかありません。

collectedTreasureメソッドをオブジェクトに対応するクラスに移動するhero1と同時に、静的 (グローバル) 変数を取り除き、オブジェクトxの配列を実装 (例: ) に置き換えます。それらはすべて独自のサイズを追跡するので、する必要はありません。さらに、20 を超える宝物を取得しても、コードがクラッシュすることはありません。TreasureListArrayList

于 2013-01-18T13:17:57.240 に答える