时间:2022-07-27 11:15:55 | 栏目:C代码 | 点击:次
本文章将承接着上面的文章(上篇文章的地址),继续对推箱子的代码进行修改和完善,对上面杂乱的代码进行修改成函数。
注意:每次打印地图的时候要在前面加入system("cls")语句来清除刷新地图,该方法需要用到#include <Windows.h>的头文件。
对上篇文章的推箱子的地图代码进行函数封装,成果如下:
void drawMap() { system("CLS"); // 使用循环,遍历数组(将游戏数据图形化) for (size_t i = 0; i < 10; i++) { for (size_t j = 0; j < 10; j++) { /*printf("%2d", map[i][j]);*/ switch (map[i][j]) { case 0: printf(" "); // 两个空格 break; case 1: printf("█"); break; case 2: printf("♀"); break; case 3: printf("●"); break; case 4: printf("☆"); break; default: break; } } printf("\n"); } }
而存储地图的地方可以放在主函数体外面来进行声明。
在这之后如果推到成功点和人走到成功点上仅需要加上case 2+4和case 3+4两个条件即可,具体代码如最后源码所示。
对角色移动的函数我们需要分为2个函数,一个是来控制角色移动的函数,另一个则是来寻找角色所在位置的坐标。
在该函数中,我们需要对寻找角色,以及判断箱子能否推动做两个功能封装为一个函数,在该函数中,我们要先找到角色的位置,然后对移动的位置进行判断。
// 移动逻辑 参数:int X,int Y X和Y方向的偏移量 void move(int X,int Y) { // 1 找人 int posX = 0, posY = 0; for (size_t i = 0; i < 10; i++) { for (size_t j = 0; j < 10; j++) { if (2 == map[i][j] || 2 + 4 == map[i][j]) { posX = i; posY = j; break; } } } // 空地或成功点 map[posX][posY]:主角所在的位置 if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y]) { map[posX][posY] -= 2; map[posX + X][posY + Y] += 2; } // 箱子(将箱子从点上推走) else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y]) { // 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置 if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)]) { // 当前位置人离开 map[posX][posY] -= 2; map[posX + X][posY + Y] += 2; map[posX + X][posY + Y] -= 3; map[posX + (X * 2)][posY + (Y * 2)] += 3; } } }
该函数对键盘输入进行处理,并且通过传入2个参数来一次性对移动进行操作,不需要四个方向都需要在写一遍函数,以下写法可以防止用户开大写而移动不了角色。
void heroMove() { // 控制人物移动 // 2 控制(键盘:WSAD(上下左右)) // 需要从键盘获取按键(字符) switch (getch()) { case 'w': case 'W': move(-1, 0); break; case 's': case 'S': move(1, 0); break; case 'a': case 'A': move(0, -1); break; case 'd': case 'D': move(0, 1); break; default: break; } }
这里用到了C++的bool类型,c语言也是可以使用,如果不想用这种函数,改成int也是可以使用的。
bool isWin() { for (size_t i = 0; i < 10; i++) { for (size_t j = 0; j < 10; j++) { if (map[i][j] == 3) { return false; } } } return true; }
这里的思想是,先绘制地图,然后对移动进行判断,直到判断所有的箱子没有后,判定玩家胜利。
int main() { while (!isWin()) // 游戏主循环 { drawMap(); heroMove(); } drawMap(); return 0; }
#include <stdio.h> #include <conio.h> #include <Windows.h> char map[10][10] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 1, 4, 0, 0, 1 }, { 1, 0, 0, 4, 0, 1, 1, 0, 0, 1 }, { 1, 0, 0, 3, 0, 1, 0, 0, 0, 1 }, { 1, 0, 0, 2, 0, 0, 0, 0, 0, 1 }, { 1, 1, 1, 1, 0, 0, 3, 0, 0, 1 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; /* 函数声明 */ void drawMap(); void heroMove(); void move(int X, int Y); bool isWin(); int main() { while (!isWin()) // 游戏主循环 { drawMap(); heroMove(); } drawMap(); return 0; } /* 函数定义 */ // 绘制地图 void drawMap() { system("CLS"); // 使用循环,遍历数组(将游戏数据图形化) for (size_t i = 0; i < 10; i++) { for (size_t j = 0; j < 10; j++) { /*printf("%2d", map[i][j]);*/ switch (map[i][j]) { case 0: printf(" "); // 两个空格 break; case 1: printf("█"); break; case 2: printf("♀"); break; case 3: printf("●"); break; case 4: printf("☆"); break; case 2 + 4: printf("♀"); break; case 3 + 4: printf("★"); break; default: break; } } printf("\n"); } } void heroMove() { // 控制人物移动 // 2 控制(键盘:WSAD(上下左右)) // 需要从键盘获取按键(字符) switch (getch()) { case 'w': case 'W': move(-1, 0); break; case 's': case 'S': move(1, 0); break; case 'a': case 'A': move(0, -1); break; case 'd': case 'D': move(0, 1); break; default: break; } } // 移动逻辑 参数:int X,int Y X和Y方向的偏移量 void move(int X,int Y) { // 1 找人 int posX = 0, posY = 0; for (size_t i = 0; i < 10; i++) { for (size_t j = 0; j < 10; j++) { if (2 == map[i][j] || 2 + 4 == map[i][j]) { posX = i; posY = j; break; } } } // 空地或成功点 map[posX][posY]:主角所在的位置 if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y]) { map[posX][posY] -= 2; map[posX + X][posY + Y] += 2; } // 箱子(将箱子从点上推走) else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y]) { // 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置 if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)]) { // 当前位置人离开 map[posX][posY] -= 2; map[posX + X][posY + Y] += 2; map[posX + X][posY + Y] -= 3; map[posX + (X * 2)][posY + (Y * 2)] += 3; } } } //判断胜利 bool isWin() { for (size_t i = 0; i < 10; i++) { for (size_t j = 0; j < 10; j++) { if (map[i][j] == 3) { return false; } } } return true; }