【Autonauts】落ちているアイテムを拾い、しまうプログラム例【オートノーツ】

このページで紹介しているのは、ゲーム「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】落ちているアイテムを拾い、しまうプログラム例【オートノーツ】」でした。

楽しいゲームに出会うための参考としていただければ幸いです。

スポンサーリンク

スポンサーリンク
スポンサーリンク
検索
スポンサーリンク
検索

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク
検索