迷路系ゲームで使えそうな技

(動作保証なし.サポート対象外.)

マップ内の移動とか...どーする?

...
#include <ncurses.h>

// データ構造
typedef struct {
	...
} Mobj;

#define MAP_W  11	// マップの幅
#define MAP_H  11	// マップの高さ

char map[MAP_H][MAP_W+1] = {	// マップデータ(幅の +1 は文字列の終端記号用)
	"###########",
	"#         #",
	"# ## # ## #",
	"#  #   #  #",
	"## ## ## ##",
	"## #   # ##",
	"#    #    #",
	"# # ### # #",
	"# #     # #",
	"#   ###   #",
	"###########"
};
	/*
	 * マップデータについては,この例のようにソースファイル内に
	 * ハードコーディング(埋め込み)するよりも,
	 * データファイルから入力する方がいろいろと捗るだろう.
	 * なお,その場合,cg.c の Pbm 構造体のように,
	 * 動的配列のデータ構造を作るとよいだろう.
	 */

#define MAP_X	3	// 画面上でのマップ左上隅の x座標
#define MAP_Y	5	//       〃      y座標

// 移動関数
int Move(Mobj *obj)
{

	int  x, y;	// 移動予定先の座標

	// 移動予定先の検査
	x = (int)(obj->px + obj->vx);
	y = (int)(obj->py + obj->vy);
	if (map[y][x] == '#') return (1);
		// 壁だったら移動しない(止める)

	// 移動
	obj->px += obj->vx;
	obj->py += obj->vy;
	return (0);
}

// 表示関数
int DrawMap()
{
	for (y = 0; y < MAP_H; y++) {
		for (x = 0; x < MAP_W; x++) {
			move(MAP_Y + y, MAP_X + x);
			addch(map[y][x]);
		}
	}
	return (0);
}

int DrawChar(Mobj *obj, char c)
{
	move(MAP_Y + (int)(obj->py), MAP_X + (int)(obj->px));
	addch(c);
}

// 操作
int Control(Mobj *obj)
{
	int key;

	obj->vx = obj->vy = 0.0;	// 一旦,移動停止
			// もし,慣性を働かせたければ,この行を削除

	key = getch();
	switch (key) {
	case KEY_UP:	obj->vy = -1.0; break;
	case KEY_DOWN:	obj->vy = +1.0; break;
	case KEY_LEFT:	obj->vx = -1.0; break;
	case KEY_RIGHT:	obj->vx = +1.0; break;
	...
	}
	return (key);
}

// ゲームの本体
int Game()
{
	Mobj me;
	...
	DrawMap();
	DrawChar(&me, 'O');
	...
	Control(&me);
	Move(&me)
	...
}

...

(c) 2014, yanagawa@kushiro-ct.ac.jp