c语言实现的推箱子小游戏-1
程序员文章站
2022-03-19 20:55:41
本次游戏是个推箱子第一关最简单的小游戏
有详细注释,下面是做出来的游戏界面
游戏操作说明和功能说明:
按wasd控制小人的上下左右移动。 按 r 重新开始游戏 游戏开...
本次游戏是个推箱子第一关最简单的小游戏
有详细注释,下面是做出来的游戏界面
游戏操作说明和功能说明:
游戏原理分析
游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利。 按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给 map[8][8] 来进行操作,以便重新归位, 这里就用到了memcpy()函数。 wasd 代表上下左右 操作人物移动, 分别需要为其定义一个函数。 判断人物移动之前我们需要定位到人物的位置,这里我们用find()函数来定义。首先从头文件开始介绍:
#include #include //malloc()函数 #include //memcpy()函数 #include //getch()函数
函数名称:malloc
函数原型: void * malloc(unsigned size);
函数功能: 分配size字节的存储区
函数返回: 所分配的内存区地址,如果内存不够,返回0
函数函数:memcpy
函数原型:void *memcpy(void *dest, const void *src, size_t n);
函数功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
函数返回:函数返回指向dest的指针。
函数名称:getch
函数原型: int getch(void);
函数功能: 从控制台读取一个字符,但不显示在屏幕上
函数返回: 读取的字符
上图是简单的8*8的图,我们定义一个二维数组来保存整张图,用0,1,2,3,4 来代表游戏界面中的每个符号。代码如下:
int map_1[8][8]={ {0,0,1,1,1,0,0,0}, {0,0,1,4,1,0,0,0}, {0,0,1,2,1,1,1,1}, {1,1,1,0,0,2,4,1}, {1,4,0,2,3,1,1,1}, {1,1,1,1,2,1,0,0}, {0,0,0,1,4,1,0,0}, {0,0,0,1,1,1,0,0} };
定义全局变量:
int x, y; int map[8][8] = {0};
声明函数原型:
int count1(); // 星星的个数 int count2(); // 箱子到了星星的位置的个数 int up(); int down(); int left(); int right(); int shuchu(); int find(); //找到自己 int zhujiemian(); //输出主界面
接着我们来给每个数字赋值他们所代表的符号, 代码如下:
int shuchu() { for(x=0; x<8; x++) { for(y=0; y<8; y++) { if(map[x][y] == 1) printf("■"); //输出砖块的样子 if(map[x][y] == 3) printf("⊙"); //输出自己的位置 if(map[x][y] == 2) printf("□"); //输出箱子 if(map[x][y] == 4) printf("☆"); //输出箱子要到的位置 if(map[x][y] == 0) printf(" "); //输出空白 if(map[x][y] == 5) printf("★"); //输出箱子到了该到的位置 } printf("\n"); } return 0; }
接着我们需要一个开始游戏之前的一个主界面来提示游戏玩法, 代码如下:
//制作主界面 int zhujiemian() { printf("*************************\n" "****请按任意键游戏开始~*****\n" "****制作:菜学匠************\n" "****请按wasd 控制上下左右****\n" "****请按r重新开始游戏*******\n" "*************************\n"); }
接着要想操作人物移动首先要找到界面中人物的位置:
//找到自己的位置 int find() { for(x=0; x<8; x++) for(y=0; y<8; y++) { if(map[x][y] == 3) return 0; } return 0; }
再来记录游戏开始之前星星的个数, 和箱子到了星星位置的个数:
//星星的个数 int count1() { int n=0; for(x=0; x<8; x++) for(y=0; y<8; y++) { if(map[x][y] == 4) n++; } return n; } //箱子到了位置的个数 int count2() { int m=0; for(x=0; x<8; x++) for(y=0; y<8; y++) { if(map[x][y] == 5) m++; } return m; }
接着来给wasd 四个方向上的人物移动做判断, 确定人物的移动:
// 按w的时候的输出结果 int up() { if(map[x][y] == 3) //找到自己的位置 { if(map[x-1][y] == 0) //判断下一格子是不是空 { map[x-1][y] = 3; map[x][y] = 0; } if(map[x-1][y] == 2 && map[x-2][y] == 4) /*判断下一格子是不是箱子,下下个格子是不是箱子要到的地方*/ { map[x][y] = 0; map[x-1][y] = 3; map[x-2][y] = 5; } } return 0; } //按d的时候的输出结果 int down() { if(map[x][y] == 3) //找到自己 { if(map[x+1][y] == 0) //判断下个格子是否空格 { map[x+1][y] = 3; map[x][y] = 0; } if(map[x+1][y] == 2 && map[x+2][y] == 4) /*判断下个格子是不是箱子且箱子后面的是不是星星*/ { map[x][y] = 0; map[x+1][y] = 3; map[x+2][y] = 5; } } return 0; } //按a的时候的输出结果 int left() { if(map[x][y] == 3) { if(map[x][y-1] == 0) //判断下个格子是否空格 { map[x][y-1] = 3; map[x][y] = 0; } if(map[x][y-1] == 2 && map[x][y-2] == 4) /*判断下个格子是不是箱子且箱子后面的是不是星星*/ { map[x][y] = 0; map[x][y-1] = 3; map[x][y-2] = 5; } if(map[x][y-2] == 0 && map[x][y-1] == 2) /*判断下个格子是不是箱子且箱子后面的格子是不是空格*/ { map[x][y] = 0; map[x][y-1] = 3; map[x][y-2] = 2; } } return 0; } //按d的时候的输出结果 int right() { if(map[x][y] == 3) { if(map[x][y+1] == 0) //判断下个格子是否空格 { map[x][y+1] =3; map[x][y] = 0; } if(map[x][y+1] == 2 && map[x][y+2] == 4)/*判断下个格子是不是箱子且箱子后面的是不是星星*/ { map[x][y] = 0; map[x][y+1] = 3; map[x][y+2] = 5; } } return 0; }
最后就是最重要的主函数了:
int main() { int n,m; system("title 推箱子游戏~"); //给一个标题 memcpy(map, map_1, sizeof(map_1)); zhujiemian(); getch(); system("cls"); //清屏 n=count1(); while(1) { system("cls"); shuchu(); m= count2(); find(); switch(getch()) { case 'w':up(); break; case 's':down(); break; case 'a':left(); break; case 'd':right(); break; case 'r':memcpy(map, map_1, sizeof(map_1)); break; } if(n==m) { system("cls"); printf("游戏胜利~\n"); getch(); return 0; } } }
接下来给出整个完整的程序,经过gcc 编译可以运行,代码如下:
#include #include #include #include int x=0,y=0; int map[8][8]={0}; // 定义的游戏界面模型 int map_1[8][8]={ {0,0,1,1,1,0,0,0}, {0,0,1,4,1,0,0,0}, {0,0,1,2,1,1,1,1}, {1,1,1,0,0,2,4,1}, {1,4,0,2,3,1,1,1}, {1,1,1,1,2,1,0,0}, {0,0,0,1,4,1,0,0}, {0,0,0,1,1,1,0,0} }; int count1(); int count2(); int (); up(); int down(); int left(); int right int shuchu(); int find(); int zhujiemian(); int main() { int n,m; system("title 推箱子游戏~"); memcpy(map, map_1, sizeof(map_1)); zhujiemian(); getch(); system("cls"); n=count1(); while(1) { system("cls"); shuchu(); m= count2(); find(); switch(getch()) { case 'w':up(); break; case 's':down(); break; case 'a':left(); break; case 'd':right(); break; case 'r':memcpy(map, map_1, sizeof(map_1)); break; } if(n==m) { system("cls"); printf("游戏胜利~\n"); getch(); return 0; } } } // 按w的时候的输出结果 int up() { if(map[x][y] == 3) //找到自己的位置 { if(map[x-1][y] == 0) //判断下一格子是不是空 { map[x-1][y] = 3; map[x][y] = 0; } if(map[x-1][y] == 2 && map[x-2][y] == 4) //判断下一格子是不是箱子,下下个格子是不是箱子要到的地方 { map[x][y] = 0; map[x-1][y] = 3; map[x-2][y] = 5; } } return 0; } //按d的时候的输出结果 int down() { if(map[x][y] == 3) { if(map[x+1][y] == 0) { map[x+1][y] = 3; map[x][y] = 0; } if(map[x+1][y] == 2 && map[x+2][y] == 4) { map[x][y] = 0; map[x+1][y] = 3; map[x+2][y] = 5; } } return 0; } //按a的时候的输出结果 int left() { if(map[x][y] == 3) { if(map[x][y-1] == 0) { map[x][y-1] = 3; map[x][y] = 0; } if(map[x][y-1] == 2 && map[x][y-2] == 4) { map[x][y] = 0; map[x][y-1] = 3; map[x][y-2] = 5; } if(map[x][y-2] == 0 && map[x][y-1] == 2) { map[x][y] = 0; map[x][y-1] = 3; map[x][y-2] = 2; } } return 0; } //按d的时候的输出结果 int right() { if(map[x][y] == 3) { if(map[x][y+1] == 0) { map[x][y+1] =3; map[x][y] = 0; } if(map[x][y+1] == 2 && map[x][y+2] == 4) { map[x][y] = 0; map[x][y+1] = 3; map[x][y+2] = 5; } } return 0; } int shuchu() { for(x=0; x<8; x++) { for(y=0; y<8; y++) { if(map[x][y] == 1) printf("■"); //输出砖块的样子 if(map[x][y] == 3) printf("⊙"); //输出自己的位置 if(map[x][y] == 2) printf("□"); //输出箱子 if(map[x][y] == 4) printf("☆"); //输出箱子要到的位置 if(map[x][y] == 0) printf(" "); //输出空白 if(map[x][y] == 5) printf("★"); //输出箱子到了该到的位置 } printf("\n"); } return 0; } //找到自己的位置 int find() { for(x=0; x<8; x++) for(y=0; y<8; y++) { if(map[x][y] == 3) return 0; } return 0; } //箱子要到的位置的个数 int count1() { int n=0; for(x=0; x<8; x++) for(y=0; y<8; y++) { if(map[x][y] == 4) n++; } return n; } //箱子到了位置的个数 int count2() { int m=0; for(x=0; x<8; x++) for(y=0; y<8; y++) { if(map[x][y] == 5) m++; } return m; } //制作主界面 int zhujiemian() { printf("*************************\n" "***请按任意键游戏开始~***\n" "*********制作:小菜*******\n" "**请按wasd 控制上下左右**\n" "**请按r重新开始游戏******\n" "*************************\n"); }