C++进行推箱子游戏设计
#头文件Map.h
#include<iostream>
#include<cstdlib>//用库函数exit()
#include<conio.h>//用库函数getch()
#include<windows.h>
using namespace std;
class Map
{
public:
void Move(char a[][20],char z,int& x,int& y,int& k);//移动函数
void Pos(int x,int y);//设置光标位置
void Welcometogame();//开始界面
void Sum(int y,int r,int c);//步数计数函数
};
void Map::Pos(int x,int y)
{
COORD pos={x,y};
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput,pos);
}
void Map::Welcometogame()
{
Pos(40,12);
system("title 李清宝的推箱子");
cout<<"欢迎来到推箱子游戏!";
Pos(44,13);
cout<<"共有五关。";
Pos(44,25);
system("pause");
system("cls");
Pos(40,11);
cout<<"用w、s、a、d分别控制人的移动\n";
Pos(40,12);
cout<<"按r为重来当前关卡\n";
Pos(40,13);
cout<<"按c可以撤销一步,但是只能撤销一步哦\n";
Pos(40,14);
cout<<"游戏要求:用人H将箱子0推到*处\n";
Pos(40,15);
cout<<"游戏中按q可以返回主界面";
Pos(40,18);
system("pause");
system("cls");
Pos(40,15);
cout<<"请输入数字选择关卡(回车键确认):\n";
Pos(25,16);
cout<<"1:关卡1,2:关卡2,3:关卡3,4:关卡4,5:关卡5,6:退出游戏\n";
}
void Map::Sum(int y,int r,int c)
{
Pos(40,18);cout<<"移动步数:"<<y;
Pos(40,19);cout<<"撤退步数:"<<r;
Pos(40,20);cout<<"重来次数:"<<c;
}
void Map::Move(char a[][20],char z,int& x,int& y,int& k)
{
if(z=='w')
{
k=1;
if(a[x-1][y]!='#')
{
if(a[x][y]!='P'&&a[x-2][y]==' '&&a[x-1][y]=='O')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x][y]!='P'&&a[x-2][y]=='*'&&a[x-1][y]=='O')
{
a[x][y]=' ';
x--;
a[x][y]='H';
a[x-1][y]='@';
}
else if(a[x][y]!='P'&&a[x-2][y]=='*'&&a[x-1][y]=='@')
{
a[x][y]=' ';
x--;
a[x][y]='P';
a[x-1][y]='@';
}
else if(a[x][y]!='P'&&a[x-2][y]==' '&&a[x-1][y]=='@')
{
a[x][y]=' ';
x--;
a[x][y]='P';
a[x-1][y]='O';
}
else if(a[x][y]!='P'&&a[x-1][y]==' ')
{
a[x][y]=' ';
x--;
a[x][y]='H';
}
else if(a[x][y]!='P'&&a[x-1][y]=='*')
{
a[x][y]=' ';
x--;
a[x][y]='P';
}
else if(a[x][y]=='P'&&a[x-2][y]==' '&&a[x-1][y]=='O')
{
a[x][y]='*';
x--;
a[x][y]='H';
a[x-1][y]='O';
}
else if(a[x][y]=='P'&&a[x-2][y]=='*'&&a[x-1][y]=='O')
{
a[x][y]='*';
x--;
a[x][y]='H';
a[x-1][y]='@';
}
else if(a[x][y]=='P'&&a[x-2][y]=='*'&&a[x-1][y]=='@')
{
a[x][y]='*';
x--;
a[x][y]='P';
a[x-1][y]='@';
}
else if(a[x][y]=='P'&&a[x-2][y]==' '&&a[x-1][y]=='@')
{
a[x][y]='*';
x--;
a[x][y]='P';
a[x-1][y]='O';
}
else if(a[x][y]=='P'&&a[x-1][y]==' ')
{
a[x][y]='*';
x--;
a[x][y]='H';
}
else if(a[x][y]=='P'&&a[x-1][y]=='*')
{
a[x][y]='*';
x--;
a[x][y]='P';
}
}
}
if(z=='a')
{
k=3;
if(a[x][y-1]!='#')
{
if(a[x][y]!='P'&&a[x][y-2]==' '&&a[x][y-1]=='O')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y]!='P'&&a[x][y-2]=='*'&&a[x][y-1]=='O')
{
a[x][y]=' ';
y--;
a[x][y]='H';
a[x][y-1]='@';
}
else if(a[x][y]!='P'&&a[x][y-2]=='*'&&a[x][y-1]=='@')
{
a[x][y]=' ';
y--;
a[x][y]='P';
a[x][y-1]='@';
}
else if(a[x][y]!='P'&&a[x][y-2]==' '&&a[x][y-1]=='@')
{
a[x][y]=' ';
y--;
a[x][y]='P';
a[x][y-1]='O';
}
else if(a[x][y]!='P'&&a[x][y-1]==' ')
{
a[x][y]=' ';
y--;
a[x][y]='H';
}
else if(a[x][y]!='P'&&a[x][y-1]=='*')
{
a[x][y]=' ';
y--;
a[x][y]='P';
}
else if(a[x][y]=='P'&&a[x][y-2]==' '&&a[x][y-1]=='O')
{
a[x][y]='*';
y--;
a[x][y]='H';
a[x][y-1]='O';
}
else if(a[x][y]=='P'&&a[x][y-2]=='*'&&a[x][y-1]=='O')
{
a[x][y]='*';
y--;
a[x][y]='H';
a[x][y-1]='@';
}
else if(a[x][y]=='P'&&a[x][y-2]=='*'&&a[x][y-1]=='@')
{
a[x][y]='*';
y--;
a[x][y]='P';
a[x][y-1]='@';
}
else if(a[x][y]=='P'&&a[x][y-2]==' '&&a[x][y-1]=='@')
{
a[x][y]='*';
y--;
a[x][y]='P';
a[x][y-1]='O';
}
else if(a[x][y]=='P'&&a[x][y-1]==' ')
{
a[x][y]='*';
y--;
a[x][y]='H';
}
else if(a[x][y]=='P'&&a[x][y-1]=='*')
{
a[x][y]='*';
y--;
a[x][y]='P';
}
}
}
if(z=='d')
{
k=4;
if(a[x][y+1]!='#')
{
if(a[x][y]!='P'&&a[x][y+2]==' '&&a[x][y+1]=='O')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y]!='P'&&a[x][y+2]=='*'&&a[x][y+1]=='O')
{
a[x][y]=' ';
y++;
a[x][y]='H';
a[x][y+1]='@';
}
else if(a[x][y]!='P'&&a[x][y+2]=='*'&&a[x][y+1]=='@')
{
a[x][y]=' ';
y++;
a[x][y]='P';
a[x][y+1]='@';
}
else if(a[x][y]!='P'&&a[x][y+2]==' '&&a[x][y+1]=='@')
{
a[x][y]=' ';
y++;
a[x][y]='P';
a[x][y+1]='O';
}
else if(a[x][y]!='P'&&a[x][y+1]==' ')
{
a[x][y]=' ';
y++;
a[x][y]='H';
}
else if(a[x][y]!='P'&&a[x][y+1]=='*')
{
a[x][y]=' ';
y++;
a[x][y]='P';
}
else if(a[x][y]=='P'&&a[x][y+2]==' '&&a[x][y+1]=='O')
{
a[x][y]='*';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y]=='P'&&a[x][y+2]=='*'&&a[x][y+1]=='O')
{
a[x][y]='*';
y++;
a[x][y]='H';
a[x][y+1]='@';
}
else if(a[x][y]=='P'&&a[x][y+2]=='*'&&a[x][y+1]=='@')
{
a[x][y]='*';
y++;
a[x][y]='P';
a[x][y+1]='@';
}
else if(a[x][y]=='P'&&a[x][y+2]==' '&&a[x][y+1]=='@')
{
a[x][y]='*';
y++;
a[x][y]='H';
a[x][y+1]='O';
}
else if(a[x][y]=='P'&&a[x][y+1]==' ')
{
a[x][y]='*';
y++;
a[x][y]='H';
}
else if(a[x][y]=='P'&&a[x][y+1]=='*')
{
a[x][y]='*';
y++;
a[x][y]='P';
}
}
}
if(z=='s')
{
k=2;
if(a[x+1][y]!='#')
{
if(a[x][y]!='P'&&a[x+2][y]==' '&&a[x+1][y]=='O')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x][y]!='P'&&a[x+2][y]=='*'&&a[x+1][y]=='O')
{
a[x][y]=' ';
x++;
a[x][y]='H';
a[x+1][y]='@';
}
else if(a[x][y]!='P'&&a[x+2][y]=='*'&&a[x+1][y]=='@')
{
a[x][y]=' ';
x++;
a[x][y]='P';
a[x+1][y]='@';
}
else if(a[x][y]!='P'&&a[x+2][y]==' '&&a[x+1][y]=='@')
{
a[x][y]=' ';
x++;
a[x][y]='P';
a[x][y+1]='O';
}
else if(a[x][y]!='P'&&a[x+1][y]==' ')
{
a[x][y]=' ';
x++;
a[x][y]='H';
}
else if(a[x][y]!='P'&&a[x+1][y]=='*')
{
a[x][y]=' ';
x++;
a[x][y]='P';
}
else if(a[x][y]=='P'&&a[x+2][y]==' '&&a[x+1][y]=='O')
{
a[x][y]='*';
x++;
a[x][y]='H';
a[x+1][y]='O';
}
else if(a[x][y]=='P'&&a[x+2][y]=='*'&&a[x+1][y]=='O')
{
a[x][y]='*';
x++;
a[x][y]='H';
a[x+1][y]='@';
}
else if(a[x][y]=='P'&&a[x+2][y]=='*'&&a[x+1][y]=='@')
{
a[x][y]='*';
x++;
a[x][y]='P';
a[x+1][y]='@';
}
else if(a[x][y]=='P'&&a[x+2][y]==' '&&a[x+1][y]=='@')
{
a[x][y]='*';
x++;
a[x][y]='P';
a[x+1][y]='O';
}
else if(a[x][y]=='P'&&a[x+1][y]==' ')
{
a[x][y]='*';
x++;
a[x][y]='H';
}
else if(a[x][y]=='P'&&a[x+1][y]=='*')
{
a[x][y]='*';
x++;
a[x][y]='P';
}
}
}
}
#主文件main.cpp
#include "Map.h"
int main()
{
int p,q;
Map mAp;
system("color 0b");
a0:
mAp.Welcometogame();
char a[20][20]= {" ",
" ",
" ### ",
" #*# ",
" # # ",
" ####O######",
" #*O H O *#",
" #####O#####",
" # # ",
" #*# ",
" ### "};
char b[20][20]={" ",
" ",
" ##### ",
" #H # ",
" # OO# ### ",
" # O # #*# ",
" ### ###*# ",
" ## *# ",
" # # # ",
" # #### ",
" ##### ",};
char c[20][20]={" ",
" ",
" ####### ",
" # ### ",
" ##O### # ",
" # H O O # ",
" # **# O ## ",
" ##**# # ",
" ######## ",
" ",
" ",};
char d[20][20]={" ",
" ",
" #### ",
" ## # ",
" #HO # ",
" ##O ## ",
" ## O # ",
" #*O # ",
" #**@*# ",
" ###### ",
" ",};
char e[20][20]={" ",
" ",
" ##### ",
" #H ### ",
" # O # ",
" ### # ## ",
" #*# # # ",
" #*O # # ",
" #* O # ",
" ######## ",
" ",};
int m,n,t,o,yi,che,chong;
char temp[20][20];
char at[20][20],bt[20][20],ct[20][20],dt[20][20],et[20][20];
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
at[m][n]=a[m][n],bt[m][n]=b[m][n],ct[m][n]=c[m][n],dt[m][n]=d[m][n],et[m][n]=e[m][n];
mAp.Pos(40,17);
cin>>o;
switch(o)
{
case 1:goto a1;break;
case 2:goto a2;break;
case 3:goto a3;break;
case 4:goto a4;break;
case 5:goto a5;break;
case 6:mAp.Pos(40,18);exit(0);break;
default:break;
}
a1:
t=0,yi=0,che=0,chong=0;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
a[m][n]=at[m][n];
system("cls");
for(int i=0;i<11;i++){puts(a[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
p=6,q=7;
while(1)
{
char z;
z=getch();
if(z=='q'){system("cls");goto a0;}
else if(z=='c'&&t!=0)
{
che++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
a[m][n]=temp[m][n];
system("cls");
for(int i=0;i<11;i++){puts(a[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(t==1)p++;else if(t==2)p--;else if(t==3)q++;else q--;
continue;}
else if(z=='r')
{chong++;goto a1;}
else {yi++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
temp[m][n]=a[m][n];
mAp.Move(a,z,p,q,t);}
system("cls");
for(int i=0;i<11;i++)puts(a[i]);
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(a[6][3]=='@'&&a[6][11]=='@'&&a[9][7]=='@'&&a[3][6]=='@')
{Sleep(1500);break;}
}
system("cls");
mAp.Pos(40,16);
cout<<"这只是第1关,将进入第2关!";
mAp.Sum(yi,che,chong);
Sleep(4000);
a2:
t=0,yi=0,che=0,chong=0;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
b[m][n]=bt[m][n];
system("cls");
for(int i=0;i<11;i++){puts(b[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
p=3,q=3;
while(1)
{
char z;
z=getch();
if(z=='q'){system("cls");goto a0;}
else if(z=='c'&&t!=0)
{
che++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
b[m][n]=temp[m][n];
system("cls");
for(int i=0;i<11;i++){puts(b[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(t==1)p++;else if(t==2)p--;else if(t==3)q++;else q--;
continue;}
else if(z=='r')
{chong++;goto a2;}
else {yi++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
temp[m][n]=b[m][n];
mAp.Move(b,z,p,q,t);}
system("cls");
for(int i=0;i<11;i++)puts(b[i]);
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(b[5][9]=='@'&&b[6][9]=='@'&&b[7][9]=='@')
{Sleep(1500);break;}
}
system("cls");
mAp.Pos(40,16);
cout<<"这只是第2关,将进入第3关!";
mAp.Sum(yi,che,chong);
Sleep(4000);
a3:
t=0,yi=0,che=0,chong=0;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
c[m][n]=ct[m][n];
system("cls");
for(int i=0;i<11;i++){puts(c[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
p=5,q=4;
while(1)
{
char z;
z=getch();
if(z=='q'){system("cls");goto a0;}
else if(z=='c'&&t!=0)
{
che++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
c[m][n]=temp[m][n];
system("cls");
for(int i=0;i<11;i++){puts(c[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(t==1)p++;else if(t==2)p--;else if(t==3)q++;else q--;
continue;}
else if(z=='r')
{chong++;goto a3;}
else {yi++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
temp[m][n]=c[m][n];
mAp.Move(c,z,p,q,t);}
system("cls");
for(int i=0;i<11;i++)puts(c[i]);
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(c[6][4]=='@'&&c[6][5]=='@'&&c[7][4]=='@'&&c[7][5]=='@')
{Sleep(1500);break;}
}
system("cls");
mAp.Pos(40,16);
cout<<"这只是第3关,将进入第4关!";
mAp.Sum(yi,che,chong);
Sleep(4000);
a4:
t=0,yi=0,che=0,chong=0;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
d[m][n]=dt[m][n];
system("cls");
for(int i=0;i<11;i++){puts(d[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
p=4,q=3;
while(1)
{
char z;
z=getch();
if(z=='q'){system("cls");goto a0;}
else if(z=='c'&&t!=0)
{
che++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
d[m][n]=temp[m][n];
system("cls");
for(int i=0;i<11;i++){puts(d[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(t==1)p++;else if(t==2)p--;else if(t==3)q++;else q--;
continue;}
else if(z=='r')
{chong++;goto a4;}
else {yi++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
temp[m][n]=d[m][n];
mAp.Move(d,z,p,q,t);}
system("cls");
for(int i=0;i<11;i++)puts(d[i]);
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(d[7][3]=='@'&&d[8][3]=='@'&&d[8][4]=='@'&&d[8][5]=='@'&&d[8][6]=='@')
{Sleep(1500);break;}
}
system("cls");
mAp.Pos(40,16);
cout<<"\n\n 这是第4关!";
mAp.Sum(yi,che,chong);
Sleep(4000);
a5:
t=0,yi=0,che=0,chong=0;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
e[m][n]=et[m][n];
system("cls");
for(int i=0;i<11;i++){puts(e[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
p=3,q=4;
while(1)
{
char z;
z=getch();
if(z=='q'){system("cls");goto a0;}
else if(z=='c'&&t!=0)
{
che++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
e[m][n]=temp[m][n];
system("cls");
for(int i=0;i<11;i++){puts(e[i]);}
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(t==1)p++;else if(t==2)p--;else if(t==3)q++;else q--;
continue;}
else if(z=='r')
{chong++;goto a5;}
else {yi++;
for(m=0;m<11;m++)
for(n=0;n<=14;n++)
temp[m][n]=e[m][n];
mAp.Move(e,z,p,q,t);}
system("cls");
for(int i=0;i<11;i++)puts(e[i]);
mAp.Pos(40,5);
cout<<"按c可撤销一步,按r可重置此关卡,按q可返回主菜单";
mAp.Pos(40,6);
cout<<"按w、s、a、d进行上下左右移动操作";
mAp.Pos(40,7);
cout<<"H为人,0为箱子,*为归宿,#为墙壁";
if(e[6][3]=='@'&&e[7][3]=='@'&&e[8][3]=='@')
{Sleep(1500);break;}
}
system("cls");
mAp.Pos(40,16);
cout<<"这是最后一关卡!";
mAp.Pos(40,17);
cout<<"恭喜你闯关成功!";
mAp.Sum(yi,che,chong);
Sleep(4000);
system("cls");
int h;
mAp.Pos(40,16);
cout<<"";
mAp.Pos(40,17);
cout<<"1:返回主界面,2:退出游戏";
mAp.Pos(40,18);
cin>>h;
if(h==1){system("cls");goto a0;}
else if(h==2){mAp.Pos(40,19);exit(0);}
}