本記事は 2026/02/01 ~ 2026/03/01 の間毎日 AI アプリケーション開発(AI を搭載したアプリ開発 or AI を使用した開発)をテーマに 30 days AI challenge を行う 9 日目のブログポストです。
今日の AI アプリは、身の回りの課題を解決したり誰かの役に立つようなアプリではなく “将棋アプリ” です。
将棋といっても、通常の将棋ではなく、ユーザーが自由にルールを追加できる将棋アプリとなります。この “ユーザーが自由にルールを追加する箇所” で AI の出番となります。
アプリの概要
通常の将棋ルールをもとに将棋アプリを実装しているので、みんなが知っているルールで将棋を指すことが可能です。
下側がユーザーで上側がコンピューター(CPU)です。このコンピューターには AI は搭載していないので定義されたアルゴリズムで動作します(強くはない)。コンピューターの強さやアルゴリズムについては AI を搭載することで容易に難易度の変更を実装できると思いますが、今日の本題はそこではないのでとりあえず動くコンピューターとなっています。
通常機能として、各駒が動ける範囲を表示する補助ラインが搭載されているので初心者でも安心のアプリです。もちろん相手から取った駒を自分の持ち駒として使えます。

そしてここからが目玉機能の “ルール追加” 機能 です。
ユーザーへの自由記入欄が用意されており、ここにカスタムルールを自然言語で指定できます。ここから自由にルールを追加することができます。

例えば “角に飛車の能力を追加してください” とルールを追加すると、以下画像のように角の行動範囲が対角の直線に加え、上下左右の直線に拡張されました。このように AI が解析できるルールであれば自由にルールを追加(改変)することができる機能です。追加ルールはいくつでも追加可能です。

技術観点
カスタムルール生成箇所は AI に以下のようなプロンプトを与えています。将棋は駒が限られている、また駒の動きもそこまで多くないため、ある程度のルール改変には耐えられます。
こんな感じでユーザーの入力を AI が解析し、対応する JSON を返してくれます。
public async Task<CustomRule?> AnalyzeRuleAsync(string ruleDescription)
{
if (string.IsNullOrWhiteSpace(ruleDescription))
return null;
try
{
var prompt = $@"以下のユーザーが提案した将棋のルールを解析してください。
ユーザー入力: {ruleDescription}
次のJSON形式で応答を生成してください:
{{
""ruleName"": ""ルールの簡潔な名前"",
""description"": ""ルールの詳細説明"",
""ruleType"": ""MoveRestriction | PlacementRestriction | WinCondition | AdditionalMovement | TurnModifier | Other"",
""ruleData"": {{
""side"": ""Player | Computer | Any"",
""affectedPieces"": [""Pawn | Lance | Knight | Silver | Gold | Bishop | Rook | King""],
""forbiddenSquares"": [[row, col]],
""forbiddenRows"": [0, 1],
""forbiddenCols"": [0, 1],
""allowedRows"": [2, 3],
""allowedCols"": [2, 3],
""minRow"": 0,
""maxRow"": 8,
""minCol"": 0,
""maxCol"": 8,
""extraDirections"": [[dr, dc]],
""slidingDirections"": [[dr, dc]],
""extraTurn"": true,
""extraTurnOnMove"": true,
""extraTurnOnCapture"": false,
""extraTurnOnDrop"": false,
""maxExtraTurns"": 1,
""winOnCapturePiece"": ""King | Rook | Bishop | Gold | Silver | Knight | Lance | Pawn"",
""winOnReachRow"": 0,
""winOnReachCol"": 0
}}
}}
応答はJSON部分だけを返してください。余分なテキストは含まないでください。";
var response = await _geminiService.GetChatResponseAsync(prompt, new());
~以下省略~
例えば、”角の能力を飛車に追加してください” といったルールを追加するときは、以下のようなプロンプトが AI に渡され、結果が JSON として返されます。
以下のユーザーが提案した将棋のルールを解析してください。 ユーザー入力: {角の能力を飛車に追加してください} 次のJSON形式で応答を生成してください: {{ ""ruleName"": ""ルールの簡潔な名前"", ""description"": ""ルールの詳細説明"", ""ruleType"": ""MoveRestriction | PlacementRestriction | WinCondition | AdditionalMovement | TurnModifier | Other"", ""ruleData"": {{ ""side"": ""Player | Computer | Any"", ""affectedPieces"": [""Pawn | Lance | Knight | Silver | Gold | Bishop | Rook | King""], ""forbiddenSquares"": [[row, col]], ""forbiddenRows"": [0, 1], ""forbiddenCols"": [0, 1], ""allowedRows"": [2, 3], ""allowedCols"": [2, 3], ""minRow"": 0, ""maxRow"": 8, ""minCol"": 0, ""maxCol"": 8, ""extraDirections"": [[dr, dc]], ""slidingDirections"": [[dr, dc]], ""extraTurn"": true, ""extraTurnOnMove"": true, ""extraTurnOnCapture"": false, ""extraTurnOnDrop"": false, ""maxExtraTurns"": 1, ""winOnCapturePiece"": ""King | Rook | Bishop | Gold | Silver | Knight | Lance | Pawn"", ""winOnReachRow"": 0, ""winOnReachCol"": 0 }} }} 応答はJSON部分だけを返してください。余分なテキストは含まないでください。
{ "ruleName": "飛車への角の動き追加", "description": "飛車が本来の縦横の動きに加え、角行と同じ斜め四方向への飛び道具(スライド移動)としての動きを持つようになります。", "ruleType": "AdditionalMovement", "ruleData": { "side": "Any", "affectedPieces": ["Rook"], "slidingDirections": [ [1, 1], [1, -1], [-1, 1], [-1, -1] ] } }
ユーザーがルールを入力してから実際にルールが適用されるまでのロジックは以下の通りです(メソッドやクラス名は少し修正しています)。
ゲーム実行中
├─ ユーザーがルールを入力
├─ AI がルールを解析 → ルールオブジェクト生成
├─ GameService.AddCustomRule(rule) - ルール追加メソッド呼び出し
│ └─ customizedRules リストに追加
│ [CustomizedRule { RuleType=AdditionalMovement, RuleData{...} }]
│
└─ 駒を移動するたびに
├─ GetValidatedMoves() - 動きの定義を呼び出し
├─ 内部で ApplyAddMovementRules() 実行
├─ customizedRules(追加されたルール一覧)を確認
└─ マッチするルールを適用 ← ここで動的に制御
プロンプトを見てもらえればわかりますが、どんなルールにも対応できる、というわけではありません。もう少しプロンプトやルール定義を修正(追加)することで柔軟性は高まりますが、現時点では “ある程度のルールには適用できる” 程度です。
おわりに
生成 AI が得意なことの 1 つは自然言語を解析できることです。今回はその機能に注目しゲームのルールを追加できる機能を実装しました(AI が)。
このパターンを使うことで、既存の(パターン化された)ゲームの機能を自由に追加(改変)することができると思います。ただし、将棋のようなゲームは、現在のルールの時点で完成されたルールですので、ほとんどの場合やみくもにルールを追加するとゲーム性が崩れ面白くなります。今回はちょっとしたジョークアプリでした。
どこかの誰かが言っていましたが “必ずしも何かの役に立つものを生み出す必要はない。不要なものを生み出すことで人類は進歩する” とのことです(誰かが言っていたのか、私がどこかでそう思った言葉なのかは不明)。
最後まで閲覧いただきありがとうございました。明日もよろしくお願いします!

コメント