CHaserGo は、プログラミング競技会「U-16プログラミングコンテスト」で使用されるCHaserゲーム用の完全なGoエコシステムです。クライアントライブラリ、ゲームサーバー、マップジェネレーターを含み、CHaser開発に必要なすべてをGoで提供します。
- Go言語らしい設計: 型安全性、Context対応、構造化されたエラーハンドリング
- 学習用途に最適: Go言語の特性を学べる設計
- 完全なプロトコル互換: Ruby版CHaserConnectと同じプロトコルをサポート
- 文字エンコーディング対応: UTF-8とCP932(Shift_JIS)の両方をサポート
- テスト駆動開発: 80%以上のテストカバレッジ
- サンプルプログラム: 3つの動作サンプルを同梱
- CUI対戦サーバー: ローカルでのAIテストに最適
- ダンプ機能: CHaserViewer互換のゲーム記録
- カスタマイズ可能: ポート番号、ターン数の調整が可能
- 完全互換: 既存のCHaserクライアントとも動作
- ランダムマップ生成: 多様なマップを自動生成
- カスタマイズ可能: ブロック数、アイテム数を指定可能
- バッチ生成: 複数マップを一度に生成
- 完全互換: CHaser標準マップフォーマットに対応
すべてをGoで実装することで、以下のメリットがあります:
- 簡単なセットアップ:
go installだけで全ツールがインストール可能 - クロスプラットフォーム: Windows、macOS、Linuxで同じコードが動作
- CI/CD統合: GitHub Actionsで自動テストが簡単
- 単一言語: 学習コストが低く、メンテナンスが容易
- 高速: Go言語の高速な実行速度を活用
go get github.com/kqnade/CHaserGoまたは、プロジェクトのgo.modに以下を追加:
require github.com/kqnade/CHaserGo v0.2.0# リポジトリをクローン
git clone https://github.com/kqnade/CHaserGo.git
cd CHaserGo
# すべてのツールをインストール
make install
# または個別にインストール
go install ./cmd/chaser-server # ゲームサーバー
go install ./cmd/chaser-mapgen # マップジェネレーターpackage main
import (
"context"
"fmt"
"log"
"CHaserGo/chaser"
)
func main() {
// クライアント作成
client := chaser.NewClient(chaser.ClientConfig{
Host: "127.0.0.1",
Port: "2001",
Name: "テストAI",
})
// 接続
ctx := context.Background()
if err := client.Connect(ctx); err != nil {
log.Fatalf("接続エラー: %v", err)
}
defer client.Disconnect()
// ゲームループ
for {
// Ready - ゲーム開始準備
resp, err := client.Ready(ctx)
if err != nil {
log.Fatalf("エラー: %v", err)
}
if resp.GameOver {
break
}
// 上方向を探索
resp, err = client.Search(ctx, chaser.Up)
if err != nil {
log.Fatalf("エラー: %v", err)
}
// レスポンス内容を確認
fmt.Printf("Values: %v\n", resp.Values)
// 上が空いていれば移動
if resp.Values[2] == chaser.Empty {
resp, err = client.Walk(ctx, chaser.Up)
if err != nil {
log.Fatalf("エラー: %v", err)
}
}
if resp.GameOver {
break
}
}
fmt.Println("ゲーム終了")
}chaser.Up // 上
chaser.Down // 下
chaser.Left // 左
chaser.Right // 右chaser.Empty // 空白またはゲームオーバー
chaser.Enemy // 敵
chaser.Wall // 壁
chaser.Item // アイテムtype Response struct {
GameOver bool // ゲーム終了フラグ
Values [10]CellType // 周囲9マス+制御フラグ
}
// Values配列のインデックス:
// [0] 制御フラグ(0=ゲーム終了)
// [1] 左上斜め
// [2] 上
// [3] 右上斜め
// [4] 左
// [5] 中央(自分)
// [6] 右
// [7] 左下斜め
// [8] 下
// [9] 右下斜め// 接続・切断
func (c *Client) Connect(ctx context.Context) error
func (c *Client) Disconnect() error
// ゲーム制御
func (c *Client) Ready(ctx context.Context) (*Response, error)
// 移動
func (c *Client) Walk(ctx context.Context, dir Direction) (*Response, error)
// 観察(隣接マス)
func (c *Client) Look(ctx context.Context, dir Direction) (*Response, error)
// 探索(直線9マス)
func (c *Client) Search(ctx context.Context, dir Direction) (*Response, error)
// ブロック設置
func (c *Client) Put(ctx context.Context, dir Direction) (*Response, error)ローカルでAIをテストするための簡易サーバー。
# マップファイルを指定してサーバー起動
chaser-server map.txt
# ポート番号をカスタマイズ
chaser-server -f 3000 -s 3001 map.txt
# ダンプファイルを指定
chaser-server -d game.dump map.txt
# ダンプを無効化
chaser-server -nd map.txt-f, --first-port: 先攻プレイヤーのポート(デフォルト: 2009)-s, --second-port: 後攻プレイヤーのポート(デフォルト: 2010)-d, --dump-path: ダンプファイルの出力先(デフォルト: ./chaser.dump)-nd, --non-dump: ダンプ出力を無効化
# 1. サーバーを起動
chaser-server map.txt
# 2. 別のターミナルでクライアントを起動
cd examples/test1
go run main.go # ポート2009に接続
# 3. さらに別のターミナルで2つ目のクライアントを起動
cd examples/test2
go run main.go # ポート2010に接続ランダムなゲームマップを生成するツール。
# 10個のマップを生成
chaser-mapgen 10
# ブロック数とアイテム数を指定
chaser-mapgen -b 15 -i 20 5
# 出力先を指定
chaser-mapgen -o ./my_maps 3
# シードを指定(再現可能な生成)
chaser-mapgen -s 12345 5-b, --blockNum: 小マップ内の最大ブロック数(デフォルト: 9)-i, --itemNum: 小マップ内の最大アイテム数(デフォルト: 10)-o, --output: 出力ディレクトリ(デフォルト: ./generated_map)-s, --seed: ランダムシード(0で現在時刻を使用)
- サイズ: 15×17
- 生成アルゴリズム: 7×8の小マップを4回転させて結合
- エージェント配置: 対角配置
- 出力形式: CHaser標準フォーマット
4方向を順番に探索するシンプルなAI。
cd examples/test1
go run main.go壁に沿って移動するアルゴリズム。状態管理の例として有用。
cd examples/test2
go run main.go敵検出・攻撃、アイテム収集、壁回避を組み合わせた高度なAI。
cd examples/test3
go run main.go# 全テスト実行
go test ./...
# カバレッジ付き実行
go test -cover ./...
# 詳細出力
go test -v ./...サーバーを使った実際の対戦テスト。
# Makeを使った統合テスト
make integration-test
# 手動で実行
make build
make mapgen
bash scripts/integration-test.sh # Linux/macOS
pwsh scripts/integration-test.ps1 # Windows開発を便利にするMakefileを提供しています。
make help # ヘルプ表示
make build # 全ツールをビルド
make test # ユニットテスト実行
make integration-test # 統合テスト実行
make mapgen # サンプルマップ生成
make fmt # コードフォーマット
make lint # リンター実行
make clean # ビルド成果物を削除
make install # 全ツールをインストールCI/CDパイプラインが設定済みです:
- ユニットテスト: すべてのプッシュで自動実行
- 統合テスト: サーバー・クライアント間の対戦テスト
- Lint: コード品質チェック
- マルチプラットフォームビルド: Windows、macOS、Linuxでビルド検証
CHaserGo/
├── chaser/ # クライアントライブラリ
│ ├── client.go # クライアント実装
│ ├── client_test.go # クライアントテスト
│ ├── protocol.go # プロトコル処理
│ ├── protocol_test.go # プロトコルテスト
│ └── testserver/ # テスト用モックサーバー
│ └── mock.go
├── server/ # ゲームサーバー
│ ├── server.go # サーバー本体
│ ├── board.go # ボード管理
│ ├── protocol.go # プロトコル処理
│ └── dump.go # ダンプシステム
├── mapgen/ # マップジェネレーター
│ ├── generator.go # マップ生成ロジック
│ └── generator_test.go
├── cmd/ # コマンドラインツール
│ ├── chaser-server/ # サーバーCLI
│ │ └── main.go
│ └── chaser-mapgen/ # マップ生成CLI
│ └── main.go
├── examples/ # サンプルプログラム
│ ├── test1/ # 基本探索
│ ├── test2/ # 壁沿い移動
│ └── test3/ # 複雑なAI
├── scripts/ # テストスクリプト
│ ├── integration-test.sh
│ └── integration-test.ps1
├── .github/workflows/ # CI/CD設定
│ └── ci.yml
├── docs/ # ドキュメント
│ ├── API.md # API詳細
│ └── DEVELOPMENT.md # 開発ガイド
├── Makefile # ビルド自動化
├── go.mod
├── go.sum
├── README.md
└── LICENSE
CHaserGoは、ポート番号に応じて自動的に文字エンコーディングを切り替えます:
- ポート40000/50000: CP932(Shift_JIS)エンコード(なでしこサーバー用)
- その他のポート: UTF-8
詳細な開発ガイドは docs/DEVELOPMENT.md を参照してください。
MIT License
完全な開発環境をセットアップして、すぐに開発を始められます。
# 1. リポジトリをクローン
git clone https://github.com/kqnade/CHaserGo.git
cd CHaserGo
# 2. ツールをビルド
make build
# 3. マップを生成
make mapgen
# 4. サーバーを起動(別ターミナル)
./bin/chaser-server testdata/RandMap_1.map
# 5. サンプルAIを実行(別ターミナル×2)
./bin/test1 # ポート2009
./bin/test2 # ポート2010
# 6. 統合テストを実行
make integration-test- クライアントライブラリ: Ruby版CHaserConnectと完全互換
- ゲームサーバー: Python版compactCHaserServerと互換
- マップジェネレーター: Python版MapGeneratorと互換
- マップフォーマット: CHaser標準フォーマット
- ダンプフォーマット: CHaserViewer互換
- Go 1.24以降
- Windows 10/11
- macOS 12以降
- Ubuntu 20.04以降
Issue報告やPull Requestを歓迎します。詳細は docs/DEVELOPMENT.md を参照してください。