```c
include include define ROW 5 define COL 5 char map[ROW][COL] = { {'', '', '', '', ''}, {'', 'S', '.', '.', ''}, {'', '.', '', '.', ''}, {'', '.', '.', 'T', ''}, {'', '', '', '', ''} }; void printMap() { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { printf("%c ", map[i][j]); } printf("\n"); } printf("\n"); } void move(int x, int y, int x2, int y2) { map[x2][y2] = map[x][y]; map[x][y] = '.'; } int main() { int x, y, x2, y2; printMap(); while (1) { printf("请输入要移动的方向(W/A/S/D):"); char c = getchar(); getchar(); // Consume newline switch (c) { case 'w': x = x - 1; y = y; break; case 'a': x = x; y = y - 1; break; case 's': x = x; y = y + 1; break; case 'd': x = x + 1; y = y; break; default: continue; } if (map[x][y] == 'T') { printf("恭喜你,成功!\n"); break; } if (map[x][y] == '.' || map[x][y] == 'X') { x2 = x; y2 = y + 1; if (map[x2][y2] == 'X' || map[x2][y2] == 'T') { move(x, y, x2, y2); } else if (map[x2][y2] == '.') { move(x, y, x2, y2); x2 = x; y2 = y + 1; if (map[x2][y2] == 'X' || map[x2][y2] == 'T') { move(x, y, x2, y2); } } } printMap(); } return 0; } ``` 代码说明: 使用二维字符数组`map`来表示游戏地图,其中`'.'`表示空地,`'S'`表示玩家,`'X'`表示箱子,`'T'`表示目标。 `printMap`函数用于打印当前地图状态。 `move`函数用于移动玩家或箱子,并更新地图。 在`main`函数中,通过一个无限循环来处理用户输入,并根据输入更新玩家位置和箱子位置。如果玩家移动到目标位置,则输出恭喜信息并退出循环。 注意事项: 该代码假设地图大小为5x5,玩家初始位置在`(1, 1)`,目标位置在`(3, 4)`。 玩家只能上下左右移动,并且只能推动箱子到目标位置。 如果玩家或箱子移动到墙壁或已经走过的位置,则不会移动。 你可以根据需要修改地图大小、玩家初始位置和目标位置,以适应不同的游戏需求。地图定义:
打印地图:
移动函数:
主循环: