前提・実現したいこと
https://teratail.com/questions/233829
にて質問させていただき、上記の質問についてはおかげさまで解決することができたのですが、その後新たなエラーが出てきてしまい、アドバイスをいただきたいです。
なぜDealerの配列dealに山札cardsから取った2枚のカードが追加されないのかが分かりません。
【問題】
トランプゲームのBlackJackを作成します。
今回作成するBlackJackは、以下の条件を満たしていればOKです。
・トランプのマークは意識しなくても良いです。1-13×4の52枚。
・チップの概念は不要です。
・1は1と11で計算可能ですが、1に固定してもOKです。
・全自動でOKです。Hitの判断を手動でさせる必要はありません。
・全てのメソッドにアクセス修飾子publicをつけてください。
・全てのフィールドにアクセス修飾子protectedをつけてください。
発生している問題・エラーメッセージ
カードを配ります Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) at blackjack.Dealer.deal(Dealer.java:20) at blackjack.BlackJack.main(BlackJack.java:13)
該当のソースコード
BlackJack
1package blackjack; 2import java.util.ArrayList; 3 4public class BlackJack { 5 public static void main(String[] args) { 6 Dealer dealer = new Dealer(); 7 User user = new User(); 8 9 10 System.out.println("カードを配ります"); 11 12 ArrayList<Integer>deal = new ArrayList<Integer>(); 13 dealer.deal(); 14 System.out.println(dealer.deal()); 15 16 ArrayList<Integer>hit = new ArrayList<Integer>(); 17 dealer.hit(); 18 19 while(user.checkSum() == true) { 20 dealer.hit(); 21 } 22 23 while(dealer.checkSum() == true) { 24 dealer.hit(); 25 } 26 27 if(user.open() == 21) { 28 System.out.println("ブラックジャック!あなたの勝ち"); 29 }else if(user.open() <= 21 && dealer.open() > user.open()){ 30 System.out.println("あなたの勝ち"); 31 }else if(user.open() > 21){ 32 System.out.println("バースト!あなたの負け"); 33 }else if(user.open() < dealer.open()){ 34 System.out.println("あなたの負け"); 35 }else if(user.open() == dealer.open()){ 36 System.out.println("引き分け"); 37 } 38 } 39}
Human
1package blackjack; 2import java.util.ArrayList; 3 4public abstract class Human { 5 //手札の合計値を計算して戻す 6 abstract public int open(); 7 8 //引いたカードを手元に追加する 9 abstract public void setCards(); 10 11 //手札の合計値によってまだ引くべきかを決定する 12 abstract public boolean checkSum(); 13 14 //UserとDealerの持つ手札の情報 15 ArrayList<Integer> myCards = new ArrayList<Integer>(); 16 17}
Dealer
1package blackjack; 2import java.util.ArrayList; 3import java.util.Collections; 4 5public class Dealer extends Human { 6 //全てのトランプを持たせてシャッフルする 7 ArrayList <Integer> cards = new ArrayList<Integer>(); 8 public void allCards() { 9 for(int n=1;n<=3;n++) { 10 for(int i=1;i<=13;i++) { 11 cards.add(i); 12 } 13 } 14 Collections.shuffle(cards); 15 } 16 17 protected ArrayList<Integer> deal(){ //ディーラーがカードを配る 18 ArrayList<Integer>deal = new ArrayList<Integer>(); 19 //山札cardsから2枚取って配列dealの0,1を入れる 20 deal.add(cards.get(0)); 21 deal.add(cards.get(1)); 22 cards.remove(0); 23 cards.remove(1); 24 return deal; 25 } 26 27 protected ArrayList<Integer> hit(){ 28 ArrayList<Integer>hit = new ArrayList<Integer>(); 29 //山札から1枚取る 30 hit.add(cards.get(0)); 31 cards.remove(0); 32 return hit; 33 } 34 35 public void setCards() { 36 ArrayList<Integer> deal = new ArrayList<Integer>(); 37 myCards = deal; 38 } 39 40 public boolean checkSum() { 41 if (open() <= 15) { 42 return true; 43 }else{ 44 return false; 45 } 46 } 47 48 public int open() { 49 int total_cards = 0; 50 for(int i=1;i<=myCards.size();i++) { 51 if(10 <= myCards.get(i)) { 52 myCards.set(i, 10); 53 } 54 total_cards += myCards.get(i); 55 } 56 return total_cards; 57 } 58} 59
User
1package blackjack; 2 3public class User extends Human { 4 public void setCards() { 5 6 } 7 8 public int open() { 9 int total_cards = 0; 10 for(int i=1;i<=myCards.size();i++) { 11 if(10 <= myCards.get(i)) { 12 myCards.set(i, 10); 13 } 14 total_cards += myCards.get(i); 15 } 16 return total_cards; 17 } 18 19 public boolean checkSum() { 20 if (open() <= 15) { 21 return true; 22 }else{ 23 return false; 24 } 25 } 26}
回答3件
あなたの回答
tips
プレビュー