このページで紹介しているのは、ゲーム「Autonauts(オートノーツ)」の「プログラム例:落ちているアイテムを拾う→しまう」です。
実際にスクリプト(プログラムコード)を記載しています。
プログラムを知らない初心者向けに書いており、
またステップアップとして、プログラムの改良方法も紹介しています。
参考にしていただければ幸いです。
スポンサーリンク
■ 落ちているアイテムを拾う
地面に落ちているアイテムを拾う、基本スクリプトは以下の通りです。
一番近い○○がある場所□
○○に移動
○○を拾う
これで1回動作します。
上の□の部分で、探す範囲を設定できます。
幅広くアイテムを探すような場合は、範囲を広くし、特定の場所にドロップするような場合は、範囲を狭くするといいでしょう。
よくわからない場合は、範囲を最大にすると良いです。
■ 特定の場所にしまう
ケースやパレットなど、特定の場所にアイテムをしまう、基本スクリプトは以下の通りです。
○○の保管場所に移動
○○の保管場所に追加
但し、このスクリプトは、手にそのアイテムを持っているという前提条件付きです。手にそのアイテムをもたずに実行すると、エラーになります。
■ 落ちているアイテムを拾い→特定の場所にしまう
上の2つのスクリプトを組み合わせると、「拾って→しまう」というプログラムが完成します。
一番近い○○がある場所□
○○に移動
○○を拾う
○○の保管場所に移動
○○の保管場所に追加
続けて実行させることで、上で説明した「手に持っていない時にエラーになる」が解決できます。
このスクリプトに、「繰り返し」を追加することで、永久に動作させられます。
繰り返し:永遠に!
一番近い○○がある場所□
○○に移動
○○を拾う
○○の保管場所に移動
○○の保管場所に追加
基本的にこのプログラムは、ゲーム最序盤で作るはずです。
チュートリアルからの流れで、切った「丸太」のピックアップ→収納が可能です。
このスクリプトを使うことで、ほとんどのアイテムをピックアップ→収納できます。
同じように採掘して手に入る「石」。
木を切ったり叩くと落ちてくる「木の種」や「枝」。
アイテムクラフト台で作ったあとの「粗雑な斧」や「木板」「柱」など。
ケースやパレットをたくさん配置し、それぞれのアイテムを入れられるようにしておきます。そして、それぞれを「拾う→しまう」専属ロボットを1体ずつ作ります。
たくさん作って、プログラムを作成してみてください。
徐々に何をしているのか分かるようになるはずです。
・「繰り返し:永遠に!」の挙動(動き方)
「繰り返し:永遠に!」は、上記の場合ですと、
・保管場所がいっぱいになる
・拾うアイテムが見つからない
時に動かなくなります。
但しこの場合は、エラーになるわけではなく、自動的に止まっています。
問題が解決されると、勝手に動き出します。
本来プログラムは、このあたりもきちんと書かないといけないのですが、「繰り返し:永遠に!」は使い勝手が良くなるように、ゲーム内でうまく処理してくれています。
■■ ステップアップ ■■
上のスクリプトを改良して、ステップアップとして紹介します。
以下の段階は、自分で考えられるとより面白くなりますが、
プログラム初心者である場合はコピペして使ってみてください。
考え方の参考になると思います。
■ まとめて拾う・まとめてしまう
上の「拾う→しまう」スクリプトは、
1回の動作で1個のアイテムを拾い、しまいます。
1個ずつ運んで移動するため、往復の時間がもったいないとも言えます。
一番最初に作れる「粗雑なボット」は、実はアイテムを3つ同時に持つことができます。但し、アイテムの種類によって持てる個数は変わります。
例えば「丸太」は最大1個。
「枝」「石」「木板」などは最大3個です。
そうすると、「3個まとめて拾って、3個まとめてしまう」スクリプトが作れれば、移動回数は1回で済みます。
これは「繰り返し」で作れます。
・ステップ1
普通に考えれば、「拾う」の部分を「繰り返し」すればできるはずです。
繰り返し:永遠に!
一番近い○○がある場所□
○○に移動
繰り返し:3回
○○を拾う
○○の保管場所に移動
繰り返し:3回
○○の保管場所に追加
しかしこれではエラーになります。
拾った瞬間に、その場にアイテムがなくなるため、2回目・3回目のアイテムが拾えません(Tips:同じマス目にアイテムがあっても、座標は微妙に違って判断されるようです)。
そのため、以下のように改良します。
繰り返し:永遠に!
繰り返し:3回
一番近い○○がある場所□
○○に移動
○○を拾う
○○の保管場所に移動
繰り返し:3回
○○の保管場所に追加
これで、
「近くにあるアイテムを探し→拾う」
「近くにあるアイテムを探し→拾う」
「近くにあるアイテムを探し→拾う」
と3回動作します。
ちなみに「しまう」の方は、しまう場所は固定なため(?)、上のスクリプトで正常に動作します。
「○○の保管場所に移動」を繰り返し内に含める必要はありません。
もっとも、含めても正常に動作すると思います。
・ステップ2
さて、上の方法ですと、回数を3回に指定していますよね。
しかしこの方法では、「丸太」の時にエラーが出ます。
主人公の持てるアイテム数は4個なので、
この先ロボットが進化すると持てる数が増えるのでは?とか、
2個とかしか持てないアイテムも出てくるのでは?と思いますよね。
これらをその都度設定するのは面倒です。
いちいち確認しなければならず、予期せぬエラーに繋がります。
そのため、「何個持てるのか」を自動判別できるようにします。
これは「繰り返し」の条件を変えることで可能になります。
繰り返し:永遠に!
繰り返し:手がいっぱいになるまで
一番近い○○がある場所□
○○に移動
○○を拾う
○○の保管場所に移動
繰り返し:手が空になるまで
○○の保管場所に追加
これで、「手がいっぱいになるまで拾って→手が空になるまでしまいます」。
「丸太」なら1個、「枝」なら3個拾います(ロボットによっても変わる)。
手がいっぱいになると、拾う動作(拾う繰り返し)をやめます。
手が空になると、しまう動作(しまう繰り返し)をやめます。
■ 最初に手を空にする
序盤ではこのエラーは発生しにくいですが、
ゲームを進めると予期せぬエラーとして目につくようになると思います。
「拾う→しまう」という動作をする場合、
「最初に何も持っていない」のが前提なのですね。
最初に何か持っているとエラーになります。
最序盤では「拾う→しまう」という単純動作しかさせないため、「そもそも最初から何も持っていないに決まってるじゃん!」となるのですが、動きが複雑になるプログラムを組むと、「なんで持ってるの!?」という状況が表れます。
最序盤では必要ないスクリプトですが、考え方として知っておくといいかもしれません。
・ステップ1
これを解消するのは、以下のスクリプトです。
すべて落とす
繰り返し:永遠に!
繰り返し:手がいっぱいになるまで
一番近い○○がある場所□
○○に移動
○○を拾う
○○の保管場所に移動
繰り返し:手が空になるまで
○○の保管場所に追加
一番最初に「すべて落とす」を追加しておくと、最初の状態で持っているアイテムを落とします。手にアイテムを持っていない場合は、エラーにならずに次に進みます。
これは、「繰り返し:永遠に!」の前に書かれています。
そのため、ロボットが実行するのは最初の1回のみです。
・ステップ2
似たようなスクリプトですが、以下のものは動作が異なります。
繰り返し:永遠に!
すべて落とす
繰り返し:手がいっぱいになるまで
一番近い○○がある場所□
○○に移動
○○を拾う
○○の保管場所に移動
繰り返し:手が空になるまで
○○の保管場所に追加
この場合は、「すべて落とす」が毎回最初に実行されます。
・ステップ1:1番最初に1回だけ実行される。
・ステップ2:繰り返しの最初に、繰り返す度に1回実行される。
ちょっと難しいですが、意味が微妙に違います。
状況によって異なりますが、基本的にはどちらでも正常に動作するはずです。
・ステップ3
以下のスクリプトも、また動作が微妙に異なってきます。
繰り返し:永遠に!
もし:手は空ではありません
すべて落とす
繰り返し:手がいっぱいになるまで
一番近い○○がある場所□
○○に移動
○○を拾う
○○の保管場所に移動
繰り返し:手が空になるまで
○○の保管場所に追加
「手に何も持っていない」場合は、「すべて落とす」を飛ばします。
この場合の「もし」は、本作ではほとんど意味はありません。
「手に何も持っていない」状態で「すべて落とす」をしても、そのまま先へ進むためです。
ゲーム内プログラムで問題なく動くように作られているわけですね。
ただ、
・持っている場合は→落とす
・持っていない場合は→その行動を飛ばす
という考え方は重要で、
プログラムが複雑化してくると、これをしないとうまく動作しない場面が出てきます。
■ 複雑さとシンプルさ
ステップアップとして、より複雑な状況でも対処できるスクリプトを紹介しましたが、必ずしも複雑なプログラムが良いというわけではありません。
例えば上の「まとめて拾う・まとめてしまう」では、
「手がいっぱいになるまで拾って→手が空になるまでしまいます」
これで移動回数が削減されています。
おお!素晴らしい!と思いますよね。
しかしこれ、別の問題が発生します。
「手がいっぱいにならないと行動を止めてしまう」のですね。
3個拾うのが、2個しか拾えないとそこで止まります。
これは、もっとプログラムを複雑にすると解決できます。
解決できますが、必ずしも複雑にすることが良いとは言い切れません。
・シンプルなプログラムでも動いていればいい
・うまく動かない時に複雑なプログラムにする
のが最も良いように思います。
まぁ、このあたりは、プログラムを組む人の能力(今できること)や状況によって変わると思いますので、色々と試してみてくださいね。
■ 終わりに
以上、「【Autonauts】落ちているアイテムを拾い、しまうプログラム例【オートノーツ】」でした。
楽しいゲームに出会うための参考としていただければ幸いです。
スポンサーリンク