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

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

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

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

Q&A

解決済

3回答

3678閲覧

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

Mario_11

総合スコア95

Java

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

0グッド

4クリップ

投稿2018/04/16 08:01

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

java

1 2 3/* 4 * To change this license header, choose License Headers in Project Properties. 5 * To change this template file, choose Tools | Templates 6 * and open the template in the editor. 7 */ 8package BlackJack; 9 10/* 11 * To change this license header, choose License Headers in Project Properties. 12 * To change this template file, choose Tools | Templates 13 * and open the template in the editor. 14 */ 15import java.util.ArrayList; 16import java.io.IOException; 17import java.io.PrintWriter; 18import static java.lang.System.out; 19import java.util.Random; 20import javax.servlet.ServletException; 21import javax.servlet.http.HttpServlet; 22import javax.servlet.http.HttpServletRequest; 23import javax.servlet.http.HttpServletResponse; 24 25/** 26 * 27 * @author ichinosemasahiro 28 */ 29public class BlackJack3 extends HttpServlet { 30 31 abstract class Human{ 32 33 abstract protected int open();//abstractには何も処理を書かない合計値を返す! 34 35 abstract protected void setcard(ArrayList<Integer> a);// 36 37 abstract protected boolean checksum(); 38 39 40 41 42 } 43 ArrayList<Integer> myCards = new ArrayList<>(); 44 45 46 class Dealer extends Human{ 47 ArrayList<Integer> cards = new ArrayList<>();//allcardsの中に書くと他のメソッドで使えないのでメソッド外に書く 48 public void allcards (){//カードの山札 49 50 for(int n = 1; n<=4; n++){//for文の中にfor文を書くことによって13枚のカードをcardsにaddする処理を4回繰り返すことができる 51 for (int i = 1; i <= 13; i++ ){//13枚のトランプをプリントしてcardsに入れる処理 52 //addの前に書かないとaddしてからiに代入するから答えが少しずれてしまう、 53 cards.add(i); 54 } 55 } 56 } 57 public ArrayList<Integer> deal(){ 58 ArrayList<Integer> data1 = new ArrayList<>();//ArrayListにdata1のカード情報を入れる 59 Random rand = new Random(); 60 Integer index = rand.nextInt(cards.size());//cardsを使いたい場合はcardsをメソッドの外に書く 61 data1.add(cards.get(index));//ランダムの要素を二つ追加するための処理 62 63 Integer index1 = rand.nextInt(cards.size());//3 64 data1.add(cards.get(index1)); 65 return data1; 66 } 67 68 public ArrayList<Integer> hit(){ 69 Random rand = new Random(); 70 Integer index = rand.nextInt(cards.size());//cardsの全要素をランダムにしている 71 ArrayList<Integer> data2 = new ArrayList<>();//これはArrayListの書き方覚える 72 data2.add(index);//cardsを入れないと要素番号が表示される。get 73 return data2; 74 } 75 public void setcard(ArrayList<Integer> a){//ArrayListで受けたカードをmyCardsに入れる処理 76 //仮定の話 もし渡してくれたらの話 77 for (int i= 0; i < a.size(); i++){ 78 //aに引いたカードが入っているものとして進む 79 myCards.add(a.get(i));//同じ方だからaddできる 80//かっこの中から実行 81 } 82 83 } 84 85 public int open(){//mycardの合計値 86 87 int sum = 0; 88 for(int i = 0;i< myCards.size(); i++){ 89 sum+=myCards.get(i); 90 } 91 return sum; 92 } 93 public boolean checksum(){//16より少ないとtrueを返す 94 int sum = 0; 95 for(int i = 0;i< myCards.size(); i++){ 96 sum+=myCards.get(i); 97 } 98 if (sum <= 16 ){//合計してから処理する 99 return true; 100 } 101 else{ 102 return false; 103 } 104 } 105 106 107 } 108 class user extends Human{ 109 110 ArrayList<Boolean> trueorfalse = new ArrayList<Boolean>(); 111 112 public void setcard(ArrayList<Integer> a){// 113 for(int i =1 ; i > a.size(); i++) 114 myCards.add(a.get(i)); 115 } 116 117 public int open(){ 118 int sum = 0; 119 for(int i = 0;i< myCards.size(); i++){ 120 sum+=myCards.get(i); 121 } 122 return sum; 123 124 } 125 public boolean checksum(){ 126 int sum = 0; 127 for(int i = 0;i< myCards.size(); i++){ 128 sum+=myCards.get(i); 129 } 130 if (sum <= 16 ){//合計してから処理する 131 return true; 132 } 133 else{ 134 return false; 135 } 136 137 138 } 139 } 140 /*int sum = 0 141 for (int i = 0 ; i<6; i++) 142 sum+=i//入れる先は左、もらう方は右!!! 143 */ 144 145 146 147 148 149 150 /** 151 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> 152 * methods. 153 * 154 * @param request servlet request 155 * @param response servlet response 156 * @throws ServletException if a servlet-specific error occurs 157 * @throws IOException if an I/O error occurs 158 */ 159 protected void processRequest(HttpServletRequest request, HttpServletResponse response) 160 throws ServletException, IOException { 161 response.setContentType("text/html;charset=UTF-8"); 162 try (PrintWriter out = response.getWriter()) { 163 /* TODO output your page here. You may use following sample code. */ 164 Dealer D = new Dealer(); 165      D.deal(); 166 out.print(D.deal()); 167 168 } 169 170 } 171 172 173//1.山札を作る 174//2,山札をシャッフル、ランダムにする。 175//3,ランダムの中から二枚受け取る 176//4,受け取った二枚のカードを足し算して合計値を出す 177//5,その合計値が基準値未満だとfalse 178//6,trueだと何もせずfalseの場合はもう一枚追加する 179//7,もう一枚追加の処理はhitを使う、 180//呼び出しただけでは何もしない 181 182 // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 183 /** 184 * Handles the HTTP <code>GET</code> method. 185 * 186 * @param request servlet request 187 * @param response servlet response 188 * @throws ServletException if a servlet-specific error occurs 189 * @throws IOException if an I/O error occurs 190 */ 191 @Override 192 protected void doGet(HttpServletRequest request, HttpServletResponse response) 193 throws ServletException, IOException { 194 processRequest(request, response); 195 } 196 197 /** 198 * Handles the HTTP <code>POST</code> method. 199 * 200 * @param request servlet request 201 * @param response servlet response 202 * @throws ServletException if a servlet-specific error occurs 203 * @throws IOException if an I/O error occurs 204 */ 205 @Override 206 protected void doPost(HttpServletRequest request, HttpServletResponse response) 207 throws ServletException, IOException { 208 processRequest(request, response); 209 } 210 211 /** 212 * Returns a short description of the servlet. 213 * 214 * @return a String containing servlet description 215 */ 216 @Override 217 public String getServletInfo() { 218 return "Short description"; 219 }// </editor-fold> 220 221} 222

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/16 08:26 編集

質問ですが、このブラックジャックはplayer数の指定などはありますか?
Mario_11

2018/04/16 08:29

Dealer対Userで二人です。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2018/04/16 08:33

ありがとうございます。あともう一つ質問ですが、本来のブラックジャックは和が21に近いかどうか競うのですが「柄なしです」ということは21にはできないということですか?質問ばかりですみません。
Mario_11

2018/04/16 08:42

こちらこそ言葉足らずですいません。ハート、スペードといった絵柄がなしで数字はありでお願いします。説明が下手ですいません
退会済みユーザー

退会済みユーザー

2018/04/16 08:49

こちらこそ勘違いをしてすいません。
退会済みユーザー

退会済みユーザー

2018/04/16 09:02 編集

柄がないというのがJ,Q,Kがないということだと勘違いしていました...
Mario_11

2018/04/16 09:04

いや、自分の説明が下手なので、、、他の説明は大丈夫でしょうか??
退会済みユーザー

退会済みユーザー

2018/04/16 09:10

後は大丈夫です 実はインスタンス化はしたことがないので時間がかかるかもしれません。(もっと効率的なコードが書けたらそちらを書くかもしれません すみません。)
Mario_11

2018/04/16 09:12

ありがとうございます、よろしくお願いいたします!
退会済みユーザー

退会済みユーザー

2018/04/17 10:15

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

2018/04/17 10:34

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

2018/04/17 10:35

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

回答3

0

>Stars1024さんへ

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

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

Java

1import java.util.ArrayDeque; 2import java.util.ArrayList; 3import java.util.Arrays; 4import java.util.Collections; 5import java.util.Deque; 6import java.util.List; 7import java.util.Objects; 8import java.util.Random; 9import java.util.Scanner; 10import java.util.stream.Collectors; 11import java.util.stream.IntStream; 12 13public class A122097 { 14 public static void main(String[] args) { 15 GameMaster game = new GameMaster(); 16 game.start(); 17 game.showResult(); 18 } 19} 20 21class InputUtils { 22 private static Scanner sc = new Scanner(System.in); 23 24 public static int readInt() { 25 while (true) { 26 try { 27 return Integer.parseInt(sc.nextLine()); 28 } catch (NumberFormatException ex) { 29 System.err.println(ex); 30 } 31 } 32 } 33} 34 35class GameMaster { 36 private static final CardDeck deck = new CardDeck(); 37 private final Player dealer = new Dealer("ディラー"); 38 private final List<Player> players = Collections.unmodifiableList(Arrays.asList(new Player("あなた"), dealer)); 39 40 enum Judge { 41 Win("勝ちました!!"), Draw("引き分け"), Lose("負けました....."); 42 43 private final String label; 44 45 Judge(String label) { 46 this.label = label; 47 } 48 49 @Override 50 public String toString() { 51 return this.label; 52 } 53 } 54 55 public void start() { 56 // 参加者に2枚ずつカードを配る。 57 IntStream.range(0, 2).forEach((i) -> { 58 for (Player p : players) { 59 p.deal(); 60 } 61 }); 62 // ディラーのカードを表示 63 System.out.println(dealer); 64 65 while (true) { 66 int skiped = players.stream().mapToInt(Player::trun).sum(); 67 // 参加者全員スキップなら 68 if (skiped == 0) { 69 break; 70 } 71 } 72 } 73 74 public static Card deal() { 75 return deck.deal(); 76 } 77 78 public Judge judge(Player player, Player dealer) { 79 int compared = player.compareTo(dealer); 80 if (compared == 0) { 81 return Judge.Draw; 82 } 83 if (compared < 0) { 84 return Judge.Lose; 85 } 86 return Judge.Win; 87 } 88 89 public void showResult() { 90 System.out.println(String.join("", Collections.nCopies(40, "#"))); 91 System.out.println("最終結果"); 92 for (Player p : players) { 93 System.out.print(p); 94 System.out.println(" 合計:" + p.calcScore()); 95 } 96 // プレイヤーとディラーの勝敗判定 97 Judge judge = judge(players.get(0), dealer); 98 System.out.println(judge); 99 } 100} 101 102class Player implements Comparable<Player> { 103 private static final int BLACK_JACK = 21; 104 // 手札 105 private final List<Card> myCardList = new ArrayList<>(); 106 private final String name; 107 // 変数:user_stopと変数:dealer_stopはここ 108 protected boolean skiped = false; 109 110 public Player(String name) { 111 this.name = name; 112 } 113 114 public String getName() { 115 return this.name; 116 } 117 118 public void deal() { 119 // Player#Draw_Cardはここ 120 // 山から一枚カードを引いて手札に加える。 121 Card c = GameMaster.deal(); 122 myCardList.add(c); 123 } 124 125 public boolean isSkip() { 126 return skiped || isBusting(); 127 } 128 129 public int trun() { 130 if (isSkip()) { 131 return 0; 132 } 133 System.out.println(this.toString()); 134 System.out.println("カードを引きますか?"); 135 System.out.print("yes -> 1 no -> 0 を入力"); 136 int n = 0; 137 do { 138 n = InputUtils.readInt(); 139 if (n == 0) { 140 skiped = true; 141 return 0; 142 } 143 } while (n != 1); 144 145 this.deal(); 146 return 1; 147 } 148 149 public boolean isBusting() { 150 // Player#Judge_burstはここ 151 return calcScore() > BLACK_JACK; 152 } 153 154 public int calcScore() { 155 // Player#calc_sumはここ 156 int aces_count = 0; 157 int sum = 0; 158 for (Card c : this.myCardList) { 159 int rank = c.calcScore(); 160 if (rank == 1) { 161 aces_count++; 162 continue; 163 } 164 sum += rank; 165 } 166 if (aces_count == 0) { 167 return sum; 168 } 169 // Aceカードのスコア計算 170 int aces_sum = 11 + (aces_count - 1); 171 if (aces_sum + sum > BLACK_JACK) { 172 aces_sum = aces_count; 173 } 174 return sum + aces_sum; 175 } 176 177 @Override 178 public int compareTo(Player o) { 179 if (this.isBusting()) { 180 return -1; 181 } 182 // ディラー 183 if (o.isBusting()) { 184 return 1; 185 } 186 return Integer.compare(this.calcScore(), o.calcScore()); 187 } 188 189 @Override 190 public String toString() { 191 // Player#Show_Listはここ 192 return name + "が持っているカード:" + myCardList.stream().map(String::valueOf).collect(Collectors.joining(" ")); 193 } 194} 195 196class Dealer extends Player { 197 public Dealer(String name) { 198 super(name); 199 } 200 201 @Override 202 public int trun() { 203 if (isSkip()) { 204 return 0; 205 } 206 /// soft 17 rule 207 int score = this.calcScore(); 208 if (score >= 17) { 209 System.out.println(this.getName() + "はカードを引きません。"); 210 skiped = true; 211 return 0; 212 } 213 System.out.println(this.getName() + "はカードを引きます。"); 214 this.deal(); 215 return 1; 216 } 217} 218 219class Card { 220 // BLACK SPADE, BLACK CLUB, WHITE DIAMOND, WHITE HEART 221 public static final List<String> SUITS = Collections 222 .unmodifiableList(Arrays.asList("\u2660", "\u2663", "\u2662", "\u2661")); 223 public static final List<String> RANKS = Collections 224 .unmodifiableList(Arrays.asList("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K")); 225 226 private final String suit; 227 private final int rank; 228 229 public Card(String suit, int rank) { 230 Objects.requireNonNull(suit); 231 if (rank > RANKS.size()) { 232 throw new IllegalArgumentException(Integer.toString(rank)); 233 } 234 this.suit = suit; 235 this.rank = rank; 236 } 237 238 public int calcScore() { 239 return Math.min(this.rank, 10); 240 } 241 242 @Override 243 public String toString() { 244 // Player#card_nameはここ 245 return this.suit + RANKS.get(this.rank - 1); 246 } 247} 248 249class CardDeck { 250 // Sum#mainの変数:card_list はここ 251 private final Deque<Card> cards; 252 253 public CardDeck() { 254 List<Card> card_list = new ArrayList<>(Card.RANKS.size() * Card.SUITS.size()); 255 IntStream.rangeClosed(1, Card.RANKS.size()).forEach((i) -> { 256 for (String suit : Card.SUITS) { 257 card_list.add(new Card(suit, i)); 258 } 259 }); 260 Random rnd = new Random(); 261 // Random#setSeedでshuffleの実行結果を固定化(テスト用) 262 // rnd.setSeed(42); 263 Collections.shuffle(card_list, rnd); 264 cards = new ArrayDeque<>(card_list); 265 } 266 267 public Card deal() { 268 return cards.removeFirst(); 269 } 270 271 @Override 272 public String toString() { 273 return Arrays.toString(cards.toArray(new Card[0])); 274 } 275}

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

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

私がmainメソッドに書かない理由は以下の2点です。
0. mainメソッドがstaticメソッドである点
→このため他のメソッドを呼び出す時にstatic宣言しないといけない
0. 一つのメソッドが長いと依存が増えてテストしずらい。
→テスト容易性は大事です。今回のコードでキーボードからの外部入力が必要な部分は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型を変数に使うのも一つの手ですが、クラス化してテストしやすさを意識してみるといいかもです。

Java

1 public static boolean testCardScore_JQK() { 2 3 Card[] jqk = { new Card("\u2660", 11), new Card("\u2660", 12), new Card("\u2660", 13) }; 4 for (Card c : jqk) { 5 if (c.calcScore() != 10) { 6 return false; 7 } 8 } 9 return true; 10 }

投稿2018/04/25 11:50

編集2018/04/26 05:29
umyu

総合スコア5846

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

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

退会済みユーザー

退会済みユーザー

2018/04/26 02:48

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

退会済みユーザー

2018/04/26 02:50

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

退会済みユーザー

2018/04/26 03:02

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

退会済みユーザー

2019/05/02 09:29 編集

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

0

最初書いたコードでも一応正常に動くのですが、「インスタンス化する」という要素がないため、
「インスタンス化する」という要素を入れたソースコードを載せたいと思います。

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

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

Java

1package sum; 2 3import java.util.Scanner; 4import java.util.ArrayList; 5 6import java.util.Random; 7 8public class Sum{ 9 public static void main(String[] args){ 10 11 Scanner sc = new Scanner(System.in); 12 ArrayList <Integer> user_card = new ArrayList<>(); 13 ArrayList <Integer> dealer_card = new ArrayList<>(); 14 Player user = new Player("あなた",user_card); 15 Player dealer = new Player("CPU",dealer_card); 16 int []card_list = new int[13]; 17 int loop = 0; 18 for(int i = 0; i < 13; i++){ 19 card_list[i] = 4; //A~Kまでそれぞれ4枚ずつ 20 } 21 //最初それぞれ2枚ずつ引く 22 Random rand = new Random(); 23 int num; 24 while(loop < 4){ 25 26 do{ 27 num = rand.nextInt(13) + 1; 28 }while(card_list[num - 1] == 0); 29 if(loop % 2 == 0){ 30 user.Draw_Card(1,num); 31 } 32 else{ 33 dealer.Draw_Card(1,num); 34 } 35 card_list[num - 1]--; 36 loop++; 37 } 38 int user_stop = 0,dealer_stop = 0; 39 while(true){ 40 if(loop % 2 == 0){ 41 user.Show_List(user_card); 42 do{ 43 num = rand.nextInt(13) + 1; 44 }while(card_list[num - 1] == 0); 45 System.out.println("カードを引きますか?"); 46 System.out.println("yes -> 1 no -> 0 を入力"); 47 int n = sc.nextInt(); 48 n = n % 2; 49 user.Draw_Card(n,num); 50 if(n % 2 == 0){ 51 user_stop = 1; 52 } 53 } 54 else{ 55 do{ 56 num = rand.nextInt(13) + 1; 57 }while(card_list[num - 1] == 0); 58 if(dealer.calc_sum(dealer_card) <= 17){ 59 System.out.println("CPUはカードを引きます。"); 60 dealer.Draw_Card(1, num); 61 } 62 else{ 63 System.out.println("CPUはカードを引きません。"); 64 dealer_stop = 1; 65 } 66 if(user_stop == 1 && dealer_stop == 1){ 67 break; 68 } 69 } 70 loop++; 71 72 } 73 int user_sum = user.calc_sum(user_card); 74 int dealer_sum = dealer.calc_sum(dealer_card); 75 System.out.println("最終結果"); 76 user.Show_List(user_card); 77 System.out.println("合計:" + user_sum); 78 dealer.Show_List(dealer_card); 79 System.out.println("合計:" + dealer_sum); 80 81 if(user.Judge_burst(user_sum) && dealer.Judge_burst(dealer_sum)){ 82 System.out.println("引き分け"); 83 } 84 else if(user.Judge_burst(user_sum)){ 85 System.out.println("負けました....."); 86 } 87 else if(dealer.Judge_burst(dealer_sum)){ 88 System.out.println("勝ちました!!"); 89 } 90 else{ 91 if(user_sum == dealer_sum){ 92 System.out.println("引き分け"); 93 } 94 else if(user_sum < dealer_sum){ 95 System.out.println("負けました..."); 96 } 97 else if(user_sum > dealer_sum){ 98 System.out.println("引き分け"); 99 } 100 } 101 } 102} 103 104class Player { 105 //カードのリスト 106 private ArrayList <Integer> myCardList = new ArrayList<>(); 107 108 private String myName; 109 110 public Player(String name,ArrayList my_cardlist){ 111 myName = name; 112 myCardList = my_cardlist; 113 } 114 115 public void card_name(int n){ 116 String line = Integer.toString(n); 117 switch(n){ 118 case 1: 119 line = "A"; 120 break; 121 case 11: 122 line = "J"; 123 break; 124 case 12: 125 line = "Q"; 126 break; 127 case 13: 128 line = "K"; 129 break; 130 default: 131 break; 132 } 133 System.out.print(line); 134 } 135 136 public void Draw_Card(int n,int card_num){ //カードを引く 137 //ひくと宣言し時 = nが奇数のとき judge = trueになる。 それ以外はfalse; 138 139 boolean judge = Judge_draw(n); 140 if(judge){ 141 myCardList.add(card_num); 142 } 143 } 144 public boolean Judge_draw(int n){ 145 boolean judge = (n % 2 == 1); 146 return judge; 147 } 148 public boolean Judge_burst(int sum){ 149 boolean judge = (sum > 21); 150 return judge; 151 } 152 public int calc_sum(ArrayList my_cardlist){ 153 int sum = 0; 154 int count = 0; 155 for(int i = 0; i < my_cardlist.size(); i++){ 156 if((int) my_cardlist.get(i) < 10){ 157 sum += (int) my_cardlist.get(i); 158 } 159 else { 160 sum += 10; 161 } 162 if((int) my_cardlist.get(i) == 1){ 163 count++; 164 } 165 } 166 if(count >= 1 && sum <= 11){ 167 sum += 10; 168 } 169 return sum; 170 } 171 public void Show_List(ArrayList myCardlist){ 172 173 System.out.print(myName +"が持っているカード:"); 174 for(int i = 0; i < myCardList.size(); i++){ 175 card_name((int) myCardList.get(i)); 176 System.out.print(" "); 177 } 178 System.out.println(); 179 } 180}

<結果の例>
あなたが持っているカード: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 03:51

編集2019/05/02 09:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/04/25 03:52

A,J,Q,Kが表示されるようにしました。
退会済みユーザー

退会済みユーザー

2018/04/25 03:54

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

2018/04/26 02:34

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

退会済みユーザー

2018/04/26 02:55

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

退会済みユーザー

2019/05/02 09:27 編集

*****
guest

0

ベストアンサー

こんにちは、

まず初めに,

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

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

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

説明の訂正

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

Java

1import java.util.Scanner; 2import java.util.Random; 3import java.util.ArrayList; 4 5public class Sum { 6 7 public static void main(String[] args){ 8 9 Random rand = new Random(); 10 11 int loop = 0; 12 13 int []card = new int[13]; 14 15 for(int i = 0; i < card.length; i++){ 16 card[i] = 4; 17 } 18 19 Scanner sc = new Scanner(System.in); 20 ArrayList<Integer> your_list = new ArrayList<>(); 21 ArrayList<Integer> cpu_list = new ArrayList<>(); 22 23 int your_sum1= 0; 24 int your_sum2 = 0; 25 int cpu_sum1 = 0; 26 int cpu_sum2 = 0; 27 28 int card_number; 29 for(int i = 0; i < 4; i++){ 30 do{ 31 card_number = rand.nextInt(13); 32 }while(card[card_number] == 0); 33 if(i % 2 == 0){ 34 your_list.add(card_number + 1); 35 card[card_number]--; 36 } 37 else{ 38 cpu_list.add(card_number + 1); 39 card[card_number]--; 40 } 41 loop++; 42 } 43 44 int your_stop = 0; //引くのをやめるとき1になる 45 int pc_stop = 0; 46 while(true){ 47 do{ 48 card_number = rand.nextInt(13); 49 }while(card[card_number] == 0); 50 51 if(loop % 2 == 0){ 52 System.out.print("あなたが持っているカード:"); 53 for(int i = 0; i < your_list.size(); i++){ 54 System.out.print(your_list.get(i) + " "); 55 } 56 System.out.println(); 57 your_sum1 = sum(1,your_list); 58 your_sum2 = sum(2,your_list); 59 System.out.println("合計値1:" + your_sum1); 60 System.out.println("合計値2:" + your_sum2); 61 62 System.out.print("カードを引きますか? yes -> 0 no - > 1"); 63 int your_choice = Integer.parseInt(sc.nextLine()); 64 if(your_choice % 2 == 1){ 65 your_stop = 1; 66 } 67 else{ 68 your_list.add(card_number + 1); 69 card[card_number]--; 70 } 71 72 } 73 else{ 74 cpu_sum2 = sum(2,cpu_list); 75 if(cpu_sum2 >= 16){ 76 System.out.println("CPUはもうカードを引きません"); 77 pc_stop = 1; 78 } 79 else{ 80 System.out.println("CPUはカードを引きました。"); 81 cpu_list.add(card_number + 1); 82 card[card_number]--; 83 } 84 } 85 if(your_stop == 1 && pc_stop == 1){ 86 break; 87 } 88 loop++; 89 } 90 91 for(int i = 0; i < your_list.size(); i++){ 92 System.out.print(your_list.get(i) + " "); 93 } 94 System.out.println(); 95 for(int i = 0; i < cpu_list.size(); i++){ 96 System.out.print(cpu_list.get(i) + " "); 97 } 98 System.out.println(); 99 int your_final_sum = your_sum2; 100 int cpu_final_sum = cpu_sum2; 101 if(your_sum2 > 21){ 102 your_final_sum = your_sum1; 103 } 104 if(cpu_sum2 > 21){ 105 cpu_final_sum = cpu_sum1; 106 } 107 System.out.println("あなたの点数" + your_final_sum); 108 System.out.println("cpuの点数" + cpu_final_sum); 109 String []result = {"勝ちました!!","引き分けです。","負けました...."}; 110 if(your_final_sum > 21 && cpu_final_sum > 21 || your_final_sum == cpu_final_sum){ 111 System.out.println(result[1]); 112 } 113 else if(your_final_sum > 21){ 114 System.out.println(result[2]); 115 } 116 else if(cpu_final_sum > 21){ 117 System.out.println(result[0]); 118 } 119 else if(your_final_sum > cpu_final_sum){ 120 System.out.println(result[0]); 121 } 122 else{ 123 System.out.println(result[2]); 124 } 125 } 126 public static int sum(int n,ArrayList<Integer> array){ //和 127 //(i)エースを全て1とする 128 //(ii)エースの一つを11とする 129 int sum = 0; 130 int count = 0; 131 for(int i = 0; i < array.size(); i++){ 132 if(array.get(i) == 1){ 133 count++; 134 } 135 if(array.get(i) < 10){ 136 sum += array.get(i); 137 } 138 else{ 139 sum += 10; 140 } 141 } 142 if(n % 2 == 0){ 143 if(count >= 1 && sum <= 11){ 144 sum += 10; 145 } 146 } 147 return sum; 148 } 149 150}

<出力結果>
あなたが持っているカード: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 10:05

編集2018/04/21 08:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/04/17 10:06

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

退会済みユーザー

2018/04/17 10:07

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

2018/04/17 14:15

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

退会済みユーザー

2018/04/17 22:10

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

退会済みユーザー

2018/04/21 08:17

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

2018/04/21 08:38

@Stars1024 さん ちゃんと動いている以上プログラムとしては合格なのかもしれませんが、手続きゴリゴリの処理になってしまっています。オブジェクト指向のトレーニングをした方が良い。 タイムリーにこういう記事が上がっていたので、読んでみてはいかがですか。 https://qiita.com/hirossyi73/items/cf8648c31898216312e5 記事内のコード例はC#ですが、なんとなく読める範囲かと思います。
退会済みユーザー

退会済みユーザー

2018/04/21 08:50

記事のほう ありがとうございます。今ちょうどC#の勉強を始めているところなのでこの記事を通して トレーニングしようと思います。 @こういういくつもの処理が必要なプログラムはクラスで書くべきということでしょうか?
LouiS0616

2018/04/21 08:55

クラスを用いるべきというか、オブジェクト指向開発するべきということです。 クラスはオブジェクト指向に際して利用しやすい言語部品でしかありません。 ...という理屈は置いておいて、まあ最初はクラスの使い方を勉強した方が良いでしょうね。
退会済みユーザー

退会済みユーザー

2018/04/21 09:08

回答ありがとうございます。まずはクラスの使い方を学びたいと思います。
退会済みユーザー

退会済みユーザー

2018/04/25 23:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問