要在C语言中使用 `W`、`S`、`A`、`D` 键控制人物移动,我们需要:
---
## ✅ 实现目标
- 使用 `W`、`S`、`A`、`D` 键控制人物上下左右移动
- 地图使用 `map[ROW][COL]` 二维数组表示
- 支持推箱子逻辑
- 使用 `_getch()` 读取键盘输入(Windows 平台)
- 每次移动后刷新地图
---
## ✅ 修改点说明
1. **键盘输入判断**:
- `'w'` 或 `'W'`:向上移动(-1 行)
- `'s'` 或 `'S'`:向下移动(+1 行)
- `'a'` 或 `'A'`:向左移动(-1 列)
- `'d'` 或 `'D'`:向右移动(+1 列)
2. **人物坐标追踪**:
- 使用 `peopleX` 和 `peopleY` 记录当前人物坐标
3. **地图刷新**:
- 每次按键后使用 `system("cls")` 清屏并重新绘制地图
---
## ✅ 完整代码实现(使用 W/S/A/D 控制)
```c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define ROW 10
#define COL 10
enum { BLANK, WALL, DEST, BOX, PEOPLE };
int map[ROW][COL] = {
{0, 0, 0, 1, 1, 1, 0, 0, 0, 0 },
{0, 0, 0, 1, 2, 1, 0, 0, 0, 0 },
{0, 0, 0, 1, 3, 1, 0, 0, 0, 0 },
{1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
{1, 2, 0, 3, 4, 3, 0, 0, 2, 1 },
{1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
{0, 0, 0, 1, 3, 1, 0, 0, 0, 0 },
{0, 0, 0, 1, 2, 1, 0, 0, 0, 0 },
{0, 0, 0, 1, 1, 1, 0, 0, 0, 0 },
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
int peopleX = 4, peopleY = 4; // 人物初始位置 (行, 列)
void drawMap();
void movePlayer(int dx, int dy);
int main()
{
system("chcp 65001"); // 设置 UTF-8 编码
char ch;
while (1)
{
system("cls");
drawMap();
printf("使用 W/A/S/D 控制人物移动,按 Q 退出\n");
ch = _getch();
switch (ch)
{
case 'w':
case 'W':
movePlayer(-1, 0); // 上
break;
case 's':
case 'S':
movePlayer(1, 0); // 下
break;
case 'a':
case 'A':
movePlayer(0, -1); // 左
break;
case 'd':
case 'D':
movePlayer(0, 1); // 右
break;
case 'q':
case 'Q':
return 0;
}
}
return 0;
}
void drawMap()
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (map[i][j] == BLANK) printf(" ");
else if (map[i][j] == WALL) printf("■ ");
else if (map[i][j] == DEST) printf("☆ ");
else if (map[i][j] == BOX) printf("□ ");
else if (map[i][j] == PEOPLE) printf("♀ ");
else if (map[i][j] == 5) printf("☼ ");
else if (map[i][j] == 6) printf("♥ ");
}
printf("\n");
}
}
void movePlayer(int dx, int dy)
{
int newX = peopleX + dx;
int newY = peopleY + dy;
if (newX < 0 || newX >= ROW || newY < 0 || newY >= COL)
return;
// 当前方格是空地或目标点
if (map[newX][newY] == BLANK || map[newX][newY] == DEST)
{
map[peopleX][peopleY] = BLANK;
map[newX][newY] = PEOPLE;
peopleX = newX;
peopleY = newY;
}
// 当前方格是箱子
else if (map[newX][newY] == BOX)
{
int boxNextX = newX + dx;
int boxNextY = newY + dy;
if (boxNextX >= 0 && boxNextX < ROW && boxNextY >= 0 && boxNextY < COL &&
(map[boxNextX][boxNextY] == BLANK || map[boxNextX][boxNextY] == DEST))
{
// 移动箱子
map[boxNextX][boxNextY] = BOX;
map[newX][newY] = PEOPLE;
map[peopleX][peopleY] = BLANK;
peopleX = newX;
peopleY = newY;
}
}
}
```
---
## ✅ 功能说明
| 按键 | 功能 |
|------|------|
| W/w | 向上移动 |
| S/s | 向下移动 |
| A/a | 向左移动 |
| D/d | 向右移动 |
| Q/q | 退出游戏 |
---
##