2

私は4つの異なるハンドにカードを「配る」ための良い方法を見つけようとしています。

         System.out.println("Deal to 4 Hands: "); 

         Hand hand1 = new Hand();
         Hand hand2 = new Hand();
         Hand hand3 = new Hand();
         Hand hand4 = new Hand();

         hand1.addSingleCard(Deck.deal());
         hand2.addSingleCard(Deck.deal());             
         hand3.addSingleCard(Deck.deal());
         hand4.addSingleCard(Deck.deal());

         hand1.addSingleCard(Deck.deal());
         hand2.addSingleCard(Deck.deal());            
         hand3.addSingleCard(Deck.deal());
         hand4.addSingleCard(Deck.deal());

         System.out.println("Cards left in deck: " + Deck.size());

         System.out.println("Player 1's Hand: \n" + hand1.getHand());
         System.out.println("Player 2's Hand: \n" + hand2.getHand());
         System.out.println("Player 3's Hand: \n" + hand3.getHand());
         System.out.println("Player 4's Hand: \n" + hand4.getHand());

手に対処する簡単な方法はありますか?たとえば、For-Eachループを使用しますか?

私はこれを試しました:しかし、それは機能しません。私は実際にこのタイプのループを使用したことはありません...

         for(Hand card : hand1){
            System.out.println("Player 1's Hand: \n" + hand1);
         }

ちなみに、これは2枚のカードを4つの異なる手札に配り、それぞれの手札を印刷します。

4

8 に答える 8

4

配列を作成してください!

Hand[] hands = new Hand[4];

// create Hand object within the array and deal a single card to each hand
for(int i = 0; i < hands.length; i++) {
    hands[i] = new Hand();
    hands[i].addSingleCard(Deck.deal());
}

// deal an additional card to each hand (use a nested loop for dealing additional cards, if necessary)
for(int i = 0; i < hands.length; i++) {
    hands[i].addSingleCard(Deck.deal());
}

System.out.println("Cards left in deck: " + Deck.size());

for(int i = 0; i < hands.length; i++) {
    System.out.printf("Player %d's hand: \n %s\n", i+1, hands[i]);
}

この配列は4つの個別のHandオブジェクトを保持し、配列を反復処理することですべての手に対して操作を実行できます。

手ごとに4つの異なる名前付き変数(hand1、hand2など)がある場合、操作で変数名(hand1.dealSingleCard()など)を明示的に使用せずに、それらが表すオブジェクトに対して操作を実行する簡単な方法はありません。

配列をループするのが方法です:)

于 2012-11-14T23:02:40.340 に答える
3

これを試して:

 System.out.println("Deal to 4 Hands: "); 

 Hand[] hands=new Hand[4];
 for(int i=0;i<hands.length;i++)
      hands[i]=new Hand();
 for(Hand hand:hands)
      hand.addSingleCard(Deck.deal());
 for(Hand hand:hands)
      hand.addSingleCard(Deck.deal());
 System.out.println("Cards left in deck: " + Deck.size());
 for(int i=0;i<hands.length;i++)
      System.out.println("Player "+i+"'s Hand: \n" + hands[i].getHand());
于 2012-11-14T23:03:52.933 に答える
1

反復するアイテムとしてHandオブジェクトの1つを配置したため、forループが機能していません。私はこのスタイルのforループのすべてのアプリケーションに100%精通しているわけではありませんが、私の経験では、オブジェクトのリストを移動するために使用されます。したがって、次のようなことをしたいと思うでしょう。

     System.out.println("Deal to 4 Hands: "); 

     Hand hand1 = new Hand();
     Hand hand2 = new Hand();
     Hand hand3 = new Hand();
     Hand hand4 = new Hand();

     List<Hand> handList = new ArrayList<Hand>();
     handList.add(hand1);
     handList.add(hand2);
     handList.add(hand3);
     handList.add(hand4);

     for (Hand currHand : handList) {
         currHand.addSingleCard(Deck.deal());
         currHand.addSingleCard(Deck.deal());
     }

リストに追加するためにforループを使用しなかったことに気付きましたが、作業中であり、最初から書き込むよりもコピーして貼り付ける方が簡単でした。

于 2012-11-14T23:10:56.870 に答える
0

手を配列(またはリスト)に格納し、2つのネストされたループを使用します。

for (int i = 0; i < 2; i++) {
    for (Hand hand : hands) {
        hand.addSingleCard(Deck.deal());
    }
}
于 2012-11-14T23:03:11.027 に答える
0

ForEachループは、Iterableを実装するクラスでのみ使用できます

于 2012-11-14T23:04:52.287 に答える
0

このようなものは機能する可能性があります(ただしテストされていません):

Hand hands[] = new Hand[] {hand1, hand2, hand3, hand4};
for (int i=0; i<2; i++) {               // deal 2 cards
    for (Hand currentHand: hands) {     // to each hand
         currentHand.addSingleCard(Deck.deal());
    }
 }

for (int i=0; i<hands.length; i++)  {
     System.out.println("Player " + i + "'s Hand: \n" + hands[i].getHand());
}
于 2012-11-14T23:06:32.207 に答える
0

どうですか:

for(int j=0; j<MAX_NUMBER_OF_DEALS_PER_PLAYER;j++)
{
  for(int i=0; i<MAX_HAND_SIZE;i++)
  {
    handsArray[i].addSingleCard(Deck.deal());
  }
}

次に、たとえば、取引の数を2に設定して、例を複製できます。また、手のサイズは、プレイしたいゲームの種類によって異なります。

もちろん、最初に次のような配列を初期化する必要があります。

Hand[] handsArray = new Hand[MAX_NUMBER_OF_PLAYERS];
for(int i=0;i<MAX_NUMBER_OF_PLAYERS;i++)
{
  handsArray[i] = new Hand();

}

これはあなたが探していたものですか?

foreachループを使用したい場合は、もちろん、投稿した内容を実行できます。

for(Hand card : hand1){
  System.out.println("Player 1's Hand: \n" + card); //notice it needs to be card here, NOT hand1
}

ただし、ここでhand1をcardに変更して、各カードを手に印刷する必要があることに注意してください。それ以外の場合は、カードごとに同じ値(hand1)を印刷するだけなので、カードが3枚ある場合は、hand1の値を3回印刷します。

于 2012-11-14T23:07:36.410 に答える
0

for-eachループを使用するには、コレクション(つまり、リスト)または配列のいずれかのある種のIterableが必要です。この場合、コードを大幅に簡略化できます。

private static final NUM_HANDS = 4;
System.out.println("Deal to 4 Hands: "); 
List<Hand> hands = new ArrayList<Hand>();
for(int i=0; i<NUM_HANDS) {
    hands.add(new Hand());
    hand.addSingleCard(Deck.deal());
}
int handNum = 1;
for (Hand hand: hands) {
    hand.addSingleCard(Deck.deal());
    System.out.println("Player " + handNum + "'s Hand: \n" + hand.getHand());
    handNum++;
}
System.out.println("Cards left in deck: " + Deck.size());
于 2012-11-14T23:14:23.303 に答える