view paper/game.tex @ 19:c20d7b72cd4a default tip

finish?
author koba <koba@cr.ie.u-ryukyu.ac.jp>
date Fri, 18 Feb 2011 05:39:37 +0900
parents 028ed9741872
children
line wrap: on
line source

\chapter{ゲームプログラミングにおけるテスト} \label{chapter:game}
多くのゲームでは多数のオブジェクトが存在し、プレイヤーのコントローラー入力や
ゲームの進行状況によって新たなオブジェクトが生成される。
生成されたオブジェクトは他のオブジェクトの座標などのパラメータに影響され、
衝突判定を行ったり、挙動が変化する。
(図\ref{fig:game})

\begin{figure}[h]
\begin{center}
\includegraphics[scale=0.6]{images/game.pdf}
\end{center}
\caption{ゲームオブジェクトの相互作用}
\label{fig:game}
\end{figure}

このようにゲームプログラムでは常にプレイヤーの入力がゲームに影響され、
オブジェクト同士のパラメーターが相互に干渉し合うため、遷移する状態が
膨大であり、一般的なテスト駆動のように遷移する状態が仕様の範囲内に収まる
のかチェックするようなテストは向かない。ゲームプログラムは実際にプレイヤーが
ゲームをプレイすることが重要なテストとなる。

\section{プレイヤーの入力の不定性}\label{sec:player}
ゲームプログラムではコントローラーなどのインターフェースにより、
プレイヤーから入力が与えられ、それによってゲーム内のパラメータが変化する。
例えばプレイヤーの操作によりキャラクターが移動する、攻撃するといった事が
これに当たる。

プレイヤーの入力は常に非決定的であり、例え同じ人間が同じゲームの同じ場面を
プレイしたとしても毎回全く同じ入力をする可能性は極めて低い。
こうした事からプレイヤーは制御不能なランダム要素であると考えられ、
ゲームプログラムテストにおけるバグの再現性を低下させている。

\section{ゲームにおける乱数の役割}\label{sec:random}
ゲームにおける乱数は、オブジェクトの振る舞いに多様性を持たせたり、ランダムな
配置を実現する為に使われ、ゲームのボリュームや面白さを広げる役割を担ってきた。
これは例えば以下のようなコードにより実現される。

\begin{verbatim}
void
random_move(Character *chara)
{
    int count = random() % 3;

    if (count == 0) {
        chara->x += 1;
        return;
    } else if (count == 1) {
        chara->y += 1;
        return;
    } else if (count == 2) {
        chara->x += 1;
        chara->y += 1;
        return;
    }
}
\end{verbatim}

こうした乱数の使用法は特に携帯ゲーム機やコンソールゲーム機のような
リソースの限られた環境においては複雑で容量の大きいレベルデータを格納する事が
困難であったため、ゲームの深みを演出する上で用いられてきた。

\section{テスト環境における乱数に対する対処法}
予測不能な乱数はゲームプレイにおいては面白さを牽引する要因となるが、
テスト環境では、こうした乱数のランダム性はデバッグをする上でバグの再現を
困難にする。この問題に対しては、乱数生成器を無効にするか、
常に同じ乱数列を生成するように定数でシードするといった手法が考えられる。