【GMS】for文を使った繰り返し処理を解説


うっほー!ゴッリラだわさ!

みんな!突然だけど、この画像を見て!!

めっちゃかっこよくない!?(*゚▽゚)
この文字は、ダイスケさん@hiratarahirataという方に書いて頂いたんだ!

もうこの企画は終わってしまったみたいだけど、またチャンスがあるかもしれないから、
気になる方は、ぜひこの方のツイッターをフォローしてみてね!!

ゴッリラ
僕@hellomanakiのフォローもよろしくね!(*’▽’)

さて、今回はGameMakerStudio上で、繰り返し処理を行う時に役に立つ”repeat“、”for
while“、”do“文について解説していくよ!

始めてこのブログに来たよ!という方は、まずこちらの記事をチェックしてね!

いますぐゲーム開発を始めたい人へ

2018年10月27日

繰り返し処理とは

繰り返し処理とは、同じコードを何度も記述することなく処理を実行することのできる、
プログラミング言語に用意された機能のことだよ!

例えば、1から10の値を表示したい時・・・

こんな風に、同じコードを何度も書くのは大変だよね?
そんな時、繰り返し処理を使う事によってこの長いコードを・・・

こんな風にコンパクトに見やすくすることができるんだ!!

GameMakerLanguageには、repeatwhiledoforの4つの繰り返し処理が用意されていてるよ!
それぞれの違いを理解して、ループマスターを目指そう!(‘ω’)

・repeat文

記述法:

repeat文は、4つの中で一番シンプルな構文で、指定した回数{ }内の処理を実行するんだ!

使用例:

ここでは、ランダムな位置に敵インスタンスを配置しているんだ!
そして、repeat文が実行し終わった後、countは10の値を保持するよ!

こんな風に、repeat文を使うことで簡単に処理を繰り返すことができるんだ!

・while文

記述法:

While文は、条件式が満たさている間、処理を繰り返し続けるんだ!
なので、必ず条件式がいつかfalseになるように値を調整する必要があるよ!

例えば、以下のコードだと・・・

何回処理が繰り返されても、iの値は10以上にならないよね?

この状態を無限ループといって、処理が永遠に繰り返されてしまい、
while文から抜け出せなくなってしまうんだ!

iから1を引くのではなく、足すことによってiが10の値に達した時、
条件式が満たされなくなり、繰り返し処理が終了するよ!

ゴッリラ
while文を使うときは、条件式に注意しよう!

・do文

記述法:

do文は、while文とは違って条件式が満たされるまで、処理を繰り返すんだ!
ただ、while文とは違い、処理内容を実行した後に、条件式を確認するため、
最低でも1回は絶対に処理が実行されるよ!

例えば、以下の例だと・・・

既に条件式は満たされているけれど、先に処理が実行されるため、iは12の値を持つよ!

・for文

 

記述法:

for文は、repeat文とは少し違っていて、以下の順に処理が実行されるんだ!

(1)初期化式 → (2)条件式 → (3)処理実行 (4)更新式 →(2)
条件式が満たされる(true)の間処理を実行するよ!

  1. 初期化式:
    初期化式は、最初に一回実行される式のことで、処理の回数を数える値を初期化するんだ!
    例: i = 0;
  2. 条件式:
    条件式は、処理を繰り返すか判断する式のことで、結果がtrueの場合
    処理を実行するよ!falseの場合は、繰り返しを終了するんだ!
  3. 処理実行:
    {}内の処理を実行
  4. 更新式:
    更新式は、処理を実行した後、初期化式で宣言した値を更新する式のことだよ!
    処理が実行された後、また(2)の処理に移るよ!例: i+=1;

文面だと分かりづらいので、実際に例をみて理解しよう!

使用例:

例えば、4人のテスト結果を保持した配列があったとして、そのテストの合計値を求めたい時・・・

こんな風に、全ての値を呼び出す事も出来るけど、面倒だよね?(;´・ω・)

そんな時、for文が役に立つんだ!

*array_length_1dは、引数として渡した配列のサイズを返すよ!

ここでは、最初にiの値を0に初期化していて、iの値が配列のサイズ(4)より小さい場合、
i番目のテストの点数を変数sumに足しているよ!

そして、処理が実行された後、iの値を1増やしているんだ!
この処理は、iが配列のサイズより小さい間繰り返されるよ!

まとめ

お疲れ様!これで繰り返し処理についての説明はおしまいだよ!

repeat,while,do,for文を使うことで、沢山の時間を節約することが出来るんだ!
それぞれ向き不向きがあるので、うまく使い分けてね!

この記事を通して、少しでも皆が新しいことを学ぶことができたら嬉しいな(*’▽’)
質問があればいつでも@hellomanaki、コメントで待ってるよ!

また次の記事で会えることを楽しみにしているよ!

ゴッリラ
またね~!
2+

11 件のコメント

  • こんにちは前回の記事を参考にして作ってみたのですが,
    ___________________________________________
    ############################################################################################
    FATAL ERROR in
    action number 1
    of Step Evento__asteroid
    for object o_bullet:

    Variable .s_asteroid_l(100004, -2147483648) not set before reading it.
    at gml_Object_o_bullet_Collision_3d4bddfa_7daf_40fa_a9c5_873660c4fb63 (line 7) – if(sprite_index == s_asteroid_l)
    ############################################################################################
    ——————————————————————————————–
    stack frame is
    gml_Object_o_bullet_Collision_3d4bddfa_7daf_40fa_a9c5_873660c4fb63 (line 7)
    というエラーコードが出てきました。どこが間違っているということなのでしょうか?

    1+
    • 質問ありがとうございます!
      画面右sprite一覧の写真を送ってもらえますか?おそらく大隕石の名前を打ち間違えているか、別の名前を使用しているからだと思います!

      1+
  • while文について質問です。
    while文は条件式が「満たされるまで」実行ですか? 「満たされなくなるまで」実行ですか?
    本文中の解説には「満たされるまで」とありました。ですがその場合以下のコードは条件式が満たされていると思います。

    ※ここから引用↓

    例えば、以下のコードだと・・・

    i = 0;
    while(i < 10)
    {
    i-=1;  
    }

    何回処理が繰り返されても、条件式は満たされないよね?

    ※引用ここまで↑

    「何回処理が繰り返されても条件式は満たされない」とのことですが、このコードではiを0で初期化していて、iが10未満になるまでiから1を引く処理だと思うのですが、iを0で初期化している時点で「iが10未満」という条件を満たしていると思います。ですので、while文は「条件を満たさなくなったとき」にループを抜けるという解説が正しい気がしました。

    そこで以下のコードで実行してみました。するとiが10をこえたとき、つまり「iが10より小さい」という条件式が「満たされなくなった」ときにwhile処理を抜け、デバッグにiがprintされなくなりました。

    i = 0
    while(i < 10)
    {
    i += 1
    show_debug_message(i)
    }

    長くなりましたが、while文は「条件が満たされなくなった時に処理を抜ける」という認識で問題ないのでしょうか。

    1+
    • サッルさんご指摘ありがとうございます!
      while文は条件式が満たされなくなった時に処理を抜けるという認識が正しいです。
      すぐに記事の内容を訂正させていただきますね、混乱を招いてしまい申し訳ありませんでした。

      1+
      • 2つ目のコメントをしたあとに確認しました。ありがとうございます。
        GMSの日本語の情報がほとんどなくこのブログは本当に役に立っています。
        誤りと分かってスッキリしました。本当にありがとうございます。

        0
        • こちらこそ、ありがとうございます!
          自分ではどうしてもミスに気づけない事があるので、とても助かりました(*’▽’)
          そう言っていただけて嬉しいです!また更新出来るように頑張りますね!
          今訂正させていただいたので念のため確認をお願いできますか?

          0
          • while文の説明だけですが確認しました。修正に間違いはないと思います。
            ただ1点、while文の説明に使われている画像だけはまだ「Trueで処理が終了」となっているのでその点は変更が必要だと思います。

            0
          • ありがとうございます!画像の方も修正させていただきました!

            0
  • 本文中のwhile文に関しての画像でもTrueでループを抜けると説明されていますが、誤りなのではないかと思っています。
    こちらはPHPについての解説なのでGMLとは異なる言語ではありますが、やはりFalseでループを抜けています。
    https://qiita.com/tsukishimaao/items/ea73e0723b362a75fc5f

    他の言語を軽く触っていた程度でGMS自体は初めてなので、もしかしたらトンチンカンなことを言っているのかもしれませんが、教えていただけると幸いです。

    0
  • コメントを残す

    メールアドレスが公開されることはありません。

    ABOUTこの記事をかいた人

    このブログでは、初心者向けにGameMakerStudioを使ったゲームの作り方、プログラミングについての基礎知識を解説しているよ! "自分でゲームをつくってみたい!と思っている人は、是非読んでみてね!