WINAPIを使用したサンプルです。
変数名や書き方は私好みに変更していますが、コメントを入れてますので適当に解析してみてください。
無限ループしていて終了しないので、飽きたら終了させてください(^_^;)
#include <stdio.h>
#include <windows.h>
/* 定数 */
#define MAP_WIDTH 10
#define MAP_HEIGHT 11
#define MOVE_WAIT 100
/* グローバル変数 */
// コンソールウインドウ用出力ハンドル
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
// プレイヤー座標
int px = 1;
int py = 1;
// 背景
/* プロトタイプ宣言 */
void printMap(int map[MAP_HEIGHT][MAP_WIDTH]);
void printGrid(int x, int y, int grid);
void printPlayer(int x, int y, int map[MAP_HEIGHT][MAP_WIDTH]);
void moveUp(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH]);
void moveDown(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH]);
void moveLeft(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH]);
void moveRight(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH]);
/* メイン関数 */
void main(void)
{
// マップ用配列
// ※この程度の規模ならばグローバル変数にした方が制御が楽だとは思いますが、
// 多元配列を引数で渡す練習用にローカルで書いてます
int map[MAP_HEIGHT][MAP_WIDTH] = { {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1} };
// 初期描画
printMap(map);
printPlayer(1, 1, map);
// プレイヤー移動制御
for(; ;)
{
moveRight(2, 8, map);
moveDown(2, 3, map);
moveLeft(7, 1, map);
moveDown(4, 5, map);
moveRight(2, 8, map);
moveDown(6, 7, map);
moveLeft(7, 1, map);
moveDown(8, 9, map);
moveRight(2, 8, map);
moveUp(8, 7, map);
moveLeft(7, 1, map);
moveUp(6, 5, map);
moveRight(2, 8, map);
moveUp(4, 3, map);
moveLeft(7, 1, map);
moveUp(2, 1, map);
}
}
/* 背景全描画 */
void printMap(int map[MAP_HEIGHT][MAP_WIDTH])
{
for (int x = 0; x < 10; ++x)
{
for (int y = 0; y < 11; ++y)
{
printGrid(x, y, map[y][x]);
}
}
}
/* 背景1マスだけ描画 */
void printGrid(int x, int y, int grid)
{
COORD pos = {x, y};
SetConsoleCursorPosition(hout, pos);
printf("%d", grid);
}
/* プレイヤーの描画 */
void printPlayer(int x, int y, int map[MAP_HEIGHT][MAP_WIDTH])
{
// 移動する前のプレイヤー座標のマスをマップデータで上書きする
printGrid(px, py, map[py][px]);
// プレイヤー座標を更新(移動)する
px = x;
py = y;
// 移動先の座標にプレイヤーを描画する
COORD pos = {px, py};
SetConsoleCursorPosition(hout, pos);
putc('@', stdout);
}
/* 上移動 */
void moveUp(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH])
{
for (int y = start; y >= end; --y)
{
printPlayer(px, y, map);
Sleep(MOVE_WAIT);
}
}
/* 下移動 */
void moveDown(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH])
{
for (int y = start; y <= end; ++y)
{
printPlayer(px, y, map);
Sleep(MOVE_WAIT);
}
}
/* 左移動 */
void moveLeft(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH])
{
for (int x = start; x >= end; --x)
{
printPlayer(x, py, map);
Sleep(MOVE_WAIT);
}
}
/* 右移動 */
void moveRight(int start, int end, int map[MAP_HEIGHT][MAP_WIDTH])
{
for (int x = start; x <= end; ++x)
{
printPlayer(x, py, map);
Sleep(MOVE_WAIT);
}
}