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

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

ただいまの
回答率

90.60%

  • Java

    13511questions

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

javaでブラックジャックを作っています。柄なしです

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 1,680

Mario_11

score 12

javaでブラックジャックを作っています。ゲーム終了時にお互いの手札の合計と勝敗値を表示するコードを描きたいです

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package BlackJack;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
import java.util.ArrayList;
import java.io.IOException;
import java.io.PrintWriter;
import static java.lang.System.out;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author ichinosemasahiro
 */
public class BlackJack3 extends HttpServlet {

    abstract class Human{

        abstract protected int open();//abstractには何も処理を書かない合計値を返す!

        abstract protected void setcard(ArrayList<Integer> a);//

        abstract protected boolean checksum();




    }
    ArrayList<Integer> myCards = new ArrayList<>();


    class Dealer extends Human{
      ArrayList<Integer> cards = new ArrayList<>();//allcardsの中に書くと他のメソッドで使えないのでメソッド外に書く
        public void allcards (){//カードの山札

                    for(int n = 1; n<=4; n++){//for文の中にfor文を書くことによって13枚のカードをcardsにaddする処理を4回繰り返すことができる
                        for (int i = 1; i <= 13; i++ ){//13枚のトランプをプリントしてcardsに入れる処理
                                              //addの前に書かないとaddしてからiに代入するから答えが少しずれてしまう、
                        cards.add(i);
                        }
                    }
        }            
            public ArrayList<Integer> deal(){
               ArrayList<Integer> data1 = new ArrayList<>();//ArrayListにdata1のカード情報を入れる
                Random rand = new Random();
                Integer index = rand.nextInt(cards.size());//cardsを使いたい場合はcardsをメソッドの外に書く
                data1.add(cards.get(index));//ランダムの要素を二つ追加するための処理

                Integer index1 = rand.nextInt(cards.size());//3
                data1.add(cards.get(index1));
                        return data1;
            }

           public ArrayList<Integer> hit(){
                Random rand = new Random();
                Integer index = rand.nextInt(cards.size());//cardsの全要素をランダムにしている
                    ArrayList<Integer> data2 = new ArrayList<>();//これはArrayListの書き方覚える
                        data2.add(index);//cardsを入れないと要素番号が表示される。get
                        return data2;
            }   
           public void setcard(ArrayList<Integer> a){//ArrayListで受けたカードをmyCardsに入れる処理
                //仮定の話 もし渡してくれたらの話
               for (int i= 0; i < a.size(); i++){
                                                             //aに引いたカードが入っているものとして進む
               myCards.add(a.get(i));//同じ方だからaddできる
//かっこの中から実行
               }

           }  

           public int open(){//mycardの合計値

               int sum = 0;
               for(int i = 0;i< myCards.size(); i++){
                    sum+=myCards.get(i);
                }
                return sum;
           }
           public boolean checksum(){//16より少ないとtrueを返す
               int sum = 0;
               for(int i = 0;i< myCards.size(); i++){
                    sum+=myCards.get(i);
                }
                if (sum <= 16 ){//合計してから処理する
                    return true;
                }
                else{
                    return false;
                }
            }


    }          
    class user extends Human{

        ArrayList<Boolean> trueorfalse = new ArrayList<Boolean>();

            public void setcard(ArrayList<Integer> a){//
                for(int i =1 ;  i > a.size(); i++)
                       myCards.add(a.get(i));
            }

            public int open(){
               int sum = 0;
                for(int i = 0;i< myCards.size(); i++){
                    sum+=myCards.get(i);
                }
                return sum;

            }
            public boolean checksum(){
                int sum = 0;
                for(int i = 0;i< myCards.size(); i++){
                    sum+=myCards.get(i);
                }
                    if (sum <= 16 ){//合計してから処理する
                        return true;
                    }
                    else{
                        return false;
                    }


            }
    }            
    /*int sum = 0
    for (int i = 0 ; i<6; i++)
        sum+=i//入れる先は左、もらう方は右!!!
    */






    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */
          Dealer D = new Dealer();
      D.deal();
           out.print(D.deal());

        }

    }


//1.山札を作る
//2,山札をシャッフル、ランダムにする。
//3,ランダムの中から二枚受け取る
//4,受け取った二枚のカードを足し算して合計値を出す
//5,その合計値が基準値未満だとfalse
//6,trueだと何もせずfalseの場合はもう一枚追加する
//7,もう一枚追加の処理はhitを使う、
//呼び出しただけでは何もしない

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}


大まかな処理の内容は書けたのですがその次のステップでprocessRequestの中にインスタンス化して動かしたいのですが何をどうすればいいのかわかりません、初心者にもわかりやすくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • asahina1979

    2018/04/17 19:15

    絵札なしでも123456や777で21でそうが

    キャンセル

  • LouiS0616

    2018/04/17 19:34

    山札からカードを引いても、山札に変化がないのが気になる。同じ数が五枚以上出る余地がありますよね。

    キャンセル

  • LouiS0616

    2018/04/17 19:35

    それにAは1あるいは11どちらか選択できるはずですし、J, Q, K は本来10ですよね。

    キャンセル

回答 3

+3

>Stars1024さんへ

Dealer(ディラークラス)がPlayer を継承する是非についてはスルーしていただくとして。
私がStars1024さんが書いたコードをクラス分けするとしたらこんな感じになります。

※)元の質問文の要件にはないですが、柄(Suit)対応も行いました。
ポイントはcard_listからのカードを配る(deal)事をCardDeckクラスを新設して管理している点でしょうか。こうすることで、CardDeck#dealメソッドが正しく動作すれば、他のクラスではcard_listの内部状態を意識しなくても良くなります。

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
import java.util.Objects;
import java.util.Random;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class A122097 {
    public static void main(String[] args) {
        GameMaster game = new GameMaster();
        game.start();
        game.showResult();
    }
}

class InputUtils {
    private static Scanner sc = new Scanner(System.in);

    public static int readInt() {
        while (true) {
            try {
                return Integer.parseInt(sc.nextLine());
            } catch (NumberFormatException ex) {
                System.err.println(ex);
            }
        }
    }
}

class GameMaster {
    private static final CardDeck deck = new CardDeck();
    private final Player dealer = new Dealer("ディラー");
    private final List<Player> players = Collections.unmodifiableList(Arrays.asList(new Player("あなた"), dealer));

    enum Judge {
        Win("勝ちました!!"), Draw("引き分け"), Lose("負けました.....");

        private final String label;

        Judge(String label) {
            this.label = label;
        }

        @Override
        public String toString() {
            return this.label;
        }
    }

    public void start() {
        // 参加者に2枚ずつカードを配る。
        IntStream.range(0, 2).forEach((i) -> {
            for (Player p : players) {
                p.deal();
            }
        });
        // ディラーのカードを表示
        System.out.println(dealer);

        while (true) {
            int skiped = players.stream().mapToInt(Player::trun).sum();
            // 参加者全員スキップなら
            if (skiped == 0) {
                break;
            }
        }
    }

    public static Card deal() {
        return deck.deal();
    }

    public Judge judge(Player player, Player dealer) {
        int compared = player.compareTo(dealer);
        if (compared == 0) {
            return Judge.Draw;
        }
        if (compared < 0) {
            return Judge.Lose;
        }
        return Judge.Win;
    }

    public void showResult() {
        System.out.println(String.join("", Collections.nCopies(40, "#")));
        System.out.println("最終結果");
        for (Player p : players) {
            System.out.print(p);
            System.out.println(" 合計:" + p.calcScore());
        }
        // プレイヤーとディラーの勝敗判定
        Judge judge = judge(players.get(0), dealer);
        System.out.println(judge);
    }
}

class Player implements Comparable<Player> {
    private static final int BLACK_JACK = 21;
    // 手札
    private final List<Card> myCardList = new ArrayList<>();
    private final String name;
    // 変数:user_stopと変数:dealer_stopはここ
    protected boolean skiped = false;

    public Player(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void deal() {
        // Player#Draw_Cardはここ
        // 山から一枚カードを引いて手札に加える。
        Card c = GameMaster.deal();
        myCardList.add(c);
    }

    public boolean isSkip() {
        return skiped || isBusting();
    }

    public int trun() {
        if (isSkip()) {
            return 0;
        }
        System.out.println(this.toString());
        System.out.println("カードを引きますか?");
        System.out.print("yes -> 1 no -> 0 を入力");
        int n = 0;
        do {
            n = InputUtils.readInt();
            if (n == 0) {
                skiped = true;
                return 0;
            }
        } while (n != 1);

        this.deal();
        return 1;
    }

    public boolean isBusting() {
        // Player#Judge_burstはここ
        return calcScore() > BLACK_JACK;
    }

    public int calcScore() {
        // Player#calc_sumはここ
        int aces_count = 0;
        int sum = 0;
        for (Card c : this.myCardList) {
            int rank = c.calcScore();
            if (rank == 1) {
                aces_count++;
                continue;
            }
            sum += rank;
        }
        if (aces_count == 0) {
            return sum;
        }
        // Aceカードのスコア計算
        int aces_sum = 11 + (aces_count - 1);
        if (aces_sum + sum > BLACK_JACK) {
            aces_sum = aces_count;
        }
        return sum + aces_sum;
    }

    @Override
    public int compareTo(Player o) {
        if (this.isBusting()) {
            return -1;
        }
        // ディラー
        if (o.isBusting()) {
            return 1;
        }
        return Integer.compare(this.calcScore(), o.calcScore());
    }

    @Override
    public String toString() {
        // Player#Show_Listはここ
        return name + "が持っているカード:" + myCardList.stream().map(String::valueOf).collect(Collectors.joining(" "));
    }
}

class Dealer extends Player {
    public Dealer(String name) {
        super(name);
    }

    @Override
    public int trun() {
        if (isSkip()) {
            return 0;
        }
        /// soft 17 rule
        int score = this.calcScore();
        if (score >= 17) {
            System.out.println(this.getName() + "はカードを引きません。");
            skiped = true;
            return 0;
        }
        System.out.println(this.getName() + "はカードを引きます。");
        this.deal();
        return 1;
    }
}

class Card {
    // BLACK SPADE, BLACK CLUB, WHITE DIAMOND, WHITE HEART
    public static final List<String> SUITS = Collections
            .unmodifiableList(Arrays.asList("\u2660", "\u2663", "\u2662", "\u2661"));
    public static final List<String> RANKS = Collections
            .unmodifiableList(Arrays.asList("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"));

    private final String suit;
    private final int rank;

    public Card(String suit, int rank) {
        Objects.requireNonNull(suit);
        if (rank > RANKS.size()) {
            throw new IllegalArgumentException(Integer.toString(rank));
        }
        this.suit = suit;
        this.rank = rank;
    }

    public int calcScore() {
        return Math.min(this.rank, 10);
    }

    @Override
    public String toString() {
        // Player#card_nameはここ
        return this.suit + RANKS.get(this.rank - 1);
    }
}

class CardDeck {
    // Sum#mainの変数:card_list はここ
    private final Deque<Card> cards;

    public CardDeck() {
        List<Card> card_list = new ArrayList<>(Card.RANKS.size() * Card.SUITS.size());
        IntStream.rangeClosed(1, Card.RANKS.size()).forEach((i) -> {
            for (String suit : Card.SUITS) {
                card_list.add(new Card(suit, i));
            }
        });
        Random rnd = new Random();
        // Random#setSeedでshuffleの実行結果を固定化(テスト用)
        // rnd.setSeed(42);
        Collections.shuffle(card_list, rnd);
        cards = new ArrayDeque<>(card_list);
    }

    public Card deal() {
        return cards.removeFirst();
    }

    @Override
    public String toString() {
        return Arrays.toString(cards.toArray(new Card[0]));
    }
}

実際の処理はできるだけMain関数には書かず自分でつくったクラス、メソッドの中に
書いたほうがいいのでしょうか?

コードの規模とコーディングルールとかによって変わりますが。
ぶっちゃけて言うとteratailでよくある質問内容なら、mainに全部書いても動くことは動きます。

私がmainメソッドに書かない理由は以下の2点です。

  1. mainメソッドがstaticメソッドである点
    →このため他のメソッドを呼び出す時にstatic宣言しないといけない
  2. 一つのメソッドが長いと依存が増えてテストしずらい。
    →テスト容易性は大事です。今回のコードでキーボードからの外部入力が必要な部分はPlayerクラスのtrunメソッドだけです。他のクラスはキーボードからの外部入力は不要です。でもmainに全部記述すると、
    いちいちキーボード入力を行う必要があります。
    ※ここは後ほど具体的なコードで説明します。

クラス分けに関しては最初はアクター:役者(もしくは主語)をクラス化してみてどうでしょうか、今回の場合だと、以下のようになります。

アクター クラス
ゲームマスター GameMaster
プレイヤー Player
ディラー Dealer
カード Card
カードデッキ CardDeck

話を戻しますが、例えばブラックジャックのスコア計算を行いたい場合

  1. カードの11:J, 12:Q, 13:Kはスコアを10として扱う。
  2. Aceカードは1または11として扱う。
  3. 残りのカードは数字(Rank)をスコアとして加算する。

このスコア部分をテストしたい場合、回答文のコードなら以下のようなテストコードを作れます。
テストメソッドの結果がtrueなら、J,Q,Kのスコア算出に関しては頭の意識外にほぼ置いて置けるのです。
残りのスコア計算で必要なのはaceカードかそうでないかを判定して処理を記述するだけです。そしてこのコードに関してはキーボード入力は必要ないのです。
int型やString型を変数に使うのも一つの手ですが、クラス化してテストしやすさを意識してみるといいかもです。

    public static boolean testCardScore_JQK() {

        Card[] jqk = { new Card("\u2660", 11), new Card("\u2660", 12), new Card("\u2660", 13) };
        for (Card c : jqk) {
            if (c.calcScore() != 10) {
                return false;
            }
        }
        return true;
    }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/26 11:48

    回答ありがとうございます。クラスは習いたてでまだまだ未熟なので
    umyuさんの回答を見て勉強したいと思います。

    キャンセル

  • 2018/04/26 11:50

    最初はクラスの継承を試みましたが、途中でエラーが出たため、継承をしない形で書きました。
    (やっぱり継承したほうがわかりやすいと感じました。)

    キャンセル

  • 2018/04/26 12:02

    @唐突な質問ですみませんが,
    実際の処理はできるだけMain関数には書かず自分でつくったクラス、メソッドの中に
    書いたほうがいいのでしょうか?

    キャンセル

  • 2018/04/26 15:03 編集

    最初、カードのデッキをPlayerクラスに書かないといけないと思ったのですが、別のクラスで
    カードのデッキを作ることができることを知りました。
    また、Main関数で書かない理由も知ることができました。
    わざわざ、私のために微に入り細を穿つ説明をしてくださり、ありがとうございます!!

    キャンセル

checkベストアンサー

0

こんにちは、

 まず初めに,

クラスの知識がほとんどなくインスタンス化はできませんでした。
直接的な回答にできなくてすいません。
自分なりに書いたソースの説明をするのであくまでも参考程度でお願いします。
少しでも役に立てば幸いです。

1.自分とpcの先攻後攻を決めます。本当はじゃんけんで判定したところですが、ソースが長くなるので
単純に二つの乱数の大小で判断することにします。
2.「自分またはpcの持っているカードの合計値が21を超える」
または、「両者ともカードをひかない」状態になるまでwhile文でループします。
3.自分の番、pcの番はカードを引いた回数偶数か奇数かどうがで判断します。
4.pcがカードを引くかどうかの判断は本当は確率から期待値を求めようと思いましたが
これもソースが長くなるので 質問欄のソースと同様16以下かどうかで判断することにします。

大まかな説明は以上です。
初めにも申し上げた通り、クラスの知識がほとんどなくて、ソースコードが長くなってしまいました。
クラスを使うともっと短くできるかもしれません。

 説明の訂正

ブラックジャックで「最初にplayerはカードを2枚ずつ引く」ところを忘れてました。すみません
その部分を追加しました。

import java.util.Scanner;
import java.util.Random;
import java.util.ArrayList;

public class Sum {

    public static void main(String[] args){

        Random rand = new Random();

        int loop = 0;

        int []card = new int[13];

        for(int i = 0; i < card.length; i++){
            card[i] = 4;
        }

        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> your_list = new ArrayList<>();
        ArrayList<Integer> cpu_list = new ArrayList<>();

        int your_sum1= 0;
        int your_sum2 = 0;
        int cpu_sum1 = 0;
        int cpu_sum2 = 0;

        int card_number;
        for(int i = 0; i < 4; i++){
            do{
               card_number = rand.nextInt(13);
            }while(card[card_number] == 0);
            if(i % 2 == 0){
                your_list.add(card_number + 1);
                card[card_number]--;
            }
            else{
                cpu_list.add(card_number + 1);
                card[card_number]--;
            }
            loop++;
        }

        int your_stop = 0; //引くのをやめるとき1になる
        int pc_stop = 0;
        while(true){ 
            do{
               card_number = rand.nextInt(13);
            }while(card[card_number] == 0);

            if(loop % 2 == 0){
                System.out.print("あなたが持っているカード:");
                for(int i = 0; i < your_list.size(); i++){
                    System.out.print(your_list.get(i) + " ");
                }
                System.out.println();
                your_sum1 = sum(1,your_list);
                your_sum2 = sum(2,your_list);
                System.out.println("合計値1:" + your_sum1);
                System.out.println("合計値2:" + your_sum2);

                System.out.print("カードを引きますか? yes -> 0  no - > 1");  
                int your_choice = Integer.parseInt(sc.nextLine());
                if(your_choice % 2 == 1){
                    your_stop = 1;
                }
                else{
                    your_list.add(card_number + 1);
                    card[card_number]--;
                }

            }
            else{
                cpu_sum2 = sum(2,cpu_list);
                if(cpu_sum2 >= 16){
                    System.out.println("CPUはもうカードを引きません");
                    pc_stop = 1;
                }
                else{
                    System.out.println("CPUはカードを引きました。");
                    cpu_list.add(card_number + 1);
                    card[card_number]--;
                }
            }         
            if(your_stop == 1 && pc_stop == 1){
                break;
            }
            loop++;
        }

        for(int i = 0; i < your_list.size(); i++){
            System.out.print(your_list.get(i) + " ");
        }
        System.out.println();
        for(int i = 0; i < cpu_list.size(); i++){
            System.out.print(cpu_list.get(i) + " ");
        }
        System.out.println();
        int your_final_sum = your_sum2;
        int cpu_final_sum = cpu_sum2;
        if(your_sum2 > 21){
            your_final_sum = your_sum1;
        }
        if(cpu_sum2 > 21){
            cpu_final_sum = cpu_sum1;
        }
        System.out.println("あなたの点数" + your_final_sum);
        System.out.println("cpuの点数" + cpu_final_sum);
        String []result = {"勝ちました!!","引き分けです。","負けました...."};
        if(your_final_sum > 21 && cpu_final_sum > 21 || your_final_sum == cpu_final_sum){
            System.out.println(result[1]);
        }
        else if(your_final_sum > 21){
            System.out.println(result[2]);
        }
        else if(cpu_final_sum > 21){
            System.out.println(result[0]);
        }
        else if(your_final_sum > cpu_final_sum){
           System.out.println(result[0]);
        }
        else{
            System.out.println(result[2]);
        }
    }
    public static int sum(int n,ArrayList<Integer> array){ //和
        //(i)エースを全て1とする
        //(ii)エースの一つを11とする
        int sum = 0;
        int count = 0;
        for(int i = 0; i < array.size(); i++){
            if(array.get(i) == 1){
                count++;
            }
            if(array.get(i) < 10){
                sum += array.get(i);
            }
            else{
                sum += 10;
            }
        }
        if(n % 2 == 0){
            if(count >= 1 && sum <= 11){
                sum += 10;
            }
        }
        return sum;
    }

}

<出力結果>
あなたが持っているカード:6 6 
合計値1:12
合計値2:12
カードを引きますか? yes -> 0  no - > 10
CPUはカードを引きました。
あなたが持っているカード:6 6 4 
合計値1:16
合計値2:16
カードを引きますか? yes -> 0  no - > 10
CPUはもうカードを引きません
あなたが持っているカード:6 6 4 11 
合計値1:26
合計値2:26
カードを引きますか? yes -> 0  no - > 11
6 6 4 11 
5 7 5 
あなたの点数26
cpuの点数17
負けました....

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/17 19:06

    とりあえず、書いたものを載せましたが、少し不備があるので、そこを検討します。

    キャンセル

  • 2018/04/17 19:07

    思ったより、ソースが長くなってしまいました。見づらくてすいません。

    キャンセル

  • 2018/04/17 23:15

    なるほど!こういう書き方もあるのですね!勉強になりました!親切にありがとうございます!!

    キャンセル

  • 2018/04/18 07:10

    インスタンス化できなくて本当にすいません。これを機にクラスの勉強をしたいと思います。

    キャンセル

  • 2018/04/21 17:17

    ブラックジャックで最初に行う「playerはそれぞれカードを2枚引く」ところを忘れていたので
    追加しました。重要な部分を忘れてしまいすみませんでした。
    また不備があるところの修正をしました。

    キャンセル

  • 2018/04/21 17:38

    @Stars1024 さん
    ちゃんと動いている以上プログラムとしては合格なのかもしれませんが、手続きゴリゴリの処理になってしまっています。オブジェクト指向のトレーニングをした方が良い。

    タイムリーにこういう記事が上がっていたので、読んでみてはいかがですか。
    https://qiita.com/hirossyi73/items/cf8648c31898216312e5

    記事内のコード例はC#ですが、なんとなく読める範囲かと思います。

    キャンセル

  • 2018/04/21 17:50

    記事のほう ありがとうございます。今ちょうどC#の勉強を始めているところなのでこの記事を通して
    トレーニングしようと思います。

    @こういういくつもの処理が必要なプログラムはクラスで書くべきということでしょうか?

    キャンセル

  • 2018/04/21 17:55

    クラスを用いるべきというか、オブジェクト指向開発するべきということです。
    クラスはオブジェクト指向に際して利用しやすい言語部品でしかありません。

    ...という理屈は置いておいて、まあ最初はクラスの使い方を勉強した方が良いでしょうね。

    キャンセル

  • 2018/04/21 18:08

    回答ありがとうございます。まずはクラスの使い方を学びたいと思います。

    キャンセル

  • 2018/04/26 08:13

    ディーラーの16以下は必ずヒットですよ(確か

    キャンセル

0

@Mario_11さんへ

 謝辞の言葉

この度はインスタンス化について知識がないのにも関わらず質問内容に首を突っ込んですみませんでした。
最初書いたコードでも一応正常に動くのですが、「インスタンス化する」という要素がないため、
適切な回答ではないと反省しています。このままでは、問題が解決したことにはならないと思ったので、
「インスタンス化する」という要素を入れたソースコードを載せたいと思います。

Player user = new Player("あなた",user_card);
Player dealer = new Player("CPU",dealer_card);


このように 名前、user,dealerがそれぞれ引いたカードを格納するArrayListを引数にインスタンス化
しました。

package sum;

import java.util.Scanner;
import java.util.ArrayList;

import java.util.Random;

public class Sum{
    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);
        ArrayList <Integer> user_card = new ArrayList<>();
        ArrayList <Integer> dealer_card = new ArrayList<>();
        Player user = new Player("あなた",user_card);
        Player dealer = new Player("CPU",dealer_card);
        int []card_list = new int[13];
                int loop = 0;
        for(int i = 0; i < 13; i++){
            card_list[i] = 4; //A~Kまでそれぞれ4枚ずつ
        }
        //最初それぞれ2枚ずつ引く
        Random rand = new Random();
        int num;
        while(loop < 4){

            do{
                num = rand.nextInt(13) + 1;
            }while(card_list[num - 1] == 0);
            if(loop % 2 == 0){
                user.Draw_Card(1,num);
            }
            else{
                dealer.Draw_Card(1,num);
            }
            card_list[num - 1]--;
            loop++;
        }
        int user_stop = 0,dealer_stop = 0;
        while(true){
            if(loop % 2 == 0){
                user.Show_List(user_card);
                do{
                    num = rand.nextInt(13) + 1;
                 }while(card_list[num - 1] == 0);
                System.out.println("カードを引きますか?");
                System.out.println("yes -> 1 no -> 0 を入力");
                int n = sc.nextInt();
                n = n % 2;
                user.Draw_Card(n,num);
                if(n % 2 == 0){
                    user_stop = 1;
                }
            }
            else{
                do{
                    num = rand.nextInt(13) + 1;
                 }while(card_list[num - 1] == 0);
                 if(dealer.calc_sum(dealer_card) <= 17){
                     System.out.println("CPUはカードを引きます。");
                     dealer.Draw_Card(1, num);
                 }
                 else{
                     System.out.println("CPUはカードを引きません。");
                     dealer_stop = 1;
                 }
                 if(user_stop == 1 && dealer_stop == 1){
                     break;
                 }
            }
            loop++;

        }
        int user_sum = user.calc_sum(user_card);
        int dealer_sum = dealer.calc_sum(dealer_card);
        System.out.println("最終結果");
        user.Show_List(user_card);
        System.out.println("合計:" + user_sum);
        dealer.Show_List(dealer_card);
        System.out.println("合計:" + dealer_sum);

        if(user.Judge_burst(user_sum) && dealer.Judge_burst(dealer_sum)){
            System.out.println("引き分け");
        }
        else if(user.Judge_burst(user_sum)){
            System.out.println("負けました.....");
        }
        else if(dealer.Judge_burst(dealer_sum)){
            System.out.println("勝ちました!!");
        }
        else{
            if(user_sum == dealer_sum){
                System.out.println("引き分け");
            }
            else if(user_sum < dealer_sum){
                System.out.println("負けました...");
            }
            else if(user_sum > dealer_sum){
                System.out.println("引き分け");
            }
        }
    }
}

class Player {
    //カードのリスト
    private ArrayList <Integer> myCardList = new ArrayList<>();

    private String myName;

    public Player(String name,ArrayList my_cardlist){
        myName = name;
        myCardList = my_cardlist;
    }

    public void card_name(int n){
        String line = Integer.toString(n);
        switch(n){
            case 1:
                line = "A";
                break;
            case 11:
                line = "J";
                break;
            case 12:
                line = "Q";
                break;
            case 13:
                line = "K";
                break;
            default:
                break;
        }
        System.out.print(line);
    }

    public void Draw_Card(int n,int card_num){ //カードを引く
        //ひくと宣言し時 = nが奇数のとき judge = trueになる。 それ以外はfalse;

        boolean judge = Judge_draw(n);
        if(judge){
            myCardList.add(card_num);
        }
    }
    public boolean Judge_draw(int n){
        boolean judge = (n % 2 == 1);
        return judge;
    }
    public boolean Judge_burst(int sum){
        boolean judge = (sum > 21);
        return judge;
    }
    public int calc_sum(ArrayList my_cardlist){
        int sum = 0;
        int count = 0;
        for(int i = 0; i < my_cardlist.size(); i++){
            if((int) my_cardlist.get(i) < 10){
                sum += (int) my_cardlist.get(i);
            }
            else {
                sum += 10;
            }
            if((int) my_cardlist.get(i) == 1){
                count++;
            }
        }
        if(count >= 1 && sum <= 11){
            sum += 10;
        }
        return sum;
    }
    public void Show_List(ArrayList myCardlist){

        System.out.print(myName +"が持っているカード:");
        for(int i = 0; i < myCardList.size(); i++){
            card_name((int) myCardList.get(i));
            System.out.print(" ");
        }
        System.out.println();
    }
}


<結果の例>
あなたが持っているカード:3 J 
カードを引きますか?
yes -> 1 no -> 0 を入力
1
CPUはカードを引きます。
あなたが持っているカード:3 J 7 
カードを引きますか?
yes -> 1 no -> 0 を入力
0
CPUはカードを引きません。
最終結果
あなたが持っているカード:3 J 7 
合計:20
CPUが持っているカード:8 5 10 
合計:23
勝ちました!!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/25 12:52

    A,J,Q,Kが表示されるようにしました。

    キャンセル

  • 2018/04/25 12:54

    @Mario_11さん、LouiS0616さんへ
    この度は、私に「クラス」を学習するきっかけをくださり、ありがとうございます。

    キャンセル

  • 2018/04/26 11:34

    こちらこそ、ご丁寧にありがとうございました。私自身も初学者なので質問の内容が未熟な部分がありました。一緒にJava学習頑張っていきましょー!!!ありがとうございました!

    キャンセル

  • 2018/04/26 11:55

    私もクラスは習いたてで、まだまだ未熟者です。質問欄のコードに書いてある"継承"を試みましたが
    エラーが出たため、継承しない形で書きました。まだまだ不十分なところもありますが、
    これからもよろしくお願いいたします。

    キャンセル

  • 2018/04/26 11:56

    まだ結果の表示に不備が残っているためそこを検討します。
    (なぜか、合計がそれぞれ,20,19のところで引き分けと出るので)
    まだまだ不十分ですみません。

    キャンセル

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

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

関連した質問

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

  • Java

    13511questions

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