懲りずに、今度は日本語プログラミング言語「なでしこ」で、簡単な数当てゲームを作ってみたいと思います。「なでしこ」の分岐処理の書き方は何通りかあるので、そのメモとして書いてみます。「なでしこ」に初めて触れる方が、このゲームを試してみて「なでしこ」の魅力を感じてもらえたらうれしいです。
この記事は、なでしこの簡易エディタv3で実行できるようにしていますが、Windows版のv1や、最新のv3コンソール版でも動作します。
基本形をつくる
とりあえず、乱数と分岐処理を利用して基本形を作りたいと思います。
サイコロ=(6の乱数)+1。
答え=「サイコロの目はいくつでしょう?」と尋ねる。 // #1
もし、答え=サイコロならば // #2
「正解!」と表示。
違えば
「残念。正解は{サイコロ}でした。」と表示。 // #3
ここまで。
#1 尋ねる
尋ねる
という命令を使うと、入力ダイアログが表示されて、文字や数値を入力できるようになります。カギカッコ「 」
には、ダイアログに表示させたいメッセージを入れておきます。
変数=「メッセージ」と尋ねる。
という構文で、メッセージを表示して、ダイアログが表示されて、入力した値が変数へ代入されます。
キャンセルボタンを押すと、変数には空の文字列(長さ=0の文字列)が代入されます。なでしこでは""
と書かずに、漢字1文字で空
と書いたり、カギカッコをつなげて「」
と書いたりします。
A=空。
B=「」。
#2 もし、答え=サイコロならば
分岐処理もし、~ならば
の条件式で、乱数の値(変数サイコロ)と、入力した値(変数答え)を比較します。
- 2つの変数の値が一致していれば、**正解!**と表示します。
- そうでなければ、残念と表示します。
蛇足ですが、最近「なでしこ」のインデント構文が話題になっています。自分は中学生に「なでしこ」を使ってプログラミングを教えていますが、インデントを理解できる生徒は意外に少ないです。だからインデントを気にせずにもし、~ならば
と違えば
、ここまで
の構文で覚えたほうが、理解しやすいのではないかと考えています。
#3 正解は{サイコロ}でした
「 」を表示
という構文で、カギカッコ「 」の中の文字列を表示します。「 」の中で中カッコ{ }を使うと、その中に書かれた数式を計算したり、変数の値を表示したりしてくれます。
「3×4={3×4}」と表示。
↑ を実行すると、3×4=12と表示されます。
「残念。正解は{サイコロ}でした。」と表示。
↑ を実行すると、サイコロの値が3ならば、**残念。正解は3でした。**と表示されます。
とりあえず、上記の基本形kazuate1.nako
を実行すると、数当てゲームを楽しむことができます。
反復処理を加える
このままでは、1回しか答えられないので、何度も「実行」する必要があります。そこで、反復処理を使って、5回答えられるようにしてみます。
5回まで答えたい
「なでしこ」には、反復処理の構文がいくつかあります。最も単純なものはn回 ~ ここまで
という構文です。
サイコロ=(6の乱数)+1。
5回
答え=「{回数}回目 サイコロの目はいくつ?」と尋ねる。
もし、答え=サイコロならば
「正解!」と表示。
抜ける。 // #1
違えば
「残念。」と表示。
ここまで。
ここまで。
「正解は{サイコロ}でした。」と表示。 //#2
n回
(★繰り返したい処理)
ここまで
の構文で、★印の処理をn回繰り返します。このとき、特殊変数である回数
には、今何回目なのかが整数で代入されます。この回数
という特殊変数は、私たちが設定する必要は無く、自動的に値が代入されています。「なでしこ」には、このような便利な特殊変数がいくつか用意されています。
処理の中で抜ける。
を使うと、反復処理から抜け出ることができます。ここでは、正解したらもう反復する必要がないので、#1の抜ける
によって反復処理を抜けて、#2で正解を表示します。
ヒントを表示したい
せっかく5回答えられるのに、間違えたときに「残念」しか表示されないのはつまらないので、ヒントを表示させようと思います。
サイコロ=(6の乱数)+1。
5回
答え=「{回数}回目 サイコロの目はいくつ?」と尋ねる。
もし、答え=サイコロならば
「正解!」と表示。
抜ける。
違えば
もし、答え>サイコロならば // #3
「もっと小さいよ」と言う。 // #4
違えば
「もっと大きいよ」と言う。
ここまで。
ここまで。
ここまで。
「正解は{サイコロ}でした。」と表示。
正解ではなかったときに、「残念」と表示する(#3の位置)代わりに、ヒントを表示するための分岐処理を入れました。分岐の内側に、さらに分岐を入れることができます。
今回は**#4**の位置で、表示
ではなく言う
という命令を使いました。こうすると、ダイアログにメッセージを表示できます。このプログラムを「なでしこ」の簡易エディタで実行したときに、1回ごとにヒントが表示されるようにするためです。
これで、少しゲーム性が高まった…でしょうか。
フラグを使いたい
先ほどの抜ける
を使うのは、反復処理を抜ける簡単なやり方ですが、どうしても美しいと思えなくて…(ごめんなさい…)。昔のBASICで「GOTOだけは使うな」と言われたことを思い出してしまいます。そこで、変数を使って同じことをやってみようかなと思います。
正解済
という変数を用意して、正解していない間は0を、正解したら1を代入しようと思います。もし、この値が1になっていたら、答えを尋ねてこないようにしようと思います。こういう変数の役割をフラグと呼びます。
サイコロ=(6の乱数)+1。
正解済=0。 // #5
5回
もし、正解済=0ならば // #6
答え=「{回数}回目 サイコロの目はいくつ?」と尋ねる。
もし、答え=サイコロならば
「正解!」と表示。
正解済=1。 // #7
違えば
もし、答え>サイコロならば
「もっと小さいよ」と言う。
違えば
「もっと大きいよ」と言う。
ここまで。
ここまで。
ここまで。
ここまで。
「正解は{サイコロ}でした。」と表示。
#5の位置で、フラグ変数の正解済
を初期化するために0を代入します。
#7の位置で、正解したときにフラグ変数正解済
に1を代入します(フラグを立てています)。
#6の位置で、もしフラグ変数正解済=0
ならば、サイコロの目を尋ねる処理を実行します。フラグが立っている(正解済=1、正確には正解済≠0)ならば、実行しません。
このようにすれば、抜ける
を使わなくても、フラグ変数を利用して同じことを実現できます。とは言っても、#6の分岐でフラグが立っていても、反復処理は5回実行されることになるので、ムダな処理があるとも言えます。
フラグの値が0と1の2択ではなく、0と1と2の3択になって、もう少し処理を工夫することができると考えれば、フラグを使う意味が大きくなってくるかなと思います。
最後に
「なでしこ」の反復処理は、BASICやDelphiでいうFor ~ next
やwhile ~ do
、do ~ until
にあたる構文もありますので、調べてみると面白いと思います。
10日目の記事でsnowdrops89さんが角丸サイコロを作っていらっしゃるので、それを組み合わせると、見た目も楽しい数当てゲームになるかなと思います。
今回も、こんな記事が誰かの役に立つのだろうか…と思いながら、1人でもお役に立てばいいなと思います。