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语言实现推箱子游戏完整代码相关推荐

  1. c 语言推箱子vs,基于C语言实现推箱子游戏

    本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 代码在vs2013上测试运行. 思想: 1):地图用二维数组实现,箱子.墙壁.人等事物用不同的数字表示,遍历二维数组,遇到 ...

  2. c语言推箱子游戏实习报告,用C语言编写推箱子游戏

    本文实例为大家分享了C语言推箱子游戏的具体实现代码,供大家参考,具体内容如下 #include #include #include #include //行和列 #define ROW 10 #def ...

  3. 推箱子完整c语言程序,C语言实现推箱子游戏

    每天学习一点点,每天容易一点点.一个简单的C语言程序,用来复习c语言,代码通俗易懂.有什么问题望各位不吝赐教. 本文用最简单的C语言语句写个推箱子的程序,分享给大家: /*************** ...

  4. C语言之推箱子游戏代码

    每天学习一点点,每天容易一点点.一个简单的C语言程序,用来复习c语言,代码通俗易懂.有什么问题望各位不吝赐教. /******************************************* ...

  5. linux推箱子脚本,【编程例题】标准C语言实现推箱子游戏!附解析!

    今天我来分享一道对于初学C语言的同学非常有启发作用的编程例题,是用C语言实现单张地图推箱子的小游戏. 这个游戏是基于Linux环境下编程的,所用工具为ubuntu.和gcc编译器. 首先推箱子的地图, ...

  6. C语言小项目 -- 扫雷游戏完整代码(递归展开 + 选择标记)

    大家好,今天我们将一起用C语言实现一个经典小游戏 – 扫雷,Let is go ! 文章目录

  7. c语言语音控制游戏文献,C语言课程设计-基于C语言推箱子游戏设计-毕业论文文献.doc...

    gd工程职业技术学院毕业论文 基于C语言的推箱子游戏设计 Design of the push box Based on Combined Language 作者姓名: 学科专业: 应用电子技术 学院 ...

  8. c语言程序推箱子详细设计,C语言实现推箱子项目

    本文实例为大家分享了C语言实现推箱子的具体代码,供大家参考,具体内容如下 项目展示 首先介绍结构板,结构版是图形版的逻辑基础: 结构版效果图: 地图: 二维数组储存地图,0代表空地,1代表墙,4代表箱 ...

  9. C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流

    C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流 说明:学做了4关推箱子, 仅供初学者参考可用g++ 编译,可以将内容复制到TXT文件,将后缀改为".cp ...

  10. 推箱子游戏破解方案的MATLAB代码实现

    <推箱子>游戏破解方案的MATLAB代码实现 前言 文件介绍与使用说明 (1)主脚本Sokoban.m (2)函数can_box() (3)函数find_can_boy() (4)函数ha ...

最新文章

  1. linux怎么压缩后保留原文件,Linux 实现压缩保留源文件的方法
  2. java线程死锁_Java并发:隐藏线程死锁
  3. C++面试/技巧(四)
  4. MIP 2016年终总结
  5. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(5)...
  6. [导入][转]Blog写作十大必杀技
  7. Reverse Integer(C++)
  8. CAD软件中如何自定义CAD填充图案?
  9. 大气压力换算公式_压力公式换算
  10. HTML:如何创建表格
  11. Android WebView 下载没反应
  12. .net接入微信二维码支付(模式二)
  13. js 判断对象数组是否存在某一个对象(全)
  14. php培训班学多久,学php最快要多久? 学习路线?要不要报培训班?
  15. 条形图的几种处理方式
  16. 如何实现团队高效协作?
  17. syn flood攻击防范
  18. python公里转海里_海里换算(海里换算公里)
  19. hyperf接入阿里云nacos配置中心
  20. Nginx + Tomcat + Session学习 - ﹎敏ō - 博客园

热门文章

  1. Docker-Toolbox常见问题解决方案
  2. java泛型返回值 <T>T 和T的区别
  3. python语言月份缩写_Python替换月份为英文缩写的实现方法
  4. 副高 职称计算机 上海,高级职称评定
  5. linux log原理,linux系统日志管理工具logrotate之原理详述
  6. TeamViewer 可信设备的信任管理
  7. 10分钟明白为什么要使用微服务
  8. 面试中遇到的“黑嘴”现象
  9. 解决Latex中文PDF目录出现乱码问题
  10. 不知道如何识别图片文字?这个方法用了都说好