Gomoku (五目並べ)
Pygame を使用して作成された五目並べゲームです。

開発の背景
パソコンで手軽に、かつ高機能に遊べる五目並べ(連珠ルール対応)が少ないと感じたため、このソフトウェアを開発しました。AI 対戦、詳細な設定、脅威の可視化、研究モードなど、初心者から経験者まで楽しめる機能を目指しています。
主な機能
- 対戦モード: 人間 vs 人間, 人間 vs AI, AI vs 人間, AI vs AI
- 設定: 盤面サイズ, 勝利に必要な石数, ゲームモード, AI難易度, AI先手/後手
- ゲームプレイ: マウス操作, 着手アニメーション, 脅威表示, 定石表示, 攻手/防手/追い手ポップアップ
- セーブ & ロード: JSON形式での保存と再開
- 連珠ルール: 黒番の禁じ手(三三、四四、長連)、珠型(序盤ルール)を実装
- その他: 脅威ライン表示, 思考時間表示, 研究モード(評価値表示)
動作環境
- 実行ファイル (.exe) 版:
- ソースコード版:
使用ライブラリ
このプロジェクトは以下の主要なライブラリに依存しています。
ソースコードから実行する場合は、これらのライブラリが必要です。
ダウンロードと実行方法
実行ファイル (.exe) 版
- GitHubのURLにアクセスするか、ここをクリックしてダウンロードします。
- zipファイルを解凍します。
- 中にある、
Gomoku.exe
をダブルクリックして実行します。
- 注意: Windows SmartScreen などで「提供元不明のアプリ」として警告が表示される場合がありますが、問題ありません。「詳細情報」->「実行」を選択してください。
ソースコード版
- このリポジトリをクローンまたはダウンロードします。
git clone https://github.com/yutokure/New-Renju.git
cd New-Renju-main
- 必要なライブラリをインストールします。
main.py
を実行します。
基本的な遊び方
- ゲームを起動するとメインメニューが表示されます。
- 「Start New Game」で新しいゲームを開始します。
- 「Load Game」で以前セーブしたゲームを再開します。
- 「Settings」でゲームの設定を変更します。
- 「Quit」でゲームを終了します。
- ゲーム画面では、自分の番のときに空いているマスをクリックすると石を置くことができます。
- 先に指定された数 (デフォルトは5個) の石を縦・横・斜めのいずれかに連続して並べたプレイヤーの勝利です(連珠ルール適用時は黒の長連は禁じ手)。
AI 詳細
設定画面で AI の強さを「Easy」「Normal」「Hard」から選択できます。
- Easy:
- 完全にランダムな着手を行います。
- ただし、ルール上置けるマス(禁じ手や珠型ルールを考慮)の中からランダムに選択します。
- Normal:
- ヒューリスティック(経験則)に基づいた基本的な思考を行います。
- 以下の優先順位で着手を決定します:
- 自分の勝ちパターン(五連など)を作る
- 相手の勝ちパターンを阻止する
- 活三(オープンな三連)を作る
- 相手の活三を阻止する
- 上記のいずれでもない場合、ルール上有効なマスにランダムで着手
- Hard:
- 探索アルゴリズム「Minimax法」と「αβ枝刈り法」を使用し、数手先まで読みます。
- 探索: 盤面の評価関数に基づき、最善の手を探します。限られた探索深さ(デフォルト2手)と制限時間(デフォルト1.5秒)内で探索を行います。
- 評価関数: 盤面上の石の並び(連の数、形、両端が空いているかなど)を点数化し、局面の有利不利を判断します。
- 最適化: Zobrist Hash を用いたトランスポジションテーブルにより、一度計算した局面の評価値を再利用し、探索効率を向上させています。
- 着手候補の絞り込み: 現在の石の周辺にある有効なマスのみを探索対象とすることで、計算量を削減しています。
- その他: 探索開始前に、即座に勝てる手や、相手の即座の勝ちを防ぐ手があれば優先的に選択します。
ゲームの特徴
- 脅威ライン表示:
- 盤面上に、あと一手で連が完成する可能性のあるライン(三連、四連)をリアルタイムで表示します。
- 青色: 三連に関連するライン
- 橙色: 四連(端が塞がっているもの)に関連するライン
- 赤色: 活四(両端が空いている四連)や複数の脅威が交差する点に関連するライン
- (これがでたら詰んだことがわかります)
- 両空きの三三や四三が作られたときに表示されます
- 勝利が確定したラインは太い赤線で表示されます。
- 攻手 / 防手 / 追い手 システム:
- 特定の着手が行われた際に、その手の意味合いを示すポップアップが表示されます。
- 攻手 (白): 自分の三連など、攻撃的な形を作った場合に表示されます。
- 防手 (青): 相手の脅威(三連や四連)を防いだ場合に表示されます。
- 追い手 (赤): 自分の新たな脅威(三連や四連)を作った場合に表示されます。連続して追い手を打つと「追い手×2」「追い手×3」のようにカウントアップされます。
- アニメーション:
- 着手アニメーション: 石を置くと、少し大きいサイズからフェードインしながら縮小するアニメーションが表示されます。
- 脅威アニメーション: 脅威ラインが生成されたり消滅したりする際、関連する石が短時間点滅します。
- 定石機能:
- 序盤の特定の有名な進行(定石)に沿って打たれた場合、その定石名が画面中央にテロップ表示されます。
- AI (Hard) も一部の定石を考慮して着手することがあります。
- 研究モード:
- ゲーム画面左上のチェックボックスで有効にできます。
- 有効にすると、AI (Hard) が計算する各空きマスに対する評価値(盤面評価スコア)がマス上に表示されます。数値が大きいほど AI にとって有利な手であることを示します。
連珠ルール
このゲームは、標準的な五目並べのルールに加えて、競技で用いられる連珠のルールの一部を採用しています。
- 勝利条件: 先に自分の石を ちょうど5個 、縦・横・斜めのいずれかに連続して並べたプレイヤーの勝利となります。
- 黒番の禁じ手 (Kinjite): 黒番(先手)には、以下の手を打つことが禁止されています。これらの手を打とうとすると無効となり、石を置けません。
- 三三 (Double Three): 同時に2つ以上の「活三」(両端が空いており、どちらかに打てば四連になる三連)を作る手。
- 四四 (Double Four): 同時に2つ以上の「四連」(あと一手で五連になる四連、端が止まっているものも含む)を作る手。
- 長連 (Overline): 6個以上の石を連続して並べる手(五連を作ると同時に六連以上になる場合も含む)。
- 注意: 白番(後手)には禁じ手はありません。白は三三や四四を打っても、長連を作っても構いません(ただし、勝利となるのは五連のみです)。
- 珠型(序盤ルール): 特定の盤面サイズ(15x15など中央がある場合)において、序盤の数手に以下の制限があります。
- 一手目 (黒): 必ず盤面の中央(天元)に打たなければなりません。
- 二手目 (白): 中央の黒石の周囲の特定の位置(実装では真上または右上斜め)に打たなければなりません。
- 三手目 (黒): 中央から一定範囲内(実装では2マス以内)に打たなければなりません。
- これらのルールは、序盤の有利不利を均等にするために設けられています。
設定
「Settings」メニューで以下の項目を変更できます。
- Board Size: 盤面のサイズ (例: 15x15)
- Win Length: 勝利に必要な連続した石の数 (通常は 5)
- 3から7の範囲で設定できます
- 3に設定すれば実質Tic tac toeと呼ばれるような三目並べになりますがBoard Sizeが大きい三目並べが遊べます
- Game Mode: 対戦モード (Human vs Human, Human vs AI など)
- Human vs AI(人間が黒の先手でAIが白の後手)
- AI vs Human(AIが黒の先手で人間が白の後手)
- AI Difficulty: AI の強さ (easy, medium, hard) - AI を含むモードでのみ有効
「<」「>」ボタンで値を変更し、「Back」でメニューに戻ります。
セーブ & ロード
- セーブ: ゲーム中に
S
キーを押すと、現在の設定と着手履歴が gomoku_save_【日時】.json
という形式のファイル名で .exe
ファイルと同じフォルダ (またはソースコード実行時のカレントディレクトリ) に保存されます。
- ロード: メインメニューで「Load Game」を選択すると、保存されたゲームファイルがリスト表示されます。ファイル名をクリックするとそのゲームを再開できます。「«」「»」ボタンでページを移動できます。
ライセンス
このソフトウェアは MIT License の下で公開されています。詳細は LICENSE
ファイルをご覧ください。
This software is released under the MIT License, see LICENSE.
連絡先・フィードバック
バグ報告、改善提案、感想などは https://github.com/yutokure/New-Renju/issues までお寄せください。