なでしこで数当てゲーム

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

この記事は、なでしこの[簡易エディタv3](https://nadesi.com/doc3/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%933%E7%B0%A1%E6%98%93%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF)で実行できるようにしていますが、Windows版のv1や、最新のv3コンソール版でも動作します。

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

```kazuate1.nako
サイコロ＝（６の乱数）＋１。
答え＝「サイコロの目はいくつでしょう？」と尋ねる。　// #1

もし、答え＝サイコロならば                       // #2
　　「正解！」と表示。
違えば
　　「残念。正解は｛サイコロ｝でした。」と表示。   // #3 
ここまで。
```
## #1 尋ねる
`尋ねる`という命令を使うと、入力ダイアログが表示されて、文字や数値を入力できるようになります。カギカッコ`「　」`には、ダイアログに表示させたいメッセージを入れておきます。
![p1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942750/6b1a076e-d5d7-e10e-142f-964c06fedc76.png)
`変数＝「メッセージ」と尋ねる。`という構文で、メッセージを表示して、ダイアログが表示されて、入力した値が変数へ代入されます。
キャンセルボタンを押すと、変数には空の文字列（長さ＝０の文字列）が代入されます。なでしこでは`""`と書かずに、漢字１文字で`空`と書いたり、カギカッコをつなげて`「」`と書いたりします。

```
A=空。
B=「」。
```

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

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

## #3 正解は｛サイコロ｝でした
`「　」を表示`という構文で、カギカッコ「　」の中の文字列を表示します。「　」の中で中カッコ｛　｝を使うと、その中に書かれた数式を計算したり、変数の値を表示したりしてくれます。

```
「３×４＝｛３×４｝」と表示。
```
↑　を実行すると、**３×４＝12**と表示されます。

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

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

# 反復処理を加える

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

## ５回まで答えたい

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

```kazuate2.nako
サイコロ＝（６の乱数）＋１。

５回
　　答え＝「｛回数｝回目　サイコロの目はいくつ？」と尋ねる。

　　もし、答え＝サイコロならば
　　　　「正解！」と表示。
　　　　抜ける。　　// #1
　　違えば
　　　　「残念。」と表示。
　　ここまで。
ここまで。
「正解は｛サイコロ｝でした。」と表示。　　//#2
```
**ｎ回
　（★繰り返したい処理）
ここまで**
の構文で、★印の処理をｎ回繰り返します。このとき、特殊変数である`回数`には、今何回目なのかが整数で代入されます。この`回数`という特殊変数は、私たちが設定する必要は無く、自動的に値が代入されています。「なでしこ」には、このような便利な特殊変数がいくつか用意されています。

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

## ヒントを表示したい

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

```kazuate3.nako
サイコロ＝（６の乱数）＋１。

５回
　　答え＝「｛回数｝回目　サイコロの目はいくつ？」と尋ねる。

　　もし、答え＝サイコロならば
　　　　「正解！」と表示。
　　　　抜ける。
　　違えば
　　　　もし、答え＞サイコロならば　　　// #3
　　　　　　「もっと小さいよ」と言う。　// #4
　　　　違えば
　　　　　　「もっと大きいよ」と言う。
　　　　ここまで。
　　ここまで。
ここまで。
「正解は｛サイコロ｝でした。」と表示。
```

正解ではなかったときに、「残念」と表示する（**#3**の位置）代わりに、ヒントを表示するための分岐処理を入れました。分岐の内側に、さらに分岐を入れることができます。
今回は**#4**の位置で、`表示`ではなく`言う`という命令を使いました。こうすると、ダイアログにメッセージを表示できます。このプログラムを「なでしこ」の[簡易エディタ](https://nadesi.com/doc3/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%933%E7%B0%A1%E6%98%93%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF)で実行したときに、１回ごとにヒントが表示されるようにするためです。

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

## フラグを使いたい

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

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

```kazuate4.nako
サイコロ＝（６の乱数）＋１。
正解済＝０。　　// #5

５回
　　もし、正解済＝０ならば　　// #6
　　　　答え＝「｛回数｝回目　サイコロの目はいくつ？」と尋ねる。
　　
　　　　もし、答え＝サイコロならば
　　　　　　「正解！」と表示。
　　　　　　正解済＝１。　　// #7
　　　　違えば
　　　　　　もし、答え＞サイコロならば
　　　　　　　　「もっと小さいよ」と言う。
　　　　　　違えば
　　　　　　　　「もっと大きいよ」と言う。
　　　　　　ここまで。
　　　　ここまで。
　　ここまで。
ここまで。
「正解は｛サイコロ｝でした。」と表示。
```

**#5**の位置で、フラグ変数の`正解済`を初期化するために０を代入します。
**#7**の位置で、正解したときにフラグ変数`正解済`に１を代入します（フラグを立てています）。
**#6**の位置で、もしフラグ変数`正解済＝０`ならば、サイコロの目を尋ねる処理を実行します。フラグが立っている（*正解済＝１*、正確には*正解済≠０*）ならば、実行しません。

このようにすれば、`抜ける`を使わなくても、フラグ変数を利用して同じことを実現できます。とは言っても、**#6**の分岐でフラグが立っていても、反復処理は５回実行されることになるので、ムダな処理があるとも言えます。

フラグの値が０と１の２択ではなく、０と１と２の３択になって、もう少し処理を工夫することができると考えれば、フラグを使う意味が大きくなってくるかなと思います。

## 最後に
「なでしこ」の反復処理は、BASICやDelphiでいう`For ～ next`や`while ～ do`、`do ～ until`にあたる構文もありますので、調べてみると面白いと思います。

10日目の記事でsnowdrops89さんが[角丸サイコロを作って](https://qiita.com/snowdrops89/items/7c6aac54366f6df79f6a)いらっしゃるので、それを組み合わせると、見た目も楽しい数当てゲームになるかなと思います。

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

## 参考
- v1マニュアル - [制御構文](https://nadesi.com/doc/reference/syntax/1-6-koubun.htm)
- v3マニュアル - [制御構文について](https://nadesi.com/doc3/index.php?%E5%88%B6%E5%BE%A1%E6%A7%8B%E6%96%87%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)