目录

1.判断操作有效性

2.移动操作

3.绘图

4.撤回操作

5.主要函数

6.源码


推箱子游戏的本质就是坐标的移动。我们假设人物当前的坐标是(x,y),那么向上移动后的位置就是(x-1,y),向下向左向右的位置依次就是(x+1,y)(x,y-1)(x,y+1)。

1.判断操作有效性

既然推箱子就是对坐标的移动,那么判定操作结果的依据就是移动到位置上的情况。假设人物向上移动,那么(x-1,y)位置上原先物品的情况就很重要了。假如(x-1,y)没有放置东西,那么人物直接移动过去便可;假如(x-1,y)上是无法移动的墙,那么对人物的这步操作就是无效的。如果(x-1,y)的位置上是箱子,那么又要对人物移动方向的下一个位置也就是(x-2,y)进行判断:如果(x-2,y)位置上是箱子或者墙,那么这次的操作同样是无效的(因为你没办法同时推动两个箱子,而墙本身也是无法移动)。因此,向上正确的操作只有两种情况:(x-1,y)上是空位、(x-1,y)上是箱子且(x-2,y)是空位。以此类推可以得到左右下其他三个方向的操作情况,在此就不再进行赘述。

if(a[x-1][y]==1)//对向上移动的判断,其中1为墙,2为箱子
{system("cls");draw2();//画图printf("无效操作"); return 0;
}if(a[x-1][y]==2&&(a[x-2][y]==1||a[x-2][y]==2)){system("cls");draw2();//画图printf("无效操作"); return 0;
}

2.移动操作

当我们判断好移动的有效性后,我们就要正式开始移动了。在操作有效的情况下,我们可以依据是否移动了箱子分出两类情况。假设没有移动箱子,那么直接将人物坐标移动过去即可。假如向上推动了箱子,那么箱子移动后的坐标即为(x-2,y),人物移动后的坐标即为(x-1,y)。

知道了推箱子的原理之后,我们就要开始写代码了。在这里,我通过数组储存地图信息,从而进行移动。其中0为空位,1为墙,2为箱子,3为推箱子的终点,4为人物。而对于推箱子的胜利条件,即箱子全部到达终点,这个操作在每一步操作结束后进行判断即可。在这里,我使用两个数组分别记录了当前地图和初始地图。当人物移动后,通过与初始地图进行比较对原先的位置情况进行复原。

x=x-1;//向上移动
if(a[x][y]==2)
{if(map1[x+1][y]==3)a[x+1][y]=3;else a[x+1][y]=0;if(map1[x-1][y]==3)mub=mub+1;//判断是否将箱子移动到终点if(map1[x][y]==3)mub=mub-1;//判断是否将箱子从终点移动出去a[x-1][y]=2;
}
else{if(map1[x+1][y]==3)a[x+1][y]=3;else a[x+1][y]=0;
}
a[x][y]=4;

3.绘图

到现在为止,推箱子游戏最主要的部分已经完成了,我们下面要做的就是将地图进行输出。

void draw()//画初始地图
{for(int i=0;i<10;i++){for(int j=0;j<10;j++){if(n==0)a[i][j]=map1[i][j];else if(n==1)a[i][j]=map2[i][j];else if(n==2)a[i][j]=map3[i][j];switch(a[i][j]){case 0:printf("  ");break;//空位case 1:printf("■");break; //墙case 2:printf("☆");break;//箱子case 3:printf("◎");break; //终点case 4:printf("♀");x=i;y=j;break;//人物}}printf("\n");}mub=0;bs=0;//初始化
}void draw2()//画图
{for(int i=0;i<10;i++){for(int j=0;j<10;j++){switch(a[i][j]){case 0:printf("  ");break;//空位case 1:printf("■");break;//墙case 2:printf("☆");break;//箱子case 3:printf("◎");break;//终点case 4:printf("♀");x=i;y=j;break;//人物}}printf("\n");}printf("你在本关使用的步数为:%d\n",bs);
}

4.撤回操作

到此为止,最基础的推箱子游戏已经完成了。

那么我们开始考虑是否需要增加一些新的功能,比如撤回操作。假如每次操作失误之后都必须重新开始,那么实在是太麻烦了。加入撤回功能之后就可以比较方便地进行操作。

在这里,我们使用链表对历史操作进行记录,从而实现撤回的功能。

对于链表我就不做详细介绍了,大家可以自行进行了解。当我们进行有效移动后,就在链表里生成新的节点;当需要撤回的时候,就从最后一个节点中取出上一步的位置情况,然后将最后一个节点删除即可。这样就可以通过链表进行撤回操作。

struct link *AppendNode(struct link *head)//声明创建节点函数
{struct link *p=NULL,*pr=head;//创建p指针,初始化为NULL;创建pr指针,通过pr指针来给指针域赋值 p=(struct link *)malloc(sizeof(struct link)) ; //为指针p申请内存空间,必须操作,因为p是新创建的节点 if(p==NULL)//如果申请内存失败,则退出程序 {printf("NO!\n");exit(0);}if(head==NULL)//如果头指针为NULL,说明现在链表是空表{head=p;//使head指针指向p的地址(p已经通过malloc申请了内存,所以有地址)}else//此时链表已经有头节点 ,再一次执行了AppendNode函数 {while(pr->next!=NULL)//当pr指向的地址,即此时的p的指针域不为NULL(即p不是尾节点) {pr=pr->next;//使pr指向头节点的指针域}pr->next=p; //使pr的指针域指向新键节点的地址,此时的next指针域是头节点的指针域 }p->xx=x;//给x赋值p->yy=y;//给y赋值p->xm=xnn;//给x赋值p->ym=ynn;//给y赋值p->fxx=fx;p->next=NULL;//新添加的节点位于表尾,所以它的指针域为NULL return head;//返回head的地址
}
void DisplayNode(struct link *head)//输出上一步的结果
{struct link *p=head;//定义p指针使其指向头节点 int j=0;//记录这是第几个数值 while(j!=nun)//因为p=p->next,所以直到尾节点打印结束 {p=p->next;//因为节点已经创建成功,所以每一个节点的指针域都指向了下一个节点)j++;}if(p->xm==0||p->ym==0)//没有推动箱子时 {if(map1[x][y]==3)a[x][y]=3;else if(map1[x][y]!=1)a[x][y]=0;x=p->xx;y=p->yy;a[x][y]=4;}else{a[x][y]=2;if(map1[x][y]==3)mub=mub+1;break;fx=p->fxx;if(fx==1)x=x-1;if(fx==2)y=y-1;if(fx==3)y=y+1;if(fx==4)x=x+1;if(map1[x][y]==3){a[x][y]=3;mub=mub-1;}else if(map1[x][y]!=1)a[x][y]=0;x=p->xx;y=p->yy;a[x][y]=4;}
}
void deleteNode(struct link *head,int n){//删除n处的节点 struct  link *p = head,*pr = head;int i =0;while(i<n&&p!=NULL){//到达指定节点,此时p指向指定节点,pr指向上一节点 pr=p;//将p的地址赋值给prp=p->next;//p指向下一节点i++;}if(p!=NULL){//当p不为空时,即p不能指向尾节点之后的节点pr->next = p->next;free(p);}
}

5.主要函数

void draw2();//画图
void draw();//画初始地图
int bd(int zl);//判断操作是否有效
void pd(int zl);//进行移动
void chh();//初始化
void DisplayNode(struct link *head);//输出函数,打印链表
void deleteNode(struct link *head,int n);//操作撤回
struct link *AppendNode(struct link *head);//声明创建节点函数

6.源码

到目前为止,推箱子游戏已经大致完成,在最后,我又加入了对文件的读入输出,从而实现对玩家信息的读取和储存。在这个推箱子游戏的设计中,我使用了三种不同的地图,原本想用三维数组进行储存,但是不知道为什么频繁报错,最后使用了三个二维数组进行储存,导致最后的代码变得非常冗长笨重(自己都看不下去了)。本人还是新手,希望能够见谅。

源码如下,可直接使用:

#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
using namespace std;
int i,j,k,n,m;
int name,cjjj;
int wzz,rs,zqx,uu;
string xm,xmm;//姓名
int fx;//运动的方向
int nun;//创立的节点数
int df;//每关的小分
int ch;//键位
int def;//得分
int mub;//目标达成情况
int xy;//人物当前位置原先的图标
int x,y;//人的坐标
int xnn,ynn;//移动后是否有移动箱子
int bs;//步数
int zbs;//总步数
int a[11][11];//当前地图
int bj[4]={6,7,4};//终点数目
int best[4]={29,34,47};//最优解步数
FILE *fp;
int map1[11][11]={{1,1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,3,1,1},{1,3,0,0,0,0,2,0,1,1},{1,1,2,1,1,1,1,0,1,1},{1,1,0,1,3,3,1,0,1,1},{1,1,0,1,0,0,1,0,1,1},{1,1,0,1,2,2,1,2,1,1},{1,1,4,2,0,0,0,0,3,1},{1,1,3,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1,1,1}};//地图1
int map2[11][11]={{1,1,1,1,1,1,1,1,1,1},{1,0,1,0,0,0,0,0,0,1},{1,1,1,0,0,0,0,0,0,1},{1,3,4,2,0,0,1,0,0,1},{1,1,1,0,2,3,1,0,0,1},{1,3,1,1,2,0,1,0,0,1},{1,0,1,0,3,0,1,1,0,1},{1,2,2,3,2,2,3,1,0,1},{1,0,0,0,3,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};//地图2
int map3[11][11]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,1},{1,1,1,0,4,0,1,0,0,1},{1,1,0,2,0,2,0,1,0,1},{1,1,0,0,1,0,0,1,0,1},{1,1,0,2,0,2,0,1,0,1},{1,1,3,3,3,3,1,0,0,1},{1,0,1,1,1,1,0,0,0,1},{1,0,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}}; //0为路,1为墙,2为箱子,3为终点,4为人 struct link{int xx,yy,xm,ym,fxx;//定义数据域 struct link *next;//定义指针域
};//链表记录历史操作 struct cr{char namee[20];
}namm;//玩家姓名的输入 struct xxi{char name[100];//姓名 int cj,gq;//成绩和关卡进度
}rwu[100];//全部玩家的数据 void draw2();//画图
void draw();//画初始地图
int bd(int zl);//判断操作是否有效
void pd(int zl);//进行移动
void chh();//初始化
void DisplayNode(struct link *head);//输出函数,打印链表
void deleteNode(struct link *head,int n);//操作撤回
struct link *AppendNode(struct link *head);//声明创建节点函数int main()
{struct link *head=NULL;chh();head=AppendNode(head);//初始化界面 while((ch=getch())!=0x1B)//有击键发生{ch=getch();//获取键盘值,上为72,下为80,左为75,右为77if(ch==72||ch==75||ch==77||ch==80){if(bd(ch))//操作合理性 {switch(ch)//将操作的情况记录在链表 {case 72:if(a[x-1][y]==2){xnn=x-1;ynn=y;fx=1;}else{xnn=0;ynn=0;}break;case 75:if(a[x][y-1]==2){xnn=x;ynn=y-1;fx=2;}else{xnn=0;ynn=0;}break;case 77:if(a[x][y+1]==2){xnn=x;ynn=y+1;fx=3;}else{xnn=0;ynn=0;}break;case 80:if(a[x+1][y]==2){xnn=x+1;ynn=y;fx=4;}else{xnn=0;ynn=0;}break;}head=AppendNode(head);//记录当前坐标位置 nun=nun+1;//节点数+1 }pd(ch);//进行移动 if(mub==bj[n])//完成一关 {system("cls");draw2();//初始化地图 df=100-bs+best[n];//计算得分 zbs=zbs+bs;//总步数 if(df<0)df=0;printf("恭喜你通过此关\n");printf("你在本关使用的步数为:%d\n",bs);printf("你在本关的得分是:%d\n",df);printf("按任意按键开始下一关");def=def+df;//总得分 n=n+1;//关卡进度 fp=fopen("1.txt","w");//打开文件记录通过情况 fprintf(fp,"%d\n",rs);//记录的人数if(zqx)//检验是否曾用名{fprintf(fp,"%s\n",namm.namee);fprintf(fp,"%d\n",def);fprintf(fp,"%d\n",n);}for(int uu=1;uu<=rs;uu++){if(uu==wzz){if(def>rwu[uu].cj)rwu[uu].cj=def;if(n+1>rwu[uu].gq)rwu[uu].gq=n;}fprintf(fp,"%s\n",rwu[uu].name);//存储姓名 fprintf(fp,"%d\n",rwu[uu].cj);//存储分数 fprintf(fp,"%d\n",rwu[uu].gq);//存储通关情况 }fclose(fp);//文件关闭 if(n==3&&(ch=getch())!=0x1B){system("cls");printf("恭喜你完成游戏\n");printf("你使用的总步数为:%d\n",zbs);printf("你的总得分是:%d",def);freopen("1.txt","w",stdout);//文件打开printf("%d\n",rs);//记录的人数if(zqx){printf("%s\n",namm.namee);printf("%d\n",def);printf("%d\n",n);}for(int uu=1;uu<=rs;uu++){if(uu==wzz){if(def>rwu[uu].cj)rwu[uu].cj=def;if(n+1>rwu[uu].gq)rwu[uu].gq=n;}printf("%s\n",rwu[uu].name);//存储姓名 printf("%d\n",rwu[uu].cj);//存储分数 printf("%d\n",rwu[uu].gq);//存储通关情况 }fclose(stdout);//文件关闭 Sleep(3000); //延迟关闭 return 0;}for(int i=nun;i>0;i--){deleteNode(head,i);}if((ch=getch())!=0x1B){system("cls");draw();nun=0;head=NULL;head=AppendNode(head);}} else{system("cls");draw2();//清空并画图 }}else if(ch==8&&bs>0&&nun>0)//撤销操作 {DisplayNode(head);deleteNode(head,nun);nun=nun-1;bs=bs-1;//步数撤回 system("cls");draw2();}else if(ch==13){for(int i=nun;i>0;i--){deleteNode(head,i);}system("cls");chh();}else{system("cls");draw2();printf("请输入空格键后再输入方向键"); //输入了非方向键 }}return 0;
}void chh()//初始化
{n=0;mub=0;def=0;zbs=0;nun=0;//归零 for(int i=0;i<10;i++)for(int j=0;j<10;j++)a[i][j]=map1[i][j];printf("                 推箱子游戏\n");printf("游戏规则:\n");printf("☆代表箱子,◎代表箱子的目的地,♀代表人所处的位置\n");printf("通过使用方向键操控人物进行移动\n");printf("人物通过移动可以推动相邻一个箱子\n");printf("如果目标方向有两个及以上的箱子或者有墙则无法移动\n");printf("将所有箱子推到目的地即可进入下一关\n");printf("当你连续输入两次回格即可进行撤销操作\n");printf("当你连续输入两次回车键即可重新开始游戏\n\n");printf("本游戏共有三关,可以使用数字键1 2 3选择关卡\n"); printf("请输入你的姓名:\n"); scanf("%s",&namm.namee);//输入姓名 zqx=1;freopen("1.txt","r",stdin);//读取文件 scanf("%d",&rs);for(uu=1;uu<=rs;uu++){scanf("%s",&rwu[uu].name);scanf("%d",&rwu[uu].cj);scanf("%d",&rwu[uu].gq);if(strcmp(rwu[uu].name,namm.namee)==0){zqx=0;wzz=uu;}}if(zqx)rs=rs+1;fclose(stdin);if(zqx==0)printf("你的历史最佳成绩为:%d\n",rwu[wzz].cj);if(zqx==0)printf("你的历史最佳进度为:完成第%d关\n",rwu[wzz].gq);printf("按任意按键开始游戏\n");if((ch=getch())!= 0x1B){switch(ch){case 49:n=0;break;case 50:n=1;break;case 51:n=2;break;}system("cls");draw();//画图 }
}void pd(int zl)//进行移动
{if(bd(zl)==0)return;bs=bs+1;switch(zl){case 72://上 x=x-1;if(a[x][y]==2){switch(n){case 0:if(map1[x+1][y]==3)a[x+1][y]=3;else a[x+1][y]=0;if(map1[x-1][y]==3)mub=mub+1;if(map1[x][y]==3)mub=mub-1;a[x-1][y]=2;break;case 1:if(map2[x+1][y]==3)a[x+1][y]=3;else a[x+1][y]=0;if(map2[x-1][y]==3)mub=mub+1;if(map2[x][y]==3)mub=mub-1;a[x-1][y]=2;break;case 2:if(map3[x+1][y]==3)a[x+1][y]=3;else a[x+1][y]=0;if(map3[x-1][y]==3)mub=mub+1;if(map3[x][y]==3)mub=mub-1;a[x-1][y]=2;break;}}else{switch(n){case 0:if(map1[x+1][y]==3)a[x+1][y]=3;else a[x+1][y]=0;break;case 1:if(map2[x+1][y]==3)a[x+1][y]=3;else a[x+1][y]=0;break;case 2:if(map3[x+1][y]==3)a[x+1][y]=3;else a[x+1][y]=0;break;}}break;case 75://左 y=y-1;if(a[x][y]==2){switch(n){case 0:if(map1[x][y+1]==3)a[x][y+1]=3;else a[x][y+1]=0;if(map1[x][y-1]==3)mub=mub+1;if(map1[x][y]==3)mub=mub-1;a[x][y-1]=2;break;case 1:if(map2[x][y+1]==3)a[x][y+1]=3;else a[x][y+1]=0;if(map2[x][y-1]==3)mub=mub+1;if(map2[x][y]==3)mub=mub-1;a[x][y-1]=2;break;case 2:if(map3[x][y+1]==3)a[x][y+1]=3;else a[x][y+1]=0;if(map3[x][y-1]==3)mub=mub+1;if(map3[x][y]==3)mub=mub-1;a[x][y-1]=2;break;}}else{switch(n){case 0:if(map1[x][y+1]==3)a[x][y+1]=3;else a[x][y+1]=0;break;case 1:if(map2[x][y+1]==3)a[x][y+1]=3;else a[x][y+1]=0;break;case 2:if(map3[x][y+1]==3)a[x][y+1]=3;else a[x][y+1]=0;break;}}break;case 77://右 y=y+1;if(a[x][y]==2){switch(n){case 0:if(map1[x][y-1]==3)a[x][y-1]=3;else a[x][y-1]=0;if(map1[x][y+1]==3)mub=mub+1;if(map1[x][y]==3)mub=mub-1;a[x][y+1]=2;break;case 1:if(map2[x][y-1]==3)a[x][y-1]=3;else a[x][y-1]=0;if(map2[x][y+1]==3)mub=mub+1;if(map2[x][y]==3)mub=mub-1;a[x][y+1]=2;break;case 2:if(map3[x][y-1]==3)a[x][y-1]=3;else a[x][y-1]=0;if(map3[x][y+1]==3)mub=mub+1;if(map3[x][y]==3)mub=mub-1;a[x][y+1]=2;break;}}else{switch(n){case 0:if(map1[x][y-1]==3)a[x][y-1]=3;else a[x][y-1]=0;break;case 1:if(map2[x][y-1]==3)a[x][y-1]=3;else a[x][y-1]=0;break;case 2:if(map3[x][y-1]==3)a[x][y-1]=3;else a[x][y-1]=0;break;}}break;case 80://下 x=x+1;if(a[x][y]==2){switch(n){case 0:if(map1[x-1][y]==3)a[x-1][y]=3;else a[x-1][y]=0;if(map1[x+1][y]==3)mub=mub+1;if(map1[x][y]==3)mub=mub-1;a[x+1][y]=2;break;case 1:if(map2[x-1][y]==3)a[x-1][y]=3;else a[x-1][y]=0;if(map2[x+1][y]==3)mub=mub+1;if(map2[x][y]==3)mub=mub-1;a[x+1][y]=2;break;case 2:if(map3[x-1][y]==3)a[x-1][y]=3;else a[x-1][y]=0;if(map3[x+1][y]==3)mub=mub+1;if(map3[x][y]==3)mub=mub-1;a[x+1][y]=2;break;}}else{switch(n){case 0:if(map1[x-1][y]==3)a[x-1][y]=3;else a[x-1][y]=0;break;case 1:if(map2[x-1][y]==3)a[x-1][y]=3;else a[x-1][y]=0;break;case 2:if(map3[x-1][y]==3)a[x-1][y]=3;else a[x-1][y]=0;break;}}break;}a[x][y]=4;return;
}
int bd(int zl)//判断操作是否有效
{switch(zl){case 77://右if(a[x][y+1]==1){system("cls");draw2();printf("无效操作"); return 0;}if(a[x][y+1]==2&&(a[x][y+2]==1||a[x][y+2]==2)){system("cls");draw2();printf("无效操作"); return 0;}break;case 80://下if(a[x+1][y]==1){system("cls");draw2();printf("无效操作"); return 0;}if(a[x+1][y]==2&&(a[x+2][y]==1||a[x+2][y]==2)){system("cls");draw2();printf("无效操作"); return 0;}break;case 72: //上 if(a[x-1][y]==1){system("cls");draw2();printf("无效操作"); return 0;}if(a[x-1][y]==2&&(a[x-2][y]==1||a[x-2][y]==2)){system("cls");draw2();printf("无效操作"); return 0;}break;case 75: //左 if(a[x][y-1]==1){system("cls");draw2();printf("无效操作"); return 0;}if(a[x][y-1]==2&&(a[x][y-2]==1||a[x][y-2]==2)){system("cls");draw2();printf("无效操作"); return 0;}break;}return 1;
}
void draw()//画初始地图
{for(int i=0;i<10;i++){for(int j=0;j<10;j++){if(n==0)a[i][j]=map1[i][j];else if(n==1)a[i][j]=map2[i][j];else if(n==2)a[i][j]=map3[i][j];switch(a[i][j]){case 0:printf("  ");break;case 1:printf("■");break; case 2:printf("☆");break;case 3:printf("◎");break; case 4:printf("♀");x=i;y=j;break;}}printf("\n");}mub=0;bs=0;
}
void draw2()//画图
{for(int i=0;i<10;i++){for(int j=0;j<10;j++){switch(a[i][j]){case 0:printf("  ");break;case 1:printf("■");break; case 2:printf("☆");break;case 3:printf("◎");break; case 4:printf("♀");x=i;y=j;break;}}printf("\n");}printf("你在本关使用的步数为:%d\n",bs);
}struct link *AppendNode(struct link *head)//声明创建节点函数
{struct link *p=NULL,*pr=head;//创建p指针,初始化为NULL;创建pr指针,通过pr指针来给指针域赋值 p=(struct link *)malloc(sizeof(struct link)) ; //为指针p申请内存空间,必须操作,因为p是新创建的节点 if(p==NULL)//如果申请内存失败,则退出程序 {printf("NO!\n");exit(0);}if(head==NULL)//如果头指针为NULL,说明现在链表是空表{ head=p;//使head指针指向p的地址(p已经通过malloc申请了内存,所以有地址)}else//此时链表已经有头节点 ,再一次执行了AppendNode函数 {while(pr->next!=NULL)//当pr指向的地址,即此时的p的指针域不为NULL(即p不是尾节点) {pr=pr->next;//使pr指向头节点的指针域}pr->next=p;    //使pr的指针域指向新键节点的地址,此时的next指针域是头节点的指针域 }p->xx=x;//给x赋值p->yy=y;//给y赋值p->xm=xnn;//给x赋值p->ym=ynn;//给y赋值p->fxx=fx;p->next=NULL;//新添加的节点位于表尾,所以它的指针域为NULL return head;//返回head的地址
}void DisplayNode(struct link *head)//输出上一步的结果
{struct link *p=head;//定义p指针使其指向头节点 int j=0;//记录这是第几个数值 while(j!=nun)//因为p=p->next,所以直到尾节点打印结束 {p=p->next;//因为节点已经创建成功,所以每一个节点的指针域都指向了下一个节点)j++;}if(p->xm==0||p->ym==0)//没有推动箱子时 {switch(n){case 0:if(map1[x][y]==3)a[x][y]=3;else if(map1[x][y]!=1)a[x][y]=0;break;case 1:if(map2[x][y]==3)a[x][y]=3;else if(map2[x][y]!=1)a[x][y]=0;break;case 2:if(map3[x][y]==3)a[x][y]=3;else if(map3[x][y]!=1)a[x][y]=0;break;}x=p->xx;y=p->yy;a[x][y]=4;}else{a[x][y]=2;switch(n){case 0:if(map1[x][y]==3)mub=mub+1;break;case 1:if(map2[x][y]==3)mub=mub+1;break;case 2:if(map3[x][y]==3)mub=mub+1;break;}fx=p->fxx;if(fx==1)x=x-1;if(fx==2)y=y-1;if(fx==3)y=y+1;if(fx==4)x=x+1;switch(n){case 0:if(map1[x][y]==3){a[x][y]=3;mub=mub-1;}else if(map1[x][y]!=1)a[x][y]=0;break;case 1:if(map2[x][y]==3){a[x][y]=3;mub=mub-1;}else if(map2[x][y]!=1)a[x][y]=0;break;case 2:if(map3[x][y]==3){a[x][y]=3;mub=mub-1;}else if(map3[x][y]!=1)a[x][y]=0;break;}x=p->xx;y=p->yy;a[x][y]=4;}
}void deleteNode(struct link *head,int n){//删除n处的节点 struct  link *p = head,*pr = head;int i =0;while(i<n&&p!=NULL){//到达指定节点,此时p指向指定节点,pr指向上一节点 pr = p;//将p的地址赋值给prp = p->next;//p指向下一节点i++;}if(p!=NULL){//当p不为空时,即p不能指向尾节点之后的节点pr->next = p->next;free(p);}
}

c++实现推箱子游戏(带链表)相关推荐

  1. c#推箱子小游戏代码_C# 推箱子游戏源码(带音效/关卡)

    C# 推箱子游戏源码(带音效/关卡) c# 2021-1-29 下载地址 https://www.codedown123.com/62444.html Vs2010 FrameWork 4.0 具有音 ...

  2. 基于java的推箱子游戏系统设计与实现(项目报告+答辩PPT+源代码+部署视频)

    项目报告 基于Java的推箱子游戏设计与实现 社会在进步,人们生活质量也在日益提高.高强度的压力也接踵而来.社会中急需出现新的有效方式来缓解人们的压力.此次设计符合了社会需求,Java推箱子游戏可以让 ...

  3. 一文教你使用java开发一款推箱子游戏

    导读:社会在进步,人们生活质量也在日益提高.高强度的压力也接踵而来.社会中急需出现新的有效方式来缓解人们的压力.此次设计符合了社会需求,Java推箱子游戏可以让人们在闲暇之余,体验游戏的乐趣.具有操作 ...

  4. 小白的编程经验(二维数组推箱子游戏)

    推箱子游戏和迷宫游戏有异曲同工之妙,不过在游戏玩法实现上略有不同,需要考虑的情况更多更复杂. 项目代码放在了码云(gitee)上,有兴趣的可以下载看看. https://gitee.com/YHF_2 ...

  5. 【java毕业设计】基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)——推箱子游戏

    基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+Eclipse的推箱子游戏设计与实现,文章末尾附有本毕业设计的论文 ...

  6. 推箱子游戏java毕业答辩ppt_基于Java推箱子游戏的设计与实现

    基于Java推箱子游戏的设计与实现(任务书,外文翻译,毕业论文20000字,程序代码,答辩PPT) 摘    要 社会在进步,人们生活质量也在日益提高.高强度的压力也接踵而来.社会中急需出现新的有效方 ...

  7. EasyX实现推箱子游戏

    文章目录 1 项目需求 2 模块划分 3 项目实现 3.1 地图初始化 3.2 热键控制 3.3 推箱子控制 3.4 游戏结束 1 项目需求 实现一款推箱子游戏,效果如下图所示,具体规则: 箱子只能推 ...

  8. 项目: 推箱子游戏【c/c++】

    很早之前写的一个推箱子的游戏 目录 最终效果 代码 最终效果 代码 #include<stdio.h> #include<stdlib.h> #include<graph ...

  9. c语言多关卡推箱子程序,多关卡地图推箱子游戏

    多关卡地图推箱子游戏 # include # include # include //调出地图 void file(int map[14][16],int n,int flag) //n表示关卡数 , ...

最新文章

  1. 公务员_只愿与一人十指紧扣_新浪博客
  2. linux下如何查看文件大小 快速找到最大文件的方法
  3. Ajax实战:Ajax的四个基本原则
  4. 批量将图片保存到模拟器
  5. django1.4 关于处理静态文件的问题
  6. YbtOJ#662-交通运输【线段树合并,树状数组】
  7. 造车厂入局网约车 新能源低运营成本或打破“烧钱”怪圈
  8. python小人画爱心_用Python画一颗心、小人发射爱心(附源码)
  9. java关闭数据库连接_java 和数据库连接如果不关闭会怎么样
  10. 软考一些可能有用的链接
  11. UBUNTU系统设置窗口打不开解决办法(精)
  12. 提高网吧上座率,TG-NET网吧光纤万兆方案
  13. iOS开发者账号Agent更换
  14. 北京中医药大学22春《生物化学B》平时作业1【专职辅导答案】
  15. Django分页,过滤:
  16. mac Node 安装及部署
  17. 计算机二级考试c语言冲刺,计算机二级考试试题C语言冲刺试题
  18. 汉威大厦中智公积金_中智租房支取公积金相关说明
  19. 最近更换系统盘踩了不少坑,主要是软件运行错误,造成原成原系统盘被损毁
  20. 036 Rust死灵书之Vec的完整代码测试

热门文章

  1. 《数据清洗》——kettle基本工具的使用
  2. 111、Flutter 实现动画颜色渐变效果
  3. 公司用的非标普通自动化用单片机还是plc_自动化专业现在吃香吗?
  4. opencv进阶-背景建模-(帧差法与混合高斯模型)
  5. 时序预测 | MATLAB实现BiLSTM时间序列未来多步预测
  6. 【UCOSIII操作系统】任务篇(1)创建任务
  7. LNK2005之解决办法
  8. 杭电通信841考研考研经验交流及资料分享
  9. 【GANs学习笔记】(十八)LAPGAN、ProGAN、SRGAN
  10. IDEA查看jks文件