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