概要
2020年に開催予定だった高専プロコンの競技部門
競技部門のルールは2チーム対戦型の陣取りゲームの囲みマスでした
しかし感染拡大予防のため競技部門は中止になりました
そこで公開されている競技ルールをもとに
競技システムを開発しオンライン対戦会を行うため
Code for KOSEN 囲みマスプロジェクトが発足しました
開発した競技システムはGitHubで公開されています
好きな時に囲みマスの対戦会を開くことができます
https://github.com/codeforkosen/Kakomimasu
システムには対戦AIを作りたい方のために
いくつかのサンプルAIが含まれています
この記事ではサンプルAI同士を対戦させる手順と
サンプルAIの行動について簡単に解説します
システムのセットアップ
対戦サーバとサンプルAIはDenoで実装されていますので
まずはDenoをインストールします
Windowsユーザの方はPowerShellを起動して以下のコマンドを実行します
iwr https://deno.land/x/install/install.ps1 -useb | iex
Macユーザの方はTerminalを起動して以下のコマンドを実行します
curl -fsSL https://deno.land/x/install/install.sh | sh
次にGitHubのCode for KOSENの囲みマスシステムをダウンロードして解凍します
https://github.com/codeforkosen/Kakomimasu/archive/master.zip
コマンドプロンプトかTerminalで以下のコマンドを入力し
対戦サーバを起動します
$ cd apiserver
$ deno run -A apiserver.ts
servest:router listening on :8880
が出力されたら対戦サーバの起動成功です
対戦状況ページの表示
Chromeでhttp://localhost:8880/ にアクセスすると対戦状況がみられるページが開きます
「ゲーム一覧はこちらから」をクリックすると観戦したい試合を選択できます
ここでは「最新のゲームビューアーはこちらから」をクリックして最新の対戦を観戦できるようしておいてから対戦AIの起動作業を行います
http://localhost:8880/gamedetails.html
サンプルAIの起動
まずサンプルAIの接続先をlocalhostに変更します
client_deno/client_util.jsの先頭行にある
// const defaulthost = "http://localhost:8880/api";
const defaulthost = "https://practice.kakomimasu.website/api";
を以下のように変更します
const defaulthost = "http://localhost:8880/api";
// const defaulthost = "https://practice.kakomimasu.website/api";
次に新しいターミナルを開き1番目のAIを起動します
$ cd client_deno
$ deno run -A client_a1.js
新しいターミナルを開き2番目のAIを起動します
$ cd client_deno
$ deno run -A client_a4.js
2つのAIが揃ったのでブラウザの対戦状況ページでは試合が開始しています
サンプルAIの簡単な解説
ここではclient_denoフォルダに含まれているサンプルAIの行動を解説します
サンプルAIは以下の2つの事についてターンごとに考えます
- 未配置エージェントの配置座標
- 配置済エージェントの移動方向
client_a1.js
- 未配置エージェントは最も高い点数のマスに配置します
- ただし競合を防ぐために点数上位何件かは使いません(ターンごとにランダムに決定)
- 配置済エージェントの作戦は8方向のうちランダムに1方向に動かします(フィールド外など移動不可の方向でも)
client_a2.js
- 未配置エージェントの行動はa1と同じです
- 配置済エージェントの行動は8方向のうちランダムに動かしますがフィールド外へは移動しないようになっています
client_a4.js
- 未配置エージェントの行動はa1と同じです
- 配置済エージェントの行動は8方向のうち最も高い点数のマスに移動します
- ただし移動先のマスの状況に応じて点数が加算されます
- 敵の陣地ならマスの点数に10点加算します
- 空きマスならマスの点数に5点加算します
- 敵の壁ならマスの点数に加算しません
- もし8方向すべてが自分の陣地ならa2と同じように移動します
- ただし移動先のマスの状況に応じて点数が加算されます