前提・実現したいこと
Javaでブラックジャックを作成しています。
・トランプの絵柄は今回無視しています。
・エースは1と11がありますが、1で固定しています。
ゲームの流れ
・ディーラーがカードを2枚引く
・ディーラーは手札の合計が17以上になるまでカードを引き続ける。
・ユーザーがカードを2枚引く。
・ディーラーは手札の合計が17以上になるまでカードを引き続ける。
・ディーラーとユーザーのスコアを比べる。
・ユーザーのバースト、勝ち、負け、いずれかの結果を発表する。
発生している問題
・ディーラーがバストしたとき、ディーラーがもう一枚カードを引いている。
・ディーラーがバストしたとき、ユーザーはバストしていないのに、負け判定になる。
・ディーラーとユーザーは17以上になるまでカードを引き続けるようにしたいが、3枚目を引いた時点で終了してしまう。(この点は恐らくループ処理を用いるべきだと考えています。)
※初めての質問で大変恐縮ですが、質問の仕方、入力場所等に誤りがあるかもしれませんが、その際は遠慮なくご指摘ください。
java
1package home; 2import java.util.ArrayList; 3abstract class Human { 4 ArrayList<Integer> myCards = new ArrayList<>(); //両プレイヤーの手札の情報 5 6 7 abstract protected int open(); //手札の合計値を計算 8 abstract protected void setCard(ArrayList<Integer>drawnCards); //引いたカードを手札に追加 9 abstract protected boolean checkSum(); //まだカードを引くべきか判断する 10} 11//Human,User,Dealerクラスにおいて、全てのメソッドにpublic,全てのフィールドにprotected. 12//ディーラーが3枚引いて終了してしまう.
java
1package home; 2import java.util.ArrayList; 3 4public class User extends Human { 5 6 protected int total=0; 7 @Override 8 public int open() { //手札の合計値を計算 9 int result =0; 10 for(int i =0;i<myCards.size();i++) { 11 result+= myCards.get(i); 12 } 13 return result;//戻り値は手札の合計値 14 } 15 16 @Override//引いたカードを手札に追加するメソッド 17 public void setCard(ArrayList<Integer>drawnCards) { 18 myCards.addAll(drawnCards); 19 } 20 21 @Override 22 public boolean checkSum() { 23 if(total<17) { 24 return true; 25 }else { 26 return false; 27 } 28 } 29}
java
1package home; 2import java.util.ArrayList; 3import java.util.Collections; 4 5public class Dealer extends Human { 6 ArrayList<Integer> cards = new ArrayList<>(); //山札のデッキ 7 protected int total=0; 8 @Override //手札の合計値を計算 9 public int open() { 10 int result =0; 11 for(int i =0;i<myCards.size();i++) { 12 result+= myCards.get(i); 13 } 14 return result;//戻り値は手札の合計値 15 } 16 @Override //引いたカードを手札に追加するメソッド 17 public void setCard(ArrayList<Integer> drawnCards) { 18 myCards.addAll(drawnCards); 19 } 20 @Override 21 public boolean checkSum() { 22 if(total<=17) { 23 return true; 24 }else { 25 return false; 26 } 27 } 28 //コンストラクタ 29 //山札に全カードを追加 30 //最後に山札をシャッフル 31 public Dealer() { 32 for (int m =1;m<=4;m++) { 33 for(int n =1;n<=13;n++) { 34 cards.add(n); 35 } 36 } 37 Collections.shuffle(cards); 38 } 39 //山札から2枚引き、引いたカードを戻り値にする 40 //引いたカードを山札からremoveする 41 public ArrayList<Integer> deal() { 42 ArrayList<Integer> drawnCards = new ArrayList<>();//両プレイヤーの引いたカード// 43 drawnCards.add(cards.get(0)); 44 cards.remove(0); 45 drawnCards.add(cards.get(1)); 46 cards.remove(1); 47 return drawnCards; 48 } 49 //山札から1枚引き、ひいたカードを戻り値とする。 50 public ArrayList<Integer> hit() { 51 ArrayList<Integer> hit= new ArrayList<>(); 52 hit.add(cards.get(0)); 53 cards.remove(0); 54 return hit; 55 } 56}
java
1package home; 2 3public class BlackJack { 4 public static void main(String[] args) { 5 User user1 = new User(); 6 Dealer dealer1 = new Dealer(); 7 System.out.println("ブラックジャックを始めます。"); 8 user1.setCard(dealer1.deal()); 9 dealer1.setCard(dealer1.deal()); 10 System.out.println("ディーラーのカードは"+dealer1.myCards.get(0)+","+dealer1.myCards.get(1)+"です。"); 11 if(dealer1.checkSum()==true) { 12 System.out.println("ディーラーはもう一枚引きます。"); 13 dealer1.setCard(dealer1.hit()); 14 System.out.println("ディーラーの引いたカードは"+dealer1.myCards.get(0)+","+dealer1.myCards.get(1)+","+dealer1.myCards.get(2)+"です。"); 15 System.out.println("ディーラーのスコアは合計で"+dealer1.open()+"です。"); 16 }else { 17 System.out.println("ディーラーのスコアは確定しました。"); 18 } 19 System.out.println("あなたのカードは"+user1.myCards.get(0)+","+user1.myCards.get(1)+"です。"); 20 if (user1.checkSum()==true) { 21 System.out.println("あなたはもう一枚引きます。"); 22 user1.setCard(dealer1.hit()); 23 }else { 24 System.out.println("あなたのスコアは確定しました。"); 25 } 26 System.out.println("ディーラーの合計スコアは"+dealer1.open()+"です。"); 27 System.out.println("あなたの合計スコアは"+user1.open()+"です。"); 28 if(user1.open()>21) { 29 System.out.println("あなたはバーストしました。あなたの負けです。"); 30 }else if (user1.open()>dealer1.open()) { 31 System.out.println("あなたの勝ちです。"); 32 }else { 33 System.out.println("あなたの負けです。"); 34 } 35 } 36}
java
1ブラックジャックを始めます。 2ディーラーのカードは6,12です。 3ディーラーはもう一枚引きます。 4ディーラーの引いたカードは6,12,9です。 5ディーラーのスコアは合計で27です。 6あなたのカードは4,13です。 7あなたはもう一枚引きます。 8ディーラーの合計スコアは27です。 9あなたの合計スコアは19です。 10あなたの負けです。
