じゃんけんプログラムが完成したと思いきや大きな落とし穴に落ちました
teratailでのアドバイスを受けて異なるクラス間で戻り値の中身を見るという壁を乗り越えることができました。戻り値のあるメソッドは呼び出して変数に入れる場合、右辺から評価されてメソッド自体が戻り値と変わったあと左辺に代入されるということを知りました。つまり左辺の変数をSystem.out.println(左辺の変数);
とすることにより表示させることができます。これを利用してユーザーが入力した値とランダムで生成されたCPUの値を変数同士で比較すれば勝敗を判定することができるはずです。
じゃんけんプログラム Ver 3日目
これでいけるはずだと確信して、いざ実行!
意外な落とし穴
あなたの手を選んでください 1:グー 2:チョキ 3:パー じゃんけんぽん! CPU:チョキ 1 あなた:グー あなたの勝ちです
おわかりだろうか?Hantei.java
の12行目でint c = cpu.RandomHand();
を実行して15行目のif
文でint c
を判定に利用しています。RandomHand();
メソッドはCPUの手の表示も兼ねているので実行結果を見ると、こちらが入力する前にCPUの手がまるわかりになってしまいます。現実世界でいうところのあと出しじゃんけんが完成したわけです。これは不覚でした。
応急処置としてHantei
クラスのif
文の勝敗メッセージの上のそれぞれの行にCpuHand
クラスのSystem.out.println("CPU:" + goo);
やSystem.out.println("CPU:" + choki);
を書いてみましたが、それだとユーザーが負けた場合やあいこの場合にメッセージが表示されなくなってしまいます。それならばとHantei
クラスのif
文のあとにRandomHand();
メソッドを書くと今度はif
文の変数c
が役に立たなくなってしまいます。
もう一歩で完成というところであと出しじゃんけん問題が発生してしまいました。これが現実ならグーで殴って、チョキで目潰し、パーで往復ビンタをすれば解決しますがプログラミングの世界ではそうもいきません。
考えられる問題点
- そもそも変数で比較して判定するのが間違い?
CpuHand
クラスに表示を任せるのが間違い?- 考えつかない問題点が存在する?
あとがき
あと出しじゃんけんプログラムに名前を変えれば楽になれる気がしますが目標はもっと先にあるので引き続き試行錯誤してみます。