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

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

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

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

解決済

ブラックジャックの実装 java

ngi
ngi

総合スコア3

Java

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

1回答

0リアクション

1クリップ

683閲覧

投稿2022/07/25 08:33

編集2022/07/25 10:30

ブラックジャックをjavaで実装しようとしたのですが、結果が以下のように途中まで表示されるのですが、それ以降の表示がされません。どのように修正すれば良いでしょうか?
初学者で手探りでコードを書いています。的外れなことを書いているかもしれませんが、ご教授お願いします。

表示される実行結果↓
ブラックジャックを始めます.
カードを配ります.

BlackJack.java

public class BlackJack { /** * ブラックジャック開始 * @param args * 引数 */ 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());/* プレイヤーにカードを配る*/ dealer.checkSum();/* 合計値の確認 */ /** * ディーラーの手札の合計が16以下だった場合(true)ディーラーはヒットする */ while (dealer.checkSum() == true) { dealer.hit(); dealer.setCards(dealer.myCards); break; } System.out.println("ディーラーの手札はこちらです."); while (user.checkSum() == true) { dealer.hit(); dealer.setCards(dealer.myCards); break; } System.out.println("あなたの手札はこちらです."); /** * 合計値を確認する * @return 手札の合計が16以下ならtrue,17以上ならfalse */ user.checkSum(); 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("引き分け"); } } }

Human.java

import java.util.ArrayList; public abstract class Human { protected ArrayList<Integer> myCards = new ArrayList<Integer>(); /** * 手札の値を出す */ abstract public int open(); /** * 自分の手札に引いたカードの数だけ加える * @param drawCard * 引いたカード */ abstract public void setCards(ArrayList <Integer> drawCard); /** * 合計値を確認する * @return 手札の合計が16以下ならtrue,17以上ならfalse */ abstract public boolean checkSum(); }

Dealer.java

import java.util.ArrayList; import java.util.Collections; public class Dealer extends Human { CardDeck deck = new CardDeck(); /** * 山札を作る * @param cards * 山札 */ protected ArrayList <Integer> cards = new ArrayList<Integer>(); /** * フルデッキ(52枚)を作成する * デッキをシャッフルする */ public Dealer() { for(int n=1; n<=4; n++) { for(int i=1; i<=13; i++) { cards.add(i); } } Collections.shuffle(cards); } /** * 手札にカードを2枚加える * @param setCards * 手札 * @return 手札 */ 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; } /** * 自分の手札に引いたカードの数だけ加える * @param drawCard * 引いたカード */ public void setCards(ArrayList<Integer> drawCard) { for(int i= 0; i<drawCard.size(); i++){ myCards.add(drawCard.get(i)); } } /** * 手札の値を出す.絵柄なら10を渡す * @param total * 手札の合計 * @return 合計の値を返す */ public int open() { int total = 0; for(int i=0; i<=myCards.size(); i++) { if(0<= myCards.get(i)) { total += 10; }else { total += myCards.get(i); } } return total; } /** * カードを山札から取る * @param setCards * 手札 * @return カード */ public ArrayList<Integer> hit(){ ArrayList<Integer>setCards = new ArrayList<Integer>(); setCards.add(cards.get(0)); cards.remove(0); return cards; } /** * 合計値を確認する * @return 手札の合計が16以下ならtrue,17以上ならfalse */ public boolean checkSum() { if (open() < 17 ) { return true; }else{ return false; } } }

User.java

import java.util.ArrayList; public class User extends Human { /** * 山札を作る * @param cards * 山札 */ protected ArrayList<Integer> cards = new ArrayList<Integer>(); /** * 自分の手札に引いたカードの数だけ加える * @param drawCard * 引いたカード */ public void setCards(ArrayList<Integer> drawCard) { for(int i= 0;i<drawCard.size();i++){ myCards.add(drawCard.get(i)); } } /** * 手札の値を出す * @param total * 手札の合計 * @return 合計の値を返す */ 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; } /** * 合計値を確認する * @return 手札の合計が16以下ならtrue,17以上ならfalse */ public boolean checkSum() { if (open() < 17) { return true; }else{ return false; } } }

使おうとして結局使わなかったコード

CardDeck.java

import java.util.ArrayList; import java.util.Collections; import java.util.List; public class CardDeck { private ArrayList<Card> cards = new ArrayList<Card>(); /** * 空のカードデッキを生成する */ public CardDeck() { super(); } /** * フルデッキ(52枚)を作る */ public void createFullDeck() { for(int i=0; i<=3; i++) { for(int j=1; j<=13; j++) { Card c = new Card(i, j); cards.add(c); } } } /** * 空デッキをにする */ public void clear() { cards.clear(); } /** * デッキををシャッフルする */ public void shuffle() { Collections.shuffle(cards); } /** * デッキの一番最後に,任意のカードcardを追加する * @param card * カード */ public void addCard(Card card) { cards.add(card); } /** * デッキの i 番目に,任意のカードcardを追加する * * @param i * 追加する場所 * @param card *      カード */ public void addCard(int i, Card card) { cards.add(i-1, card); } /** * デッキの一番上のカードを取る * * @return カード */ public Card takeCard() { Card c = cards.get(0); cards.remove(0); c.show(); return c; } /** * デッキの i 番目から,カードを抜き取る * * @param i * 抜き取る場所 * @return *      カード */ public Card takeCard(int i) { Card c = cards.get(i-1); cards.remove(i-1); c.show(); return c; } /** * デッキのi番目にあるカードを見る * * @param i * 見る場所 * @return *     カード */ public Card seeCard(int i) { Card c = cards.get(i-1); System.out.println(i + "番目のカード:" + c.getString(c.getSuit(), c.getNumber())); return c; } /** * カードがデッキの何番目にあるかを調べる * @param suit * 絵柄 (0:スペード,1:ダイヤ,2:ハート,3:クラブ) * @param number *        数字 (1-13) * @return カードの場所 */ public int searchCard(int suit, int number) { Card c = new Card(suit, number); return cards.indexOf(c) + 1; } /** * 現在のデッキが空かどうか,判定する * @return 空ならtrue,空でないならfalse */ public boolean isEmpty() { return cards.isEmpty(); } /** * 現在デッキにあるカード枚数を返す( * * @return デッキにあるカード枚数 */ public int size() { return cards.size(); } /** * 現在のすべてのカードを画面に表示する */ public void showAllCard() { System.out.println("------------現在の山を表示します.-----------"); for(int i=1; i<=size(); i++) { seeCard(i); } System.out.println("------------ここまで-----------"); } /** * 現在デッキにある全てのカードを返す * @return 現在デッキにある全てのカード */ public List<Card> getAllCards() { return cards; } }

Card

public class Card { private int suit; // 絵柄 (0:スペード,1:ダイヤ,2:ハート,3:クラブ) private int number; // 数字 (1-13) /** * 絵柄と数字を指定してカードを生成する * * @param suit * 絵柄 (0:スペード,1:ダイヤ,2:ハート,3:クラブ) * @param number * 数字 (1-13) */ public Card(int suit, int number) { super(); this.suit = suit; this.number = number; } /** * そのカードの絵柄を取得する * * @return 絵柄 (0:スペード,1:ダイヤ,2:ハート,3:クラブ) */ public int getSuit() { return suit; } /** * そのカードの数字を取得する * * @return 数字 (1-13) */ public int getNumber() { return number; } /** * そのカードの整数表現を取得する * * @return 整数表現 (0-51) */ public int toIndex() { //自身の絵柄,数字で,staticメソッドから得る return getIndex(getSuit(), getNumber()); } /** * そのカードの文字列表現を取得する * * @return 文字列表現 (スペードA, スペード2, ...) */ public String toString() { //自身の絵柄,数字で,staticメソッドから得る return getString(getSuit(), getNumber()); } /** * そのカードの文字列表現を画面に表示する */ public void show() { System.out.println(toString()); } /** * 与えられた絵柄,数字から整数表現を計算して返す.すべてのカードで共通 * * @param suit * 絵柄 (0:スペード,1:ダイヤ,2:ハート,3:クラブ) * @param number * 数字 (1-13) * @return カードの整数表現 (0-51) */ public static int getIndex(int suit, int number) { int index; index = suit * 13 + number; return index; } /** * 与えられた絵柄,数字から文字列表現を決定して返す.すべてのカードで共通 * * @param suit * 絵柄 (0:スペード,1:ダイヤ,2:ハート,3:クラブ) * @param number * 数字 (1-13) * @return カードの文字列表現 (スペードA, スペード2, ...) */ public static String getString(int suit, int number) { String suitStr, numStr; // 絵柄文字列,数字文字列 String[] sLabel = { "スペード", "ダイヤ", "ハート", "クラブ" }; if (2 <= number && number <= 10) { // 通常の数字の場合 suitStr = sLabel[suit]; numStr = Integer.toString(number); } else { // 特別な数字表現の場合 suitStr = sLabel[suit]; switch (number) { case 1: numStr = "A"; break; case 11: numStr = "J"; break; case 12: numStr = "Q"; break; case 13: numStr = "K"; break; default: numStr = "存在しないカード"; } } // 絵柄文字列と数字文字列を連結して返す return suitStr + numStr; } }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/07/25 23:12

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

jimbe

2022/07/25 09:25

プログラムがどこまで動いているのか確認されましたでしょうか。
usekay

2022/07/25 10:23

このコードで『ディーラーの手札はこちらです.』にたどり着けないのが不思議でしょうがない。 エラー出てるのに質問文で省略したりしてませんか?
m.ts10806

2022/07/25 11:37

自身が書いたコードはどの程度理解されているのでしょうか。
ngi

2022/07/25 13:19

ある程度理解はしているのですが、様々な教材やサイトを引用しながら書いたので、コードが表すものがわかっても完全に意味は理解できていないとこがあるかもしれません。
ngi

2022/07/25 13:21

public int open() { int total = 0; for(int i =0; i<myCards.size(); i++) { if(10 <= myCards.get(i)) { total += 10; } この部分は別のサイトを参照したのですが、絵柄の11,12,13が10になると思っていたのですが、 i<myCards.size() の部分の意味がよくわかりません。 わかる方教えていただけませんか?
jimbe

2022/07/25 18:16

myCards に 9,10,11 の3枚が入っていたとして、ループする毎にどの変数がどのような値になるか、ご自身がコンピュータになったつもりで、一行ずつ"実行"してみては如何でしょうか。
m.ts10806

2022/07/25 22:32

そこだけ見てても理解はできないので機能としてみましょう。 forの2番目はループ回数を定義するものです。
BeatStar

2022/07/25 23:49

とりあえず、「コードとして書いた部分の内容を」、「事細かく説明」してくれませんか? 質問者さんの力量がどのくらいなのかを測るためです。 質問本文に「追記」してください。(質問内容はそのままで)
usekay

2022/07/26 10:42

まともに動かないコードをこれ動くぜなんてふうに公開する人がいるからでは。
dodox86

2022/07/26 11:01

基本文法をちゃんと学んで一から自分で作り直した方が話が早いし身にもなるんですけどねぇ。オブジェクト指向辺りが分からなければ無理して使う必要無いはずだし。「課題消化の為なので、理解できなくていいからとにかく答えが欲しい」ならそう書いてもらった方がそれも話が早くていいでしょう。(もちろんteratailではNGで、低評価集めるだけですけど)
ngi

2022/07/26 13:21

返信ありがとうございます。また基本文法から考えてみたいと思います。
jimbe

2022/07/26 15:42

それで、この質問はどこかに提出する課題なのでしょうか。
ngi

2022/07/26 23:51

いえ、提出はしない予定です
dodox86

2022/07/27 01:23

ほぼ同じと思われるそのコードの質問の投稿が去年2021年の7月なので、もしかしたら同じ学校の課題なのかもしれませんね。こういうの多いですね。
ngi

2022/07/28 02:48

そうかもしれないです。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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