質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

3159閲覧

Java ブラックジャック作成時のエラー2

kixx

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/01/08 04:23

前提・実現したいこと

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/08 04:39

同じタイトル続けるのはよろしくありません。あとから見たときにタイトルだけで何が問題だったかわかりませんよね。 一意となる要件を記載してください。
guest

回答3

0

public class Dealer extends Human {
public Dealer() { allCards(); }

で解決すると思います。

投稿2020/01/08 04:36

homu_homu_ai

総合スコア96

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kixx

2020/01/08 04:49

分かりやすい回答本当にありがとうございます。理解できました。修正したところ、このようなエラーが出ました。 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.hit(Dealer.java:31) at blackjack.BlackJack.main(BlackJack.java:20) 続けてご質問になってしまい申し訳ございませんがどこを直したら良いのか分からない状態です。原因についてアドバイスいただけたらと思います、
kixx

2020/01/08 04:50

blackjack.Dealer.hit(Dealer.java:31) →hit.add(cards.get(0)); です。
homu_homu_ai

2020/01/08 04:55

public boolean checkSum() { if (open() <= 15) { return true; }else{ return false; } } でヒットする枚数を決めていると思いますが、 山札が0枚になって上記のエラーになっている状況かと思います。
homu_homu_ai

2020/01/08 05:12

コードで示すと dealer.hit(); のときに、 myCards.add(); がされていないのが直接の原因かと思います。
kixx

2020/01/08 05:38

ご回答本当にありがとうございます。以下のように山札から一枚取ったヒットを手持ち札に追加してみたのですが同じエラーが続きます。教えていただいた意味は分かっているつもりですが、認識が間違っているのでしょうか。ハテナです。。 protected ArrayList<Integer> hit(){ ArrayList<Integer>hit = new ArrayList<Integer>(); //山札から1枚取る hit.add(cards.get(0)); cards.remove(0); myCards.add(hit.get(0)); return hit; }
homu_homu_ai

2020/01/08 05:41 編集

hit.add(cards.get(0)); myCards.add(cards.get(0)); cards.remove(0); 順番的には上記が正しいと思います。
kixx

2020/01/08 06:08

ご回答ありがとうございます。問題文を読み直したところ「setCardメソッドは、引数から受けたカード情報をmyCardsに追加するように実装してください。 」と記載がありました。これを受け以下のように実装したのですが、違うメソッドの配列であるdealとhitの要素が取得できないようです。この場合はどのようにmyCardsにdealとhitの要素を追加したらいいでしょうか? public void setCards() { ArrayList<Integer> set = new ArrayList<Integer>(); myCards.add(deal.get(0)); myCards.add(hit.get(0)); myCards = set; }
homu_homu_ai

2020/01/08 06:14

流れとしてはsetCards()に引数をもたせて、 setCards(deal.hit());のように実装するのがスマートかと思います。
kixx

2020/01/08 06:56

何度もご回答いただき本当にありがとうございます!もう一度考え直してみます。
guest

0

配るもとのcardsを初期化しているタイミングが見当たりません。そうなると空の山札から配ることになります。

投稿2020/01/08 04:31

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

public class BlackJack {
public static void main(String[] args) {
ArrayList<Integer>deal = new ArrayList<Integer>();
dealer.deal();

上記コードの
dealer.deal();
がコンストラクタにてallCards()が呼ばれていないため、

public class Dealer extends Human {
ArrayList <Integer> cards = new ArrayList<Integer>();

が初期化されていないのが原因だと思います。

投稿2020/01/08 04:30

homu_homu_ai

総合スコア96

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問