LoginSignup
3
2

More than 3 years have passed since last update.

懲りずに、今度は日本語プログラミング言語「なでしこ」で、簡単な数当てゲームを作ってみたいと思います。「なでしこ」の分岐処理の書き方は何通りかあるので、そのメモとして書いてみます。「なでしこ」に初めて触れる方が、このゲームを試してみて「なでしこ」の魅力を感じてもらえたらうれしいです。

この記事は、なでしこの簡易エディタv3で実行できるようにしていますが、Windows版のv1や、最新のv3コンソール版でも動作します。

基本形をつくる

とりあえず、乱数と分岐処理を利用して基本形を作りたいと思います。

kazuate1.nako
サイコロ=(6の乱数)+1。
答え=「サイコロの目はいくつでしょう?」と尋ねる。 // #1

もし、答え=サイコロならば                       // #2
  「正解!」と表示。
違えば
  「残念。正解は{サイコロ}でした。」と表示。   // #3 
ここまで。

#1 尋ねる

尋ねるという命令を使うと、入力ダイアログが表示されて、文字や数値を入力できるようになります。カギカッコ「 」には、ダイアログに表示させたいメッセージを入れておきます。
p1.PNG
変数=「メッセージ」と尋ねる。という構文で、メッセージを表示して、ダイアログが表示されて、入力した値が変数へ代入されます。
キャンセルボタンを押すと、変数には空の文字列(長さ=0の文字列)が代入されます。なでしこでは""と書かずに、漢字1文字でと書いたり、カギカッコをつなげて「」と書いたりします。

A=空。
B=「」。

#2 もし、答え=サイコロならば

分岐処理もし、~ならばの条件式で、乱数の値(変数サイコロ)と、入力した値(変数答え)を比較します。
- 2つの変数の値が一致していれば、正解!と表示します。
- そうでなければ、残念と表示します。

蛇足ですが、最近「なでしこ」のインデント構文が話題になっています。自分は中学生に「なでしこ」を使ってプログラミングを教えていますが、インデントを理解できる生徒は意外に少ないです。だからインデントを気にせずにもし、~ならば違えばここまでの構文で覚えたほうが、理解しやすいのではないかと考えています。

#3 正解は{サイコロ}でした

「 」を表示という構文で、カギカッコ「 」の中の文字列を表示します。「 」の中で中カッコ{ }を使うと、その中に書かれた数式を計算したり、変数の値を表示したりしてくれます。

「3×4={3×4}」と表示。

↑ を実行すると、3×4=12と表示されます。

  「残念。正解は{サイコロ}でした。」と表示。

↑ を実行すると、サイコロの値が3ならば、残念。正解は3でした。と表示されます。

とりあえず、上記の基本形kazuate1.nakoを実行すると、数当てゲームを楽しむことができます。

反復処理を加える

このままでは、1回しか答えられないので、何度も「実行」する必要があります。そこで、反復処理を使って、5回答えられるようにしてみます。

5回まで答えたい

「なでしこ」には、反復処理の構文がいくつかあります。最も単純なものはn回 ~ ここまでという構文です。

kazuate2.nako
サイコロ=(6の乱数)+1。

5回
  答え=「{回数}回目 サイコロの目はいくつ?」と尋ねる。

  もし、答え=サイコロならば
    「正解!」と表示。
    抜ける。  // #1
  違えば
    「残念。」と表示。
  ここまで。
ここまで。
「正解は{サイコロ}でした。」と表示。  //#2

n回
 (★繰り返したい処理)
ここまで

の構文で、★印の処理をn回繰り返します。このとき、特殊変数である回数には、今何回目なのかが整数で代入されます。この回数という特殊変数は、私たちが設定する必要は無く、自動的に値が代入されています。「なでしこ」には、このような便利な特殊変数がいくつか用意されています。

処理の中で抜ける。を使うと、反復処理から抜け出ることができます。ここでは、正解したらもう反復する必要がないので、#1抜けるによって反復処理を抜けて、#2で正解を表示します。

ヒントを表示したい

せっかく5回答えられるのに、間違えたときに「残念」しか表示されないのはつまらないので、ヒントを表示させようと思います。

kazuate3.nako
サイコロ=(6の乱数)+1。

5回
  答え=「{回数}回目 サイコロの目はいくつ?」と尋ねる。

  もし、答え=サイコロならば
    「正解!」と表示。
    抜ける。
  違えば
    もし、答え>サイコロならば   // #3
      「もっと小さいよ」と言う。 // #4
    違えば
      「もっと大きいよ」と言う。
    ここまで。
  ここまで。
ここまで。
「正解は{サイコロ}でした。」と表示。

正解ではなかったときに、「残念」と表示する(#3の位置)代わりに、ヒントを表示するための分岐処理を入れました。分岐の内側に、さらに分岐を入れることができます。
今回は#4の位置で、表示ではなく言うという命令を使いました。こうすると、ダイアログにメッセージを表示できます。このプログラムを「なでしこ」の簡易エディタで実行したときに、1回ごとにヒントが表示されるようにするためです。

これで、少しゲーム性が高まった…でしょうか。

フラグを使いたい

先ほどの抜けるを使うのは、反復処理を抜ける簡単なやり方ですが、どうしても美しいと思えなくて…(ごめんなさい…)。昔のBASICで「GOTOだけは使うな」と言われたことを思い出してしまいます。そこで、変数を使って同じことをやってみようかなと思います。

正解済という変数を用意して、正解していない間は0を、正解したら1を代入しようと思います。もし、この値が1になっていたら、答えを尋ねてこないようにしようと思います。こういう変数の役割をフラグと呼びます。

kazuate4.nako
サイコロ=(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 ~ nextwhile ~ dodo ~ untilにあたる構文もありますので、調べてみると面白いと思います。

10日目の記事でsnowdrops89さんが角丸サイコロを作っていらっしゃるので、それを組み合わせると、見た目も楽しい数当てゲームになるかなと思います。

今回も、こんな記事が誰かの役に立つのだろうか…と思いながら、1人でもお役に立てばいいなと思います。

参考

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2