view paper/game.tex @ 4:2dbd515e0284

finish chapter 5.
author koba <koba@cr.ie.u-ryukyu.ac.jp>
date Sat, 05 Feb 2011 18:21:47 +0900
parents 398e732edfb6
children 028ed9741872
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}

こうした乱数の使用法は特に携帯ゲーム機やコンソールゲーム機のような
リソースの限られた環境においては複雑で容量の大きいレベルデータを格納する事が
困難であったため、ゲームの深みを演出する上で用いられてきた。しかしこうした
ランダム性は、テストをする上でバグの再現を困難にする。この問題に対して、
常に同じ乱数列を生成するように、乱数生成器を無効にするか、定数でシードする
といった手法が考えられる。