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

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

ただいまの
回答率

90.62%

  • Java

    13477questions

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

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 285

ueyama

score 12

コード

 前提・実現したいこと

勉強を始めて1か月。JAVAでブラックジャックを作っていて、カードをAを引いた時に「1」か「11」にするかという選択をカードを引いたときにはできるのですが、2枚目以降カードを引いた時に、それまでにAを引いていたら、またAを「1」か「11」かにするかという選択肢を表示するにはどうすればいいのでしょうか。
例:1枚目でAを引く→「1」を選択
2枚目で10を引く→一枚目のAを「11」にすればブラックジャックなので、Aを「1」から「11」へ変更したい。

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

引いた時にAを引いた時にしか選択肢がでない

 該当のソースコード

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/06/25 15:14

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

    キャンセル

  • ueyama

    2018/06/25 16:04

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

    キャンセル

  • mts10806

    2018/06/25 16:14

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

    キャンセル

回答 5

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/25 15:18

    回答ありがとうございます

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

    キャンセル

  • 2018/06/25 15:40

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

    キャンセル

  • 2018/06/25 15:55

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

    キャンセル

+2

それまでに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 15:21

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

    キャンセル

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/25 16:03

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

    キャンセル

checkベストアンサー

+1

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

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

だと思いますよ。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/25 16:02

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

    キャンセル

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/25 15:14

    回答ありがとうございます

    最後に手の中にあるエースのそれぞれについて、1にするか11にするかの選択を求める

    とのことですが、手の中にあるカードを参照するには具体的にどういったプログラムを使えばいいのか等ありますか?
    もし参照するなら、俺というクラスとAIというクラスを作った方がいいのでしょうか?

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Java if文を多様しないで組みたい

    現在Javaにて名前と科目を入力したら登録した点数がでるプログラムを組んでいます。 エラーは無いのですがif文を多様してしまっているのでif文をあまり使わずに作りたいです。

  • 解決済

    ジャンケンの勝敗判定がおかしいです。手にはクラスを使いました。

    前提・実現したいこと クラスの2次元配列を使っていますが、それで勝敗判定を正確にすること。 ジャンケンの勝敗判定したいです。 ジャンケンの勝敗判定が正確にできません。

  • 受付中

    プログラムソースを教えて欲しいです

    前提・実現したいこと しりとりプログラムを作ろうとしています。 CSVデータ中の情報を読み込みデータ内の単語のみでしりとりを行います。 ルールとして ・CPUとの対戦型

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

  • 解決済

    クラスリストの比較でcontainsが動作してくれない

    containsを用いて2つのクラスリストを比較したいのですが、うまく動作してくれません。 class Order{ public int id; publi

  • 解決済

    Javaでマス当てゲームを作りたい

    前提・実現したいこと Javaで5*5のマス目から当たりを見つけるプログラムを作りたいと考えています。 インターネットで下記のプログラムを見つけ応用できないかと思っています。

  • 解決済

    Javaのプログラミングで詰まっています

    最近、独学でJavaの学習を始めた新参者です。 エクリプスを利用して自分でプログラムを書いているのですが エラーの出てる箇所の修正方法がわからず詰まっている状態です。 よろし

  • 解決済

    Java Hit&Blow

    Hit&Blowのコードです。 答えの4桁の数字が重複しないためのコードはどのように書けばいいのでしょうか? import java.util.Scanner; class

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

  • Java

    13477questions

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