---
# System prepended metadata

title: 囲みますC++Clientの使い方
tags: [解説資料]

---

# 囲みます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)にあります。