# 囲みますC++Clientの使い方 ###### tags: `解説資料` ## 環境構築 gccまたはVisual C++での動作を確認しています。 MinGWが32bitの場合動かない可能性が高いです。 ### Visual Studioの設定 Visual Studioの「C++によるデスクトップ開発」をダウンロードしていない場合はダウンロードしてください。 1. C++ 「空のプロジェクト」を作成 1. kakomimasu.cpp、kakomimasu.h、picojson.hをプロジェクトに追加 1. main.cppにAI部分を作ります。(client_a1.cppなどを貼り付けてください) 1. メニューバーから「プロジェクト」→「〇〇のプロパティ」→「構成プロパティ」→「全般」→「C++ 言語標準」→「ISO C\++17 標準(std:C++17)」を選択 このように設定することで実行することができます。 ### Visual Studio以外の方 ```shell= g++ -std=c++17 client_a1.cpp kakomimasu.cpp ``` と打つとビルドすることができます。 ### Linuxの方 curlが必要になります。 aptやpacmanからcurlをインストールしてください。 ## C++クライアントの使い方 ```cpp=main.cpp #include "kakomimasu.h" int main() { setHost("localhost:8880/api"); KakomimasuClient kc("ai-1", "AI-1", "", "ai-1-pw"); kc.waitMatching(); kc.getGameInfo(); while(kc.getGameInfo()) { vector<Action> action; kc.setAction(action); kc.waitNextTurn(); } return 0; } ``` ### KakomimasuClientクラスの初期化 引数は、ユーザーID、表示名、spec(なにも書かなくて良い)、パスワードの順です。 これは今後変わる可能性があります。 ### KakomimasuClientクラスに実装されている関数 |関数名|返り値の型|説明| |-|-|-| |`getGameInfo`|`bool`|ゲームのデータを取得します。ゲームが実行中は`true`終了後は`false`を返します。| |`waitMatching`|`void`|マッチングするまで待機します。| |`getWidth`|`int`|フィールドの横幅を返します。| |`getHeight`|`int`|フィールドの縦幅を返します。| |`getAgentCount`|`int`|エージェントの数を返します。| |`getPlayerNumber`|`int`|ゲームに参加しているプレイヤー人数を返します。| |`getNextTurnUnixTime`|`int`|次のターンまでの時間を返します。| |`getTrun`|`int`|現在のターン数を返します。| |`getTotalTurn`|`int`|総ターン数を返します。| |`getPoints`|`vector<vector<int>>`|フィールドのポイントを返します。| |`getField`|`vector<vector<Tile>>`|フィールドのタイル情報を返します。| |`getAgent`|`vector<Agent>`|味方のエージェント情報を返します。| |`getEnemyAgent`|`vector<Agent>`|敵のエージェント情報を返します。| |`waitNextTurn`|`void`|次のターンまで待機します。| |`setAction`|`void`|Actionをセットしサーバーに送信します。| ### その他 `Action型`、`Tile型`、`Agent型`を宣言しています。 それぞれ以下のような情報を保持しています。 ```cpp= struct Action { int agentId; string type; int x; int y; }; struct Tile { int type; int pid; int point; }; struct Agent { int x; int y; }; ``` `rnd(int n)`:0以上n未満の乱数を返します。 `DIR`:自分のタイルから1回でいける移動距離をもっています。 ## サンプルAIの解説 サンプルAIの解説は[ここ](https://hackmd.io/k36V_so3RUaEVor8gQXiSQ)にあります。