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

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

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

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

Q&A

解決済

5回答

2505閲覧

JAVA ブラックジャックのAを「1」「11」どちらかにしたい

ueyama

総合スコア20

Java

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

0グッド

0クリップ

投稿2018/06/25 05:41

編集2018/06/25 09:01
コード ```### 前提・実現したいこと 勉強を始めて1か月。JAVAでブラックジャックを作っていて、カードをAを引いた時に「1」か「11」にするかという選択をカードを引いたときにはできるのですが、2枚目以降カードを引いた時に、それまでにAを引いていたら、またAを「1」か「11」かにするかという選択肢を表示するにはどうすればいいのでしょうか。 例:1枚目でAを引く→「1」を選択   2枚目で10を引く→一枚目のAを「11」にすればブラックジャックなので、Aを「1」から「11」へ変更したい。 ### 発生している問題・エラーメッセージ 引いた時にAを引いた時にしか選択肢がでない ### 該当のソースコード ```import java.util.ArrayList; import java.util.Collections; public class BlackJack{ public static void main(String[] args){ ArrayList<Card> a=new ArrayList<>(); String[] b={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; String[] c={"ダイヤ","スペード","クラブ","ハート"}; for(int i=1;i<=4;i++){ for(int j=1;j<=13;j++){ a.add(new Card(j,c[i-1],b[j-1])); } } int Ore=0; int Ai=0; // 俺にカード一枚目 Ore = ore(a,Ore); //AIにカード一枚目 Collections.shuffle(a); System.out.println("AIが引いたカード:"+a.get(0).card+"の"+a.get(0).cardnumber); if(a.get(0).cardnumber.equals("J")||a.get(0).cardnumber.equals("Q")||a.get(0).cardnumber.equals("K")){ Ai+=10; }else if(a.get(0).cardnumber.equals("A")){ if(Ai<=10){ Ai+=11; }else{ Ai+=1; } }else{ Ai+=a.get(0).number; } a.remove(0); System.out.println("AIの現在の点数:  ●"+Ai+"●"); // 俺にカード二枚目 // System.out.println("2回目"); Ore = ore(a,Ore); // この時点で21になったら勝利 if(Ore==21){ System.out.println("BlackJack"); System.out.println("あなたの勝利です"); System.exit(0); } // AIにカード二枚目 int aione=Ai; Collections.shuffle(a); System.out.println("AIが引いた:裏側のためカード不明");//+a.get(0).card+"の"+a.get(0).cardnumber); if(a.get(0).cardnumber.equals("J")||a.get(0).cardnumber.equals("Q")||a.get(0).cardnumber.equals("K")){ Ai+=10; }else if(a.get(0).cardnumber.equals("A")){ if(Ai<=10){ Ai+=11; }else{ Ai+=1; } }else{ Ai+=a.get(0).number; } String aitwonamber=a.get(0).cardnumber; String aitwocard=a.get(0).card; a.remove(0); System.out.println("AIの現在の点数:"+aione+"+裏側のカード(不明です)"); // テスト用 AIに2枚目での合計値表示 // System.out.println("AIの現在の点数:  ●"+Ai+"●"); // 俺のターン System.out.println("あなたの現在の点数:  ☆"+Ore+"☆です"); System.out.println("引くか引かないか どちらにしますか? 引く:1 引かない: 2"); String sc2=new java.util.Scanner(System.in).nextLine(); if(sc2.equals("1")){ Ore = ore(a,Ore); //AIのカード二枚目表示 System.out.println("AIが二枚目に引いたカードは"+aitwocard+"の"+aitwonamber+"でした"); System.out.println("AIの現在の点数:  ●"+Ai+"●"); }else { //AIのカード二枚目表示 System.out.println("AIが二枚目に引いたカードは"+aitwocard+"の"+aitwonamber+"でした"); System.out.println("AIの現在の点数:  ●"+Ai+"●"); } //AIのターン if(16>=Ai) { Collections.shuffle(a); System.out.println("AIが引いたカード:"+a.get(0).card+"の"+a.get(0).cardnumber); if(a.get(0).cardnumber.equals("J")||a.get(0).cardnumber.equals("Q")||a.get(0).cardnumber.equals("K")){ Ai+=10; }else if(a.get(0).cardnumber.equals("A")){ if(Ai<=10){ Ai+=11; }else{ Ai+=1; } }else{ Ai+=a.get(0).number; } a.remove(0); System.out.println("AIの現在の点数:  ●"+Ai+"●"); } // 自分、相手と交互に9回繰り返す // 最大9枚まで引けるため(A:4枚 2:4枚 3:3枚で合計11枚で21、最初に2枚配るので、残り9回) for (int turn=0; turn < 9; turn++ ){ //俺のターン二回目以降, // if // sc2が"1"かつAIより点数が低ければ // while // sc2が"引かない=2"を選択するまで // 引くを繰り返す // ただし // もし引いた後に、22点を超えていれば // break もう引かない if(sc2.equals("1")&&Ore<21){ System.out.println("引くか引かないか どちらにしますか? 引く:1 引かない: 2"); sc2=new java.util.Scanner(System.in).nextLine(); if(sc2.equals("1")){ Ore = ore(a,Ore); if(Ore>=21) { System.out.println("バーストしました"); break; } }else { sc2="2"; } } // AIのターン2回目以降 if(16>=Ai) { Collections.shuffle(a); System.out.println("AIが引いたカード:"+a.get(0).card+"の"+a.get(0).cardnumber); if(a.get(0).cardnumber.equals("J")||a.get(0).cardnumber.equals("Q")||a.get(0).cardnumber.equals("K")){ Ai+=10; }else if(a.get(0).cardnumber.equals("A")){ if(Ai<=10){ Ai+=11; }else{ Ai+=1; } }else{ Ai+=a.get(0).number; } a.remove(0); System.out.println("AIの現在の点数:  ●"+Ai+"●"); } } //ブラックジャック勝敗のif文です。 if(Ore > Ai && Ore < 22 || Ai>21 && Ore<22) { System.out.println("あなたの勝利です!"); }else if(Ore == Ai && Ore >= 17&&Ore <=21) { System.out.println("引き分けです"); }else { System.out.println("あなたは負けました。"); } } public static int ore(ArrayList<Card> a, int Ore) { Collections.shuffle(a); System.out.println("あなたが引いたカード:"+a.get(0).card+"の"+a.get(0).cardnumber); // J,Q,Kを10として扱う if(a.get(0).cardnumber.equals("J")||a.get(0).cardnumber.equals("Q")||a.get(0).cardnumber.equals("K")){ Ore+=10; // Aを1か11か選択 }else if(a.get(0).cardnumber.equals("A")){ System.out.println("1か11 どちらにしますか? 1:1 11: 11"); String sc=new java.util.Scanner(System.in).nextLine(); if(sc.equals("1")){ Ore+=1; } else if(sc.equals("11")){ Ore+=11; }else { Ore+=1; } }else{ Ore+=a.get(0).number; } a.remove(0); System.out.println("あなたの現在の点数:  ☆"+Ore+"☆"); return Ore; } } class Card{ int number=0; String card=""; String cardnumber=""; Card(int a,String b,String c){ number=a; card=b; cardnumber=c; } } コード
### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2018/06/25 06:14

プログラムコード(およびエラーメッセージ)は質問内容としては最も重要な部分であるため、見やすくしていただけると助かります。<code>ボタン押下→「コード」部分にコードを貼り付け→「ここに言語を入力」に対象言語名記入(エラーメッセージの場合は不要)の手順で「コードハイライト化」してください。(質問編集画面ではリアルタイムでプレビューが表示されるので見ながら調整してください)
ueyama

2018/06/25 07:04

すみません、初めての投稿で慣れていませんでした。
m.ts10806

2018/06/25 07:14

質問は編集できるので、指摘があったときはなるべく対応してください(特にコードや内容など読みやすい質問は解決を早めます)[質問するときのヒント]も読んでおいてください。 https://teratail.com/help/question-tips
guest

回答5

0

またAを「1」か「11」かにするかという選択肢を表示するにはどうすればいいのでしょうか。

ブラックジャックの厳密なルールは知らないのですが、これはそもそもユーザーに選択させるべきものではなくて有利な方を自動的に選択するものではないのかと思われます。

投稿2018/06/25 05:44

maisumakun

総合スコア145183

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

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

ueyama

2018/06/25 06:18

回答ありがとうございます 有利な方を自動的に選択するとのことですが、それだとAI vs AIと変わらないのではないのかと 間違った選択(自分で選択)をするのも一つのプログラムとして入れたいのです
maisumakun

2018/06/25 06:40

いや、ブラックジャックのプレイは「カードを引くか止めるか」なわけですし、「Aをどちらで計算するか」は本来ディーラーがやる作業(どっちが勝ったか判定するのはディーラー)ですので、ユーザーに介入させるのは本来のゲーム性と別物になります。
ueyama

2018/06/25 06:55

なるほど、だからみなさん最後に(引くのをやめた時)にAを、1にするか11にするかと参照にすればとコメントしてくださっているのですね。 理解が及ばずにすみませんでした。
guest

0

  1. Aを1として、点数を合計する。この時、Aがあるかどうかのフラグを持っておく。
  2. 「Aがある」かつ「点数が11点以下」のときに、点数に10加算。

これだけでブラックジャックの点数計算としては成り立つのでは?

投稿2018/06/25 06:09

swordone

総合スコア20649

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

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

ueyama

2018/06/25 07:03

回答ありがとうございました。
guest

0

それまでにAを引いていたら、またAを「1」か「11」かにするかという選択肢を表示するにはどうすればいいのでしょうか。

ブラックジャックは2枚目以降のA(エース)は1として扱わないと
11+11で22となりバースト(負け)になります。

よってスコア計算は以下のような処理になります。
1,保持しているカードのAカードの枚数を数える。
2,それ以外のカードは数字を加算してスコアとする。
3,11 + (Aカードの枚数 - 1)を計算してスコアとする。
4.2のスコアと3のスコア > 21(ブラックジャック)ならば、
2のスコア+Aカードの枚数=スコア
そうでなければ、2のスコア+3のスコア=スコアになります。

◇参考情報
javaでブラックジャックを作っています。柄なしですの回答のcalcScoreメソッドでスコア計算を行っています。

投稿2018/06/25 06:01

編集2018/06/25 06:06
umyu

総合スコア5846

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

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

ueyama

2018/06/25 06:21

わざわざ、参考URLまで貼っていただきありがとうございます
guest

0

ベストアンサー

A(エース)のカードの解釈を 1, 11 の両方の解釈で計算してみて、

  • すべてのパターンで21を超える -> バースト
  • 21以下のパターンが有る -> 最大値が現在の得点

だと思いますよ。

["6", "K", "A"] -> [[6, 10, 1], [6, 10, 11]] // 1, 11 の両方のパターンをマッピング -> [17, 27] // それぞれ和を計算 -> [17] // 21以下でフィルタ -> 17 // 最大値を取り出す

投稿2018/06/25 06:24

mather

総合スコア6753

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

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

ueyama

2018/06/25 07:02

回答ありがとうございます。 この計算で組んでみます。 ベストアンサーに選ばせて頂きます。これまでに回答してくださった皆様共々ありがとうございました。
guest

0

1枚目でAを引く→「1」を選択

2枚目で10を引く→一枚目のAを「11」にすればブラックジャックなので、Aを「1」から「11」へ変更したい。

1にするのが良いのか11にするのが良いのかが判らない1枚目の段階で選択を迫っている(2枚目以降が判らないのに判断するから正しくないかもしれない)から、後で変更する必要が出てくるのだと思います。

最後のカードを引いた時(これ以上、カードを引かないと宣言した時)に、手の中にあるエースのそれぞれについて、1にするか11にするかの選択を求める

という方法が良いと思います。

投稿2018/06/25 05:52

coco_bauer

総合スコア6915

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

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

ueyama

2018/06/25 06:14

回答ありがとうございます 最後に手の中にあるエースのそれぞれについて、1にするか11にするかの選択を求める とのことですが、手の中にあるカードを参照するには具体的にどういったプログラムを使えばいいのか等ありますか? もし参照するなら、俺というクラスとAIというクラスを作った方がいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問