🐱🚀个人博客【C++开发实例】如何使用C++做个简单的推箱子
🐱👤收录专栏:C++开发实例
🐱👓专栏目标:分享一些所学知识和编程实例
🐱💻作者:敲代码的猫(Codemon)
今天向大家介绍一下如何使用C++来写一个推箱子游戏的代码
一、思路
首先要做出推箱子,我们先要明确它的思路是什么:
如图,在一个推箱子游戏中,我们首先要有一个二维的地图,并在地图中加入障碍物,箱子,小人,还有箱子需要到达的指定地点。当然,简单的把这些呈现出来是很简单的,如下面的代码:
#include<iostream>
using namespace std;
int main()
{
cout<<"\n\n";
cout<<" ### "<<endl;
cout<<" #*# "<<endl;
cout<<" # # "<<endl;
cout<<" ####O######"<<endl;
cout<<" #* OH O *#"<<endl;
cout<<" #####O#####"<<endl;
cout<<" # # "<<endl;
cout<<" #*# "<<endl;
cout<<" ### "<<endl;
return 0;
}
运行结果如图:
该代码呈现了一个简单的推箱子地图和内容,其中我们用”#“来做墙壁障碍,“H”代表小人,“O”是箱子,“*”就是箱子要到达的指定地点。
但是我们只是将这些因素呈现了出来,或者说它更像是一个图片,和你在本子上画了一个图没有区别,它不能叫做游戏。要想使它成为游戏,我们还要在里面加上移动系统,使小人“H”移动起来,并且还可以推着箱子“O”移动,障碍物墙壁也要起到格挡的作用,当箱子到达*处时,还要显示通关。
1.1移动系统
首先我们要解决让小人H动起来的问题,而且对于一个游戏来说,”H“的运动需要玩家通过键盘来操控,也就是说玩家输入指定字符,H要做出位置的变化。这一点我们可以想象H在一个平面直角坐标系中,当我们输入上下左右之类的案件,会使H的坐标发生不同的变化。这个想法利用二维数组解决。
1.2迷宫
如,我们先用二维数组初始化一个简单的迷宫:
char a[50][50]={
"OOOOOOOOOOOOOOO",
"OH O O O",
"OOO O OO O OO O",
"O O O O O",
"OO OOO O OO OOO",
"OO O O O",
"OOOOOOOO OO O O",
"OO O O O",
"OO OOOOOOOO O O",
"OO O O O",
"OO OOOOOOO OO O",
"OO O O O",
"OOOOOOOO O OO",
"OOOOOOOOOOOO OO",};
这里的char[50][50]是我往大了点写的,写小点数完全可以,只要能把你的迷宫放进去就行。我们先用O来做墙壁,H做小人。这样就有了H的初始坐标(1,1)和迷宫的出口坐标(13,12)。接下来就是想办法让H动起来了,我们使用“w,d,a,s”分别来控制上下左右,这样就涉及到了一个输入的程序。
需要使用头文件
#include<conio.h>
和函数:
getch();
该函数的作用是进行输入值,但是它于我们的“cin>>”和“scanf()”不同的是,使用getch()函数输入不需要按回车。很容易理解,因为我们在游戏中不能让H走动一下按一下回车。所以接下来我们写定义两个坐标,和输入走动按键的程序:
int i,x,y,p,q;
char z;
x=1,y=1,p=13,q=12;//用x,y表示H坐标,p,q表示迷宫出口坐标
z=getch();//移动键的输入
现在有了坐标,我们就可以做移动系统了,通过if语句来实现,比如要控制H向上移动,我们需要按w键,代码如下:
if(z=='w')
{
if(a[x-1][y]!='O')
{
a[x][y]=' ';
x--;
a[x][y]='H';
}
}
显然,我们不能让H撞到障碍物,所以当H移动后的下一个坐标处不是墙壁“O”才行。并且,移动一次之后,H原来的坐标处要变成空的,即用空格来表示。然后将移动后的位置变成H,这样我们就完成了H向上移动的代码,同理,我们可以写出其他三个方向移动的代码:
if(z=='s')
{
if(a[x+1][y]!='O')
{
a[x][y]=' ';
x++;
a[x][y]='H';
}
}
if(z=='d')
{
if(a[x][y+1]!='O')
{
a[x][y]=' ';
y++;
a[x][y]='H';
}
}
if(z=='a')
{
if(a[x][y-1]!='O')
{
a[x][y]=' ';
y--;
a[x][y]='H';
}
}
但是有了这些我们怎么让计算机将移动后的样子显示出来呢?
这里要用到程序:
system("cls");
这是一个清屏程序,它的执行速度很快,所以我们可以在执行完清屏操作后立即将移动后的程序输出,这样看起来就是H进行了一次移动。为了使H可以无限次的移动,我们将移动系统的代码加在循环里,具体如下:
char a[50][50]= {
"OOOOOOOOOOOOOOO",
"OH O O O",
"OOO O OO O OO O",
"O O O O O",
"OO OOO O OO OOO",
"OO O O O",
"OOOOOOOO OO O O",
"OO O O O",
"OO OOOOOOOO O O",
"OO O O O",
"OO OOOOOOO OO O",
"OO O O O",
"OOOOOOOO O OO",
"OOOOOOOOOOOO OO",};
int i,x,y,p,q;
char z;
x=1,y=1,p=13,q=12;
for(i=0;i<=13;i++)
puts(a[i]);
while(1)
{
z=getch();
if(z=='s')
{
if(a[x+1][y]!='O')
{
a[x][y]=' ';
x++;
a[x][y]='H';
}
}
if(z=='d')
{
if(a[x][y+1]!='O')
{
a[x][y]=' ';
y++;
a[x][y]='H';
}
}
if(z=='a')
{
if(a[x][y-1]!='O')
{
a[x][y]=' ';
y--;
a[x][y]='H';
}
}
if(z=='w')
{
if(a[x-1][y]!='O')
{
a[x][y]=' ';
x--;
a[x][y]='H';
}
}
system("cls");
for(i=0;i<=13;i++)
puts(a[i]);
}
这样你就可以控制H在你做的迷宫中任意的走动了。但是要想使它成为一个游戏,我们还需要加入获胜条件,对于迷宫来说,胜利条件就是到达出口处,这样我们就能加入程序“在到达出口时,跳出循环,并宣布获胜”
即:
if(x==p&&y==q)
break;
和:
system("cls");
printf("You win!");
为了让程序结束后再停顿几秒,可以加入由#include<windows.h>头文件中的Sleep()函数
再为你的迷宫加上喜欢的颜色,最终代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
int main()
{
system("color 0a");
char a[50][50]={
"OOOOOOOOOOOOOOO",
"OH O O O",
"OOO O OO O OO O",
"O O O O O",
"OO OOO O OO OOO",
"OO O O O",
"OOOOOOOO OO O O",
"OO O O O",
"OO OOOOOOOO O O",
"OO O O O",
"OO OOOOOOO OO O",
"OO O O O",
"OOOOOOOO O OO",
"OOOOOOOOOOOO OO",};
int i,x,y,p,q;
char z;
x=1,y=1,p=13,q=12;
for(i=0;i<=13;i++)
puts(a[i]);
while(1)
{
z=getch();
if(z=='s')
{
if(a[x+1][y]!='O')
{
a[x][y]=' ';
x++;
a[x][y]='H';
}
}
if(z=='d')
{
if(a[x][y+1]!='O')
{
a[x][y]=' ';
y++;
a[x][y]='H';
}
}
if(z=='a')
{
if(a[x][y-1]!='O')
{
a[x][y]=' ';
y--;
a[x][y]='H';
}
}
if(z=='w')
{
if(a[x-1][y]!='O')
{
a[x][y]=' ';
x--;
a[x][y]='H';
}
}
if(x==p&&y==q)
break;
system("cls");
for(i=0;i<=13;i++)
puts(a[i]);
}
system("cls");
printf("You win!");
Sleep(5000);
system("pause");
return 0;
}
如图,H已经可以移动,并且在到达出口时赢得游戏了!
1.3推箱子的移动系统
有了做迷宫的方法,我们便只需要对移动系统进行稍微改进就可以做出推箱子游戏了。
要知道,推箱子和迷宫唯一不同的,也是唯一的难点就是“箱子”。我们不光要控制H的移动,还有箱子O是被“推动”的。这样一来,if语句要判断的内容就多了。比如:箱子移动的下一个坐标处是不是墙、箱子的下一个坐标处是不是箱子。还有我们在玩经典推箱子时会发现:箱子遇到了*时要有变化,比如变颜色。那我们可以把小球O这个箱子变成@,但这也需要代码来解决。还有当小人走到了*处时,*会变成小人H,可小人H离开后,该点又要变成*,箱子进入*里要变成@,可出来又要变成O,这些这种种因素我们都要考虑进去。
但它们的原理都是和迷宫的不撞墙的一样的,所以我就不一一解释这些了,直接看代码:
if(z=='w')
{
if(a[x-1][y]!='#')
{
if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]!=' ')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='@';
}
else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
}
}
}
if(z=='a')
{
if(a[x][y-1]!='#')
{
if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]!=' ')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='@';
}
else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
}
}
}
if(z=='d')
{
if(a[x][y+1]!='#')
{
if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]!=' ')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='@';
}
else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
}
}
}
if(z=='s')
{
if(a[x+1][y]!='#')
{
if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]!=' ')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='@';
}
else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
}
}
}
这就是推箱子的移动系统,就是依据迷宫的框架进行完善移动条件。
1.4其他细节
我们知道,推箱子的胜利条件是将所有箱子都移动到指定位置,所以相比于迷宫的到达出口,我们只是多了几个判断的坐标而已。而推箱子没有过关失败的触发,可当我们将箱子推到了死角处时,就无法继续游戏通过了,所以我们还要加设重新开始的程序,比如按“r”,关卡就会重置。根据这些细节,下面小编列出一个最简单的推箱子关卡:
{
a:
char a[20][20]={
" ",
" ",
" ### ",
" #*# ",
" # # ",
" ####O######",
" #* OH O *#",
" #####O#####",
" # # ",
" #*# ",
" ### "};
system("cls");
for(int i=0;i<=11;i++)
{
puts(a[i]);
}
int x,y;
x=6,y=7;
while(1)
{
char z;
z=getch();
if(z=='w')
{
if(a[x-1][y]!='#')
{
if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]!=' ')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='@';
}
else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
}
}
}
if(z=='a')
{
if(a[x][y-1]!='#')
{
if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]!=' ')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='@';
}
else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
}
}
}
if(z=='d')
{
if(a[x][y+1]!='#')
{
if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]!=' ')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='@';
}
else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
}
}
}
if(z=='s')
{
if(a[x+1][y]!='#')
{
if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]!=' ')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='@';
}
else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
}
}
}
if(z=='r')
goto a;
check1(a);
system("cls");
for(int i=0;i<=11;i++)
{
puts(a[i]);
}
if(a[6][3]=='@'&&a[6][11]=='@'&&a[9][7]=='@'&&a[3][6]=='@')
{
Sleep(1500);break;}
}
system("cls");
cout<<"\n\n 这只是第一关哦,来看看下一关吧!";
Sleep(3000);
}
这是完整的推箱子第一关,关于重置关卡的问题,我采用了C++中一个非常好用的代码:
a:
goto a;
你可以选择一个你喜欢的标记,可以是单词也可以是字母,在你代码中需要的位置加上它并带着冒号,只要有了这个标记,当下面遇到了代码goto就会无条件的立刻返回你的标记处。这样对于推箱子,当我们按下r时,就可以返回最开始处重置你的关卡,起到了重新开始的作用。
二、check函数
check函数用于检测当小人走到*处或@处或O处时,会将其覆盖,但是离开时如果不做处理,在移动后就会变成空白,因此需要对这些点位进行处理。当然我们也可以在优化后将此操作放入移动系统中,这是小编刚入门时写的代码,因此还是有一些待优化的地方
void check1(char a[][20])
{
if(a[6][3]=='O')
a[6][3]='@';
if(a[3][6]=='O')
a[3][6]='@';
if(a[9][7]=='O')
a[9][7]='@';
if(a[6][11]=='O')
a[6][11]='@';
if(a[6][3]==' ')
a[6][3]='*';
if(a[3][6]==' ')
a[3][6]='*';
if(a[9][7]==' ')
a[9][7]='*';
if(a[6][11]==' ')
a[6][11]='*';
}
void check2(char a[][20])
{
if(a[5][9]=='O')
a[5][9]='@';
if(a[6][9]=='O')
a[6][9]='@';
if(a[7][9]=='O')
a[7][9]='@';
if(a[5][9]==' ')
a[5][9]='*';
if(a[6][9]==' ')
a[6][9]='*';
if(a[7][9]==' ')
a[7][9]='*';
}
void check3(char a[][20])
{
if(a[6][4]=='O')
a[6][4]='@';
if(a[6][5]=='O')
a[6][5]='@';
if(a[7][4]=='O')
a[7][4]='@';
if(a[7][5]=='O')
a[7][5]='@';
if(a[6][4]==' ')
a[6][4]='*';
if(a[6][5]==' ')
a[6][5]='*';
if(a[7][4]==' ')
a[7][4]='*';
if(a[7][5]==' ')
a[7][5]='*';
}
void check4(char a[][20])
{
if(a[7][3]=='O')
a[7][3]='@';
if(a[8][3]=='O')
a[8][3]='@';
if(a[8][4]=='O')
a[8][4]='@';
if(a[8][5]=='O')
a[8][5]='@';
if(a[8][6]=='O')
a[8][6]='@';
if(a[7][3]==' ')
a[7][3]='*';
if(a[8][3]==' ')
a[8][3]='*';
if(a[8][4]==' ')
a[8][4]='*';
if(a[8][5]==' ')
a[8][5]='*';
if(a[8][6]==' ')
a[8][6]='*';
}
三、干货
好了,废话不多说,小编送上推箱子前四关的代码:
第二关
{
b:
char a[20][20]={
" ",
" ",
" ##### ",
" #H # ",
" # OO# ### ",
" # O # #*# ",
" ### ###*# ",
" ## *# ",
" # # # ",
" # #### ",
" ##### ",};
system("color 0a");
system("cls");
for(int i=0;i<=11;i++)
{
puts(a[i]);
}
int x,y;
x=3,y=3;
while(1)
{
char z;
z=getch();
if(z=='r')
goto b;
if(z=='w')
{
if(a[x-1][y]!='#')
{
if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='@';
}
else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
}
}
}
if(z=='a')
{
if(a[x][y-1]!='#')
{
if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='@';
}
else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
}
}
}
if(z=='d')
{
if(a[x][y+1]!='#')
{
if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='@';
}
else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
}
}
}
if(z=='s')
{
if(a[x+1][y]!='#')
{
if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='@';
}
else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
}
}
}
check2(a);
system("cls");
for(int i=0;i<=11;i++)
{
puts(a[i]);
}
if(a[5][9]=='@'&&a[6][9]=='@'&&a[7][9]=='@')
{
Sleep(1500);break;}
}
system("cls");
cout<<"\n\n 你只是侥幸获胜!过了下一关再说!";
Sleep(3000);
}
第三关
{
c:
char a[20][20]={
" ",
" ",
" ####### ",
" # ### ",
" ##O### # ",
" # H O O # ",
" # **# O ## ",
" ##**# # ",
" ######## ",
" ",
" ",};
system("color 03");
system("cls");
for(int i=0;i<=11;i++)
{
puts(a[i]);
}
int x,y;
x=5,y=4;
while(1)
{
char z;
z=getch();
if(z=='r')
goto c;
if(z=='w')
{
if(a[x-1][y]!='#')
{
if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]!=' ')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='@';
}
else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
}
}
}
if(z=='a')
{
if(a[x][y-1]!='#')
{
if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]!=' ')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='@';
}
else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
}
}
}
if(z=='d')
{
if(a[x][y+1]!='#')
{
if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]!=' ')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='@';
}
else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
}
}
}
if(z=='s')
{
if(a[x+1][y]!='#')
{
if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]!=' ')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='@';
}
else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
}
}
}
check3(a);
system("cls");
for(int i=0;i<=11;i++)
{
puts(a[i]);
}
if(a[6][4]=='@'&&a[6][5]=='@'&&a[7][4]=='@'&&a[7][5]=='@')
{
Sleep(1500);break;}
}
system("cls");
cout<<"\n\n 这你都能过??天哪!!";
Sleep(3000);
}
第四关
{
d:
char a[20][20]={
" ",
" ",
" #### ",
" ## # ",
" #HO # ",
" ##O ## ",
" ## O # ",
" #*O # ",
" #**@*# ",
" ###### ",
" ",};
system("color 04");
system("cls");
for(int i=0;i<=11;i++)
{
puts(a[i]);
}
int x,y;
x=4,y=3;
while(1)
{
char z;
z=getch();
if(z=='r')
goto d;
if(z=='w')
{
if(a[x-1][y]!='#')
{
if(a[x-2][y]!='#'&&a[x-1][y]=='O'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]!=' ')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='@';
}
else if(a[x-2][y]!='#'&&a[x-1][y]=='@'&&a[x-2][y]!='O'&&a[x-2][y]!='@'&&a[x-2][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x-1][y]!='O'&&a[x-1][y]!='@')
{
a[x][y]=' ';
x--;
a[x][y]='H';
}
}
}
if(z=='a')
{
if(a[x][y-1]!='#')
{
if(a[x][y-2]!='#'&&a[x][y-1]=='O'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]!=' ')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='@';
}
else if(a[x][y-2]!='#'&&a[x][y-1]=='@'&&a[x][y-2]!='O'&&a[x][y-2]!='@'&&a[x][y-2]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y-1]!='O'&&a[x][y-1]!='@')
{
a[x][y]=' ';
y--;
a[x][y]='H';
}
}
}
if(z=='d')
{
if(a[x][y+1]!='#')
{
if(a[x][y+2]!='#'&&a[x][y+1]=='O'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]!=' ')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='@';
}
else if(a[x][y+2]!='#'&&a[x][y+1]=='@'&&a[x][y+2]!='@'&&a[x][y+2]!='O'&&a[x][y+2]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y+1]!='O'&&a[x][y+1]!='@')
{
a[x][y]=' ';
y++;
a[x][y]='H';
}
}
}
if(z=='s')
{
if(a[x+1][y]!='#')
{
if(a[x+2][y]!='#'&&a[x+1][y]=='O'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]!=' ')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='@';
}
else if(a[x+2][y]!='#'&&a[x+1][y]=='@'&&a[x+2][y]!='O'&&a[x+2][y]!='@'&&a[x+2][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x+1][y]!='O'&&a[x+1][y]!='@')
{
a[x][y]=' ';
x++;
a[x][y]='H';
}
}
}
check4(a);
system("cls");
for(int i=0;i<=11;i++)
{
puts(a[i]);
}
if(a[7][3]=='@'&&a[8][3]=='@'&&a[8][4]=='@'&&a[8][5]=='@'&&a[8][6]=='@')
{
Sleep(1500);break;}
}
system("cls");
cout<<"\n\n 行!可以!!很棒!!!";
Sleep(3000);
}
以上就是今天的推箱子代码教学过程,想要制作更多的关卡只需要更改你的推箱子地图,小人H起始位置,过关胜利条件,再配上我们的移动系统就可以啦,赶快去试试吧!!!
2021.1.31
今天的文章c++推箱子实验报告_php简单的项目实例分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87352.html