Kuina-chan

くいなちゃん2018年12月11日


プログラミング言語Kuin」の基本構文を学ぶチュートリアル2です。 今回はサイコロを振るプログラムを作ってみます。

1ウインドウの作成

まずはウインドウを表示してみます。 Kuinを起動(もしくは新規作成)し、図1-1の(1)から「mainと空のウインドウ」をクリックしてコードを挿入してください。
スニペット
図1-1: スニペット
図1-2のコードが挿入されたと思います。
  1. var wndMain: wnd@Wnd
  2.  
  3. func main()
  4.   do @wndMain :: wnd@makeWnd(null, %normal, 800, 450, "Title")
  5.  
  6.   while(wnd@act())
  7.   end while
  8. end func
図1-2: 空のウインドウを表示するプログラム
これは、単にウインドウを表示するだけのプログラムになっていて、先ほどの(1)をクリックせずに1文字ずつ書いても同じ結果になります。
先ほどの(1)は、よく書くプログラムをすぐに挿入できる機能で「スニペット」といいます。 自分で好きなプログラムをスニペットに登録することもできますので便利に使ってください。
このプログラムをウインドウモードで「コンパイル&実行」すると図1-3のようになります。
ウインドウの表示
図1-3: ウインドウの表示
それではプログラムの中身を説明します。 Kuinでは、「func main()」と「end func」で挟まれた行が上から順に実行されます(図1-4)。
  1. var wndMain: wnd@Wnd
  2.  
  3. func main()
  4.   do @wndMain :: wnd@makeWnd(null, %normal, 800, 450, "Title")
  5.  
  6.   while(wnd@act())
  7.   end while
  8. end func
図1-4: 空のウインドウを表示するプログラム2
つまり4~7行目が実行されて、このプログラムは終了します。
4行目の「wnd@makeWnd(~)」は、ウインドウを作成する命令です。 括弧の中はカンマ区切りでそれぞれ、「親ウインドウ」「サイズを変更したときの挙動」「幅」「高さ」「タイトルに表示するテキスト」が書かれています。 親ウインドウが無い場合はこのように「null」と書きます。
作成したウインドウは、「do @wndMain ::」によって「@wndMain」という名前の変数に代入しています。 「変数」とは箱のようなもので、値を入れたり、入っている値を読んだりすることができます。 「::」は代入演算子といい、「::」の右側の値を左の変数に代入する操作を表します。
変数は使う前にあらかじめ作成しておく必要があります。 この「@wndMain」は1行目で作成しています。 「var 変数名: 型名」と書くことで、その名前と型を持った変数が作成されます。
「型」とは、その変数にどんな値が入るかを示すもので、例えば整数型には整数しか入らず、文字型には文字しか入りません。 このプログラムの「wnd@Wnd型」はウインドウが入る型です。
さて、残るは6~7行目のプログラムです(図1-5)。
  1. var wndMain: wnd@Wnd
  2.  
  3. func main()
  4.   do @wndMain :: wnd@makeWnd(null, %normal, 800, 450, "Title")
  5.  
  6.   while(wnd@act())
  7.   end while
  8. end func
図1-5: 空のウインドウを表示するプログラム3
6~7行目は、ウインドウを閉じるまでこのプログラムを終了しないようにする処理です。
「wnd@act()」は、ウインドウを移動したり、サイズを変更したりしたり、閉じたときなどの処理を行う命令です。 この命令は真偽の値を返し、ウインドウが閉じられるまでは真、閉じたときには偽の値を返します。
「while(~)」は、括弧内の値が真である限り、「end while」とに挟まれた部分の行を繰り返し実行する命令になります。 つまりこの6~7行目は、ウインドウが閉じられて「wnd@act()」が偽の値を返すまで、待機し続けるような処理になっています。

2ボタンの追加

さて、プログラムの基本的な仕組みが分かったところで、ウインドウにボタンを追加してみましょう。 図2-1のプログラムを書き加えます。
  1. var wndMain: wnd@Wnd
  2. var btnDice: wnd@Btn
  3.  
  4. func main()
  5.   do @wndMain :: wnd@makeWnd(null, %normal, 800, 450, "Title")
  6.   do @btnDice :: wnd@makeBtn(@wndMain, 12, 12, 185, 23, %fix, %fix, "サイコロを振る")
  7.  
  8.   while(wnd@act())
  9.   end while
  10. end func
図2-1: ボタンの追加
ボタンの作成は、基本的にはウインドウの作成と同じで、「wnd@makeBtn(~)」を使って行います。 括弧の中身は順に「親ウインドウ」「左座標」「上座標」「幅」「高さ」「親ウインドウの幅を変更したときの挙動」「親ウインドウの高さを変更したときの挙動」「表示するテキスト」です。
実行すると図2-2のようになります。
ボタンの追加の実行画面
図2-2: ボタンの追加の実行画面
ボタンを押してみても何も起こりませんが、それはプログラムを書いていないからです。 図2-3のプログラムを追加しましょう。
  1. var wndMain: wnd@Wnd
  2. var btnDice: wnd@Btn
  3.  
  4. func main()
  5.   do @wndMain :: wnd@makeWnd(null, %normal, 800, 450, "Title")
  6.   do @btnDice :: wnd@makeBtn(@wndMain, 12, 12, 185, 23, %fix, %fix, "サイコロを振る")
  7.   do @btnDice.onPush :: @btnDiceOnPush
  8.  
  9.   while(wnd@act())
  10.   end while
  11. end func
  12.  
  13. func btnDiceOnPush(sender: wnd@Btn)
  14.   do wnd@msgBox(@wndMain, lib@rnd(1, 6).toStr(), "サイコロの結果", %info, %ok)
  15. end func
図2-3: サイコロを振る
作成したボタンは、6行目で「@btnDice」の変数に代入されていますが、7行目のようにこの@btnDiceに対して「do @btnDice.onPush :: ~」と書くと、@btnDiceのボタンが押されたときの動作を設定することができます。
この「@btnDice.onPush」とは@btnDiceが持つ要素で、変数のように扱えます。 「@btnDice.onPush」に代入した処理が、ボタンが押されるたびに呼び出される仕組みです。
ここでは13行目で「@btnDiceOnPush」というものを作成していて、それを7行目で「@btnDice.onPush」に代入していますので、ボタンが押されるたびに13行目の処理が行われるようになります。
13~15行目では、ボタンが押されたときの処理を書いています。 14行目の「wnd@msgBox(~)」は画面にメッセージを表示する命令です。 括弧内は順に「親ウインドウ」「表示するメッセージ」「タイトルに表示するテキスト」「表示するアイコン」「表示するボタン」です。
14行目の「lib@rnd(1, 6).toStr()」のうち、「lib@rnd(1, 6)」は1~6の数をランダムに返す命令です。 ただし「wnd@msgBox(~)」で表示するテキストは「文字列型」でなければならず、「lib@rnd(~)」は整数型で返ってくるため、「.toStr()」によって整数型から文字列型に変換しています。
ボタンを押すと図2-4のように、1~6の数がランダムに表示されます。
サイコロを振る実行画面
図2-4: サイコロを振る実行画面
ちなみに13~15行目のように「func 関数名(~)」と「end func」で囲んだ部分のことを「関数」といい、一連の処理をまとめることができます。 関数にまとめた処理は、プログラムの複数の箇所から呼び出して実行したり、また先ほどの「@btnDice.onPush :: ~」のように変数に代入することができます。
「func main()」も一種の関数です。 つまり、Kuinのプログラムは「main」という名前の関数を実行して終わる流れだと言えます。

3サイコロを10個振る

さて、サイコロを10個振るようにしてみましょう。 図3-1のプログラムを追加します。
  1. var wndMain: wnd@Wnd
  2. var btnDice: wnd@Btn
  3.  
  4. func main()
  5.   do @wndMain :: wnd@makeWnd(null, %normal, 800, 450, "Title")
  6.   do @btnDice :: wnd@makeBtn(@wndMain, 12, 12, 185, 23, %fix, %fix, "サイコロを振る")
  7.   do @btnDice.onPush :: @btnDiceOnPush
  8.  
  9.   while(wnd@act())
  10.   end while
  11. end func
  12.  
  13. func btnDiceOnPush(sender: wnd@Btn)
  14.   var msg: []char :: ""
  15.   for(1, 10)
  16.     do msg :: msg ~ lib@rnd(1, 6).toStr() ~ "\n"
  17.   end for
  18.   do wnd@msgBox(@wndMain, msg, "サイコロの結果", %info, %ok)
  19. end func
図3-1: 10個のサイコロを振る
18行目の「msg」の部分も忘れずに書き換えてください。
15~17行目のように「for ~」と「end for」で囲むと、その間を数え上げながら一定回数繰り返します。 書き方は「for(数え始める値, 数え終わる値)」です。 このプログラムでは「for(1, 10)」とあるため、「1、2、3、…、10」と数えながら、計10回繰り返します。
14行目では、「msg」という名前の変数を作成しています。 型は「[]char」ですが、これは文字列を入れる型です。 「文字列」とは文字が連なったもので、つまり「ABCDE」や「こんにちは」などのことです。
プログラム上にところどころ「"」の記号がありますが、Kuinでは文字列を表すときに「"」で囲んで、「"ABCDE"」「"こんにちは"」などと書きます。 0文字の文字列は「空文字列」といい、「""」と書きます。 14行目では、変数msgを作成すると同時に、「:: ""」によって空文字列を代入しています。
16行目に出てくる「~」の記号は、文字列を連結する操作です。 例えば「"ABC" ~ "DEF"」と書くと、「"ABCDEF"」になります。
また16行目の「\n」は、改行文字を表します。 このようにプログラム上でそのまま書くことが難しい文字は、「\」の記号と1文字の組み合わせで表します。 「\」の文字自体を表したい場合は「\\」と書きます。
以上の仕組みにより、16行目の「do msg :: msg ~ lib@rnd(1, 6).toStr() ~ "\n"」を実行するたびに、変数msgの文字列には、「lib@rnd(1, 6).toStr()」の結果に改行文字を付けたものが追加されることになります。 計10回繰り返されるため、このプログラムを実行すると図3-2のようになります。
10個のサイコロを振る実行画面
図3-2: 10個のサイコロを振る実行画面
以上、チュートリアル「サイコロを振るプログラム」でした。 次回は、簡単なミニゲームを作ってみます!
1544534117jaf