じゃんけんプログラムが完成したと思いきや大きな落とし穴に落ちました
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
クラスに表示を任せるのが間違い?- 考えつかない問題点が存在する?
あとがき
あと出しじゃんけんプログラムに名前を変えれば楽になれる気がしますが目標はもっと先にあるので引き続き試行錯誤してみます。
じゃんけんをプログラミングする 2日目
昨日に引き続きじゃんけんのプログラムに取り組んだわけですが見事に玉砕しました。あちらを立てればこちらが立たずという具合に動いたと思ったら他の箇所でトラブル発生といった流れが数時間も続いて気力が底をつきました。このまま続けても先に進みません。もしかしたら、上手く動いてくれないのは根本的な考え方が間違っているという可能性もあるので現状を書き出すことにしました。
まず現状のブログラムはこうです。
まだキーボードからの入力が1の場合しか作っていませんが実行するとバグが2つ確認できました。
- CPUが最初にグーの手以外を出した場合は何度も手を出してくること
Hantei.java
にある「あいこです」「あなたの勝ちです」「あなたの負けです」というメッセージが表示されない場合がある
この2つと1時間以上にらめっこした挙句に負けました。
じゃんけんのプログラムの考え方
頭を整理するために、じゃんけんプログラムに対してどう考えているのかを書き出します。
CpuHand
クラスでRandom
メソッドを使いCPUの手を1~3の数値で決定するswitch
文で1~3の数値に応じたCPUの手を表示するreturn
でCPUの手を返す- キーボード入力された1~3の数値に応じた手を
Hantei
クラスで利用する Hantei
クラスでキーボード入力の数値を引数として受け取りswitch
文で数値に応じた手を表示するHantei
クラスでif文を使い勝敗を判定する。その際CPUの手であるreturn
の戻り値の中を見て勝敗の材料とする- キーボード入力された数値が1の場合CPUのランダム数値を比較して同じならあいこ、2ならユーザーの勝ち、3ならユーザーの負けとし、キーボード入力された数値を2の場合、3の場合もそれぞれ
if
文で判定する
文章化するとなにか間違っているような気がしないでもないです。いまだ解決策は見えていませんが明日もチャレンジしてみるつもりです。
あとがき
関係ないのですがGistに書いた前日のプログラムを編集したところ当然のようにブログに表示されたGistにも反映されてしまいました。それはそうですよね。というわけで過程は残しておくことにして新しいGistファイルを作りました。Markdown記法も含めて、わからないことだらけで脳みそがパンクしそうです。でも楽しい!
じゃんけんをプログラミングする 1日目
世の中のプログラマーの方々はどんな風に仕事をしてるのでしょうか?正直、私には想像もつかないです。非プログラマーの私は少しでもプログラミングを知りたくて1日に1つ小さくてもいいのでプログラムを作っていければと考えていますが現実は難しいところです。そんななか、ふと思いついたのが「じゃんけんのプログラムを作ってみたい」でした。私の手とCPUの手で勝負するというシンプルなものです。FizzBuzzが作れて浮足立っていたので1時間もあれば作れるだろうと軽く考えていたわけですがそんなに甘くなかったです。
どんな内容?
- 私とCPUがそれぞれグー、チョキ、パーの3種類を提示
- 勝ち負けの判定をしてメッセージを表示して終了
- あいこの場合は再戦
仕様というのでしょうか?そもそも上の3つを考えずにいきなりプログラムを書き出したのが反省点でした。途中でなにをやっているのかわからなくなったり、あいこの場合はどうするのかも考えていなかったので勝敗の判定の部分で手が止まり今に至ります。まずは仕様を考えないと駄目ですね。
明日はじゃんけんプログラムについてじっくりと考えてみます。