第七回 『じゃんけんゲーム』のプログラム

プログラミング編

はじめに

マサト先生
マサト先生

やあ、こんにちは。今日は乱数を利用して簡単なゲームを作りたいと思うぞ!

ヒロト
ヒロト

簡単なゲームですか?ワクワクします!今日もよろしくお願いします!

マサト先生
マサト先生

今回は人とコンピュータが対戦する『じゃんけんゲーム』を作ってみよう。人はキーボードから出す手を入力し、コンピュータは出す手をランダムに決めるというプログラムだ。ランダムを実現するためにランダム関数を利用するぞ。

ヒロト
ヒロト

ランダム関数ですか。print関数みたいなもともと備わっている関数という理解で大丈夫でしょうか?

マサト先生
マサト先生

うむ、そういうことだ。ただ、print関数と違って、ランダム関数を使うときはランダム関数を呼び出す必要があるのだ。どうやって呼び出すのかというと、一行目に『import random』と書けばいいのだ。この一行を書かずにランダム関数を使うとエラーと出てしまうから気を付けてほしい。まあ、まずは簡単なものを書いてみてみよう。では、もう準備はOKかな?

ヒロト
ヒロト

はい!すでにビットアローを起動して待っていました!

今日は『file11』を作成してこれに書いていきます。

マサト先生
マサト先生

準備が良くて助かるぞ!これからもよろしくたのむ。さてまずは次の画面を見てほしい。

ランダム関数

マサト先生
マサト先生

上のプログラムでは、まず1行目で『import ramdom』と書いてランダム関数を呼び出している。そして、2行目でprint関数にランダム関数を代入しているぞ。ランダム関数は『random.randint(0,5)』と書かれているが、これは0以上5以下の整数をランダムに取り出しているのだ。試しに実行してみると…

マサト先生
マサト先生

このようにランダムに2が表示された。第5回で学んだfor文を使って5回繰り返すプログラムを書いてみよう!さあ、復習だと思ってやってごらん。

ヒロト
ヒロト

はい!for文は for i in range(回数) の形をしていたので次のようになります。

マサト先生
マサト先生

うむ、ちゃんと5回ランダムに表示されたな。

何回か繰り返し実行してみてちゃんとランダムに表示されるか試してみるといいだろう。

実行画面ダイアログを閉じてからまた、F9ボタンを押すと何回でも繰り返し実行できるぞ。

ヒロト
ヒロト

はい、確かに何度試してもランダムに5個の数が表示されます!

マサト先生
マサト先生

さて、ランダム関数を使ってじゃんけんを表現するには『グーを0、チョキを1、パーを2』のようにじゃんけんの『出す手』を数字に置き換えてやるのだ。そして、相手つまりコンピューターの出す手をランダムに変数 C に代入し、自分の出す手をキーボードから変数 I に代入し、それらを表示する。とりあえずここまでをプログラムに書いてみようか。新しくfile12を用意してそれに書こうか。

ヒロト
ヒロト

はい!先ほどのランダム関数を再利用できますね!

ヒロト
ヒロト

出来ました!実行結果も正しそうです。

勝敗のつけ方

マサト先生
マサト先生

うむ、完璧だ!ここまで来たら残るは勝敗をどうつけるか、ということだ。

ヒロト
ヒロト

手の組み合わせ、つまり条件によって勝敗が変わるので、if文の出番のような気がします!

マサト先生
マサト先生

素晴らしい!自分でプログラムを考えられるようになってきたじゃないか?

もう立派なプログラマーだぞ(笑)!では、残りのプログラムは任せるから自力でやってごらん!できると信じてるぞ!

ヒロト
ヒロト

はい!頑張ります!

先ほどのプログラムの続きの8行目から書きたいと思います。

ヒロト
ヒロト

ふう、なんとか出来ました。if文のオンパレードになっちゃった!

9通りの場合がありますが、コンピューターがグーを出す場合が書けたら、コンピューターがチョキとパーを出す場合はコピペしてちょっと書き直せばいいので思ったより楽にできました!どうでしょうか?

マサト先生
マサト先生

ふふふ、確かにif文のオンパレードだが、自分で考えたプログラムであることに何より価値があるのだ!合ってるかどうかは何回か実行して確認してみて欲しい。

ヒロト
ヒロト

何回か実行しましたが、大丈夫そうです!やったー!

魔法の式

マサト先生
マサト先生

よく頑張ったな!これでじゃんけんのプログラムは完成といっていいだろう。 

ただ、一つだけ劇的にプログラムを短くする魔法の式を紹介しよう!それは、『I+C-3 の値を3で割ったときの余り』を求める式に他ならない。つまり、次の式だ。

魔法の式

                   (I-C+3)%3

ヒロト
ヒロト

これがなぜ魔法の式なのですか?

マサト先生
マサト先生

ふふふ、それは次の表を見てもらえば明らかになるだろう。タテの列のグー、チョキ、パーは自分の出した手で、横の列のグー、チョキ、パーはコンピューターの出した手となっている。そして、表に中の数はすべて魔法の式の値である。さあ、表から何か気づくことはないかい?

 グー:0  チョキ:1  パー:2 
 グー:0   0  2  1  
チョキ:1   1  0  2
 パー:2  2  1  0
ヒロト
ヒロト

おっ!あいこのときは全て0になっています!

それから、ん、待てよ・・・

あっ!自分が勝った時は2、負けた時は1になっています!

マサト先生
マサト先生

その通りだ!つまり、この魔法の式は、自分が勝った時は2、負けた時は1、あいこのときは0を必ず返してくれる便利な式なのだ!このようにうまい式を使えばプログラムを短くすることができるのだ。このようなうまい式を考えることもプログラムの面白さの一つだぞ!さあ、この魔法の式を使うと、じゃんけんのプログラムは以下のようにすっきり書くことができるのだ。新しくfile13を作ってそれに書いてみよう。

マサト先生
マサト先生

上のプログラムは6行目まではfile12で書いたのとまったく同じでコピペをしただけだ。

8行目で変数 K に魔法の式の値を代入しているな。そして、あとはif文を用いてそれぞれの場合をprint関数で表示しているのだ。

ヒロト
ヒロト

僕の書いたプログラムの行数は30行だったのに対して、こちらはその約半分ですね!とてもすっきりしてかっこいいですね!

マサト先生
マサト先生

ふふふ、短くてエレガントなプログラムを書くことは、数学の問題でエレガントな証明を書くことに似ているな!でも、最初のうちは自分の力で考えて書くことが一番大事だからあまり気にしなくていいぞ!

ヒロト
ヒロト

はい!分かりました!

マサト先生
マサト先生

では最後に、ランダム関数を使う練習問題をやって終わりにしよう。ちょっと、難しいが頑張ってくれ!

練習問題(ランダム関数)

問題

『さいころの数当てゲーム』を作ろう!

つまり、ランダムに1から6までの目をコンピューターにきめてもらって、その数をキーボードから入力して当てるというゲームだ。もし、当てることができたら『Win!』を表示し、外したら『Lose』を表示するようにしよう。

※新しくfile14を作成してそれに書こう!

解答

ヒロト
ヒロト

ふう、何とかできました!yosou(予想)という変数とdeme(出目)という変数を使いました!

何回かやってみましたが、なかなか当たりませんね!

マサト先生
マサト先生

うむ、完璧だ!

まあ、確率的には \(\frac{1}{6}\) だからな。6回に1回当たるという確率は決して大きくないな。さて、今日はここまでにしよう。かなりボリュームがある回だったが、やった内容がゲームということもあって楽しく取り組めていたみたいだな!次回は『リスト』についてやろうと思う。更にプログクラムの世界が広がること間違いなしだ。楽しみにしてくれ!

ヒロト
ヒロト

はい!ありがとうございました!

コメント

タイトルとURLをコピーしました