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;
}//主函数 

所有的代码就到这里了,如果需要完整代码可以留言

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

(0)

相关推荐

  • 推箱子游戏C语言实现代码

    今天我来分享一道对于初学C语言的同学非常有启发作用的编程例题,是用C语言实现单张地图推箱子的小游戏. 这个游戏是基于Linux环境下编程的,所用工具为ubuntu.和gcc编译器. 首先推箱子的地图,我们根据经典游戏推箱子中的其中一幅地图来自做,图片如下. 用图片形式实现这张图片对于初学编程的同学来说,难以实现,所以我们选择用字符代替的形式来实现这张地图. 我们采用2为数组的方式来存储这张地图,具体的数字与字符含义转换如下: 0 printf(" "); 路 2 printf(&quo

  • C语言代码实现推箱子小游戏

    本文实例为大家分享了C语言实现推箱子小游戏的具体代码,供大家参考,具体内容如下 本次游戏是个推箱子第一关最简单的小游戏 有详细注释,下面是做出来的游戏界面 游戏操作说明和功能说明: 1.按wasd控制小人的上下左右移动. 2.按 r 重新开始游戏 3.游戏开始有操作介绍 4.游戏结束有胜利提示 游戏原理分析 1.游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利. 2.按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给

  • C语言实现简单推箱子游戏

    使用C语言实现超简单的推箱子游戏,供大家参考,具体内容如下/p> 感谢您打开了这篇文章,下面我将讲述一下推箱子是如何实现的. 另外附赠适配该程序简单好用 专属推箱子地图编辑器 让您在16 * 16大地图的条件下也能轻松编辑地图. 链接:地图编辑器 本程序在没有检测到地图文件的情况下也能独自运行!代码中储存了推箱子游戏第一关的标准地图,让您在没有地图文件的情况下也能熟悉整个程序的流程! 当然,拥有地图文件会也会获得更好的游戏体验,请自行编辑. 废话不多说! 下面进入技术环节: C语言版 多功能推箱

  • C语言推箱子游戏实现代码

    推箱子游戏的运行规则:在街道上上小人推动箱子移动,直到把箱子移动到目的地. 思路分析: 小人及箱子的移动就是小人或者箱子和路的交换: 1 定义二维字符数组,存储地图 2 显示地图,提示游戏玩法 3 记录小人及箱子位置,并定义字符变量接收用户输入方向 4 循环判断语句 1).小人的下一步是否为路,如果为路,则移动并记录小人新位置信息 2).小人的下一步如果不是路,在判断是否为箱子,如果是箱子,在判断箱子的下一个位置是否是路,如果是路,则移动箱子和小人 3). 刷新地图 4) .判断箱子的位置,如果

  • Linux下用C语言实现推箱子游戏

    前面有Linux的常用命令和vim文本编辑器还没有介绍,之后我会补上的. 今天来介绍如何用C语言写一个简单的小游戏,叫做"小老鼠推箱子".虽然游戏的编写过程不复杂,但是我觉得能够从中找到自己对于编程的不足和完善自己的编程思维是最重要的.游戏代码不多,所以直接写在一个c文件中.本人小白,有不足之处还望指教 游戏介绍 下图是游戏开始界面,$是小老鼠,#是墙,O是终点,当小老鼠把所有箱子推进终点就代表游戏通过. 游戏思维 游戏地图用一个二维数组去存储.数组中不同的值代表不同的对象(老鼠.墙.

  • C语言实现推箱子项目

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

  • 基于C语言实现推箱子游戏

    本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 代码在vs2013上测试运行. 思想: 1):地图用二维数组实现,箱子.墙壁.人等事物用不同的数字表示,遍历二维数组,遇到不同的数字打印相应的图案即可. 2):按键移动原理:判断要移动的方向是怎样的障碍物,如果理论上可以移动的话,只需把对应位置的数字作相应更改即可. #include<stdio.h> #include<stdlib.h> #include<windows.h> #includ

  • 用C语言编写推箱子游戏

    本文实例为大家分享了C语言推箱子游戏的具体实现代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include<string.h> #include <conio.h> //行和列 #define ROW 10 #define COL 11 /* run this program using the console pauser or add your own getch, system(&quo

  • C语言实现推箱子游戏的地图编辑器

    推箱子地图编辑器,供大家参考,具体内容如下 由于我在写推箱子的时候苦于没有地图可以试验程序运行效果,而且去搜了好长时间都没有找到一个储存16*16地图版本的推箱子关卡数据信息的文件. 于是想到了写了一个地图编辑器用来自己设计地图的想法. 原本以为这个伟大的创意只有我才想的出来,结果搜索后才发现还有很多人有着与我相同的想法. 但,其他人写的编辑器大部分都不是C语言版本的,而这一个是C语言版本的. 另外说明一下,该编辑器的想法完全是我个人想法写出来的,不敢保证编辑习惯符合别人的习惯. 但本着,能够实

  • C语言实现推箱子游戏完整代码

    C语言实现推箱子游戏完整代码,供大家参考,具体内容如下 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 代码一共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数,一个作图. 手动设置地图 用'0'表示空格,"1"表示墙,"2"表示箱子,"3"表示人,"4"表示终点 这样可以提高代码的移植性 如需改为手动输入地图可以直接定义一个二维数组,在给他赋值就可以了 int

  • C语言实现推箱子游戏的代码示例

    很早就想过做点小游戏了,但是一直没有机会动手.今天闲来无事,动起手来.过程还是蛮顺利的,代码也不是非常难.今天给大家分享一下~ 一.介绍 开发语言:C语言 开发工具:Dev-C++ 5.11 日期:2019年9月28日 作者:ZackSock 也不说太多多余的话了,先看一下效果图: 游戏中的人物.箱子.墙壁.球都是字符构成的.通过wasd键移动,规则的话就是推箱子的规则,也就不多说了. 二.代码实现 关于代码方面,我尽可能讲的细致.希望大家可以理解~ (1)方法列表 //主函数 void mai

  • 用C语言实现推箱子游戏实例

    目录 前言 游戏效果图 游戏开发思路 游戏逻辑的分析 源代码实现 头文件 PushBackGame.c文件 test.c文件 总结 前言 本游戏需要用到的核心技术,如下: 二维数组分支语句 技术难点: 二维数组的应用和游戏的判断逻辑 只要会以上的技术的萌新都能做出很棒的游戏,博主本身也是一枚小白,如果源代码的某些地方有不足,请大佬在评论区指出. 游戏效果图 实际游玩效果图​​​​​ 游戏开发思路 分析游戏逻辑,再根据游戏分析游戏代码逻辑写出伪代码,再分析可能存在的问题,最后一步才是开发游戏. 游

  • C语言实现推箱子游戏

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

  • C语言实现推箱子小游戏

    本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1000 /* r目的地 o箱子 i人 x墙 路(空格) w上 a左 d右 s下 */ void menu(); int level1(); int level2(); void swap(char*,char*); int opera(char *p,int *

随机推荐