これは Jasmine Tea アドベントカレンダー 2023 の 11 日目の記事です。
こんにちは、Jasmine Tea の開発に参加している石川です。この記事では Jasmine Tea の関数 (FUNCTION
) について説明します。
Jasmine Tea の関数(FUNCTION
)は、手続き(PROCEDURE
)と似ていて、複数の命令をひとまとまりにできる仕組みです。手続きと違う点は、関数に値を与えて命令を実行するだけでなく、関数から値を返すことができる点です。例えば、inkey$()
関数は今押されているキーの文字列を返しますが、似たような関数を独自に定義することができます。
FUNCTION
命令
次のプログラムは昨日の記事で作成したもので、クリックや十字キーでキャラクターを動かすプログラムです。(動作確認はこちら)
procedure move_sprite number, x, y, sd, d
sprite number, 0, number * 4 + sd
show number, (x, y)
direction number, d
distance number, 600
speed number, 20
move number
end procedure
sprite_number = 0
do
tap x, y
if x <> -1 and y <> -1 then
call move_sprite sprite_number, x, y, 3, 3
sprite_number = (sprite_number + 1) % 13
end if
key$ = inkey$()
if key$ = "ArrowLeft" then
call move_sprite sprite_number, 320, 200, 2, 7
sprite_number = (sprite_number + 1) % 13
else if key$ = "ArrowUp" then
call move_sprite sprite_number, 320, 200, 1, 1
sprite_number = (sprite_number + 1) % 13
else if key$ = "ArrowRight" then
call move_sprite sprite_number, 320, 200, 3, 3
sprite_number = (sprite_number + 1) % 13
else if key$ = "ArrowDown" then
call move_sprite sprite_number, 320, 200, 0, 5
sprite_number = (sprite_number + 1) % 13
end if
loop
このプログラムの (sprite_number + 1) % 13
は、「つぎのスプライトの番号」を計算しています。この部分が繰り返されているので、ひとまとまりの命令のように書きたいです。しかし、計算結果を sprite_number
に代入しなくてはならないため、手続きをここで使うことはできません。こういうときは、関数(FUNCTION
)を使うとよいでしょう。
関数は命令を function
と end function
で囲み、返す値を return
で決めます。 function
の後ろには関数の名前と受け取る値(引数)を指定します。
function next_sprite_number()
return (sprite_number + 1) % 13
end function
受け取る値(引数)や返す値(戻り値)の種類
受け取る値はなくてもよいですし、複数あってもよいです。また、数値、文字列、配列のどれでも使うことができます。一方で返す値は必ず 1 つである必要があります。ただし、受け取る値と同じように数値、文字列、配列のどれでも使うことができるので、もし 2 つ以上の値を返したいときは配列を使うと良いでしょう。
例として、 inkey$()
の値に応じて、move_sprite
の sd
と d
の値を決める関数を作ってみます。返す値は sd
と d
からなる配列にするため、関数の名前には配列の記号 @
をつけます。また、受け取る値は文字列なので、受け取る値の名前には $
をつけます。
function directions_of_key@(key$)
directions_of_key@
の中身は以下のようにします。
-
key$
の値が十字キーの場合:sd
とd
の値を返す - それ以外の場合: からの配列
[]
を返す
このようにしておけば、directions_of_key@
を使う側で len
を使って配列の長さを確認し、move_sprite
を呼び出すべきか決めることができます。(プログラムの全体はこちら)
...
function directions_of_key@(key$)
if key$ = "ArrowLeft" then
return [2, 7]
else if key$ = "ArrowUp" then
return [1, 1]
else if key$ = "ArrowRight" then
return [3, 3]
else if key$ = "ArrowDown" then
return [0, 5]
else
return []
end if
end function
...
directions@ = directions_of_key@(inkey$())
if len(directions@) = 2 then
call move_sprite sprite_number, 320, 200, directions@[0], directions@[1]
sprite_number = next_sprite_number(sprite_number)
end if
...
次回は
次回は、二次方程式の解を求める関数を作成してみます。