推箱子c语言代码有注释,C语言代码实现推箱子小游戏
本文实例为大家分享了C语言实现推箱子小游戏的具体代码,供大家参考,具体内容如下
本次游戏是个推箱子第一关最简单的小游戏
有详细注释,下面是做出来的游戏界面
游戏操作说明和功能说明:
1、按wasd控制小人的上下左右移动。
2、按 r 重新开始游戏
3、游戏开始有操作介绍
4、游戏结束有胜利提示
游戏原理分析
1、游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利。
2、按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给 map[8][8] 来进行操作,以便重新归位, 这里就用到了memcpy()函数。
3、wasd 代表上下左右 操作人物移动, 分别需要为其定义一个函数。
4、判断人物移动之前我们需要定位到人物的位置,这里我们用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");
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推箱子c语言代码有注释,C语言代码实现推箱子小游戏相关推荐
- python 贪吃蛇小游戏代码_10分钟再用Python编写贪吃蛇小游戏
Python编写贪吃蛇 前不久我们公众号发布了一篇C++编写贪吃蛇小游戏的推文,反响空前.看来大家对这类简单易上手小游戏还是很喜爱的. 恰逢2018年IEEE Spectrum编程语言排行榜新鲜出炉, ...
- C语言写一个很好玩的皇帝的后宫小游戏
C语言写一个很好玩的皇帝的后宫小游戏 前言 先演示一下 上源码 总结 前言 只是单纯喜欢C语言,闲着无事把以前学习的时候的案例编了一下,都是很基础的代码,for,swich,if这些,基础好的看完后完 ...
- Go语言中的注释类型和代码风格
Go语言中的注释类型 Go的代码风格
- c语言/c++大作业基于easyx图形库自制RPG类型小游戏代码(附源码)
目录 一.游戏玩法 二.完整代码 三.部分细节 透明化人物背景 关于easyx库中怎样贴出透明图片 地图的链表实现 移动检测 碰撞检测 总结 前言: 花两天边看easyx文档边学边写的期末小作业. 学 ...
- python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...
原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...
- 手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏
公众号关注 "菜鸟学Python" 设为 "星标",重磅干货,第一时间送达! 烟花三月下扬州,我想3月能下楼.虽然很多地方都已经开始慢慢的开放了,但是我怀念的胡 ...
- python3小游戏代码教程_Python3制作仿“经典90坦克大战”小游戏|python3教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ 本文转载至知乎ID:Charles(白露未晞)知乎个人专栏 下载W3Cschool手机App,0基础随时随 ...
- 【c语言】和【Java】版本的猜数字小游戏
目录 前言 一.c语言版本 1.游戏设计思路 2.rand()及srand()函数的使用 2.取模确定取值范围 3.条件运算符 4.利用二分法进行猜测 二.java版本 1.Math.random() ...
- python小游戏代码大全-【程序源代码】python贪吃蛇小游戏
关键字:python 游戏 贪吃蛇 正文 | 内容 在网络还不发达,没有平板电脑和手机的童年;电视机里的动画片和小游戏曾经陪伴我们度过了欢乐的时光.扫雷.贪吃蛇.俄罗斯方块.58坦克大战.超级玛丽.魂 ...
- python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)
经常有人问我 Python 能开发游戏吗?今天就直接给大家推荐一个汇集多款经典小游戏的Github项目:Free Python Games. 项目地址:grantjenks/free-python-g ...
最新文章
- 精通Python网络爬虫:核心技术、框架与项目实战.1.1 初识网络爬虫
- android存储器,Android——寄存器和存储器的区别
- linux进程间通讯-有名管道
- 我的世界java8_《我的世界》java8 64服务器mod
- day38 css的4种引入方式
- 27行代码AC_How Many Tables HDU - 1213(并查集讲解)
- Win7下telnet使用
- chromedriver 下载_centos7中配置python爬虫selenium+chromium+chromedriver环境
- java中遍历树形菜单,你可能不知道还有这样的方法
- MATLAB实现BP神经网络预测汽油辛烷值
- mysql 时间小于_删库不必跑路,自己动手MySQL数据恢复,真香~~
- kali怎么新建文本_macOS 开发之 NSTextField 支持文本快捷键(一): 基本操作
- windows curl ssl版本号编译
- 机器视觉打光方案(NOMEX胶纸)
- 我是如何在自学编程9个月后找到工作的
- pdproxy度盘下载器不限速(xp版也可用) v2021
- HTML5框架 iframe用法 实现嵌套 好玩用法
- 亦余心之所善兮,虽九死其犹未悔
- 记录Robotium黑盒测试一个APK文件学习之从签名到简单测试
- g++来进行编译的头文件路径问题
热门文章
- 数据结构c语言版ppt答案,《数据结构(C语言版)》习题答案.ppt
- 【读书笔记】《天才在左 疯子在右》
- chromecast协议_如何将Chromecast用作快速信息仪表板
- 我要偷偷的学Python,然后惊呆所有人(第三天)
- 魔兽服务器优化,《魔兽世界》画质与流畅最佳优化指南
- 该网站安全证书有问题 宝塔面板配置ssl中遇到的“坑”
- 用python编写加减乘除计算器_python实现加减乘除计算器
- 计算机垃圾清理指令,win7电脑清理垃圾的运行命令代码是什么
- python怎么交换xy轴_matplotlib Y轴和X轴交换
- ECCV2020 点云处理——A Closer Look at Local Aggregation Operators in Point Cloud Analysis