An open API service indexing awesome lists of open source software.

https://github.com/usagi/poker

pluggable poker system for my workshop events and study groups
https://github.com/usagi/poker

Last synced: 3 months ago
JSON representation

pluggable poker system for my workshop events and study groups

Awesome Lists containing this project

README

        

# poker

作者が自身のワークショップや勉強会向けとして開発するプラガブルなポーカーシステムです。

## 特徴

- プラガブルなドローポーカーシステム ( draw_poker )
- プレイヤーAIを .so/.dll 等のライブラリー形式の実行ファイルから外部読み込みして動作 (version>=0.0.1)
- シンプルなプレイヤーAI部分のみワークショップの参加者にアルゴリズムを実装して貰い、キャッキャウフフなどして楽しめる
- クロスプラットフォームポータビリティー
- GNU/Linux, Windows(MinGW), etc.
- GCC, Clang

### 予定される将来の実装拡張

- プレイヤープラグインの .net バインディング
- プレイヤープラグインの LUA バインディング
- プレイヤープラグインの JavaScript バインディング
- プレイヤープラグインの Python バインディング
- ルール(あがり役の取り決め、使用するカードセット、手札の枚数など)のプラグイン化
- 実行時オプションを自動的にJSONから設定するコンフィグレーション機能
- 複数のプレイヤープラグインによる全自動トーナメント機能
- ドローポーカー以外のポーカーシステムへの対応(通常のマルチプレイヤータイプのポーカー等)
- ソースコード全般のリファクタリング
- テストの追加

## 勉強会の宣伝

- わんくま同盟・札幌支部
- 2017年より年2回の開催ペースで札幌でもわんくま勉強会します!みなさまよろしくお願いいたします。
- この poker も作者にスピーカー枠が回ってくる機会ごとにワークショップとして楽しみたいものです。

## 使い方

### ソースから最新版をビルド

1. このリポジトリーをクローンします。
1. `Boost`-1.61以降を使用可能な適当な`C++処理系`を用意します。
1. `mkdir build`などして`cmake`します。
1. `ninja` や `make` します。
1. `bin/draw_poker` を実行します。使い方についてコマンドライン引数の説明が出ます。
- `bin/draw_poker -v` を実行するとバージョン情報を表示するので確認します。

### ビルドした poker で遊ぶ

- `bin/draw_poker -p bin/player_a` を実行するとプレイヤーAIのサンプルA(ナッシングマン)を標準設定のラウンド数や掛け金設定のドローポーカーゲームでプレイできます。
- プレイ中の様子はログとして出力され、最後に全てのラウンドを通した通算戦績が表示されます。
- ナッシングマンは常にチップを1枚だけ掛けて、最初に配られた手札から何も捨てずに勝負に挑む、何もしないマンなAIです。最もシンプルな雛形となるAIなので自分でAIを作る際の雛形として参考にして下さい。
- `bin/draw_poker -p bin/player_b` を実行するとプレイヤーAIのサンプルB(ハートマン)を標準設定のラウンド数や掛け金設定のドローポーカーゲームでプレイできます。
- ハートマンは簡単ながらナッシングマンに比べて少しだけ個性あるプレイスタイルを実装したサンプルです。
- ハートマンはラウンド毎の掛け金の選択を手持ちのチップの枚数から判断して「いのちだいじに」「みんながんばれ」「ガンガン行こうぜ」など切り替えます。
- ハートマンはハート以外のスート(カードの絵柄)には興味が無いのでクラブ、スペード、ダイヤは未練なくあっさり切り捨てる「ラブ・ハート・アルゴリズム」を搭載しています。

### プレイヤープラグインを自分で作って遊ぶ

- もし、`cmake` に不慣れなら、とりあえずはじめはこのリポジトリーのソースファイルや `CMakeLists.txt` をそのまま流用して進めてみましょう。
1. `git checkout -b my_strong_ai` などして `git` のブランチを生やして作業を始めましょう。
2. `CMakeLists.txt` の終端付近の `add_library( player_a SHARED source/player_a.cxx )` の行をコピーして、ファイルの終端など適当な位置に貼り付け、行に2箇所ある `player_a` の部分を `my_strong_ai` など適当に変更しましょう。
3. `source/player_a.cxx` ファイルをコピーして `source/my_strong_ai.cxx` など適当にファイル名を設定したこれからプレイヤーAIを実装するソースファイルの雛形を用意しましょう。
4. 用意した `source/my_strong_ai.cxx` の中身の3箇所ある `player_a` の部分を `my_strong_ai` などこれまで同様に変更しましょう。
5. `get_name` 関数の戻り値にあなたの新しいAIが名乗る名前を設定しましょう。
6. `source/player_b.cxx` なども参考にしながら、新しいプレイヤーAIのソースコードを書いて下さい!
7. ビルドし、 `bin/draw_poker -p my_strong_ai` などしてお楽しみ下さい!

#### プレイヤープラグインのAPIの概要

プレイヤープラグインは [`source/player_a.cxx`](source/player_a.cxx) や [`source/player_b.cxx`](source/player_b.cxx) を参考に、たった3つのメンバー関数をオーバーライド実装するだけであなたのポーカープレイヤーAIを定義できます。

- `player_type` プラグインの基底型です。 public 継承してあなたの新しいAIのクラスを実装します。
- `player_type::get_name` 継承したあなたの新しいAIのクラスでオーバーライドして実装し、あなたのAIの名乗る名前を定義します。
- `player_type::pay_ante` 継承したあなたの新しいAIのクラスでオーバーライドして実装し、あなたのAIがラウンド毎にアンティ(参加費としての掛け金)をどのように支払うか定義します。
- `player_type::discard_cards` 継承したあなたの新しいAIのクラスでオーバーライドして実装し、あなたのAIがターンの始めにドローしたカード群を確認し、どのカードを捨てる(交換する)か定義します。

詳細は [`source/player_type.hxx`](source/player_type.cxx) ファイルを開いて下さい。メンバー関数毎に引数の説明など比較的丁寧に doxy 形式でドキュメントが書き込まれています。

## License

- [MIT](LICENSE)

## Author

- Usagi Ito
- https://www.facebook.com/usagi.wrp
- https://twitter.com/USAGI_WRP