当前位置:首页 > 通信资讯 > 正文

本文实例为大家分享了C语言实现推箱子小游戏的具体代码,供大家参考,具体内容如下

本次游戏是个推箱子第一关最简单的小游戏
有详细注释,下面是做出来的游戏界面

用c语言编写推箱子小游戏(推箱子游戏代码 c语言)

用c语言编写推箱子小游戏(推箱子游戏代码 c语言)

游戏操作说明和功能说明:

1、按wasd控制小人的上下左右移动。
2、按 r 重新开始游戏
3、游戏开始有操作介绍
4、游戏结束有胜利提示

游戏原理分析

1、游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利。
2、按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给 map[8][8] 来进行操作,以便重新归位, 这里就用到了memcpy()函数。
3、wasd 代表上下左右 操作人物移动, 分别需要为其定义一个函数。
4、判断人物移动之前我们需要定位到人物的位置,这里我们用find()函数来定义。

首先从头文件开始介绍:

?
1 2 3 4 #include<stdio.h> #include<stdlib.h> //malloc()函数 #include<string.h> //memcpy()函数 #include<conio.h> //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 来代表游戏界面中的每个符号。代码如下:

?
1 2 3 4 5 6 7 8 9 10 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} };

定义全局变量:

?
1 2 int x, y; int map[8][8] = {0};

声明函数原型:

?
1 2 3 4 5 6 7 8 9 10 11 int count1(); // 星星的个数 int count2(); // 箱子到了星星的位置的个数 int up(); int down(); int left(); int right(); int shuchu(); int find(); //找到自己 int zhujiemian(); //输出主界面

接着我们来给每个数字赋值他们所代表的符号, 代码如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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; }

接着我们需要一个开始游戏之前的一个主界面来提示游戏玩法, 代码如下:

?
1 2 3 4 5 6 7 8 9 10 //制作主界面 int zhujiemian() { printf("*************************\n" "****请按任意键游戏开始~*****\n" "****制作:菜学匠************\n" "****请按wasd 控制上下左右****\n" "****请按r重新开始游戏*******\n" "*************************\n"); }

接着要想操作人物移动首先要找到界面中人物的位置:

?
1 2 3 4 5 6 7 8 9 10 11 //找到自己的位置 int find() { for(x=0; x<8; x++) for(y=0; y<8; y++) { if(map[x][y] == 3) return 0; } return 0; }

再来记录游戏开始之前星星的个数, 和箱子到了星星位置的个数:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //星星的个数 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 四个方向上的人物移动做判断, 确定人物的移动:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 // 按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; }

最后就是最重要的主函数了:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 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 编译可以运行,代码如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> 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"); }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_35457927/article/details/51871211

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。