(動作保証なし.サポート対象外.)
マップ内の移動とか...どーする?
...
#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)
...
}
...