Skip to content

How to talk with .dll

skytomo edited this page Jul 8, 2018 · 9 revisions

ボットの仕様

ボットの命名規則

  • 必ず、最後はBotで終わらせましょう
  • 鹿児島弁か鹿児島に関係する単語を名前に含みましょう

例. TegeTegeBot

せっかく徳島に行って全国大会するのだから、
ここは遠慮せずに、鹿児島をアピールしましょう!

とりあえずプロジェクトを作成しよう

  1. ソリューションエクスプローラーでソリューション 'Procon29'の項目を右クリック!
  2. 追加(D)をクリック
  3. 新しいプロジェクト(N)をクリック
  4. クラスライブラリ (.NET Framework)をクリック
  5. ボットの名前を決めよう(ボットの名前には規則があります。詳しくはボットの命名規則を見て)
  6. 今作ったプロジェクト内の「参照」を右クリック
  7. 参照の追加(R)をクリック
  8. Procon29_Visualizerにチェックを入れる

とりあえず空のボットを作成しよう

試しに、CustodomBotを作成します。
ちなみにCustodomBotは「custom(習慣)」と「かすたどん」の合成語です。
みなさんもCustodomBotのような慣習的なC#のコードを書きましょう。

あなたがまずボットを作るには次のように書きましょう。

// CustodomBot.cs

using System;
using System.Linq;
using nitkagoshima_sysken.Procon29.Visualizer;

namespace nitkagoshima_sysken.Procon29.CustodomBot
{
    class CustodomBot: Bot.Bot
    {
        public CustodomBot() : base() { }

        public override AgentActivityData[] Answer()
        {
        }
    }
}

よく分からない人は、「おまじない」だと思ってください。
このCustodomBotというクラスはBotというクラスを継承しています。
(つまり、CustodomBotBotの子ども)
Botクラスは、Visualizerとあなたのボットとの仲介をしてくれるクラスです。
ですので、すべてのボットはBotクラスを継承しなければなりません。
もし、継承しなければ、Visualizerは

ここで、名前空間とクラス名とファイル名をすべてCustodomBotにしてください。
あなたが作るボットの名前も、名前空間とクラス名とファイル名をすべて統一してください。
これはVisualizerがCustodomBot.dllを開くときに、
名前空間CustodomBotのクラスCustodomBotを探そうとするからです。
この3つをすべて同じにしないと、Visualizerが例外を投げます。 ですので、必ずボットの名前は、名前空間とクラス名とファイル名をすべて同じにしてください。

// CustodomBot のコンストラクタ
public CustodomBot() : base() { }

これはCustodomBotのコンストラクタです。
よく分からない人はおまじないだと思いましょう。

// ここでBotの中身を書く
// C言語で言うmain関数みたいなもの
public override AgentActivityData[] Answer()
{
    // 処理
    return ...;
}

Visualizerはあなたのボットの中のAnswer()というメソッドを探して、それを実行します。
ですので、Answer()の中にボットの中身を書きましょう。

何もしないボットを作成しよう

// 何もしないボットを作る
public override AgentActivityData[] Answer()
{
    var result = new AgentActivityData[2];
    result[0] = new AgentActivityData(AgentStatusCode.RequestNotToDoAnything);
    result[1] = new AgentActivityData(AgentStatusCode.RequestNotToDoAnything);
    return result;
}

さて、返り値にはintstringの型を返すメソッドがありますが、
あなたがこれから作るボットのAnswer()の返り値の型はAgentActivityData[]です。
AgentActivityData[]AgentActivityData型の配列を意味します。

var result = new AgentActivityData[2];
result[0] = // あなたのチームの1人目のエージェントの Agent Activity Data が入ります
result[1] = // あなたのチームの2人目のエージェントの Agent Activity Data が入ります

Agent Activity Dataでは、エージェントが次のターンで何をしたいかを記述します。
var result = new AgentActivityData[2];AgentActivityData型の要素数2のresultという変数が宣言されます。
result[0]: 配列の0番目にはボット側のチームの1人目のエージェントの Agent Activity Data が入り、
result[1]: 配列の1番目にはボット側のチームの2人目のエージェントの Agent Activity Data が入ります。

result[0] =
    new AgentActivityData(
      AgentStatusCode.RequestNotToDoAnything,
      new Point(0, 0)
      );

AADの中には2つの要素があります。 それはAgentStatusCodeDestinationです。
AgentStatusCodeで「エージェントが何をするか」を決め、 Destinationで「それをエージェントがどこへするか」を決めます。

AgentStatusCode Destination
AgentStatusCode.RequestNotToDoAnything new Point(0, 0)
何もしない (何もしないので今回は意味をなさない)

今回の場合はこのような意味になります。
ちなみに、RequestNotToDoAnythingのときは、
第二引数を省略できるので、このように書けます。

result[0] =
    new AgentActivityData(
      AgentStatusCode.RequestNotToDoAnything,
      );

他のパターンを下に示します。

result[0] =
    new AgentActivityData(
      AgentStatusCode.RequestMovement,
      new Point(2, 8)
      );
AgentStatusCode Destination
AgentStatusCode.RequestMovement new Point(2, 8)
移動する 縦2行目、横8列目のマス

この場合は、「あなたのチームの1人目のエージェント」は「縦2行目、横8列目のマス」へ「移動する」という意味になります。

AgentStatusCodeが取りうる値をASC (Agent Status Code)といいます。
例えばASC001は"Request Not To Do Anything"(その場でとどまり、何もしないことを要請します)です。
詳しくはAbout Agent Status Dataを参照してください。

return result;

これで「何もしないこと」を返すボットが完成しました。