用WSAD模拟方问键

Table of Contents

[To update the table of contents, select the message below and press F9]


Pages 2

1.1.Page Tree 2

1.2.Home 3

1.2.1.User Interface 3

1.2.2.Target 3

1.2.2.1.State1 3

1.3.Page 1 5

1.4.Page 2 6

1.5.Page 3 7

Masters 8

1.6.Master List 8

1.7.WSAD 9

1.7.1.User Interface 9

1.7.2.Object Table 9



Pages

    1. Page Tree

  1. Home

  2. Page 1

  3. Page 2

  4. Page 3

    1. Home

      1. User Interface

File?id=dcf869c4_1373cxpzvqfv_b

      1. Target

        1. State1

User Interface

File?id=dcf869c4_1374dp4bpgnb_b

Object Table

Footnote

Interactions

1

Up:
Case Up:
Move Target by (0,-10)

Down:
Case Down:
Move Target by (0,10)

Left:
Case Left:
Move Target by (-10,0)

Right:
Case 1:
Move Target by (10,0)

    1. Page 1

    2. Page 2

    3. Page 3


Masters

    1. Master List

  1. WSAD

    1. WSAD

      1. User Interface

File?id=dcf869c4_1375c9shp3ft_b

      1. Object Table

Footnote

Label

Interactions

1

key

OnKeyUp:
Case Up (If text on widget key equals "w" or text on widget key equals "W"):
Raise Up
Case Down (Else If text on widget key equals "s" or text on widget key equals "S"):
Raise Down
Case Left (Else If text on widget key equals "a" or text on widget key equals "A"):
Raise Left
Case Down (Else If text on widget key equals "d" or text on widget key equals "D"):
Raise Right
Case Else (If True):
Set text on widget key equal to ""


要在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 | 退出游戏 | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值