日本語プログラミング言語「なでしこ」Advent Calendar 2020が始まったと聞き、今まで自分で何か発信しようなんて考えたことが無かったのですが、皆さんの記事を拝見して「ちょっと新しいことにチャレンジしてみようかな」と思い立ちました。
自分が「なでしこ」でプログラミングをするときに困っていることは、現バージョンでのサンプルプログラムが少ないということです。なでしこのマニュアルを見ても、サンプルが載っていないことも多く、手探りのトライ&エラーでプログラムを書いている日々です。
そこで、自分が作ったソースが、どなたかの参考になればいいなという思いで、記事をまとめてみようかなと思います。こういうことをするのは初めてなので、いろいろと教えていただけるとうれしいです。よろしくお願いします。
この記事は、なでしこの簡易エディタで実行できるようにしていますが、Windows版のv1や、最新のv3コンソール版でも動作します。
変数
「なでしこ」を初めて触る方向けの記事はたくさんあるので、そちらに譲りたいと思います。
とりあえず、「なでしこ」でいろいろな処理をしたいと思ったときに、変数を使う必要がありますが、書き方が何通りかあります。
一般的なプログラム言語と同じ、等号(=)を使った書き方は、次のようになります。
A=12。
B=4。
C=A÷B。
Cを表示。
「なでしこ」っぽく、日本語で書くとこうなります。
Aに12を代入。
Bは4。
A÷BをCに代入。
Cを表示。
もちろん、変数名に日本語を使うことができます。変数名は「サイコロ」「明るさ」のように単語で指定するとよいと思います。「Aの明るさ」のように助詞を入れるとうまくいかないことがあります。
変数の値を表示するときはCを表示。
のように、変数名を直接記述します。他には、カギカッコ「 」の中で変数の内容を展開するために、中カッコ{ }を使う方法があります。
A=12。
B=4。
C=A÷B。
「{A}÷{B}={C}」を表示。
乱数
サイコロを振る命令を作りたいので、乱数を利用します。サイコロという変数に、1~6までのどれか1つの値を代入します。
サイコロ=(6の乱数)+1。
nの乱数
という命令で、0からn-1までの整数から1つを選んでくれます。上記のように(6の乱数)+1
とすれば、1から6までの整数から1つの値を選びます。
おみくじをつくる
単純な分岐
最も単純な分岐処理を理解するために、おみくじを作ってみます。
サイコロを振り、値が1だったら「大吉」、2だったら「凶」と表示させます。次のように記述します。
おみくじ=(6の乱数)+1。
おみくじを表示。
もし、おみくじ=1ならば
「大吉」と表示。
ここまで。
もし、おみくじ=2ならば
「凶」と表示。
ここまで。
もし、(条件式)ならば
(処理)
ここまで。
の構文で単純な分岐処理になります。この場合、条件式がYES(はい)ならば「処理」を実行することになります。そのため、上記のサンプルを実行すると、「大吉」または「凶」と表示される...と思いきや、サイコロの値が3~6だった場合は何も表示されません。
「はい」「いいえ」の分岐
サイコロを振り、値が4~6だったら「大吉」、それ以外だったら「凶」にする場合は、次のように記述します。
おみくじ=(6の乱数)+1。
おみくじを表示。
もし、おみくじ≧4ならば
「大吉」と表示。
違えば
「凶」と表示。
ここまで。
もし、(条件式)ならば
(YESの場合の処理)
違えば
(NOの場合の処理)
ここまで。
の構文で、基本的な分岐処理を作れます。条件式を満たす(YESの)場合と、満たさない(NOの)場合の2通りに分かれます。
ちなみに、なでしこでは条件式の不等号に「以上(≧
)」「以下(≦
)」を使えます。わかりやすくていいですよね。
3通り以上の分岐
こうなれば、1~6までの6通りでおみくじを用意したいので、次のように記述します。
おみくじ=(6の乱数)+1。
おみくじを表示。
もし、おみくじ=1ならば
「大吉」と表示。
違えばもし、おみくじ=2ならば
「小吉」と表示。
違えばもし、おみくじ=3ならば
「中吉」と表示。
違えばもし、おみくじ=4ならば
「吉」と表示。
違えば
「凶」と表示。
ここまで。
もし、(条件式1)ならば
(条件式1がYESの場合の処理)
違えばもし、(条件式2)ならば
(条件式2がYESの場合の処理)
違えば
(NOの場合の処理)
ここまで。
の構文で、条件が3通り以上の分岐処理を作れます。条件式1と条件式2を共に満たさない場合は違えば
の処理を実行します。
要するにこれは、
if (条件式1) {
処理1
} elseif (条件式2) {
処理2
} else {
処理3
};
みたいな感じです。
変数でスリムに?
処理自体は単純なので、おみくじ(=乱数)の値によって表示するメッセージ(=文字列)が違うだけなんです。それなら、メッセージにも変数を使えばいいじゃんということになりますが…。やってみました。
おみくじ=(6の乱数)+1。
おみくじを表示。
もし、おみくじ=1ならば
結果=「大吉」。
違えばもし、おみくじ=2ならば
結果=「小吉」。
違えばもし、おみくじ=3ならば
結果=「中吉」。
違えばもし、おみくじ=4ならば
結果=「吉」。
違えば
結果=「凶」。
ここまで。
結果を表示。
おまけ 「条件分岐」構文
v1には条件分岐という命令があります。switch ~ case構文のようなものです。
おみくじ=(6の乱数)+1。
おみくじを表示。
おみくじで条件分岐
1ならば
「大吉」と表示。
2ならば
「小吉」と表示。
3ならば
「中吉」と表示。
4ならば
「吉」と表示。
違えば
「凶」と表示。
ここまで。
ブラウザ版のv3ではこの構文が使えないので違えばもし
構文を使うことになります。
最後に
自分が「なでしこ」を使い始めたときに、分岐処理の書き方に迷ってしまうことがあったので、それを思い出しながらまとめてみました。
10日目の記事でsnowdrops89さんが角丸サイコロを作っていらっしゃるので、それを組み合わせると、見た目も楽しいおみくじになるかなと思います。
こんな記事が誰かの役に立つのだろうか…。まあいいや。やろうと思った気持ち(自己満足)と、困ったことの覚書を大事にします。また続きを書きたいと思います。