読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

アドベンチャーゲームのアルゴリズム

遊びのレシピの2章を読みながら適当にメモ

アドベンチャーゲームとは?

小説のようなゲームから育成ゲームなど幅広い種類のゲームがある。
システムに手を加えることで別の種類のゲームを作ることが出来る。
他のゲームの基礎となる仕組みを持ったゲーム。

選択の結果により物語が進んでいく

選択肢をプレイヤーが選んで進める。
選択肢は直接的な設問だけではなく、様々な形を持つ。

  • 入手したアイテム
  • イベント
  • ミニゲーム、その他の要因

プレイヤーの意志で物語を変えられる、主人公と一緒に疑似体験できる。
インタラクティブな要素も面白さに繋がる。

アドベンチャーゲームのサンプルプログラム

Luaで簡単にコードを書くとこんな感じ。
本の内容とは別物なのであまり参考にならないかも知れない。

local step = 1
first = {
	"貴方は怪しい館に閉じ込められてしまいました",
	"部屋を移動して脱出しましょう",
	"最初の部屋です",
	"1:右の部屋へ行く 2:左の部屋へ行く",
	{function () return {"ドアの向こうには人喰い虎が居た。貴方は死んでしまった"} end,
	function ()
		return {
		"1:正面の部屋へ行く 2:右の部屋へ行く 3:元の部屋に戻る",
		{function () return {"ドアを開けた途端、灼熱のマグマが流れ込んできた", "貴方は死んでしまった"} end,
		function () return {"貴方は脱出に成功した"} end,
		function () step = 4 return first end}} end}}
local events = first
while step <= #events do
	if type(events[step]) == "string" then
		print(events[step])
	end
	local input = io.read()
	if type(events[step + 1]) == "table" then
		local func = events[step + 1][tonumber(input)]
		if type(func) == "function" then
			step = 1
			events = func()
		end
	else
		step = step + 1
	end
end

Luaで組む場合は、シナリオを上のようなテーブルに変換するプログラムを用意すると良いと思う。
もちろん他のアプローチもあるので、この方法が最善とは限らない。

サンプルプログラムの適当解説

eventsテーブルは逐次処理される。
stepの指す要素が文字列なら表示し、その次の要素がテーブルであれば選択肢として処理する。
選択肢の処理はユーザーから入力されたインデックスの要素が関数かどうかを判断し、関数であれば実行する。関数は戻り値としてeventsに代入可能なテーブルを返す。
上記の内容をeventsテーブルの最後まで行う。

この記事で読み進めている本

ゲームプログラミング遊びのレシピ―アルゴリズムとデータ構造 (C magazine)

ゲームプログラミング遊びのレシピ―アルゴリズムとデータ構造 (C magazine)