前提・実現したいこと
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あなたの負けです。
> ※初めての質問で大変恐縮ですが、質問の仕方、入力場所等に誤りがあるかもしれませんが、その際は遠慮なくご指摘ください。
「タイトルには要件を書きましょう」
https://teratail.com/help/question-tips#questionTips3-1
タイトル読んだだけだと「おう、頑張ってね」で終わっちゃう。
このコードでコンパイルエラーなく動くはずがありません。
動かしたときのコードをそのまま掲載してください。
画像で提示されてもこちらで動作確認困難です。
なぜコードから画像にされたのかと思いましたら, swordone さんの「そのまま掲載」というコメントを勘違いされたのでしょうか.
コードは(修正される前のように) ``` で囲った状態のご提示にしてください. 回答する際にそのコードをコピペして再現テストをしたりしますので, 画像では全て手入力しなければならず, その段階で入力間違いがあっては元も子もありません.
swordone さんが仰るのは, 「問題が発覚してから YamatoKogushi さんのほうで原因究明等の為にコードを色々弄ってみたりされているでしょうけれども, 元の(エラー無くコンパイルでき, 実行すると問題が再現できる)コードをご提示ください」ということかと思います.
的確で丁寧なご指摘をどうもありがとうございました。
再度コードを修正しましたので、お手すきの際にアドバイスを頂ければ幸いです。
こちらは Q&A のサイトで, Q&A を蓄積することで、以後同じ問題に遭遇した方が解決策を得られるようにという目的があります.
進捗があるのは良いことですが, 質問内容をどんどん変えてしまうと, 回答との齟齬が発生しますし, 以前に発生していた問題が分からなくなります. (編集履歴は残りますが, 恐らく検索には掛からないでしょう.)
コードはともかく, ご質問内容はなるべく追加するようにして頂いたほうが宜しいかと思います.
さらには, 「回答のサポート」はともかく「開発のサポート」もまた趣旨に合わないように思います.
もちろん, コードも仕様もそれを作る人も多種多様であって, 発生する問題も同様であることは大前提ですが,「不具合→解決→不具合→解決...という開発時に普通にあるサイクル」を QAサイトの 質問→回答→次の質問→さらに回答...という展開にするのは, 如何でしょうか.
「少しでも趣旨に合わないことはするな」というつもりはありませんし, 自身そんなに厳密に条件を決めて teratail に関与しているわけでもありませんが, 「そんな意見もあるのね」的にでもご理解頂けると幸いです.
NEW と書かれましても。
https://teratail.com/help/question-tips
ご回答ありがとうございます。コードと質問内容を大幅に変更した理由は、自身が理解できていないままに、質問してしまった点、また、改善点が多すぎてかえって参考にならないと私が判断したことによります。
teratailの趣旨を確認したところ、「プログラミングに関わる問題を皆で正しあい、切磋琢磨できる環境を作る。」というものでした。
その観点から、私は別段、趣旨に合わないとは判断していません。また、teratailの推奨していない質問にも該当しないと私は判断しました。
しかしながら、jimbeさんのおっしゃる通り、何度も変更することは他の方の情報資産にならないので、今後は慎みたいと思います。貴重なご意見ありがとうございます。
元の質問を残して追記すれば良かったのでは。
既に回答やコメントがついている以上、指摘内容の反映ならともかく、大幅改変するときには関わっている人への確認(相談)は不可欠と思います。
> ※初めての質問で大変恐縮ですが ~
ということでしたが
> teratailの趣旨を確認
されたということですので(元よりですが)判断はお任せです.
失礼しました.
個人的には, コードの変容は即ち作者である YamatoKogushi さんのプログラミング技術の変化の現れですので, 変容を見てみたくもあり, 失礼な例えですが「二軍の野球選手の話でも(未来のスターの卵たりえる)野球少年の役には立つかもしれない」ような感覚でいます.