0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Jasmine TeaAdvent Calendar 2023

Day 11

Jasmine Tea の関数(`FUNCTION`)を使ってみる

Last updated at Posted at 2023-12-10

これは 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)を使うとよいでしょう。

関数は命令を functionend function で囲み、返す値を return で決めます。 function の後ろには関数の名前と受け取る値(引数)を指定します。

function next_sprite_number()
  return (sprite_number + 1) % 13
end function

受け取る値(引数)や返す値(戻り値)の種類

受け取る値はなくてもよいですし、複数あってもよいです。また、数値、文字列、配列のどれでも使うことができます。一方で返す値は必ず 1 つである必要があります。ただし、受け取る値と同じように数値、文字列、配列のどれでも使うことができるので、もし 2 つ以上の値を返したいときは配列を使うと良いでしょう。

例として、 inkey$() の値に応じて、move_spritesdd の値を決める関数を作ってみます。返す値は sdd からなる配列にするため、関数の名前には配列の記号 @ をつけます。また、受け取る値は文字列なので、受け取る値の名前には $ をつけます。

function directions_of_key@(key$)

directions_of_key@ の中身は以下のようにします。

  • key$ の値が十字キーの場合: sdd の値を返す
  • それ以外の場合: からの配列 [] を返す

このようにしておけば、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
  ...

次回は

次回は、二次方程式の解を求める関数を作成してみます。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?