C语言实现推箱子游戏完整代码
C语言实现推箱子游戏完整代码
前言
自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的
代码效果
代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数,一个作图。
手动设置地图
用’0’表示空格,“1”表示墙,“2”表示箱子,“3”表示人,“4”表示终点
这样可以提高代码的移植性
如需改为手动输入地图可以直接定义一个二维数组,在给他赋值就可以了
int screen[9][11]={
{0,1,1,1,1,1,1,1,1,0,0},
{0,1,0,0,0,1,0,0,0,1,0},
{0,1,0,2,2,2,2,2,0,1,0},
{0,1,0,2,0,2,0,2,0,1,1},
{0,1,0,0,0,3,0,0,2,0,1},
{1,1,0,1,1,1,1,0,2,0,1},
{1,0,4,4,4,4,4,1,0,0,1},
{1,0,4,4,4,4,4,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,0}
};//定义为全局变量 (地图) i表示行,j表示列
计算地图中终点的个数
这一步主要是为了后面判断游戏输赢的
int cum(){
int i,j,k=0;
for(i=0;i<9;i++){
for(j=0;j<11;j++){
if(screen[i][j]==2){
k++;
}
}
}//遍历整个二维数组
return k;
}//计算地图中有多少个终点
打印地图函数
通过switch函数对二维数组中的值进行可视化,也就是画出地图
注意:这里还定义出了6和7,是通过重叠的关系来算的,就是箱子在终点上,这个位置又有箱子又有终点2个标识,所以让两个的数值加起来,方便理解,也方便后面的计算
void print(){
int i,j;
printf("请用wsad代表上下左右来进行游戏\n");
for(i=0;i<9;i++){
for(j=0;j<11;j++){
switch(screen[i][j]){
case 0:
printf(" ");//空
break;
case 1:
printf("■");//墙
break;
case 2:
printf("★");//箱子
break;
case 3:
printf("♀");//人
break;
case 4:
printf("○");//终点
break;
case 6:
printf("★");
break;//箱子和终点
case 7://人和终点显示人
printf("♀");
break;
}
}
printf("\n");
}
}
判断游戏输赢
这里我写了2个函数,一个判断赢,一个判断输,并返回值,然后在主函数的最后面通过判断返回值来确定游戏的输赢
判断赢
int win(){
int i,j,k=0;
int t=0;
for(i=0;i<9;i++){
for(j=0;j<11;j++){
if(screen[i][j]==6){
k++;
}
}
}//遍历整个二维数组,计算箱子在终点上的个数
if(k==cum()){
t=1;
}//如果个数等于前面计算出的终点个数,则说明所有终点都放了箱子,说明游戏胜利
return t;
} //判断赢
判断输
int lose(){
int i,j;
int k=0;
for(i=0;i<9;i++){
for(j=0;j<11;j++){
if(i>0 && j>0 ){
if(screen[i][j] == 2 || screen[i][j] == 6){
if(((screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6) && (screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6))
|| ((screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6) && (screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6))
|| ((screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6) && (screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6))
|| ((screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6) && (screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6))){
k++;
}
}
}
}/*这里也是遍历了整个数组,判断所有的箱子四个方向的情况,
如果有三个方向被堵住了说明箱子无法移动了,也表明这个箱子失效了,
用k来记录失效的个数,当全部失效时游戏失败
(这是游戏的玩法,其实有一个被堵住就已经不可能胜利了)*/
}
if(k==cum()){
k=1;
}
return k;//返回1说明游戏失败
}
接下来是最重要的四个控制函数
向上移动
通过数字的变化来控制二维数组的变化,进而控制地图的更新
这里非常重要的就是要理解:加1,加2,加3减3都是什么意思
加1:箱子的值是2,人的值是3,所以箱子的位置变成人需要加1来实现
加2:空地的值是0,箱子的值是2,箱子和终点在一起的值是6,所以在推箱子的时候,前方的空格或者终点放上箱子后数值会加2
加3减3:人的值是3,人要动的话,它原先在的格子就会因为人走了导致数值减3,走到的那个格子就会因为站了人而加3
如果这个理解的话,代码就非常简单了
void movew(){
if(x>0){
if(screen[x-1][y]==1){
return ;/*如果箱子的上面是墙,则地图不会发生变化,因为
推不动嘛*/
}else if(screen[x-1][y]==0){
screen[x-1][y]+=3;
screen[x][y]-=3;
x--;/*如果前面是空地,则需要向前移动一格,也就是原先人的位置
变成空地,前方的空地变成人,空地(0)变成人(3)需要加3,
人变成空地需要减3*/
}else if(screen[x-1][y]==4){
screen[x-1][y]+=3;
screen[x][y]-=3;
x--;
}//一样的
else if(screen[x-1][y]==2||screen[x-1][y]==6){
if(screen[x-2][y]==0){
screen[x-2][y]+=2;//箱子前面的格变成箱子(2)
screen[x-1][y]+=1;//箱子的位置变成人(3)
screen[x][y]-=3;/*如果前面是空地,则需要向前移动
一格,也就是原先是箱子的格子变成人,人的位置变成空
地,原先的空地变成箱子,箱子(2)变成人(3)需要减
3,空地变成人*/
x--;
}else if(screen[x-2][y]==1){
return ;
}else if(screen[x-2][y]==2){
return;//如果箱子的前面是墙或者其他的箱子,则箱子推不动
}else if(screen[x-2][y]==4){
screen[x-2][y]+=2;
screen[x-1][y]+=1;
screen[x][y]-=3;
x--;
}//这个情况别漏了
}
}
}
其他三个方向的代码思路和这个是一样的
向下移动
void moves(){
if(x<9){
if(screen[x+1][y]==1){
return ;
}else if(screen[x+1][y]==0){
screen[x+1][y]+=3;
screen[x][y]-=3;
x++;
}else if(screen[x+1][y]==4){
screen [x+1][y]+=3;
screen[x][y]-=3;
x++;
}
else if(screen[x+1][y]==2||screen[x+1][y]==6){
if(screen[x+2][y]==1){
return;
}else if(screen[x+2][y]==0){
screen[x+2][y]+=2;
screen[x+1][y]+=1;
screen[x][y]-=3;
x++;
}else if(screen[x+2][y]==2){
return ;
}else if(screen[x+2][y]==4){
screen[x+2][y]+=2;
screen[x+1][y]+=1;
screen[x][y]-=3;
x++;
}
}
}
}
向左移动
void movea(){
if(y>0){
if(screen[x][y-1]==1){
return;
}else if(screen[x][y-1]==4){
screen[x][y-1]+=3;
screen[x][y]-=3;
y--;
}
else if(screen[x][y-1]==0){
screen[x][y-1]+=3;
screen[x][y]-=3;
y--;
}else if(screen[x][y-1]==2||screen[x][y-1]==6){
if(screen[x][y-2]==0){
screen[x][y-2]+=2;
screen[x][y-1]+=1;
screen[x][y]-=3;
y--;
}else if(screen[x][y-2]==1){
return;
}else if(screen[x][y-2]==2){
return;
}else if(screen[x][y-2]=4){
screen[x][y-2]+=2;
screen[x][y-1]+=1;
screen[x][y]-=3;
y--;
}
}
}
}
向右移动
void moved(){
if(y<9){
if(screen[x][y+1]==1){
return;
}else if(screen[x][y+1]==4){
screen[x][y+1]+=3;
screen[x][y]-=3;
y++;
}
else if(screen[x][y+1]==0){
screen[x][y+1]+=3;
screen[x][y]-=3;
y++;
}else
if(screen[x][y+1]==2||screen[x][y+1]==6){
if(screen[x][y+2]==0){
screen[x][y+2]+=2;
screen[x][y+1]+=1;
screen[x][y]-=3;
y++;
}else if(screen[x][y+2]==4){
screen[x][y+2]+=2;
screen[x][y+1]+=1;
screen[x][y]-=3;
y++;
}else if(screen[x][y+2]==2){
return;
}else if(screen[x][y+2]==1){
return;
}
}
}
}
主函数
这个主函数写的有点乱,直接看注释吧
int main(){
int n,t;
int j,k;
int b=1;
here:
system("cls");//
printf("开始游戏请按1\n退出游戏请按2\n");
scanf("%d",&j);
if(j==1){
printf("请用wsad代表上下左右来进行游戏\n");//这个就引导进入游戏
while(1){
system("cls");/*在每一次移动过后都清除上一个地图,不然就会每走
一步生成一个图*/
print();//先打印地图
scanf("%c",&n);//读入用户的操作
switch(n){
case 'w':
movew();
break;
case 's':
moves();
break;
case 'a':
movea();
break;
case 'd':
moved();
break;
} //控制人移动
t=win();
if(t==1){
goto there;
}//每次操作完先判断游戏是否胜利,如果胜利了直接跳到函数最后
if(b == lose()){
system("cls");
print();
printf("游戏失败");
return 0;
} //游戏失败提示
}
}else {
system("cls");
printf("您确认要退出游戏吗\n确认退出按1\t返回上一层按2\n");
scanf("%d",&k);
if(k==1){
printf("你已退出游戏,期待你的再次到来,谢谢");
return 0;
}else {
goto here;
}
}//这一块是最前面用户进入游戏那里的,如果用户选择退出游戏执行的操作
there:
printf("恭喜你通过了游戏!");
return 0;
}//主函数
所有的代码就到这里了,如果需要完整代码可以留言喔.
C语言实现推箱子游戏完整代码的更多相关文章
- C语言之推箱子游戏代码
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Yan_Less 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
- C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 用C写一个简单的推箱子游戏(一)
我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱 ...
- JavaScript写一个小乌龟推箱子游戏
推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用 ...
- 用HTML5+原生js实现的推箱子游戏
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JavaScript 推箱子游戏
推箱子游戏的 逻辑非常简单,但是如果不动手的话,还是不太清楚.我在这里讲一下自己的思路. 制作推箱子,首先要有自己的设计素材.如下我也是网上找的素材 第二步,理清游戏的规则. 游戏规则: 1.小人将箱 ...
- three.js 制作一个三维的推箱子游戏
今天郭先生发现大家更喜欢看我发的three.js小作品,今天我就发一个3d版本推箱子的游戏,其实webGL有很多框架,three.js并不合适做游戏引擎,但是可以尝试一些小游戏.在线案例请点击博客原文 ...
- 用C写一个简单的推箱子游戏(二)
下面接着上一篇随笔<用C写一个简单的推箱子游戏(一)>来写 tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么 ...
- C# 推箱子游戏&对战游戏
推箱子游戏提纲,只有向右向上的操作,向左向下同理,后期需完善. namespace 推箱子 { class Program { static void Main(string[] args) { // ...
随机推荐
- Hadoop完整搭建过程(四):完全分布模式(服务器)
1 概述 上一篇文章介绍了如何使用虚拟机搭建集群,到了这篇文章就是实战了,使用真实的三台不同服务器进行Hadoop集群的搭建.具体步骤其实与虚拟机的差不多,但是由于安全组以及端口等等一些列的问题,会与 ...
- Alpine镜像
Alpine Linux 是一个面向安全,轻量级的基于musl libc与busybox项目的Linux发行版. Alpine 提供了自己的包管理工具 apk,可以通过 https://pkgs.al ...
- Leecode第二题:两数相加
Leecode2 先看题目 : 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的 ...
- Oralce注入 bypass waf出数据
发存货: 探测banner 版本号: ' and (SELECT banner FROM v$version where rownum=1) like 'O%' and '1'like'1 rownu ...
- php 日志处理工具 SeasLog 的使用
首先附上seaslog github地址: https://github.com/Neeke/SeasLog/blob/master/README_zh.md php官方文档地址: https://w ...
- 病毒木马查杀实战第024篇:MBR病毒之编程解析引导区
前言 通过之前的学习,相信大家已经对磁盘的引导区有了充分的认识.但是我们之前的学习都是利用现成的工具来对引导区进行解析的,而对于一名反病毒工程师而言,不单单需要有扎实的逆向分析功底,同时也需要有很强的 ...
- POJ 2396 构造矩阵(上下流)
题意: 要求构造一个矩阵,给你行和,列和,还有一些点的上下范围,输出一个满足题意的矩阵. 思路: 这个题目很经典,这是自己看上下流后接触的第一道题,感觉很基础的一道题目,现在我 ...
- POJ3614奶牛晒阳光DINIC或者贪心
题意: n个区间,m种点,每种点有ci个,如果一个点的范围在一个区间上,那么就可以消耗掉一个区间,问最多可以消耗多少个区间,就是这n个区间中,有多少个可能被抵消掉. 思路: 方 ...
- html个人笔记
HTML 1.1常用编辑器 dreamweaver.sublime.webstorm.Hbuilder.vscode 1.2 浏览器内核 分为渲染引擎和JS引擎 渲染引擎:它负责取得网页的内容(HTM ...
- Day008 下标越界及小结
数组的四个基本特点 其长度是确定的.数组一旦被创建,它的大小就是不可以改变的. 其元素必须是相同类型,不允许出现混合类型. 数组中的元素可以是任何数据类型,包括基本类型和引用类型. 数组变量属于引用类 ...