3

私は Java の完全な初心者であり、クラスとメソッド間でオブジェクトを渡す方法を理解するのに苦労しています。ある程度の進歩はありましたが、for ループ内でトランプを作成しようとすると、アプリが失敗します。ループを削除すると正常に動作します。エラーを含むクラスの最初の部分を次に示します。

public class Testing
{
    public static void main(String[] args)
    {

   int Deal = 1;

   for(int Hand = 0; Hand < Deal; ++Hand)
   {
     //instantiate and derive values for Player
     Card card1 = new Card();
     card1.setSuit();  //assign card 1's suit
     card1.setValue(); //asign card 1's value

     //instantiate and derive values for Computer
     Card card2 = new Card();
     card2.setSuit();  //assign card 2's suit
     card2.setValue(); //assign card 2's suit

     //compare the two cards and make sure they are different
     cardCompare(card1,card2);
   }

   //output the two cards to the screen
   output(card1,card2);

}

これは私が得るエラーです:

Testing.java:26: error: cannot find symbol
   output(card1,card2);
          ^
  symbol:   variable card1
  location: class Testing

Testing.java:26: error: cannot find symbol
   output(card1,card2);
                ^
  symbol:   variable card2
  location: class Testing
2 errors

for ループを削除するとコードが機能するため、何らかの方法で card1 と card2 という名前がループの外に表示されないと想定していますか? 10 枚か 20 枚のカードを作成したい場合は、それをループで実行したいので、新しいオブジェクトをインスタンス化し、プログラムの他の場所でそれらを使用することについて何かが欠けているに違いありません。

ご協力いただきありがとうございます。

**更新: 最初のフィードバックをありがとう。インスタンス化ステートメントを for ループの外に移動すると、理論的には、ループを使用してそれらのオブジェクトに新しい値を何度も割り当てることができることがわかりました。これだけで、この特定のタスクを完了することができます。

私はまだ興味がありますが、ループ内で新しいオブジェクトをインスタンス化することはできませんが、ループの外でそれらを使用することはできますか? これは何とか可能にならなければならないようです。

public class Testing
   {
    public static void main(String[] args)
   {

int Deal = 1;

   //instantiate and derive values for Player
     Card card1 = new Card();

      //instantiate and derive values for Computer
     Card card2 = new Card();

   for(int Hand = 0; Hand < Deal; ++Hand)
   {
     card1.setSuit();  //assign card 1's suit
     card1.setValue(); //asign card 1's value

     card2.setSuit();  //assign card 2's suit
     card2.setValue(); //assign card 2's value

    //compare the two cards and make sure they are different
     cardCompare(card1,card2);
   }


   //output the two cards to the screen
   output(card1,card2);


}
4

3 に答える 3

5

card1 および card 変数は for ループ内で宣言されているため、ループ内でのみ表示されます。ループの外で使用するには、ループの前に宣言する必要があります。Javaスコープ規則をよく読んでください。

于 2012-05-04T18:39:43.747 に答える
2

card1との両方がループcard2のスコープ内にあり、 の残りの部分ではありません。初期化を の前に移動します。formain()for

于 2012-05-04T18:40:15.460 に答える
0

現状では、カード 1 とカード 2 を上書きしようとし続けます。宣言と初期化の両方が「ディール」回になるからです。さらに、さらに重要なことに、それらは範囲外になります。代わりに、事前に宣言し、ループ内でのみ初期化してください。

ここでおそらく必要なのは次のとおりです。

public class Testing
   {
    public static void main(String[] args)
   {

 int Deal = 1;

 ArrayList<Card> playerCards = new ArrayList<Card>();
 ArrayList<Card> computerCards = new ArrayList<Card>();

  //instantiate and derive values for Player
 Card card1;

 //instantiate and derive values for Computer
 Card card2;

 for(int Hand = 0; Hand < Deal; ++Hand)
 {
    card1 = new Card();
    card1.setSuit();  //assign card 1's suit
    card1.setValue(); //asign card 1's value

    card2 = new Card();
    card2.setSuit();  //assign card 2's suit
    card2.setValue(); //assign card 2's value



   //compare the two cards and make sure they are different
   cardCompare(card1,card2);

   playerCards.Add(card1);
   computerCards.Add(card2);

}

  //output the two cards to the screen

  output(card1,card2);

}

テストしていませんが、動作するはずです。

また、Output メソッドの使用についても再考する必要があります。1 人 20 枚までのカードを持っているので、いつユーザーにカードを見せる必要があると思いますか? 現在、for ループの外にあるため、それぞれに割り当てられた LAST 値のみが表示されます。獲得している各カードを表示したい場合は、出力呼び出しを for ループ内に置き、Thread.Sleep() を使用してプログラムを 0.5 秒ほど一時停止し、獲得した各カードを表示できるようにします。または、カードの ArrayList を受け入れる出力のオーバーロードを記述し、それらすべてを同時に出力します。もう一度言いますが、それについて助けが必要な場合は、私に尋ねてください。

ところで、 cardcompare() が実際に裏で何をしているのかはわかりませんが、おそらく違いがあるかどうかを表す bool を返すようにしたいと思うでしょう。何かのようなもの:

bool areCardsDistinct = cardcompare(card1,card2);

そうすれば、結果を使用して、ランダムな新しいカードを再度取得するかどうかを決定できます

于 2012-05-04T20:35:03.780 に答える