さて、まじめに CoSpace Rescue のプログラミングをしてみます。
目標は・・・RCJJ関東ブロック大会2016で優勝した、「Cure Blossom ~again~」に勝てるプログラムを作る、です。
これまで、以下の基本的なことはできるようになりました。
①境界から出ない
②罠に入らない
③オブジェクトの収集(格納)
④格納したオブジェクトを収集箱に入れる
⑤テレポーテーション
普通に、ある程度までの得点はできます。
でも・・・オブジェクトの収集にしろ、収集箱に入るにしろ・・・運まかせです。
だから、6個のオブジェクトを搭載済なのに、収集箱に行かないので無駄に発見したりして・・・時間の無駄です。
う~ん どうすればよいか・・・
何度も、エア対戦を見ていて、以下の方針にしました。(まずは、Stage1)
(a) ロボットには6個以上のオブジェクトを搭載できないので、6個のオブジェクトを搭載している場合はオブジェクトの上を通っても、発見の動作(収集の動作)をしない。
(b) ロボットに4個以上のオブジェクトを搭載している場合は、積極的に収集箱に向かう。
まずは、この2つです。
まず、(a)を実現するのに、どうするか・・・
最初は、独自の変数を定義して、オブジェクトの収集の動作をするときに、値を1つづつ加算していく方法を考えました。よし、これで行こう、と作り始めた時・・・ふと、内部の変数で無いのかな? と確認してみたら・・・「LoadedObjects」というのが、搭載しているオブジェクトの数のようでした。これが6以上ならオブジェクトの上を通っても発見の動作をしないようにしました。
で、この LoadedObjects ですが・・・良く分からないのですが、正確ではありません。実際に搭載しているオブジェクトの数とずれることが多々あります。極端な話、6個搭載していて収集箱に入れるのを失敗すると、実際に6個搭載しているにも関わらず、LoadedObjects=0 というのも何度もあります。
まあ、それでも、この LoadedObjects の値を使うのが一番簡単そうです・・・
さて、(b) はどうやって実現しますかねぇ。
これはコースレイアウトに合わせて、いわゆるプレマッピングをするしか無いでしょう・・・(笑)
単純に、ロボットが4個以上のオブジェクトを搭載している場合に右の境界に触れた場合に真上に行く・・・というプログラムにしました。真上に行けば収集箱があります。
とりあえず、この2つを設定したら・・・無駄な動きが減りました。
確かに減ったのですが、やっぱり「運まかせ」というのは、あんまり変わらないなぁ。