日本語プログラミング言語「なでしこ」公式サイト |
筆者が海外旅行に行ったとき、地元の方とじゃんけんをする機会があり、呼び名こそ違うものの、同じルールで勝負できることが新鮮でした。そもそも、じゃんけんは、江戸時代から明治時代にかけて日本で成立し、近代に世界に広まったものだそうです。今回は、日本が世界に誇る「じゃんけん」ゲームのプログラムを作ってみましょう。
ちなみに、「じゃんけん」ですが、日本国内でも、かけ声が違ったり、三回勝負だったりと、いろいろなローカルルールがありますが、インドネシアでは、ゾウ・アリ・ヒトで勝負したり、マレーシアでは、太陽・鉄砲・鳥・石・水の五種類で勝負するとか。やはり、国によって、いろいろなバリエーションがあるようです。とは言え、今回は、日本の伝統的なルールの、じゃんけんをプログラミングしてみましょう。
日本語プログラミングでじゃんけんゲームを作ってみる
まずは最初に、以下のような完成版のプログラムを紹介します。このプログラムをコピーして、なでしこ3の簡易エディタに貼り付けて「実行」ボタンを押してみましょう。
# --- HTMLを定義 --- (*1)
「#nako3_div_1」に「
<div style="padding:15px; border:1px solid silver;">
<div id="janken">今から<br>じゃんけんしよう</div>
<div id="hand">
<button id="gu">グー</button>
<button id="choki">チョキ</button>
<button id="pa">パー</button>
</div>
</div>
」を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」に「自分は<b>{自手説明}</b><br>
相手は<b>{敵手説明}</b> ... {判定}」を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貢献者章受賞。技術書も多く執筆している。