(57)【要約】      （修正有）【課題】ゲームの仕様から、ゲームプログラムと関連する様々なプログラムの作成をより簡便に行う。【解決手段】ゲームルール処理プログラムは、ゲームの状態の定義と、プレイヤーからの指示によりゲームプログラムにより実行されるアクションの定義と、ゲームの終了の定義とを含むゲーム仕様２０２を基に、以下のプログラムモジュールを生成する。ゲームの初期状態のテーブルを生成するモジュール。テーブルを検索することで、ゲームプログラムにより実行可能なアクションを特定するモジュール。プレイヤーにより選択されたアクションを受け取るモジュール。選択されたアクションが、実行可能なアクションである場合、そのアクションを実行するモジュール。実行されたアクションの定義に基づいて、テーブルに格納された命題に変更を施すことで、テーブルを更新するモジュール。テーブルを検索することで、ゲームの終了と終了結果を出力するモジュール。【選択図】図３
2019191786.tif 000002
【特許請求の範囲】
【請求項１】
命題を用いて定義されたゲームの仕様から、ゲームマシンにゲームを動作させるゲームプログラムを生成するゲームプログラム生成装置であって、前記仕様は、少なくとも、ゲームの状態の定義と、プレイヤーからの指示に基づいて前記ゲームプログラムにより実行されるアクションの定義と、ゲームの終了の定義と、を含み、
前記ゲームプログラム生成装置は、
ゲームの状態を記憶するテーブルに、前記ゲームの仕様に含まれる複数の命題について、ゲームの初期状態における真理値が含まれるように、初期状態のテーブルを作成するプログラムモジュールを生成する、テーブル作成プログラム生成部と、
前記アクションの定義を用いて、前記テーブルを検索することで、前記ゲームプログラムにより実行可能なアクションを特定するプログラムモジュールを生成する、実行可能アクション特定プログラム生成部と、
前記プレイヤーによって選択されたアクションを受け取るプログラムモジュールを生成する、アクション受取プログラム生成部と、
前記プレイヤーによって選択されたアクションが、前記実行可能なアクションのうちの１つである場合、前記選択されたアクションを実行するプログラムモジュールを生成する、アクション実行プログラム生成部と、
実行された前記アクションの定義に基づいて、前記アクションが実行された後のゲームの状態を表す真の命題の全てを含むように、前記テーブルに格納された命題に変更を施すことで、前記テーブルを更新するプログラムモジュールを生成する、テーブル更新プログラム生成部と、
前記ゲームの終了の定義を用いて、前記テーブルを検索することで、ゲームの終了及びゲームの終了の結果を出力するプログラムモジュールを生成する、ゲーム終了プログラム生成部と、
を有する、ゲームプログラム生成装置。
【請求項２】
前記アクションの定義は、アクションの実行を可能とさせる前提条件となる真の命題の集合と、アクションの実行後に偽から真となる命題の集合と、アクションの実行後に真から偽となる命題の集合と、を含み、
前記実行可能なアクションを特定するプログラムモジュールは、所定のアクションについての前記前提条件となる真の命題の集合が前記テーブルに存在する場合に、前記所定のアクションが実行可能であると特定し、
前記テーブルを更新するプログラムモジュールは、実行されたアクションについて、アクションの実行後に偽から真となる命題の集合と、アクションの実行後に真から偽となる命題の集合とに整合するように、前記テーブルを更新する、
請求項１に記載のゲームプログラム生成装置。
【請求項３】
生成された前記ゲームプログラムを人間のプレイヤーに代わって、仮想的プレイヤーがプレイするプログラムモジュールを生成するプレイヤシミュレーションプログラム生成部、を更に有し、
プレイヤシミュレーションプログラム生成部は、
前記ゲームにより実行可能なアクションを特定するプログラムモジュールによって得られたアクションのうち、前記仮想的プレイヤーがゲームで有利になる確率の高いアクションを推定するプログラムモジュールを生成する、アクション推定プログラム生成部と、
前記アクションを推定するプログラムモジュールにより推定された１つのアクションを、前記アクションを受け取るプログラムモジュールに伝達するプログラムモジュールを生成する、アクション伝達プログラム生成部と、
を有し、
前記仮想的プレイヤーがゲームで有利になる確率の高いアクションを推定するプログラムモジュールは、少なくとも、前記選択されたアクションと、当該アクションが実行される前のゲームの状態、当該アクションが実行された後のゲームの状態、及びゲームの終了の結果のうちの少なくとも１つを複数回学習することで前記仮想的プレイヤーがゲームで有利になる確率の高いアクションの１つを推定する、
請求項１又は２に記載のゲームプログラム生成装置。
【請求項４】
ゲームのルールの仕様と背反する論理式を受け取るプログラムモジュールを生成する、論理式受取プログラム生成部と、
前記仮想的プレイヤーによって前記ゲームプログラムをプレイさせて前記テーブルを監視するプログラムモジュールを生成する、テーブル監視プログラム生成部と、
を有し、
前記テーブルを監視するプログラムモジュールは、前記背反する論理式が、前記テーブルに存在する場合に、前記テーブルが不正である旨を報知する、請求項３に記載のゲームプログラム生成装置。
【請求項５】
前記ゲームの初期状態を変更するプログラムモジュールを生成する、初期状態変更プログラム生成部と、
変更された前記ゲームの初期状態を用いて、前記生成されたゲームプログラムを前記仮想的プレイヤーによって所定の回数プレイさせることで、前記ゲームの途中の状態又は前記ゲームの終了の結果から、前記ゲームの初期状態を用いたゲームプログラムの難易度を統計的に測定するプログラムモジュールを生成する、難易度測定プログラム生成部と、
を更に有する、
請求項３又は４に記載のゲームプログラム生成装置。
【請求項６】
測定された前記難易度と、予め定められた難易度との差を比較した差の絶対値が、所定の閾値以下の場合には、変更された前記ゲームの状態の定義から得られた前記ゲームの初期状態を出力する、難易度比較・初期状態出力プログラムモジュールを生成する、難易度比較・初期状態出力プログラム生成部、
を更に有し、
前記難易度比較・初期状態出力プログラムモジュールは、前記差の絶対値が所定の閾値を超える場合には、前記ゲームの初期状態を出力せずに、前記ゲームの初期状態を変更するプログラムモジュールにゲームの状態の定義を変更するよう指示する、
請求項５に記載のゲームプログラム生成装置。
【請求項７】
前記仕様に基づいて、ゲームプログラムにアノーテーションを付加するアノーテーション付加部を更に有する、
請求項1ないし６のうちいずれか1項に記載のゲームプログラム生成装置。
【請求項８】
命題を用いて定義されたゲームの仕様から、ゲームマシンにゲームを動作させるゲームプログラムを生成するゲームプログラムをコンピュータに生成させるプログラムであって、前記仕様は、少なくとも、ゲームの状態の定義と、プレイヤーからの指示に基づいて前記ゲームプログラムにより実行されるアクションの定義と、ゲームの終了の定義と、を含み、
前記プログラムは、
ゲームの状態を記憶するテーブルに、前記ゲームの仕様に含まれる複数の命題のうち、ゲームの初期状態において真である全ての命題が少なくとも含まれるように、初期状態のテーブルを作成するプログラムモジュールを生成するステップと、
前記アクションの定義を用いて、前記テーブルを検索することで、前記ゲームプログラムにより実行可能なアクションを特定するプログラムモジュールを生成するステップと、
前記プレイヤーによって選択されたアクションを受け取るプログラムモジュールを生成するステップと、
前記プレイヤーによって選択されたアクションが、前記実行可能なアクションのうちの１つである場合、前記選択されたアクションを実行するプログラムモジュールを生成するステップと、
実行された前記アクションの定義に基づいて、前記アクションが実行された後のゲームの状態を表す真の命題の全てを含むように、前記テーブルに格納された命題に変更を施すことで、前記テーブルを更新するプログラムモジュールを生成するステップと、
前記ゲームの終了の定義を用いて、前記テーブルを検索することで、ゲームの終了及びゲームの終了の結果を出力するプログラムモジュールを生成するステップと、
をコンピュータに実行させる、ゲームプログラム生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ゲームプログラム生成装置及びゲームプログラム生成プログラムに関する。
【背景技術】
【０００２】
コンピュータプログラムの作成には、一般的に、プログラミング言語を用いてプログラムを定義することが行われている。
【０００３】
コンピュータゲームのプログラムは、ゲームのルールだけでなく、画面の描画処理、音響の入出力処理、コントローラからの入力処理、通信処理、ＡＩの思考処理など、様々な要素の処理を並行して行う複雑なプログラムである。多くのゲーム製作現場では、これらの処理をより簡単に実現し実装するために、ゲームエンジンと呼ばれるゲーム製作支援用ソフトウェアが用いられている。
【０００４】
一般にゲームエンジンと称されるものには、ゲームのプログラム製作を支援するツールを備えたものであって、様々な形態が存在する。ゲームエンジンの例を挙げれば、ミドルウェアの集合で構成されたツール群が総合化された形態のもの、ＡＰＩ（Application Programing Interface）を提供することでゲームの部品を提供するものなどがある。
ゲームエンジンの具体例としては、例えば、Unity（登録商標）、Unreal Engine、Cocos2d-xなどが挙げられる。
【０００５】
従来のゲームエンジンにおいては、個別の要素を処理するライブラリやＡＰＩは用意されていても、それらをどのようにまとめあげて連携させるのかはゲーム製作者が自ら考えて設計し実装している。特に、ゲームのルールを処理する部分の製作又はゲームのロジックを処理する部分の製作については、ツールやライブラリを有効に利用できる機会が限られている。
【０００６】
したがって、ゲームのルール処理部の設計からテストに至るまで、製作者自身が殆ど全てのプログラムを設計し、プログラミングする場合が多い。このため、上述のようなゲームエンジンの役割には限界が存在する。結果的にはゲームプログラムの製作には、多くの作業工数がかかることになる。
【０００７】
加えて、ゲームプログラムの製作には、ゲームを構成する要素に関する多岐にわたる専門知識が要求される。例えば人間の対戦相手やＮＰＣ（Non-Player Character）のプレイを操作するゲームＡＩの製作などは高度な知識が要求されて難しい。
【０００８】
また、複数のゲーム製作者の設計能力のばらつきや製作時の急な仕様変更など様々な理由から、全ての処理が密に結合したモノリシックなプログラムが製作される傾向が強い。プログラムの処理のモジュール化が不十分な場合には、単体テストや自動的なテストなどのデバッグ手法を利用することが難しくなってしまう。
加えて、ゲームの特定の機能だけを別のゲームで再利用したい場合においても、移植作業が困難になるなど、様々な不都合がある。
【０００９】
また、ゲームプログラムに限らず、一般的なプログラムの製作においても、プログラム製作者を支援する技術が存在する。例えば以下のような技術が挙げられる。
【００１０】
アプリケーションプログラムを構成する要素を表示する表示部と、第１の要素を個別の状況に対応できるようにする旨、及び、第２の要素により個別の状況を識別する旨の表示部上での指示を検出する検出部と、第１の要素を第２の要素により識別される個別の状況に対応できるようにするアプリケーションプログラムの部分を生成する生成部とを備えた技術が存在する。この技術では、既存のアプリケーションプログラムを個別の状況に応じて変更する作業を行える環境を提供している（例えば特許文献１参照）。
【００１１】
また、所定のプログラミング言語により記述されるコンピュータプログラムを生成するコンピュータプログラム生成装置であって、ユーザによって定義された用語と、前記用語に対応する識別子とを記憶する用語データベースと、前記プログラミング言語の文法に従って形成される木構造であって、前記プログラミング言語に用いられる各命令文を構成する複数の構成要素をそれぞれ格納する複数のノードを含む木構造を有する文法データベースと、前記用語を含む前記コンピュータプログラムのアルゴリズムの入力を受け付ける入力部と、前記用語データベースを検索して前記入力部で入力された用語に対応する識別子を読み出し、前記文法データベースを検索して前記ノードから構成要素を読み出し、前記読み出された識別子及び構成要素を配列することにより複数の命令文を１つずつ生成し、前記生成された複数の命令文を前記入力されたアルゴリズムに従って順番に並べる生成部とを備える、コンピュータプログラム生成装置を提供する技術がある（例えば特許文献２参照）。
以上のような一般的なプログラムの製作を支援する技術においても、その適用範囲は限られた範囲にとどまっているのが現状である。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特許第４６２９６４６号公報
【特許文献２】特許第５８４４３４７号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
本発明は、上述のような、技術的な課題を解決するためになされたものであって、その目的は、ゲームの仕様から、ゲームプログラム及びゲームプログラムに付随する様々なプログラムの作成をより簡便に行えるようにすることにある。
【課題を解決するための手段】
【００１４】
一実施形態によれば、命題を用いて定義されたゲームの仕様から、ゲームマシンにゲームを動作させるゲームプログラムを生成するゲームプログラム生成装置であって、前記仕様は、少なくとも、ゲームの状態の定義と、プレイヤーからの指示に基づいて前記ゲームプログラムにより実行されるアクションの定義と、ゲームの終了の定義と、を含み、前記ゲームプログラム生成装置は、ゲームの状態を記憶するテーブルに、前記ゲームの仕様に含まれる複数の命題について、ゲームの初期状態における真理値が含まれるように、初期状態のテーブルを作成するプログラムモジュールを生成する、テーブル作成プログラム生成部と、前記アクションの定義を用いて、前記テーブルを検索することで、前記ゲームプログラムにより実行可能なアクションを特定するプログラムモジュールを生成する、実行可能アクション特定プログラム生成部と、前記プレイヤーによって選択されたアクションを受け取るプログラムモジュールを生成する、アクション受取プログラム生成部と、前記プレイヤーによって選択されたアクションが、前記実行可能なアクションのうちの１つである場合、前記選択されたアクションを実行するプログラムモジュールを生成する、アクション実行プログラム生成部と、実行された前記アクションの定義に基づいて、前記アクションが実行された後のゲームの状態を表す真の命題の全てを含むように、前記テーブルに格納された命題に変更を施すことで、前記テーブルを更新するプログラムモジュールを生成する、テーブル更新プログラム生成部と、前記ゲームの終了の定義を用いて、前記テーブルを検索することで、ゲームの終了及びゲームの終了の結果を出力するプログラムモジュールを生成する、ゲーム終了プログラム生成部と、を有する、ゲームプログラム生成装置が提供される。
【発明の効果】
【００１５】
実施形態によれば、ゲームの仕様などから、ゲームプログラム及びゲームプログラムに付随する様々なプログラムの製作をより簡便に行うことができる。
【図面の簡単な説明】
【００１６】
【図１】三目並べを説明する図である。
【図２】実施形態の概略を示す図である。
【図３】ゲームルール処理プログラム生成部の処理の内容を示した図である。
【図４】プレイヤーシミュレーション（ＡＩ）プログラム生成部を示す図である。
【図５】初期状態（ステージ）難易度測定プログラムの生成及び難易度比較・初期状態出力プログラムの生成を示す図である。
【図６】テストプログラムの生成を示す図である。
【図７】ゲームプログラム生成プログラムの動作のフローである。
【図８】一実施形態のハードウエア構成を示す図である。
【発明を実施するための形態】
【００１７】
複数の実施形態について図面を参照しながら説明する。
【００１８】
以下に示す複数の実施形態は、様々なゲームに対して適用でき、ゲームのルールの仕様に依存するものではない。また、以下の実施形態は、ゲームに関するプログラムの製作に適用できるのは勿論のこと、例えば交通や運輸のシミュレーションなど、特定の対象に適用される所定のルールに基づいて状態が変化する対象を取り扱うプログラムなどにも有効に利用できる。
【００１９】
なお、以下の実施形態の説明においては、具体的なゲームを例に説明を行うことが、各実施形態の理解を助けることとなる。このため、主に三目並べのゲームを例にして、各実施形態の説明を行う。上述のように、三目並べのゲームは、例示であって、実施形態は、三目並べのゲームにのみ適用できる技術でないことは言うまでもない。なお、実施形態によっては、説明の都合上、三目並べ以外のゲームのルールを例示して説明を行う場合がある。
【００２０】
＜三目並べのゲームのルール＞
まず、三目並べのゲームのルールについて簡潔に説明する。
図１（Ａ）は、三目並べの盤面を示している。盤面には、９つのマス目の陣地がある。９つの陣地の位置を示すために、各列に１、２、３の番号が付されており、各行にａ、ｂ、ｃの英文字が付されている。各陣地の位置は、例えば、[1a]、[1b]、[1c]、[2a]、[2b]・・・などの数字と英文字の組合せで特定される。
図１（Ａ）においては、先手が〇、後手が×であり、以下の順でゲームが進行している。
1a〇、3a×、2b〇、3b×、3c〇
この時点において、先手〇は、直線に並んだ３マスの列[1a]、[2b]、[3c]に〇を並べることができたので、先手〇の勝ちとなる。
【００２１】
図１（Ｂ）は、他のゲームの進展の例であり、先手〇及び後手×共に、直線に並んだ３マスの列の陣地を取ることができなかったため、引き分けに終わった例である。
なお、以下の説明においては、縦、横、斜めのいずれであっても「直線に並んだ３つのマス」を単に「列」と称す。
【００２２】
＜実施形態１＞
＜＜ゲームのルール仕様の定義の例＞＞
人間がプログラムのコーディングをすることは、非常に煩雑な作業を行わなければならない。また、ゲームの仕様が変更された場合などでは、ゲームのプログラムを修正するという極めて手間のかかる作業を強いられることとなる。
【００２３】
このため、人間がゲームの仕様の作成に専念できるようにして、その後のゲームプログラムのコーディング作業については、人間の手を煩わせることをできるだけ排除できれば、ゲームプログラムを作成するための労力を大幅に削減できる。また、ゲームの仕様を変更するような場合においても、プログラムの手直しなどにかかる労力を削減できる。
【００２４】
このためには、ゲームのルールの仕様を適切に定義する手法が確立されていることが重要である。以下に説明するゲームのルール仕様の定義の例は、以上のような背景のもとに提案されたものである。
【００２５】
＜＜ゲームルール処理プログラムがなす仕事＞＞
ゲームルール処理プログラムは、以下の処理を行うことで進行し終了する。すなわち、ゲーム処理の本質を列挙すれば以下のとおりである。
（１）プレイヤーの指示により、どのようなアクションを実行できるのかゲーム装置が判定あるいは列挙すること。
（２）プレイヤーによって指示されたアクションをゲーム装置が実行できるのか否かを確認し、実行できる場合には、実行して、実行の前後のゲームの状態の変化を特定し、実行した後の状態を保持すること。
（３）ゲームの状態をチェックすることで、いずれかのプレイヤーが勝利しているか、あるいはいずれのプレイヤーも勝利していないかをゲーム装置が判定すること。
【００２６】
以上の３点が把握できれば、ゲームルール処理プログラムによってゲーム装置は、ゲームの処理を遂行することが可能である。より具体的には、以上の３点を把握しつつ以下のようにして、ゲームプログラムは、ゲーム装置にゲーム処理を遂行させることができる。
【００２７】
（ｎ１）ゲーム装置が、プレイヤーに（初期の）状態を提示する。
（ｎ２）ゲーム装置が、プレイヤーにより現在実行可能なアクションをプレイヤーに提示する。
（ｎ３）プレイヤーによっていずれかのアクションが選択され、選択されたアクションがゲーム装置によって実行される。
（ｎ４）選択されたアクションによる後の状態をゲーム装置が認識することでゲームの決着がついたか否か判定し、決着になるまでｎ２ないしｎ４を繰り返す。
【００２８】
なお、プレイヤーに対して、実行可能なアクションを列挙（提示）しないゲームの場合には、上記（ｎ１）ないし（ｎ４）は、以下のような処理であってもよい。
【００２９】
（ｍ１）ゲーム装置が、プレイヤーに（初期の）状態を提示する。
（ｍ２）ゲーム装置が、プレイヤーにより選択されたアクションが、実行可能なアクションかをチェックする。
（ｍ３）プレイヤーにより選択されたアクションがゲーム装置によって実行可能であれば、選択されたアクションがゲーム装置によって実行される。実行不可能なアクションの選択がなされた場合には、ゲーム装置がその旨を報知する。
（ｍ４）アクションが実行されれば、実行されたアクションによる後の状態をゲーム装置が認識することでゲームの決着かついたか否か判定し、決着になるまでｍ２ないしｍ４を繰り返す。
【００３０】
このような処理を行うゲーム装置で動作するゲームプログラムの生成にあたって、本実施形態を適用する場合のゲーム製作者の主な作業は、自分が製作しているゲームのルールにおいて、上記（１）、（２）及び（３）がそれぞれどのように定義されるのかについて、例えば形式言語を用いてルール仕様を記述することである。
【００３１】
以下では、実施形態として、ゲームのルール仕様を一階述語論理に基づいた形式言語で記述する方法について述べるが、ルール仕様を形式的に書き表すことができればよいのであって、言語の具体的な定義は以下で述べるものに限定されない。
【００３２】
＜＜ゲームのルールの仕様の定義の手法＞＞
（ａ）仕様の構成要素１：述語、命題、論理式
述語を用いて、ゲームのルールの定義を表現する例を以下に示す。
例えば、「[位置]は空欄である」という述語を例に説明する。ここで、[位置]は、述語「[位置]は空欄である」の項を表す。
本実施形態では、述語の項のことを引数と表現し、[  ]を用いて表現する（なお、本明細書において「引数」の語は、ある関数に引き渡す値を意味する用語としても用いられる場合がある。）。例えば、
[位置]は[手番]の陣地である      （式１）
という（式１）で示される述語に対して、図１（Ａ）において、具体的に[位置]＝[1a]及び[手番]＝[先手]を当てはめれば、
[1a]は[先手]の陣地である        （式２）
という命題となる。図１Ａにおいて位置[1a]には「〇」が入っているから先手の陣地であり、（式２）で表現された命題の真偽（真理値）は、「真」である。
【００３３】
また、例えば、
[位置]は空欄である              （式３）
という述語（式３）に対して、図１（Ａ）において、具体的に[位置]＝[3c]を当てはめれば、
[3c]は空欄である                （式４）
という命題（式４）となる。図１Ａにおいて位置[3c]は、「〇」が入っており空欄ではないから、（式４）の命題の真偽は、「偽」である。
また、以下の（式５）は、論理式の一例である。
∃[位置]，[位置]は[先手]の陣地でありかつ[位置]は[後手]の陣地でない  （式５）
【００３４】
この論理式（式５）は、図１Ａに関しては、具体的に[位置]＝[3c]を当てはめれば、位置[3c]には、「〇」が入っているから、「位置[3c]は先手の陣地でありかつ位置[3c]は後手の陣地でないという位置[3c]が少なくとも１つ存在する」ことになるから、論理式（式５）の真偽は、「真」である。
【００３５】
（ｂ）仕様の構成要素２：ゲーム中で用いられる引数（述語の項）
ゲームのルールの定義においては、ゲームにおける引数の取り得るバリエーションを定義しておくことが望ましい。例えば、図１の三目並べのゲームにおいては、引数の取り得るバリエーションは、「1a、2a、3a、1b、2b、3b、1c、2c、3c、先手、後手」である。三目並べのゲームの場合には、[4a]という位置は存在しないから、そのような位置に陣地を取ることはできない。このため、引数[4a]は、存在し得ない引数であるとゲーム装置が判断するよう、例えば初期状態の定義中に引数の取り得る範囲をも定めておくことが望ましい。なお、ゲームの仕様を表す命題の数は、ゲームを遂行するにあたり、合理的な数を作成しておくことが望ましい。
【００３６】
＜＜ゲームのルールの仕様の構成要素＞＞
ゲームのルールの仕様は、以下の構成要素を有する。
（Ｆ１）ゲームの初期状態の定義
（Ｆ２）プレイヤーによって指示され得るアクションの定義
（Ｆ３）ゲームの終了条件（勝敗、引き分けなど）の定義
ゲームのルールの仕様は、上記の（Ｆ１）ないし（Ｆ３）で定義できる。以下、これらの構成要素について説明する。
【００３７】
（Ｆ１）ゲームの初期状態の定義
ゲームを開始する際に真である命題の全てを少なくとも含む命題の集合が列記されていることにより、ゲームが開始されるときの状態が定義され得る。
たとえば、三目並べのゲームのルールであれば、真の値を取り得る全ての命題のリストが初期状態を表すこととなる。以下に、その例を示す。「，」は、各命題の区切りを示している。
【００３８】
（三目並べの初期状態を表す真の命題のリストの例）                    （式６）
[1a]は空欄である, [1b]は空欄である, [1c]は空欄である, 
[2a]は空欄である, [2b]は空欄である, [2c]は空欄である, 
[3a]は空欄である, [3b]は空欄である, [3c]は空欄である,
[1a]は位置である, [1b]は位置である, [1c]は位置である, 
[2a]は位置である, [2b]は位置である, [2c]は位置である, 
[3a]は位置である, [3b]は位置である, [3c]は位置である,
[1a] [1b] [1c]は列である, [2a] [2b] [2c]は列である, [3a] [3b] [3c]は列である, 
[1a] [2a] [3a]は列である, [1b] [2b] [3b]は列である, [1c] [2c] [3c]は列である, 
[1a] [2b] [3c]は列である, [3a] [2b] [1c]は列である,
[先手]の手番である, [後手]の手番でない
【００３９】
上記（式６）に列挙された命題の全てが真である状態は、三目並べの初期状態の一例である。初期状態を定義するには、初期状態において真である命題の全てが少なくとも列挙されていればよい。なお、真偽の両者の命題が含まれる場合には、例えば真理値表又はフラグなどを用いて、各命題の真偽がわかるようにすればよい。初期状態以外の任意の時点のゲームの状態も、その任意の時点において、真である命題の全てが少なくとも列挙されていれば、その時点の状態を適切に表現することができる。なお、例えば、「[1a]は位置である」という真の命題は、「［後手］は位置である」などの、存在し得ない命題がゲームの状態に混入することを避けるために、定義しておくことが望ましい。また、上記の定義のように、初期状態の定義において、引数の取り得る範囲も定義されていることが望ましい。
【００４０】
なお、上記の三目並べの初期状態を表す真の命題のリストの例（式６）では、真の命題だけが含まれる形式となっているが、ゲームにおいて存在し得る合理的な数の命題全てを含むように、初期状態を表す命題のリストを作成してもよい。この場合には、初期状態を表す命題のリストには、上述のように例えば命題が真であるか偽であるかを表すフラグが付け加えられる。この場合には、状態を表す命題のリストに含まれる命題の総数Ｎは、ゲームの各場面を通じて変化しないこととなる。
【００４１】
（Ｆ２）プレイヤーによって指示され得るアクションの定義
次に、プレイヤーによって指示され得るアクションの定義の手法について述べる。プレイヤーによって指示され得るアクションの定義は、例えば、以下の構成要素を含む。
（Ｆ２−１）引数の列挙
（Ｆ２−２）アクションが実行されるための前提条件となる論理式
（Ｆ２−３）アクションが実行された後に真になる命題のリスト
（Ｆ２−４）アクションが実行された後に偽になる命題のリスト
【００４２】
上記（Ｆ２−１）で引数を列挙する理由は、その後の（Ｆ２−２）、（Ｆ２−３）及び（Ｆ２−４）において定義される述語或いは論理式において、どのような項（引数）が含まれているかを簡便に把握するためである。（Ｆ２−１）で引数を列挙しておくことで、プレイヤーによって指示され得るアクションを網羅的に探索したり、アクションが実行可能か否かを判断したり、具体的なアクションを特定したりするプログラムを生成することがより容易になる。したがって、「（Ｆ２−１）引数の列挙」を、プレイヤーによって指示され得るアクションの定義に含ませておくことが望ましい。
【００４３】
三目並べの場合には、指示され得るアクションの定義は、例えば、以下のようになる。
（Ｆ２−１）引数の列挙：[手番1], [手番2], [位置]
（Ｆ２−２）アクションが実行されるための前提条件となる論理式
[位置]は位置である, かつ  
[位置]は空欄である, かつ
[手番1]の手番である, かつ
[手番2]の手番でない, 
（Ｆ２−３）アクションが実行された後に真になる命題のリスト
[位置]は[手番1]の陣地である, 
[手番2]の手番である, 
[手番1]の手番でない
（Ｆ２−４）アクションが実行された後に偽になる命題のリスト
[位置]は空欄である,
[手番1]の手番である, 
[手番2]の手番でない 
【００４４】
たとえば、初期状態において、先手が、位置[1a]に陣地を取る（1aに○を打つ）場合には、上記の具体的アクションは以下のようになる。
【００４５】
（ｆ２−１）引数の列挙：[先手], [後手], [1a]
（ｆ２−２）アクションが実行されるための前提条件となる論理式
[1a]は位置である, かつ  
[1a]は空欄である, かつ
[先手]の手番である, かつ
[後手]の手番でない, 
（ｆ２−３）アクションが実行された後に真になる命題のリスト
[位置]は[先手]の陣地である, 
[後手]の手番である, 
[先手]の手番でない
（ｆ２−４）アクションが実行された後に偽になる命題のリスト
[1a]は空欄である,
[先手]の手番である, 
[後手]の手番でない
【００４６】
初期状態の場合、アクションが実行されるための前提条件となる論理式（ｆ２−２）は、真であるから、アクションが実行され得る前提条件を満足する。
【００４７】
そして、アクションが実行された場合には、アクションの実行後に、ゲームの状態を更新する必要がある。このため、アクションが実行された後に真になる命題のリストである（ｆ２−３）に列挙された命題のリストを、初期状態の命題のリストに加える。そして、アクションが実行された後に偽になる命題のリストである（ｆ２−４）に列挙された命題のリストを取り除くか、又はこれらの命題が偽である旨のフラグを付するなどの処理を行う。
【００４８】
以上の処理によって、状態を表す命題のリストが現在の状態を表すように更新されることとなる。なお、状態を表す命題のリストは、例えば記憶装置にテーブル（真理値表）の形式で保存することで実現できる。
【００４９】
（Ｆ３）ゲームの終了条件（勝敗、引き分けなど）の定義
通常のゲームの場合には、キャラクター同士を何らかの競技で対戦させる形式や、キャラクターを操作してゴールに到達させるなど何らかの目的を達成させる形式でゲームが進行する場合が多い。このようなゲームでは、勝敗が決まれば、ゲームは終了するか、次のゲームステージに移る場合が多い。また、勝敗が決まらずに、引き分ける場合もある。
以上のようなゲームの一区切りを判断する条件が定義される。これを、本実施形態では、ゲームの終了条件と呼ぶ。
ゲームの終了条件の定義は、例えば、ゲームの状態を監視し、ゲームの状態が終了条件を満足したときに真となる論理式を定義することによって実現できる。
三目並べの場合には、以下の論理式が、ゲームの終了条件を与える。
【００５０】
（ｆ３−１）先手の勝ちの論理式（真の場合）
∃[位置1], [位置2], [位置3], 
[位置1]は[先手]の陣地であり、かつ
[位置2]は[先手]の陣地であり、かつ
[位置3]は[先手]の陣地であり、かつ
[位置1] [位置2] [位置3]は列である
【００５１】
（ｆ３−２）後手の勝ちの論理式（真の場合）
∃[位置1], [位置2], [位置3], 
[位置1]は[後手]の陣地であり、かつ
[位置2]は[後手]の陣地であり、かつ
[位置3]は[後手]の陣地であり、かつ
[位置1] [位置2] [位置3]は列である
【００５２】
（ｆ３−３）引き分けの論理式
（ｆ３−１）の論理式が偽であり、かつ（ｆ３−２）の論理式が偽であり、かつ「∃[位置], [位置]は空欄」の論理式が偽である
【００５３】
上記の条件が満足されれば、三目並べの勝敗又は引き分けが判定され、三目並べのゲームが終了する。
【００５４】
＜実施形態の全体構成＞
図２は、実施形態の概略を示す図である。
まず、ゲームルールの仕様２０２が与えられる。このゲームルールの仕様は、ゲームを開発した者が作成することとなる。ゲームルールの仕様については、実施形態１の「ゲームのルールの仕様の定義」で述べたように、以下の３要素が定義されることである。
（Ｆ１）ゲームの初期状態の定義
（Ｆ２）プレイヤーによって指示され得るアクションの定義
（Ｆ３）ゲームの終了条件（勝敗、引き分けなど）の定義
そして、ゲームルールの仕様２０２は、ゲームルール処理プログラム生成部２２０に入力される。
【００５５】
ゲームルール処理プログラム生成部２２０は、仕様情報解析部２２０ａ、実装情報作成部２２０ｂ、アノーテーション付加部２２０ｃ、プログラミング言語生成部２２０ｄを具備する。
【００５６】
仕様情報解析部２２０ａは、例えば、ゲームルールの仕様が、「ゲームの初期状態の定義」、「プレイヤーによって指示され得るアクションの定義」、「ゲームの終了（勝敗、引き分けなど）の定義」のいずれかに少なくとも分類する。分類された仕様を、実装情報作成部２２０ｂに渡す。
実装情報作成部２２０ｂの具体的な動作は、図３ないし図６の説明において詳述する。
【００５７】
アノーテーション付加部は、その後段に位置するプログラミング言語生成部２２０ｄにおいて、具体的なプログラミング言語プログラムが生成されるときに、プログラムに適切なアノーテーション（コメント）を付す情報を提供する。このアノーテーションは、ＵＩ、映像出力機能等を有する汎用プログラム２８２が提供するＡＰＩ２８０とのインタフェースを取る際に、プログラム開発者によって利用される情報となる。このアノーテーション付加部２２０ｃの動作の詳細は、後述する。
【００５８】
プログラミング言語生成部２２０ｄは、たとえばＣ言語などの具体的なプログラミング言語の文法に準拠した具体的なプログラムを生成する。この具体的なプログラムは、実装情報作成部２２０ｂとアノーテーション付加部２２０ｃからの情報を用いて、モジュール化されたプログラムの適切な場所にアノーテーションを付加することで、生成される。生成されたプログラムは、ゲームルール処理プログラム２５０となる。プログラミング言語生成部２２０ｄの処理の詳細は、図３ないし図６の説明において詳述する。
【００５９】
また、各種プログラム生成部（３２０、４２０、５２０、６２０）は、プレイヤーシミュレーション（ＡＩ）プログラム３５０、初期状態（ステージ）難易度測定プログラム４５０、難易度比較・初期状態出力プログラムモジュール５５０、テストプログラム６５０を出力する。これらのプログラムは、ゲームルール処理プログラム２５０と連携して動作する。これらのプログラムの生成方法及びプログラムの機能については、図３ないし図６の説明において詳述する。
【００６０】
そして、ゲームルール処理プログラム２５０は、ＵＩ、映像出力等の機能を有する汎用プログラム２８２及びオペレーティングシステム２８４に対して、直接又はＡＰＩ２８０を経由して情報の授受を行う。プログラム作成者は、ゲームルール処理プログラムのアノーテーションを参照することで、ゲームルール処理プログラム２５０とＡＰＩ２８０との情報の授受が行える付加的なプログラムを容易に作成することができる。
【００６１】
＜実施形態２＞ゲームルール処理プログラムの生成
以下に、ゲームルール処理プログラムを生成する実施形態を説明する。
図３は、ゲームルール処理プログラム生成部の処理の内容を示した図である。
ゲームルールの仕様２０２については、「実施形態の全体構成」で既に説明した。
ゲームルール処理プログラム生成部２２０の各機能と、生成されるゲームルール処理プログラム２５０について、以下に説明する。
なお、図２と図３との対応関係は以下のとおりである。
図３におけるテーブル作成プログラム生成部２２２、実行可能アクション特定プログラム生成部２２４、アクション受取プログラム生成部２２６、アクション実行プログラム生成部２２８、テープル更新プログラム生成部２３０及びゲーム終了プログラム生成部２３２は、図２における仕様情報解析部２２０ａ、実装情報作成部２２０ｂ及びプログラミング言語生成部２２０ｄに対応しており一体化して描かれている点に留意すべきである。
【００６２】
なお、図２及び図３におけるアノーテーション付加部２２０ｃは、実施形態７において後述する。（図４ないし図６では、図を簡略化するためアノーテーション付加部２２０ｃの記載を省略している。）
【００６３】
・テーブル作成プログラム生成部２２２
まず、テーブル作成プログラム生成部２２２は、テーブル作成プログラムモジュール２５２を作成する。テーブルとは、ゲームの状態をメモリ部に格納する状態テーブル２６４を指す。テーブル作成プログラムモジュール２５２は、ゲームを始めるにあたって、状態テーブル２６４の領域をメモリに確保し、ゲームの初期状態を状態テーブル２６４に格納する機能を有する。
【００６４】
三目並べの場合には、（式６）で提示した初期状態をテーブルに格納する。テーブルへの格納の手法としては、それぞれの命題を所定のフォーマットでメモリに記述することにより達成される。たとえば、「[3a]は空欄である」という真の命題は、
[3a]，空欄である，真            （式７）
上記（式７）のようなエントリーを表形式でメモリに格納するようにすればよい。
【００６５】
テーブル作成プログラム生成部２２２は、この初期状態をあらかじめ保存しておき、ゲームの起動時に、この初期状態をメモリに展開する具体的なプログラムを作成することで、テーブル作成プログラムモジュール２５２が作成される。
作成されたテーブルは、状態テーブル２６４の初期状態となる。
三目並べの場合、生成されるテーブル作成プログラムモジュール２５２は、例えば、以下のようなプログラムモジュールで状態テーブル２６４を作成することができる。
以下のプログラムの場合、三目並べにおける命題の総数をＮとする。各命題に1からNの番号を割り振る。
【００６６】
（テーブル作成プログラムモジュール２５２の例）
1.  サイズNの真理値テーブルTをメモリに確保;
2.  for each (i = 1…N)
3.      T[i] = 初期状態における命題iの値;
4.  Tを出力;
以上のプログラムで、状態テーブル２６４が作成される。
【００６７】
・実行可能アクション特定プログラム生成部２２４
実行可能アクション特定プログラム生成部２５４は、実行可能アクション特定プログラムモジュール２５４を生成する。実行可能アクション特定プログラムモジュール２５４は、状態テーブル２６４に格納された現在のゲームの状態を参照し、ゲームが実行可能なアクションを特定し列挙する機能を有する。あるいは、プレイヤーにより特定されたアクションが実行可能なアクションか否かを、チェックする機能を更に有してもよい。
例えば、三目並べの場合、具体的な処理は以下のようになる。
【００６８】
状態テーブル２６４の現在のゲームの状態において、アクションが実行されるための前提条件となる論理式（Ｆ２−２）が、真となる引数の列挙（Ｆ２−１）を探索し特定することにより達成される。初期状態の場合には、位置の全ては空欄であるから、先手は、全ての位置に先手の陣地〇を打つことができる。具体的な実行可能なアクションを列挙すれば以下のとおりである。
【００６９】
（初期状態において実行可能なアクション）
[先手], [後手], [1a]
[先手], [後手], [1b]
[先手], [後手], [1c]
[先手], [後手], [2a]
[先手], [後手], [2b]
[先手], [後手], [2c]
[先手], [後手], [3a]
[先手], [後手], [3b]
[先手], [後手], [3c]
【００７０】
このように、アクションの定義と、状態テーブル２６４とから、上記のような実行可能なアクションを抽出し特定するように、実行可能アクション特定プログラムモジュール２５４が生成される。
【００７１】
三目並べの場合、生成される実行可能アクション特定プログラムモジュール２５４は、例えば、以下のようなプログラムで、実行可能なアクションのリストＬを作ることができる。
【００７２】
（実行可能アクション特定プログラムモジュール２５４の例）
1.  実行可能なアクションを収めるリストＬを用意;
2.   for each (アクションの候補となる網羅的なアクションのリストに列記されたアクションa)
3.   if (現在の状態がアクションaの前提条件となる論理式（Ｆ２−２）を満たす)
4.     Lにaを追加;
5.  return L;
【００７３】
・アクション受取プログラム生成部２２６
アクション受取プログラム生成部２２６は、ゲーム装置において実行されるべきアクションの指示をプレイヤーの操作等２７２に基づいてプレイヤーから受け取るアクション受取プログラムモジュール２５６を生成する。ゲームのルールにも依存するが、ゲーム装置がプレイヤーに対して、選択可能なアクションを提示するルールの場合には、アクション受取プログラムモジュール２５６は、選択可能なアクションを、実行可能アクション特定プログラムモジュール２５４から受け取り、プレイヤーに提示すればよい。ゲーム装置がプレイヤーに対して、選択可能なアクションを提示しないルールの場合には、アクション受取プログラムモジュール２５６は、プレイヤーからのアクションの指示を受け取り、その情報を実行可能アクション特定プログラムモジュール２５４に渡して、指示されたアクションが実行可能かを問い合わせればよい。アクション受取プログラムモジュール２５６は、プレイヤーから指示された実行可能なアクションの情報を、後述するアクション実行プログラムモジュール２５８及びテーブル更新プログラムモジュール２６０に渡す。
アクション受取プログラム生成部２２６は、以上の処理を行うアクション受取プログラムモジュール２５６を生成する。
【００７４】
・アクション実行プログラム生成部２２８
アクション実行プログラム生成部２２８は、プレイヤーにより指示されたアクション、及びゲームの状態の変化をゲーム装置に反映させるため、画像表示、音響出力などの指示を含むアクションの表示等２７０を出力するためのアクション実行プログラムモジュール２５８を生成する。アクション実行プログラムモジュール２５８は、アクション受取プログラムモジュール２５６から、プレイヤーの指示したアクションを取得する。また、現在のゲームの状態を、状態テーブル２６４から取得する。
【００７５】
なお、出力されるアクションの表示等２７０は、ＡＰＩ２８０を介してＵＩ、映像出力機能等を有する汎用プログラム２８２に渡されるか、直接オペレーティングシステム２８４に渡される。なお、アクションの表示等２７０の出力を適切なＡＰＩ２８０へのコマンド又は適切なＯＳ２８４へのコマンドに変換するためには、プログラム製作者が別途のインタフェースを作りこむことが必要となる場合がある。この場合には、生成されたプログラムモジュールに併記されたアノーテーションをプログラム製作者が参照することにより、上記インタフェースを製作することが容易化される。なお、アノーテーションについては、後述する。
三目並べの場合、生成されるアクション実行プログラムモジュール２５８は、例えば、以下のようなプログラムモジュールとなる。
【００７６】
（アクション実行プログラムモジュール２５８の例）
1.  現在の状態のテーブルをTとする;
2.  実行するアクションをaとする;
3.  命題を覚えるリストLT、LFを用意する;
4.  for each (アクションaが実行された後に真になる命題のリストに列記された命題p)
5.      if (T[pの番号]が偽)
6.          LTにpを追加;
7.  for each (アクションaが実行された後に偽になる命題のリストに列記された命題p)
8.      if (T[pの番号]が真)
9.          LFにpを追加;
10.  テーブル更新プログラムモジュール２６０にLT、LFを渡して、テーブル更新プログラムモジュール２６０を実行する;
11.  return a、LT、LF;
以上の処理において、アクションａ、アクションaが実行された後に偽から真になる命題のリストLT、アクションaが実行された後に真から偽になる命題のリストLFは、ゲーム装置において、映像効果のプログラム及び／又は音響効果のプログラムをゲームプログラム開発者が別途製作する際に有効に利用することができる。
このように本実施形態を適用することで、ゲームプログラム開発者は、ゲームルールの仕様の作成と、ゲームのアクションの映像効果又は音響効果のプログラムの作成とを切り分けて作業を遂行することができ、作業効率を高めることができる。
【００７７】
・テーブル更新プログラム生成部２３０
テーブル更新プログラム生成部２３０は、ゲーム装置により実行されたアクションを基にして、状態テーブル２６４をアクション実行後の状態に更新する機能を有するテーブル更新プログラムモジュール２６０を生成する。
【００７８】
三目並べの場合、例えば、先手が、位置[1a]に陣地を取る（1aに○を打つ）場合には、状態テーブル２６４に格納された現在の状態を表す真の命題のリストに対して、上述のアクションが実行された後に真になる命題のリスト（ｆ２−３）を加える。そして、上述のアクションが実行された後に偽になる命題のリスト（ｆ２−４）を削除するか、これらの偽となる命題が「偽」であることを示すフラグを立てればよい。
例えば、以上の具体的な処理を行うテーブル更新プログラムモジュール２６０が以下のように生成される。
【００７９】
（テーブル更新プログラムモジュール２６０の例）
1.  現在の状態のテーブルをTとする;
2.  アクション実行プログラムモジュール２５８から与えられた真になる命題のリストをLT、偽になる命題のリストをLFとおく。
3.  for each (LTに列記された命題p)
4.      T[pの番号] = 真;
5.  for each (LF列記された命題p)
6.      T[pの番号] = 偽;
以上のプログラムによって、状態テーブル２６４が現在の状態を反映したものとなる。このようにして、状態テーブルは、現在のゲームの状態を常に反映した情報を保持することができる。
【００８０】
・ゲーム終了プログラム生成部２３２
ゲーム終了プログラム生成部２３２は、状態テーブル２６４に格納された現在のゲームの状態が、ゲームの終了の定義に当てはまるかを判断するゲーム終了プログラムモジュール２６２を生成する。
【００８１】
三目並べの場合は、状態テーブルを監視し、既に述べた先手の勝ちの論理式（ｆ３−１）が真となるか、後手の勝ちの論理式（ｆ３−２）が真となるか、引き分けの論理式（ｆ３−３）が真となるかをチェックすればよい。ゲーム終了プログラム生成部２３２は、このようなチェックを行うように、ゲーム終了プログラムモジュール２６２を生成すればよい。
【００８２】
そして、ゲーム終了プログラムモジュール２６２がゲームの終了を検出した場合は、ゲームの結果の表示等２６６を出力する。ゲームの終了の結果の表示は、例えば、ＵＩ、映像出力機能等を有する汎用プログラム２８２にＡＰＩ２７０を介して渡され、プレイヤーに報知される。なお、ゲームの終了とは、例えば複数のステージを有するゲームの場合には、所定のゲームのステージの終了を意味し、次のステージの開始の準備がなされるように、ゲームルール処理プログラム２５０全体が動作するようにトリガーをかけるプログラムを生成すればよい。ゲームのステージの切り替わりのシーン、ゲームのエンディングのシーンなどは、ゲームの本質的な動作とのかかわりが薄いから、ゲーム製作者が別途プログラムを作成してもよい。
三目並べの場合、生成されるゲーム終了プログラムモジュール２６２は、例えば、以下のようなプログラムモジュールとなる。
【００８３】
（ゲーム終了プログラムモジュール２６２の例）
1.  現在の状態のテーブルをTとする;
2.  for each (プレイヤーp)
3.      if (Tがプレイヤーpが勝ちとなる論理式を満たす)
4.          return “pの勝ち”;
5.  if (Tが引き分けとなる論理式を満たす)
6.      return “引き分け”;
7.  return “終了ではない”;
なお、三目並べの場合は、ゲームの終了形態は、いずれかのプレイヤーの勝ち、又は引き分けである。なお、この終了形態は、一例であって、既に述べたように、ゲームステージの一区切り、他のステージへのへの移動、様々な特典の開放など、ゲームの区切りであってもよい。ゲーム製作者が定めた様々なゲームの区切りを、容易にゲームプログラムに実装することが可能となる。
【００８４】
以上のようにして、ゲームルール処理プログラム生成部２２０は、ゲームルールの仕様２０２を用いて、ゲームルール処理プログラム２５０を生成することができる。本実施形態によれば、ゲームプログラム製作者は、ゲームルールの仕様の作成に専念することができる。そして、ゲームルールの仕様をゲームルール処理プログラム生成部２２０に与えることにより、ゲームルール処理プログラム生成部２２０が、ゲームルール処理プログラム２５０を自動的に生成することができる。すなわち、ゲームルールの仕様から、ゲームプログラム及びゲームプログラムに付随する様々なプログラムの製作をより簡便に行うことができる。
【００８５】
また、ゲームルールが変更された場合にも、ゲームプログラム製作者は、ゲームルールの仕様２０２を変更すればよいため、簡便にゲームルール処理プログラム２５０を変更することができる。加えて、既存のゲームルールの仕様を流用することにより、新たなゲームプログラムを簡便に作成することができる。
【００８６】
＜実施形態３＞プレイヤーシミュレーション（ＡＩ）プログラムの生成
図４は、プレイヤーシミュレーション（ＡＩ）プログラム生成部３２０を示す図である。生成されるプレイヤーシミュレーション（ＡＩ）プログラム３５０は、人間であるプレイヤーに代わって、ゲームルール処理プログラムを操作するプログラムである。プレイヤーシミュレーション（ＡＩ）プログラム生成部３２０は、アクション伝達プログラム生成部３２２と、有利になるアクション推定プログラム生成部３２４とを有する。
例えば、三目並べの場合には、二人のプレイヤーによる対戦ゲームである。したがって、二人のプレイヤーのそれぞれに対して、１つのプレイヤーシミュレーション（ＡＩ）プログラム３５０を用いることもできる。この場合には、担当プレイヤーの識別子を引数として、１つのプレイヤーシミュレーション（ＡＩ）プログラム３５０に与えて全プレイヤー（三目並べでは二人のプレイヤー）で同じプレイヤーシミュレーション（ＡＩ）プログラム３５０を使いまわすことができる。この場合には、プレイヤーを識別する識別子を引数にして、記憶すべきメモリ領域などをプレイヤー毎に識別できるようにすればよい。
【００８７】
アクション伝達プログラム生成部３２２は、アクション受取プログラムモジュールに、実行されるべきアクションを指示するための、アクション伝達プログラムモジュール３５２を生成する。
三目並べの場合、生成されるアクション伝達プログラムモジュール３５２は、例えば、以下のようなプログラムモジュールとなる。
【００８８】
（アクション伝達プログラムモジュール３５２の例）
1.  アクションa = 有利になるアクション推定プログラム３５４の結果;
2.  return a;
上記プログラム例では、有利になるアクション推定プログラム３５４の結果であるアクションａを得て、このアクションａを採用するプログラムモジュールとなっている。
【００８９】
有利になるアクション推定プログラム生成部３２４は、有利になる確率の高いアクション推定プログラムモジュール３５４を生成する。有利になる確率の高いアクション推定プログラムモジュール３５４は、例えば、状態テーブル２６４及びゲーム終了プログラムモジュール２６２の結果から得た学習結果に基づき、有利になるアクションを特定する。特定された有利なアクションは、上記アクション伝達プログラムモジュール３５２の例に示したようにアクション伝達プログラムモジュール３５２に伝えられる。
【００９０】
有利になる確率の高いアクション推定プログラムモジュール３５４は、ＡＩ技術を実装したプログラムモジュールである。ＡＩ技術は、種々のものが提案されているが、その一例として、以下に原始モンテカルロ法について簡潔に説明する。
【００９１】
原始モンテカルロ法は、実行可能なアクションのそれぞれの次の状態から、ランダムなアクション選択によるシミュレーションプレイを繰り返して、平均勝利回数の最も高かった次の状態に対応するアクションを実際の選択として決定する、というアルゴリズムである。このため、有利になる確率の高いアクション推定プログラムモジュール３５４は、実行可能アクション特定プログラムモジュール２５４から、実行可能なアクションを取得する。有利になる確率の高いアクション推定プログラムモジュール３５４が採用するアルゴリズムは、上述の原始モンテカルロ法に限られるものではなく、その他のＡＩのアルゴリズムでもよいことは言うまでもない。
三目並べの場合、生成される有利になる確率の高いアクション推定プログラムモジュール３５４は、例えば、以下のようなプログラムモジュールとなる。
【００９２】
（有利になるアクション推定プログラム３５４の例（原始モンテカルロ法））
1.  現在の状態のテーブルをTとする;
2.  AIが担当するプレイヤーをPとおく;
3.  L = Tに対して実行可能アクション特定プログラムモジュール２５４を実行した結果;
4.  C = Lと同じサイズのテーブルをメモリに確保;
5.  X = 所定回数（例えば100回）;
6.  for each (Lに列挙されたアクションa)
7.      T’= アクション実行プログラムモジュール２５８でTに対してaを実行した結果;
8.      C[a] = 0;
9.      for each (i=1…X)
10.          T’’= ゲームルール処理プログラムを利用して、T’から開始して各プレイヤーのアクションをランダムに選択しながらゲームが終了するまで状態を変化させた際の、ゲームが終了した状態のテーブル;
11.      if (T’’がプレイヤーPの勝利する状態)
12.          C[a]を1増加;
13.  return C[a]が最も高くなるアクションa;
【００９３】
上記のプログラムでＬは、実行可能アクション特定プログラムモジュール２５４を実行して得た実行可能なアクションを収めるリストである。また、アクションaはＬのリストに列挙された実行可能なアクションである。上記のプログラムによって、個々のアクションaに対して有利になる評価値C[a]を求め、最も高い評価値C[a]となるアクションaを、求めるアクションに採用することとなる。
なお、上記の場合、１つのプレイヤーシミュレーション（ＡＩ）プログラム３５０に、二人のプレイヤーを担当させている。
上記のプログラムでは、所定回数Xに１００回を用いているが、この所定回数は、用いられるコンピュータの計算能力、得られる結果の質などを勘案し、妥当な値を予め設定すればよい。なお、計算時間及び得られる結果の質に応じて、上記所定回数を適宜変更してもよい。この点は、他のプログラムの例における「所定回数」についても同様である。
【００９４】
＜実施形態４＞初期状態（ステージ）難易度推定プログラムの生成及び難易度比較・初期状態出力プログラムの生成
図５は、初期状態（ステージ）難易度推定プログラムの生成及び難易度比較・初期状態出力プログラムの生成を示す図である。なお、図５において、図４に示したプレイヤーシミュレーション（ＡＩ）プログラム３５０は、簡略化して図示されている。
【００９５】
まず、初期状態（ステージ）難易度推定プログラム４５０の生成について以下に説明する。初期状態（ステージ）難易度推定プログラム生成部４２０は、初期状態変更プログラム生成部４２２と、難易度測定プログラム生成部４２４とを有する。
【００９６】
なお、三目並べの場合には、（式６）に示したように、初期状態は１つしか存在しない。複数の初期状態があるゲームとしては、例えば、詰め将棋が挙げられる。詰め将棋には、最初に置かれた将棋の駒の配置に無数のバリエーションがある。最初に置かれているコマのパターンの各々が、それぞれ異なる初期状態の例である。
【００９７】
初期状態変更プログラムモジュール４５４は、プログラム作成者から、初期状態５６４を受け取る。初期状態変更プログラムモジュール４５４は、受け取った初期状態を変更せずにテーブル作成プログラムモジュール２５２に渡す。後述する難易度比較・初期状態出力プログラムモジュール５５０を動作させない場合には、初期状態変更プログラムモジュール４５４は、初期状態を変更しない。
【００９８】
プレイヤーシミュレーション（ＡＩ）プログラム３５０を動作させて、初期状態５６４を固定させて複数回ゲームを実行させる。難易度測定プログラムモジュール４５２は、ゲーム終了プログラムモジュール２６２から、この複数回のゲームの終了結果（すなわち勝敗）を取得して、初期状態５６４に対する難易度を測定することで測定難易度５６１を出力する。測定難易度の一例は、勝率である。勝率が低い結果が得られた場合には、初期状態５６４の難易度は高いと判定できる。勝率が高い結果が得られた場合には、初期状態５６４の難易度は低いと判定できる。勝ちの回数、負けの回数、引き分けの回数に、所定の重みをかけて加算した結果を測定難易度５６１としてもよい。
生成される難易度測定プログラムモジュール４５２は、例えば、以下のようなプログラムモジュールとなる。
【００９９】
（難易度測定プログラムモジュール４５２の例）
1.  与えられた初期状態のテーブルをTとする;
2.  X = 所定回数（例えば100回）;
3.  難易度D = 0;
4.  for each (i = 1…N)
5.      Tを初期状態としてゲームが終了するまでAIにプレイさせる;
6.      if (Tが負けの場合)
7.          Dを1増加;
8.  return D;
上記のプログラムの例の場合、測定難易度５６１（D）が大きい値であるほど、与えられた初期状態５６４の難易度は高いと判断することができる。
【０１００】
次に、難易度比較・初期状態出力プログラム生成部５２０について以下に説明する。難易度比較・初期状態出力プログラム生成部５２０は、難易度比較・初期状態出力プログラムモジュール５５０を出力する。
【０１０１】
難易度比較・初期状態出力プログラムモジュール５５０は、難易度測定プログラムモジュール４５２から測定難易度５６１を受け取ると共に、プログラム製作者から、目標難易度５６０を受け取る。難易度比較・初期状態出力プログラムモジュール５５０は、測定難易度５６１と目標難易度５６０とを比較する。例えば、測定難易度５６１と目標難易度５６０との差の絶対値が、所定の閾値以下であれば、測定難易度５６１は、目標難易度５６０に近似していると判断できる。この場合には、現在の初期状態を適切な初期状態であるとして、決定初期状態（所定のステージの初期状態）５６２を出力する。
【０１０２】
測定難易度５６１と目標難易度５６０との差の絶対値が、所定の閾値を超える場合には、測定難易度５６１は、目標難易度５６０から乖離していると判断できる。このため、難易度比較・初期状態出力プログラムモジュール５５０は、初期状態変更プログラムモジュール４５４に対して、初期状態を変更するよう指示する。
生成される難易度比較・初期状態出力プログラムモジュール５５０は、例えば、以下のようなプログラムモジュールとなる。
【０１０３】
（難易度比較・初期状態出力プログラムモジュール５５０の例）
1.  与えられた初期状態のテーブルをTとする;
2.  X = 所定回数（例えば100回）;
3.  難易度と目標難易度の近さQbest = 無限大;
4.  暫定最良の初期状態のテーブルTbestをメモリに確保;
5.  for each (i = 1…X)
6.      T’= 初期状態変更プログラムモジュール４５４にTを与えた結果;
7.      D = 難易度測定プログラムモジュール４５２にT’を与えた結果;
8.      Q = (D −目標難易度)の絶対値;
9.      if (Q < Qbest)
10.          Tbest = T’;
11.          Qbest = Q;
12.  return Tbest;
上記プログラムでは、初期状態を変更することで、暫定最良の初期状態のテーブルTbestを探索しながら、最終的に目標難易度に近い難易度の初期状態のテーブルTbestを出力している。この処理により、試行錯誤を繰り返しながら、目標とする難易度に近い初期状態が決定され出力される（決定初期状態（ステージ）５６２）。多くのゲームでは、難易度の異なる複数のステージを有する場合が多い。このようなゲームでは、所望の難易度の初期状態を有するステージを作り出すことができる。
なお、ステージを切り替えるプログラムは、ゲームのアレンジを基にして、プログラム製作者によって別途作りこみを行えばよい。
【０１０４】
なお、初期状態の変更の手法としては、目標難易度５６０に測定難易度５６１が収束してゆくように、初期状態を変更させることが望ましい。収束のさせ方は、例えば、モンテカルロ法を採用してもよい。なお、収束が局所的な極小値に収束してしまうのを避けるために、例えば、大域的最適化問題への汎用の乱択アルゴリズムである焼きなまし法を採用してもよい。
生成される初期状態変更プログラムモジュール４５４は、例えば、以下のようなプログラムモジュールとなる。
【０１０５】
（初期状態変更プログラムモジュール４５４の例）
1.  与えられた初期状態のテーブルをTとする;
2.  X = 所定回数（例えばNの5%）;
3.  for each (i = 1…X)
4.      命題p = 1からNの中からランダムに選択;
5.      T[p] = T[p]の値を反転した値;
6.  return T;
上記プログラムでは、サイズNの真理値テーブルTにおいて、例えばN個の命題のうちの５％の命題の真理値を反転させている。このようにすることにより、初期状態をランダムに変更することができる。
【０１０６】
本実施形態によれば、任意の初期状態の難易度を測定するプログラムが生成できる。また、設定された難易度の初期状態を自動的に生成できる。この自動的に生成された初期状態は、次第に難易度が増してゆくゲームの各ステージの初期状態に適用することができる。
【０１０７】
＜実施形態５＞テストプログラムの生成
図６は、テストプログラムの生成を示す図である。
テストプログラムは、ゲームルール処理プログラム２５０が正しい状態となっているかをテストするためのプログラムである。テストプログラム生成部６２０は、テストプログラム６５０を生成する。テストプログラム生成部６２０は、論理式受取プログラム生成部６２２と、テーブル監視プログラム生成部６２４とを有する。
【０１０８】
論理式受取プログラム生成部６２２は、背反する論理式受取プログラムモジュール６５２を生成する。テーブル監視プログラム生成部６２４は、テーブル監視プログラムモジュール６５４を生成する。
【０１０９】
背反する論理式受取プログラムモジュール６５２は、プログラム製作者が作成した背反する論理式６７０を受け取る。背反する論理式受取プログラムモジュール６５２の機能は、背反する論理式５７０を受け取り、テーブル監視プログラムモジュール６５４に渡すことである。テーブル監視プログラムモジュール６５４の機能は、背反する論理式６７０に対応する命題の集合が、状態テーブル２６４に存在するという異常を発見することである。そして、異常が発見された場合には、テーブル監視プログラムモジュール６５４は、状態が異常である旨６７２を報知する。
生成される背反する論理式受取プログラムモジュール６５２は、例えば、以下のようなプログラムモジュールとなる。
【０１１０】
（背反する論理式受取プログラムモジュール６５２の例）
1.  論理式（文字列）を取得する;
2.  論理式を等価な構造体Sに変換する;
3.  return S;
上記のプログラムは、論理式を処理しやすいように、論理式をそれと等価な構造体Sに変換している例を示している。なお、論理式を構造体Sに変換することが必須ではないことは言うまでもない。
例えば、三目並べの場合には、下記の論理式（式８）は、常に偽となる論理式であり、真となってはならない論理式である。
∃[位置]，［位置］は［先手］の陣地でありかつ［位置］は［後手］の陣地である（式８）
【０１１１】
上記（式６）は、同じ位置が先手の陣地でありかつ後手の陣地でもあるという論理式である。この論理式は、常に偽となるはずである。しかしながら、このような論理式（式８）と整合する下記の２つの命題（式９）を例にして説明する。
［位置］は［先手］の陣地である，［位置］は［後手］の陣地である    （式９）
【０１１２】
このような２つの命題（式９）のいずれの命題も真であるような状態が、状態テーブルに存在することは、状態テーブルに格納されたゲームの状態が異常であることを示している。このことは、ゲームルールの定義に誤りが存在すると判断される。
【０１１３】
真となってはいけない論理式（例えば論理式（式８））が真であれば、テーブル監視プログラムモジュール６５４は、ゲームを中断させる。そして、初期状態からどのようなアクションの系列を経てゲームの中断に至ったのかを表示するようにしてもよい。
【０１１４】
なお、テストプログラムは、実際のプレイヤーがゲームを操作している際に動作させてもよいが、既に述べたプレイヤーシミュレーション（ＡＩ）プログラム３５０にゲームをプレイさせたときに動作させるようにすることが望ましい。正しいゲームプログラムをプレイヤーに提供することが望ましいからである。
生成されるテーブル監視プログラムモジュール６５４は、例えば、以下のようなプログラムモジュールとなる。
【０１１５】
（テーブル監視プログラムモジュール６５４の例）
1.  初期状態のテーブルをTとする;
2.  E = 背反する論理式受取プログラムモジュール６５２の結果の論理式;
3.  X = 所定回数（例えば100回）;
4.  for each (i = 1…X)
5.      T’ = T;
6.      Y = 所定回数（例えば100回）;
7.      for each (j = 1…Y)
8.          if (T’が終了の状態)
9.               jのループを中断して次のiへ;
10.          if (T’が論理式Eを満たす)
11.               T’や初期状態Tからそこまで至ったアクションの列などの情報を出力;
12.               return “背反状態を発見”;
13.          L = 実行可能アクション特定プログラムモジュール２５４の結果;
14.          アクションa = Lからランダムに一つ選択したアクション;
15.          T’= アクション実行プログラムモジュール２５８でT’に対してaを実行した結果;
16.  return “背反状態未発見”;
上記のプログラムの例で、論理式Eは、構造体Sの形式であってもよい。また、行番号11では、初期状態Tから、異常の状態T’に至るまでのアクションの情報などを出力させるようにしてもよい。
【０１１６】
＜実施形態６＞動作の概要
図７は、ゲームプログラム生成プログラムの動作のフローを示している。
ステップＳ７００で、初期状態のテーブルを作成するプログラムモジュールが生成される。
ステップＳ７０２で、ゲームプログラムにより実行可能なアクションを特定するプログラムモジュールが生成される。
ステップＳ７０４で、プレイヤーによって選択されたアクションを受け取るプログラムモジュールが生成される。
ステップＳ７０６で、選択されたアクションを実行するプログラムモジュールが生成される。
ステップＳ７０８で、テーブルを更新するプログラムモジュールが生成される。
ステップＳ７１０で、ゲームの終了及びゲームの終了の結果を出力するプログラムモジュールが生成される。
以上の処理により、ゲームルール処理プログラムが生成される。
【０１１７】
その他、プレイヤーシミュレーション（ＡＩ）プログラム、初期状態（ステージ）難易度測定プログラム、初期状態出力プログラムモジュール、テストプログラムについても、任意のタイミングで生成される。
【０１１８】
＜実施形態７＞生成されたプログラムに対するアノーテーションの付加
生成された各種のプログラムは、プレイヤーとのインターラクションを実現するように、ＵＩ、映像出力機能等を有する汎用プログラム２８２及び／又はオペレーティングシステム２８４との連携を図るため、必要なインタフェースをとることが望ましい。このインタフェースの作りこみを容易化するためには、生成されたプログラムに、プログラム製作者の理解を助けるためのアノーテーションが適切に付されていることが望ましい。
【０１１９】
図２に示したように、アノーテーション付加部２２０ｃは、仕様情報解析部２２０ａを介して得たゲームルールの仕様２０２から、適切なアノーテーションを作成し、生成されたプログラムに付加する。以下に、その具体例を示す。
【０１２０】
「/**
* @brief アクションを表す構造体
*/
struct Action {
/** @brief 前提条件の命題の数 */
int num_zentei_jouken;
/** @brief 前提条件の命題の配列 */
int zentei_jouken[NUM_MEIDAI];
/** @brief 前提条件の命題の値 */
bool zentei_jouken_value[NUM_MEIDAI];
/** @brief 後状態で真となるべき命題の数 */
int num_true_effect;
/** @brief 後状態で真となるべき命題の配列 */
int true_effect[NUM_MEIDAI];
/** @brief 後状態で偽となるべき命題の数 */
int num_false_effect;
/** @brief 後状態で偽となるべき命題の配列 */
int false_effect[NUM_MEIDAI];
};」
【０１２１】
たとえば、上記の生成されたプログラムでは、「@brief」の後に書かれた記述がアノーテーションである。このアノーテーションを参照することによって、プログラム製作者は、生成されたプログラムの内容を、より容易に理解することができる。このアノーテーションは、生成されたプログラムと、他の汎用プログラム等とのインタフェースを、プログラム製作者が作りこむことを容易にさせることができる。
【０１２２】
＜ハードウエア構成＞  
図８は、一実施形態のハードウエア構成８００を示す図である。
ハードウエア構成８００は、ＣＰＵ８０２、メモリ８０４、通信制御装置８０６、入力インタフェース８０８、表示制御部８１０、外部メモリ制御部８１２及び出力インタフェース８１４を有する。
【０１２３】
そして、通信制御装置８０６には、ネットワーク８３０（ＷＩＦＩ、有線ＬＡＮ、広域ネットワーク（インターネット）、近距離無線通信等）が接続される。入力インタフェース８０８には、タッチ感知センサ等８４０などが接続される。表示制御部８１０には、ディスプレイ８５０が接続される。外部メモリ制御部８１２は、記憶媒体８６０を読み書きすることができる。出力インタフェースには、スピーカ等８７０などが接続される。
記憶媒体８６０は、ＲＡＭ、ＲＯＭ、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ハードディスク、メモリーカード等であってもよい。
【０１２４】
以上説明した実施形態のプログラムは、ハードウエア構成８００を備えるコンピュータにより実行され得る。また，実施形態のプログラムは，コンピュータに実行させる方法として，インプリメントされてもよい。本実施形態のプログラムの一部又は全部は、オペレーティングシステム２８４により実行されてもよい。また、プログラムの一部がハードウエアにより実現されてもよい。プログラムは記憶媒体８６０又はメモリ８０４に記憶されてもよい。
【０１２５】
なお，上述の実施形態において，プログラムのステップは、矛盾のない限り，同時に，又は順序を入れ替えて実行されてもよい。
以上の実施形態は，ハードウエアの装置としてインプリメントされ得る。
以上の実施形態は，請求項に記載された発明を限定するものではなく，例示として取り扱われることは言うまでもない。
【符号の説明】
【０１２６】
２０２  ゲームルールの仕様
２２０  ゲームルール処理プログラム生成部
３２０  プレイヤーシミュレーション（AI）プログラム生成部
４２０  初期状態（ステージ）難易度測定プログラム生成部
５２０  難易度比較・初期状態出力プログラム生成部
６２０  テストプログラム生成部
【図１】
2019191786.tif 000003
【図２】
2019191786.tif 000004
【図３】
2019191786.tif 000005
【図４】
2019191786.tif 000006
【図５】
2019191786.tif 000007
【図６】
2019191786.tif 000008
【図７】
2019191786.tif 000009
【図８】
2019191786.tif 000010