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

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

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

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

Q&A

解決済

3回答

1136閲覧

Java ブラックジャックの作成過程で発生したエラーの解決方法

kixx

総合スコア14

Java

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

0グッド

0クリップ

投稿2020/01/08 07:46

前提・実現したいこと

Javaで下記の問題でブラックジャックを作成しています。どうしてもエラーの解決方法が分からず、詰まってしまいました。何度も質問を投稿してしまい申し訳ありませんが、ご教授いただけたら幸いでございます。

【問題】
トランプゲームのBlackJackを作成します。
今回作成するBlackJackは、以下の条件を満たしていればOKです。
・トランプのマークは意識しなくても良いです。1-13×4の52枚。
・チップの概念は不要です。
・1は1と11で計算可能ですが、1に固定してもOKです。
・全自動でOKです。Hitの判断を手動でさせる必要はありません。
・全てのメソッドにアクセス修飾子publicをつけてください。
・全てのフィールドにアクセス修飾子protectedをつけてください。

■ Humanという抽象クラスを作成し、以下を実装してください。
openというabstractな公開メソッドを用意してください。
setCardというArrayListを引数とした、abstractな公開メソッドを用意してください。
checkSumというabstractな公開メソッドを用意してください。
myCardsというArrayListの変数を用意してください。
■ Humanを継承したDealerクラスを実装してください。
cardsというArrayListの変数を用意し、初期処理でこのcardsに全てのトランプを持たせてください。また、処理の最後にcardsの要素をシャッフルしてください
dealという公開メソッドを用意し、cardsから2枚のカードを取得し、ArrayList型の戻り値にしてください。
hitという公開メソッドを用意し、cardsから1枚のカードを取得し、ArrayList型の戻り値にしてください。
■ Humanを継承したUserクラスを実装してください。
■ DealerとUser両方に抽象メソッドを実装してください。
setCardは、引数から受けたカード情報をmyCardsに追加するように実装してください。
checkSumは、myCardsを確認し、まだカードが必要ならtrue、必要無ければfalseを戻り値にするように実装してください。
openは、myCardsのカードの合計値を戻り値とするように実装してください。
■ BlackJackクラスにてDealerとUserクラスを使ってゲームが実行できるように処理を実装してください。
カードのやり取りは自動で構いません、カードの変化と最終結果を表示してください。

発生している問題・エラーメッセージ

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:22)

該当のソースコード

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 user.open(); 10 11 12 System.out.println("カードを配ります"); 13 14 ArrayList<Integer>deal = new ArrayList<Integer>(); 15 dealer.deal(); 16 System.out.println(dealer.deal()); 17 18 ArrayList<Integer>hit = new ArrayList<Integer>(); 19 dealer.hit(); 20 21 while(user.checkSum() == true) { 22 dealer.hit(); 23 } 24 25 while(dealer.checkSum() == true) { 26 dealer.hit(); 27 } 28 29 if(user.open() == 21) { 30 System.out.println("ブラックジャック!あなたの勝ち"); 31 }else if(user.open() <= 21 && dealer.open() > user.open()){ 32 System.out.println("あなたの勝ち"); 33 }else if(user.open() > 21){ 34 System.out.println("バースト!あなたの負け"); 35 }else if(user.open() < dealer.open()){ 36 System.out.println("あなたの負け"); 37 }else if(user.open() == dealer.open()){ 38 System.out.println("引き分け"); 39 } 40 } 41} 42

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 public Dealer() { allCards(); } 7 //全てのトランプを持たせてシャッフルする 8 ArrayList <Integer> cards = new ArrayList<Integer>(); 9 public void allCards() { 10 for(int n=1;n<=3;n++) { 11 for(int i=1;i<=13;i++) { 12 cards.add(i); 13 } 14 } 15 Collections.shuffle(cards); 16 } 17 18 protected ArrayList<Integer> deal(){ //ディーラーがカードを配る 19 ArrayList<Integer> deal = new ArrayList<Integer>(); 20 //山札cardsから2枚取って配列dealの0,1を入れる 21 deal.add(cards.get(0)); 22 deal.add(cards.get(1)); 23 cards.remove(0); 24 cards.remove(1); 25 return deal; 26 } 27 28 protected ArrayList<Integer> hit(){ 29 ArrayList<Integer> hit = new ArrayList<Integer>(); 30 //山札から1枚取って配列hitの0に入れる 31 hit.add(cards.get(0)); 32 cards.remove(0); 33 return hit; 34 } 35 36 public void setCards() { 37 ArrayList<Integer> set = new ArrayList<Integer>();; 38 myCards.add(cards.get(0)); 39 myCards.add(cards.get(1)); 40 myCards = set; 41 } 42 43 public boolean checkSum() { 44 if (open() <= 15) { 45 return true; 46 }else{ 47 return false; 48 } 49 } 50 51 public int open() { 52 int total_cards = 0; 53 for(int i=1;i<=myCards.size();i++) { 54 if(10 <= myCards.get(i)) { 55 myCards.set(i, 10); 56 } 57 total_cards += myCards.get(i); 58 } 59 return total_cards; 60 } 61}

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ページで確認できます。

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

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

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

jimbe

2020/01/08 18:37

コード枠の ``` の後の文字列は, ファイル名ではなく言語名(java)をお書きください. ファイル名は枠の外に書くか, 中にコメントとしてお書きください.
guest

回答3

0

Geekjobの課題はだしてはいけません

投稿2020/01/09 04:34

glovers079

総合スコア17

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

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

0

恐らく何かの課題と思いますが失礼な丸投げ頻出する中頑張ってて和みました。

エラー自体については他の方の回答の通りですが、その背景+αとして以下のバグが見受けられます。

・BlackJack.javaのdealとhitがおかしい
返り値について勉強してみて下さい。配られたカードが返り値になるんだろうと思いますので、それをsetCardsでUserに渡してやる必要があります。
今のままではUserがカードを受け取らないので永遠にcheckSumがtruefalseにならずDealerがカードを配り尽くしてエラーが発生します。
・カードの枚数が39枚になっている
for(int n=1;n<=3;n++) の終了条件を見直して下さい。

他にも何かあるかもですがとりあえずこんなところで。

【修正部について】
こういうミスするからboolを返すメンバの命名のcheckって嫌いなんですよね…
trueだとどうなのか分かる名前の方が良いですね…

投稿2020/01/08 09:26

編集2020/01/08 09:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kixx

2020/01/08 14:53

お忙しい中ご丁寧に本当にありがとうございます。 ・カードの枚数について全く気付いてませんでした。ありがとうございます。 ・配られたカードをUserに渡す方法を考えているのですが。。。 User.javaにて Dealer dealer = new Dealer(); public ArrayList<Integer> setCards() { dealer.allCards(); ArrayList<Integer> deal = new ArrayList<Integer>(); dealer.deal(); myCards.add(deal.get(0)); myCards.add(deal.get(1)); return myCards; } と、行なってみたのですがどうも上手くいきません、渡し方が違うのでしょうか?どうしても分かりません。勉強不足でしょうか。。
退会済みユーザー

退会済みユーザー

2020/01/08 15:37

変数のスコープ、返り値、引数が分からない、メソッドと変数の区別が付かない、と言ったところでしょうか(かなりきついですね... はっきり言ってしまいますがそのsetCardsでは滅茶苦茶です。 setCardsの目的を見直して下さい。単純にカードを受け取ってmyCardsに追加すると言われていたはずです。 「Dealerがカードを配る」という話はありません。 ここについてはメソッドに外からデータを受け渡すための方法である引数について理解することが解決に繋がります。 cards.gets(0)の0とかがそうですね。 あと ArrayList<Integer> deal = new ArrayList<Integer>(); これはdealという名前の空のArrayListを作っているだけで dealer.deal()のdealとは名前が同じになっているだけでなんにも関係がありません。変数の方のdealはずっと空です。 dealer.deal()の結果が欲しいのであれば、以下のように返り値を受け取る必要があります。 ArrayList<Integer> deal = dealer.deal(); 別に変数名はメソッド名と一致させる必要はありませんし、むしろメソッド名に関係なく分かりやすい名前を付けるのが普通です。 まずは引数と返り値を調べて見て下さい。
jimbe

2020/01/08 19:25 編集

> 配られたカードをUserに渡す方法を考えているのですが もなにも, > setCardというArrayListを引数とした、abstractな公開メソッドを用意してください。 が, メソッド名から合っていませんね.
guest

0

ベストアンサー

IndexOutOfBoundsException
というのは、配列の範囲外へのアクセスなので、
ArrayListが要素0の状態でArrayList.get(0)を行っているのが直接的な原因になります。

投稿2020/01/08 08:03

homu_homu_ai

総合スコア96

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

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

kixx

2020/01/08 14:45

いつもご回答いただきありがとうございます。 最初に山札cardsから2枚取る・hitで山札cardsから1枚取る を 行なっていますが、この山札cardsの中身が空ということなのでしょうか?
homu_homu_ai

2020/01/08 23:33

はい、山札の中身が空になっているのが原因だと思います。 protected ArrayList<Integer> hit(){  system.out.writeline("残り:" + cards.size()); というのを加えると、動きがわかるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問