質問: new Dealer(); System.out.println("ブラックジャックを始めます。"); user1.setCard(dealer1.deal()); dealer1.setCard(dealer1.deal()); System.out.println("ディーラーのカードは"+dealer1.myCards.get(0)+","+dealer1.myCards.get(1)+"です。"); if(dealer1.checkSum()==true) { System.out.println("ディーラーはもう一枚引きます。"); dealer1.setCard(dealer1.hit()); System.out.println("ディーラーの引いたカードは"+dealer1.myCards.get(0)+","+dealer1.myCards.get(1)+","+dealer1.myCards.get(2)+"です。"); System.out.println("ディーラーのスコアは合計で"+dealer1.open()+"です。"); }else { System.out.println("ディーラーのスコアは確定しました。"); } System.out.println("あなたのカードは"+user1.myCards.get(0)+","+user1.myCards.get(1)+"です。"); if (user1.checkSum()==true) { System.out.println("あなたはもう一枚引きます。"); user1.setCard(dealer1.hit()); }else { System.out.println("あなたのスコアは確定しました。"); } System.out.println("ディーラーの合計スコアは"+dealer1.open()+"です。"); System.out.println("あなたの合計スコアは"+user1.open()+"です。"); if(user1.open()>21) { System.out.println("あなたはバーストしました。あなたの負けです。"); }else if (user1.open()>dealer1.open()) { System.out.println("あなたの勝ちです。"); }else { System.out.println("あなたの負けです。"); } } } ``` ``` ブラックジャックを始めます。 ディーラーのカードは6,12です。 ディーラーはもう一枚引きます。 ディーラーの引いたカードは6,12,9です。 ディーラーのスコアは合計で27です。 あなたのカードは4,13です。 あなたはもう一枚引きます。 ディーラーの合計スコアは27です。 あなたの合計スコアは19です。 あなたの負けです。 ```
回答: ``` b.setCard(b.deal()); ``` まずここの実行を考えます。`b.deal()`の実行により、`b.drawnCards`に`b.cards.get(0)`と`b.cards.get(1)`の結果が追加されます。これが1と13だとすると、`b.drawnCards`の中身が`[1,13]`になります。その結果が`setCard`によって`b.myCards`に移され、`b.myCards`の中身が`[1,13]`になります。 ``` a.setCard(b.deal()); ``` 次にここの実行を考えます。再び`b.deal()`が実行されますが、**`b.drawnCards`の中身はそのまま残っています。**すでにあった`[1,13]`に再び1と13が追加され、`b.drawnCards`の中身は`[1,13,1,13]`となります。`setCard`によって、これがそっくりそのまま`a.myCards`に移され、`a.myCards`の中身が`[1,13,1,13]`になります。 その後、○○のカードは~の出力に入りますが、どちらも最初の2枚しか出力しないため、ここでの見た目は変わらないように見えます。この状態で合計を取れば、aの方は同じカードセットを2回分持っているわけですから、当然倍になります。 本題に関係ないですが、「もう一枚引きます」とだけ出力して、実際には何もしていないです。 それを含めて、設計に大いに難ありです。