画像提供:マイナビニュース

写真拡大

筆者が海外旅行に行ったとき、地元の方とじゃんけんをする機会があり、呼び名こそ違うものの、同じルールで勝負できることが新鮮でした。そもそも、じゃんけんは、江戸時代から明治時代にかけて日本で成立し、近代に世界に広まったものだそうです。今回は、日本が世界に誇る「じゃんけん」ゲームのプログラムを作ってみましょう。

ちなみに、「じゃんけん」ですが、日本国内でも、かけ声が違ったり、三回勝負だったりと、いろいろなローカルルールがありますが、インドネシアでは、ゾウ・アリ・ヒトで勝負したり、マレーシアでは、太陽・鉄砲・鳥・石・水の五種類で勝負するとか。やはり、国によって、いろいろなバリエーションがあるようです。とは言え、今回は、日本の伝統的なルールの、じゃんけんをプログラミングしてみましょう。

○日本語プログラミングでじゃんけんゲームを作ってみる

まずは最初に、以下のような完成版のプログラムを紹介します。このプログラムをコピーして、なでしこ3の簡易エディタに貼り付けて「実行」ボタンを押してみましょう。

# --- HTMLを定義 --- (*1)

「#nako3_div_1」に「



今から
じゃんけんしよう














」をDOM_HTML設定

# --- HTMLのスタイルを定義 --- (*2)

文字スタイルは、{

"font-size": "24px",

"padding": "10px",

"line-height": "35px"

}

「#janken」に文字スタイルをDOMスタイル一括設定。

「#hand button」に文字スタイルをDOMスタイル一括設定。

# --- イベントを設定 --- (*3)

「#gu」をクリックした時には、0で勝負処理。ここまで。

「#choki」をクリックした時には、1で勝負処理。ここまで。

「#pa」をクリックした時には、2で勝負処理。ここまで。

●(自手で)勝負処理

敵手=3の乱数。

結果は(敵手 - 自手 + 3) % 3

もし、結果が0ならば、判定は「あいこ」

もし、結果が1ならば、判定は「勝ち★」

もし、結果が2ならば、判定は「負け」

手説明=["グー","チョキ","パー"]

自手説明=手説明[自手]

敵手説明=手説明[敵手]

「#janken」に「自分は{自手説明}

相手は{敵手説明} ... {判定}」をDOM_HTML設定。

ここまで。

すると、以下のように、「グー」「チョキ」「パー」の三つのボタンが表示されます。

そこで、出したい手のボタンをクリックすると、じゃんけんの結果が画面に表示されます。何度でも遊べるので、出したい手のボタンを押して遊んでみてください。

プログラムの大半は、じゃんけんの画面を定義するHTMLと、それを装飾するスタイルの指定に費やされています。それでは、一つずつ処理を見ていきましょう。

プログラムの(*1)では、じゃんけんの画面に使うHTMLを定義しています。基本的には、メッセージを表示するdivタグと、じゃんけんの手を選ぶための三つのボタン(buttonタグ)を表示するようにしています。

プログラムの(*2)では、配置したじゃんけんの画面を見やすくするために、HTMLのスタイルを一括で設定しています。ここでは、特に、文字を大きく表示するように、font-sizeを24pxに設定している部分がポイントです。

プログラムの(*3)の部分では、グー・チョキ・パーの各手のボタンをクリックした時に、関数「勝負処理」を実行するように指定します。そして、勝負処理が呼びだされたときには、ランダムに敵の手を決定し、自分の出した手と比較して、勝敗を表示します。

○じゃんけんをプログラムで判定する方法

じゃんけんのルール自体は、関数「勝負処理」で定義されています。特に、勝敗判定をしているプログラムは、以下の4行で記述することができます。このプログラムですが、前提として、じゃんけんの手を数値で表しています。グーなら0、チョキなら1、パーなら2です。数値で表した場合のメリットとしては、簡単な計算によって、勝負の判定ができるという点にあります。

結果は(敵手 - 自手 + 3) % 3

もし、結果が0ならば、判定は「あいこ」

もし、結果が1ならば、判定は「勝ち★」

もし、結果が2ならば、判定は「負け」

計算でじゃんけんの勝敗判定ができるのは、面白いことと言えます。

しかし、もし、誰の目にも明らかなように、じゃんけんのルールを実装するなら、以下のように書き直すことができるでしょう。以下のプログラムでは、コンピューター同士がランダムに手を決定して、じゃんけんを行います。

# --- 変数の初期化

手説明=["グー","チョキ","パー"]

グーは0。チョキは1。パーは2。

# --- 手を決定して勝負 --- (*1)

自手=3の乱数。

敵手=3の乱数。

「自分は」&手説明[自手]と表示。

「相手は」&手説明[敵手]と表示。

自手と敵手で勝敗判定して表示。

# --- 勝敗判定を行う関数 --- (*2)

●(自手と敵手で)勝敗判定とは

もし、自手=敵手ならば、「あいこ」を戻す。

もし、(自手=グー)かつ(敵手=チョキ)ならば「勝ち」を戻す。

もし、(自手=グー)かつ(敵手=パー)ならば「負け」を戻す。

もし、(自手=チョキ)かつ(敵手=グー)ならば「負け」を戻す。

もし、(自手=チョキ)かつ(敵手=パー)ならば「勝ち」を戻す。

もし、(自手=パー)かつ(敵手=チョキ)ならば「負け」を戻す。

もし、(自手=パー)かつ(敵手=グー)ならば「勝ち」を戻す。

ここまで。

エディタで実行ボタンを押すと、以下のように、じゃんけんが行われて、結果が表示されます。

プログラムの(*1)の部分では、自手と敵手でランダムにじゃんけんの手を決定し、関数「勝敗判定」を呼びだします。

そして、プログラムの(*2)の部分で、じゃんけんのメインロジックを記述しています。グー・チョキ・パーの各手の組み合わせごとに、勝敗を記述しています。じゃんけんの各手の組み合わせは、3×3=9通りありますが、あいこの場合の3パターンを一つの「もし」構文で記述できて、残りの6パターンを記述すれば、全ての手を処理できます。

○まとめ

以上、今回は、じゃんけんをプログラミングする方法を紹介しました。

冒頭のプログラムでは、計算によって勝敗を決定し、末尾のプログラムでは、じゃんけんの全ての手を「もし」構文で振り分けるという手法でルールを記述しました。この二つのプログラムを比べてみると、じゃんけんのルールを記述する方法にも、いくつかのやり方があるというのが分かるのではないでしょうか。

答えを求める方法は、一つではないのです。もちろん、単純に、どちらの書き方が優れているかを判定することはできません。冒頭の書き方は、判定自体は一行なので、洗練されているように感じますが、誰にでもプログラムが読みやすく、じゃんけんのルールが分かりやすいのは、末尾の書き方です。人の数だけ、やり方があるでしょう。ぜひ、自分でじゃんけんのプログラムを作ってみてください。楽しくゲームを作ることは、プログラミングのレベルアップにつながります。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。