Repository navigation
設計
#1
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
以下は「Pythonで一手詰め将棋を自動生成」するための 要件 / スコープ / アーキテクチャのたたき台です(そのまま設計書にできます)。
要件
機能要件
局面表現
合法手生成(MoveGen)
王手判定(Check)
一手詰判定(Mate-in-1)
自動生成(Generator)
生成方式を最低2つ用意(後述)
生成結果に「難易度指標」を付与(分岐数など)
品質フィルタ(Question Quality)
CLI
generate --n 100 --method reverse --max_pieces 4 --seed 1verify --sfen "..."render --sfen "..."スコープ
MVP(最初に作る範囲)
駒種:玉・飛・角・金・銀・桂・香・歩(成りは後回しでも可)
打ち駒:あり(歩二は実装、打ち歩詰はMVPでは「チェック対象外でもOK」だが、後で追加推奨)
生成:
フィルタ:唯一解、駒数上限、応手0確認
スコープ外(後で)
アーキテクチャ
モジュール構成(推奨)
データ構造(軽量で速い形)
0..80(file,rank変換関数)intで符号に手番を埋め込む(例:先手=+、後手=-)主要コンポーネントの責務
1) Attack / Check
attacked_squares(side)を毎回全計算すると遅いMVP:都度計算でOK
改良:差分更新 or 駒ごと利きの加算
2) MoveGen(合法手)
apply→ 自玉王手でないか確認 → 合法手3) Mate1
流れ:
moves = legal_moves(P, side=attacker)for m in moves:P2=apply(P,m)if not is_check(P2, defender): continueresponses = legal_moves(P2, defender)if responses == []: mates.append(m)返す情報:
生成方式(2本立て推奨)
A) ランダム配置→フィルタ(簡単・大量生成向き)
mate1で「一手詰 & 唯一解」を満たすまで繰り返すB) 逆算生成(良問が作りやすい)
mate1で検証し、唯一解になるまで微調整難易度指標(生成の制御に使える)
L = |legal_moves(attacker)|C = |checking_moves(attacker)|R_total = Σ |legal_moves(defender after checking move)|Cが小さい(1〜3)、Lも小さめ、詰み手が直感的非機能要件
seed指定で同じ問題を生成この設計で次に作るべきは「MVPのAPI」です。
もしそのまま進めるなら、上のアーキテクチャに沿って **クラス/関数のインターフェース(Pythonコード雛形)**まで一気に書けます。
All reactions