(57)【特許請求の範囲】
【請求項１】
ＣＰＵと、不揮発性のメモリとを備え、該不揮発性のメモリには、実行されるコマンドの情報を記憶する履歴テーブルと、該履歴テーブルに記憶されたコマンドの情報がコピーされるセーブエリアと、再生カウンタとを備え、ゲームの進行に伴い実行されるコマンドを前記履歴テーブルに記憶させ、該ゲームの再スタート時に該履歴テーブルからコマンドを読み出し再生して該再スタート前と同様の状態から進行させると共に、該再生の回数を前記再生カウンタに記憶させることができるゲームシステムにおけるバグ検出方法であって、
コマンドの実行前に該コマンドを該履歴テーブルに連続して順次格納すると共に、該コマンドを該セーブエリアの各再生ごとにポイントされる所定の領域に順次格納してから該コマンドを実行し、
該履歴テーブルに記憶されているコマンドの再生時は、該履歴テーブルに格納されているデータを順次読み出し、前記再生カウンタの値がｎであり、該セーブエリアの連続したｎ個の領域に記憶されたコマンドが同一であるか否かを判断するゲームシステムにおけるバグ検出方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラム中にバグが存在する場合に、そのバグの発生箇所を検出する方法及びその方法を実現する機能を有するプログラム、そのプログラムを記録した記録媒体に関する。
【０００２】
【従来の技術】
パーソナルコンピュータ、ゲーム専用機等の各種コンピュータ機器で動作するプログラムにおいて、その内部に存在する何らかのバグによってプログラムの実行が停止した場合には、そのプログラムを強制終了させたり、機器をリセットしたり、電源をオフにしたりしてから、新たにプログラムを再起動しなければならない。
【０００３】
【発明が解決しようとする課題】
しかしながら、プログラムの実行を最初から再開したとしても、実行が停止したときと同様の条件の下で同様の操作をした場合には、同じバグによって再びプログラムの実行が停止してしまう。
【０００４】
また、プログラム中のどのステップを実行したときにバグが発生したのかを特定することもできないため、特に製品の出荷後にバグが発生した場合には、ユーザーに対して解決策を提供することができない。
【０００５】
従って、ゲームソフトウェアにおいては、一度バグが発生するとゲームを先に進行させることができなくなり、バグを解決した新たな製品と交換したり、ソフトウェアをバージョンアップさせたりする以外には解決策がないという問題がある。
【０００６】
【課題を解決するための手段】
上記課題を解決するための具体的手段として本発明は、ＣＰＵと、不揮発性のメモリとを備え、該不揮発性のメモリには、実行されるコマンドの情報を記憶する履歴テーブルと、該履歴テーブルに記憶されたコマンドの情報がコピーされるセーブエリアと、再生カウンタとを備え、ゲームの進行に伴い実行されるコマンドを履歴テーブルに記憶させ、ゲームの再スタート時に履歴テーブルからコマンドを読み出し再生して再スタート前と同様の状態から進行させると共に、再生の回数を再生カウンタに記憶させることができるゲームシステムにおけるバグ検出方法であって、コマンドの実行前にコマンドを履歴テーブルに連続して順次格納すると共に、コマンドをセーブエリアの各再生ごとにポイントされる所定の領域に順次格納してからコマンドを実行し、履歴テーブルに記憶されているコマンドの再生時は、履歴テーブルに格納されているデータを順次読み出し、再生カウンタの値がｎであり、セーブエリアの連続したｎ個の領域に記憶されたコマンドが同一であるか否かを判断するゲームシステムにおけるバグ検出方法を提供する。
【０００７】
上記のように構成される本発明によれば、再生カウンタの値がｎであり、セーブエリアの連続したｎ個の領域に記憶されたコマンドが同一であれば、そのコマンドの実行時にバグが発生したと判断でき、バグの発生前にバグ発生要因となるコマンドを特定することができるため、バグの発生を回避することが可能となる。
【０００８】
更に、プログラムの開発中においては、バグが発生するステップを容易に特定することができる。
【０００９】
【発明の実施の形態】
本発明が適用されるゲームシステムにおいては、ＣＰＵ、メモリ、表示画面、ボタン等を備えており、図１に示すように、メモリには履歴テーブルＨ、履歴テーブルポインタｉ、セーブエリアＳ、サーブエリアポインタｊ、再生カウンタＣがそれぞれ確保されている。
【００１０】
ここで、履歴テーブルＨ、セーブエリアＳ、再生カウンタＣ、履歴テーブルポインタｉ、セーブポインタｊは不揮発性のメモリやディスクに領域が確保され、バグが発生してやむを得ず電源をオフにしてもその内容が消えることはない。また、バグが発生せずにユーザーが途中でゲームをやめて電源をオフにした場合も、その記憶は失われない。
【００１１】
ユーザーによって行われた操作の内容、例えばロールプレイングゲームでは、主人公を移動させた方向、位置、動作等は、ゲームシステム内部においてコマンドとして認識される。
【００１２】
履歴テーブルＨは、実行されたコマンドや位置を記憶する連続した領域であり、履歴テーブルポインタｉは、履歴テーブルＨにアクセスする際のポインタである。また、セーブエリアＳは、履歴テーブルＨに格納されたデータがコピーされる連続した領域であり、セーブポインタｊは、セーブエリアＳにアクセスする際のポインタである。再生カウンタＣは、履歴テーブルＨからデータを読み出して再生した回数を示すカウンタである。
【００１３】
以下においては、図２〜図４のフローチャートを参照しつつメモリ上の上記各エリアの値の変化に基づいて本発明を説明する。ゲームシステムの電源を入れる等してゲームプログラムを起動すると、ゲームを最初から開始するか、続きから再開するかを選択させるためのメッセージが画面表示され（Ｓ１）、例えばユーザーがＡボタンを押して最初から開始する方を選択すると、初期化処理が行われる。初期化処理においては、図５に示すように、履歴テーブルＨ及びセーブエリアＳがクリアされてすべての領域の値がNULLとなる（Ｓ２、Ｓ３）。次に、履歴テーブルポインタｉ及びセーブエリアポインタｊの値を０とし（Ｓ４、Ｓ５）、再生カウンタＣの値を１とし（Ｓ６）、ゲームを最初から開始する（Ｓ１１〜Ｓ１５）。
【００１４】
最初にＡボタンを押して最初からプレイする方を選択すると、図６に示すように、そのときの位置及び操作の内容（Ａボタンを押したこと）を示すコマンドが履歴テーブルＨ［０］に書き込まれる（Ｓ７）。
【００１５】
次に図７に示すように、履歴テーブルＨ［０］の内容がセーブエリアＳ［０］にコピーされる（Ｓ８）。更に、図８に示すように、次の処理に備えて履歴テーブルポインタｉをインクリメントした後（Ｓ９）、そのコマンドに対応した処理を実行する（Ｓ１０）。そして、ユーザーの操作によってゲームが中断しない限り、上記と同様の動作を繰り返してゲームが進行する（Ｓ１１）。
【００１６】
例えば、次にＢボタンを押した場合は、図９に示すように、そのときの位置及びＢボタンを押したことを示すコマンドが履歴テーブルＨ［１］に記憶され（Ｓ７）、次に図１０に示すように、この情報がセーブエリアＳ［０］にコピーされる（Ｓ８）。ここで、セーブエリアＳ［ｊ］へのコピーは、コピー時のインデックスであるセーブポインタｊがインクリメントされないため、上書きされていく。
【００１７】
そして更に、図１１に示すように、次の処理に備えてセーブエリアポインタｉをインクリメントした後（Ｓ９）、そのコマンドに対応した処理を実行する（Ｓ１０）。
【００１８】
こうして履歴テーブルポインタｉをインクリメントしながらコマンドが書き込まれていくと、履歴テーブルＨの連続した領域に次々と位置及びコマンドが書き込まれていく。そしてユーザーが操作を中断すると（Ｓ１１）、例えば図１２に示すように、履歴テーブルＨ［２］に位置及びコマンド（ＥＮＤ）が書き込まれ（Ｓ１２）、図１３に示すように、セーブエリアＳ［０］にその内容がコピーされる（Ｓ１３）。そして、履歴テーブルポインタｉを０に戻して正常終了する（Ｓ１４）。
【００１９】
こうして履歴テーブルＨに記憶された内容は、電源をオフにしても消えることはなく、プログラムによる処理によってクリアを行った場合にのみその内容が消去される。
【００２０】
しかし、例えば図１４に示すように図１〜図７に示した処理の後にＣボタンを押してこれを履歴テーブルＨ［２］に書き込み、図１５に示すようにセーブエリアＳ［０］にこれをコピーし、図１６に示すように履歴テーブルポインタｉをインクリメントした後、そのコマンドを実行したところバグが発生したとすると、この時点でプログラムがフリーズしてしまうため、履歴テーブルＨ［３］にコマンド（ＥＮＤ）を書き込むことができない。この場合は異常終了となり、セーブエリア［０］にはコマンド（Ｃ押す）が格納されている。また、履歴テーブルＨに記憶された内容は、後に電源をオフにしても消えることはない。
【００２１】
図２のステップＳ１において、ユーザーがＢボタンを押して続きから再開する方を選択すると、再生カウンタＣの値が３以上であるかどうかを判断し（Ｓ１５）、３未満であれば、次に履歴テーブルＨの最初の領域がNULLかどうかを判断する（Ｓ１６）。NULLであれば最初からゲームを開始し（Ｓ４〜Ｓ１４）、NULLでなければセーブエリアポインタｊをインクリメントしてコマンド再生ルーチンを実行する（Ｓ１７、Ｓ２０）。
【００２２】
一方、再生カウンタＣの値が３以上であれば、セーブエリアＳの内容をチェックし（Ｓ２１）、ユーザーによる操作なしに強制的に過去のコマンドを再生することによりゲーム再開前と同様の状態とし（Ｓ２０）、その続きからゲームを進行させることができる（Ｓ７〜Ｓ１４）。
【００２３】
ステップＳ２１におけるセーブエリアＳのチェックは、図３のフローチャートに示す手順により行う。この処理においては、セーブエリアＳの連続する３つの領域の値が等しいかどうかをチェックし（Ｓ３０、Ｓ３１）、すべてが同じであればバグが発生するのを回避するための処理を行う（Ｓ３２）。これは、３回連続して同じステップでバグが発生した場合には、そこでまたバグが発生する可能性が高いという考え方に基づいている。
【００２４】
一方、値が一つでも異なれば、何もせずに終了する。即ち、３回連続して同じステップでバグが発生していない場合には、必ずしもまたバグが発生するとはいえないため、特別な処理は行わない。
【００２５】
図２のステップＳ２０において行うコマンド再生の処理の手順を図４のフローチャートに示す。例えば図１７のように、以前に正常終了して履歴テーブルＨにデータが書き込まれている場合においてこれを再生する場合には、まず履歴テーブルポインタｉを０にし（Ｓ４０）、図１８に示すように再生カウンタＣをカウントアップし（Ｓ４１）、更に図１９に示すようにセーブエリアＳ［０］に履歴テーブルＨ［０］の内容をコピーする（Ｓ４２）。そして、コマンド（ＥＮＤ）であるかどうかを判断し（Ｓ４３）、コマンド（ＥＮＤ）でなければそのコマンドを実行する（Ｓ４４）。
【００２６】
次に、図２０に示すように履歴テーブルポインタｉをインクリメントし（Ｓ４５）、更に図２１に示すようにセーブエリアＳ［１］に履歴テーブルＨ［１］の内容をコピーしてから（Ｓ４２）、そのコマンドがコマンド（ＥＮＤ）かどうかを判断する（Ｓ４３）。履歴テーブルＨ［１］はコマンド（ＥＮＤ）ではないため、上記と同様の処理によってコマンドが実行され（Ｓ４４）、更に図２２に示すように履歴テーブルポインタｉをインクリメントする（Ｓ４５）。
【００２７】
図２３に示すようにセーブエリアＳ［０］に履歴テーブルＨ［２］の内容をコピーしてから（Ｓ４２）、そのコマンドがコマンド（ＥＮＤ）かどうかを判断する（Ｓ４３）。ここではコマンド（ＥＮＤ）であるため、図２４に示すように、セーブエリアＳをすべてクリアし（Ｓ１０７）、セーブエリアポインタｊを０にして再生処理を終了する（Ｓ４８）。
【００２８】
このようにして履歴テーブルＨに記憶されているすべてのコマンドを再生することにより、ゲームを終了させた時点と同様の状態となる。そしてその後はユーザーの操作によってその続きからゲームを進行させることができる。
【００２９】
一方、図２５に示すように、再生カウンタＣの値が３となっている場合は、次にセーブエリアチェックを行い（Ｓ２１）、ここでは連続して３つの同じデータが格納されているため、セーブエリアＳの連続する３つの領域に格納された位置及びコマンドがバグの発生要因であると考え、バグ回避処理を行う（Ｓ３２）。
【００３０】
この処理においては、図２６に示すように、履歴テーブル［ｉ］の内容を別のコマンドに置き換える。
【００３１】
そして、上記と同様の処理によって履歴テーブルＨに格納されているコマンドを実行すると、バグを発生させることなく再生処理を終了し、その続きからゲームを進行させることができる。
【００３２】
このように、バグの発生前にバグ発生要因となるコマンドを特定することができるため、バグの発生を回避することが可能となる。
【００３３】
また、プログラムの開発中においては、バグが発生するステップを容易に特定することができるため、デバッグが容易となり、開発効率が向上する
【００３４】
なお、本実施の形態においては、再生カウンタの値が３以上になったときにバグの発生を回避するための処理を行うこととしたが、再生カウンタの値は任意の値ｎとすることが可能である。そして、これに対応させて、セーブエリアに記憶された内容の比較を行う領域の数も変更することができる。
【００３５】
【発明の効果】
以上説明したように、本発明によれば、バグの発生前にバグ発生要因となるコマンドを特定することができる。
【００３６】
また、プログラムの開発中においては、バグが発生するステップを容易に特定することができるため、デバッグが容易となり、開発効率が向上する。
【図面の簡単な説明】
【図１】  本発明に用いるテーブル及びポインタを示す説明図である。
【図２】  本発明の手順を示すフローチャートである。
【図３】  本発明の手順を示すフローチャートである。
【図４】  本発明の手順を示すフローチャートである。
【図５】  初期化されたテーブル及びポインタの内容を示す説明図である。
【図６】  最初からプレイした場合のテーブル及び変数の内容の一例を示す説明図である。
【図７】  最初からプレイした場合のテーブル及び変数の内容の一例を示す説明図である。
【図８】  最初からプレイした場合のテーブル及び変数の内容の一例を示す説明図である。
【図９】  最初からプレイした場合のテーブル及び変数の内容の一例を示す説明図である。
【図１０】  最初からプレイした場合のテーブル及び変数の内容の一例を示す説明図である。
【図１１】  最初からプレイした場合のテーブル及び変数の内容の一例を示す説明図である。
【図１２】  操作を中断させた場合のテーブル及び変数の内容の一例を示す説明図である。
【図１３】  操作を中断させた場合のテーブル及び変数の内容の一例を示す説明図である。
【図１４】  プログラムがフリーズする前のテーブル及び変数の内容の一例を示す説明図である。
【図１５】  プログラムがフリーズする前のテーブル及び変数の内容の一例を示す説明図である。
【図１６】  プログラムがフリーズする前のテーブル及び変数の内容の一例を示す説明図である。
【図１７】  コマンド再生時のテーブル及び変数の内容の一例を示す説明図である。
【図１８】  コマンド再生時のテーブル及び変数の内容の一例を示す説明図である。
【図１９】  コマンド再生時のテーブル及び変数の内容の一例を示す説明図である。
【図２０】  コマンド再生時のテーブル及び変数の内容の一例を示す説明図である。
【図２１】  コマンド再生時のテーブル及び変数の内容の一例を示す説明図である。
【図２２】  コマンド再生時のテーブル及び変数の内容の一例を示す説明図である。
【図２３】  コマンド再生時のテーブル及び変数の内容の一例を示す説明図である。
【図２４】  コマンド再生時のテーブル及び変数の内容の一例を示す説明図である。
【図２５】  バグ回避処理時のテーブル及び変数の内容の一例を示す説明図である。
【図２６】  バグ回避処理時のテーブル及び変数の内容の一例を示す説明図である。
【符号の説明】
Ｈ…履歴テーブル  Ｓ…セーブエリア  Ｃ…再生カウンタ
ｉ…履歴テーブルポインタ  ｊ…セーブエリアポインタ
【図１】
0003833097.tif 000002
【図２】
0003833097.tif 000003
【図３】
0003833097.tif 000004
【図４】
0003833097.tif 000005
【図５】
0003833097.tif 000006
【図６】
0003833097.tif 000007
【図７】
0003833097.tif 000008
【図８】
0003833097.tif 000009
【図９】
0003833097.tif 000010
【図１０】
0003833097.tif 000011
【図１１】
0003833097.tif 000012
【図１２】
0003833097.tif 000013
【図１３】
0003833097.tif 000014
【図１４】
0003833097.tif 000015
【図１５】
0003833097.tif 000016
【図１６】
0003833097.tif 000017
【図１７】
0003833097.tif 000018
【図１８】
0003833097.tif 000019
【図１９】
0003833097.tif 000020
【図２０】
0003833097.tif 000021
【図２１】
0003833097.tif 000022
【図２２】
0003833097.tif 000023
【図２３】
0003833097.tif 000024
【図２４】
0003833097.tif 000025
【図２５】
0003833097.tif 000026
【図２６】
0003833097.tif 000027