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

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

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

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

Q&A

1回答

1045閲覧

ブラックジャック作成について

mnodudy.12

総合スコア4

Java

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

0グッド

0クリップ

投稿2021/07/08 10:39

前提・実現したいこと

ブラックジャックの作成に挑んでいますが、コンソール上の表記がおかしいのでどのようにしたら改善されるか教えていただきたいです。
下記のようにディーラー側がカードをかなり引いてしまいます。

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

ブラックジャックをこれから始めます!!
カードを配りますね
ディーラーの手札はこちらです‼!
あなたの手札はこちらです‼
ディーラーは[5, 10, 10, 7, 3, 13, 6, 2, 7, 4, 11, 6, 11, 9, 5, 4, 11, 8, 6, 8, 1, 10, 7, 9, 5, 12, 5, 11, 13, 8, 10, 9, 9, 7, 4, 6, 3, 13, 12, 1, 1, 2, 2, 1]
290
あなたは[2, 8]
10
あなたの勝ち

該当のソースコード

Blackjack.java public class Blackjack { public static void main(String[]args) { Dealer dealer = new Dealer(); User user = new User(); System.out.println("ブラックジャックをこれから始めます!!"); System.out.println("カードを配りますね"); dealer.setCards(dealer.deal()); user.setCards(dealer.deal()); while (dealer.checkSum()) { dealer.hit(); dealer.setCards(dealer.hit()); break; } System.out.println("ディーラーの手札はこちらです‼!"); while (user.checkSum()) { dealer.hit(); dealer.setCards(dealer.hit()); break; } System.out.println("あなたの手札はこちらです‼"); System.out.println("ディーラーは"+ dealer.myCards); System.out.println(dealer.open()); System.out.println("あなたは"+ user.myCards); System.out.println(user.open()); if(user.open() == 21) { System.out.println("ブラックジャック!あなたの勝ち"); }else if(user.open() < 21 && dealer.open()<user.open() || dealer.open()>21){ System.out.println("あなたの勝ち"); }else if(user.open() > 21){ System.out.println("バースト!あなたの負け"); }else if(dealer.open() ==21 || dealer.open() <=21 && user.open()<dealer.open()){ System.out.println("あなたの負け"); }else if(user.open() == dealer.open() || user.open()>21 && dealer.open()>21){ System.out.println("引き分け"); } } }
Dealer.java import java.util.ArrayList; import java.util.Collections; public class Dealer extends Human { protected ArrayList <Integer> cards = new ArrayList<Integer>(); public Dealer() { for(int n=1; n<=4; n++) { for(int i=1; i<=13; i++) { cards.add(i); } } Collections.shuffle(cards); } public ArrayList<Integer> deal(){ ArrayList<Integer> setCards = new ArrayList<Integer>(); setCards.add(cards.get(0)); setCards.add(cards.get(1)); cards.remove(0); cards.remove(0); return setCards; } public void setCards(ArrayList<Integer> drawCard) { for(int i= 0; i<drawCard.size(); i++){ myCards.add(drawCard.get(i)); } } public int open() { int total = 0; for(int i=0; i<myCards.size(); i++) { if(10<= myCards.get(i)) { total += 10; }else { total += myCards.get(i); } } return total; } public ArrayList<Integer> hit(){ ArrayList<Integer>setCards = new ArrayList<Integer>(); setCards.add(cards.get(0)); setCards.add(cards.get(1)); cards.remove(0); cards.remove(1); return cards; } public boolean checkSum() { if (open() < 17 ) { return true; }else{ return false; } } }
Human.java import java.util.ArrayList; public abstract class Human { protected ArrayList<Integer> myCards = new ArrayList<Integer>(); abstract public int open(); abstract public void setCards(ArrayList <Integer> drawCard); abstract public boolean checkSum(); }
User.java import java.util.ArrayList; public class User extends Human { protected ArrayList<Integer> cards = new ArrayList<Integer>(); public void setCards(ArrayList<Integer> drawCard) { for(int i= 0;i<drawCard.size();i++){ myCards.add(drawCard.get(i)); } } public int open() { int total = 0; for(int i =0; i<myCards.size(); i++) { if(10 <= myCards.get(i)) { total += 10; }else { total += myCards.get(i); } } return total; } public boolean checkSum() { if (open() < 17) { return true; }else{ return false; } } }

試したこと

Blackjack.javaのwhile文が上手く機能していまいかhitメソッドがおかしいのかなとは思うのですがそれ以上わからないのでご教授いただきたいです。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

それはそうでしょう……

つか、デバッグぐらいはしてください!!!!!

プロでもデバッグぐらいはしています

プログラミングは「書いて終わり」ではありません。

デバッグやテスト(検証)まで含みます。

デバッガを使うなりしてデバッグして下さい。

ご自分のコードを読んでください。

コードを読むコツは「一行レベルで、この行が何をしているのかを考えながら読む」です。

たとえばコメント文にするとか。

まずJavaのような言語はmainメソッドから始まります。

なのでmainメソッドを探しましょう。

そうすると Blackjack.mainメソッドですね。(in Blackjack.java)

では、このmainメソッドの中の処理を追ってください。

Java

1 // ディーラーオブジェクトを生成 2 Dealer dealer = new Dealer(); 3 // ユーザオブジェクトを生成 4 User user = new User(); 5 6 // 始まるぜ~的なメッセージ 7 System.out.println("ブラックジャックをこれから始めます!!"); 8 System.out.println("カードを配りますね"); 9     10 // ディーラーがカードを引く 11 dealer.setCards(dealer.deal()); 12 // ユーザがカードを引く 13 user.setCards(dealer.deal()); 14 15 // ディーラーのcheckSum(?)が終わるまでループ 16 while (dealer.checkSum()) { 17 // ディーラーのヒット 18 dealer.hit(); 19 dealer.setCards(dealer.hit()); 20 break; 21 } 22 System.out.println("ディーラーの手札はこちらです‼!"); 23

のように。

これを現実世界で実際に手作業でやってみる。
脳内でもいいです。

インスタンス化をしている場所があれば、そのクラスのコンストラクタ内も同じように調べ、

メソッドを呼び出している場合はそのメソッド内に潜る。

引数や変数、配列、フィールドなんかは「データの状態を意識して」読む。

iが0のとき……iが1のとき……とかみたいに実際にデータを当てはめて考えるとか。

そうするとわかるはずです。

投稿2021/07/08 11:08

編集2021/07/08 11:25
BeatStar

総合スコア4962

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

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

BeatStar

2021/07/08 11:09

あ、ちなみに私は怒っていませんから。
m.ts10806

2021/07/08 11:19

「プロでも」というのは余計かもしれません。 「プログラミングをするなら義務、どんなカテゴリの人も関係なく必須技術」というのを伝えたいのかもしれませんが、「プロ」とだけ出すとちょっと重たい気がしました。
BeatStar

2021/07/08 11:24

あー、確かにそうかもしれませんね…… ちょっと修正しますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問