c++推箱子(更新)
本文继“c++实现推箱子”一文。
#include<bits/stdc++.h>
//#include <bios.h>
#include<conio.h>
#include<windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
using namespace std;
int map1[2][10][12]={
{ //关卡1
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,0,4,0,4,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,6,1,1},
{1,0,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,0,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,7,3,3,1}
},
{ //关卡2
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,0,1,1},
{1,0,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,0,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,0,6,1},
{1,0,1,0,0,0,0,0,0,4,4,1},
{1,1,1,1,1,1,1,1,7,3,3,1}
}
};
int map2[2][10][12]={ //备份
{ //关卡1
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,0,4,0,4,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,6,1,1},
{1,0,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,0,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,7,3,3,1}
},
{ //关卡2
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,0,1,1},
{1,0,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,0,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,0,0,6,1},
{1,0,1,0,0,0,0,0,0,4,4,1},
{1,1,1,1,1,1,1,1,7,3,3,1}
}
};
int tmp[1][10][12];
int level=0;
//人坐标结构体
struct Pos{
int x;
int y;
};
//获取玩家坐标
Pos GetGamerPosition(){
Pos gamer={-1,-1};
for(int i=0;i<10;i++) //从50开始
{
for(int j=0;j<12;j++){
if( map1[level][i][j]==6||map1[level][i][j]==9 ){
gamer.x=i;
gamer.y=j;
return gamer;
}
}
}
return gamer;
}
void Up()
{
Pos gamer=GetGamerPosition();
//1 人的前面是空地
if(map1[level][gamer.x-1][gamer.y]==0){
//空地改成人
map1[level][gamer.x-1][gamer.y]=6;
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//2 人的前面是目的地
if(map1[level][gamer.x-1][gamer.y]==3){
//目的地改成人站在上面
map1[level][gamer.x-1][gamer.y]=9;
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//3 人的前面是箱子
if(map1[level][gamer.x-1][gamer.y]==4){
//3.1箱子的前面是空地
if(map1[level][gamer.x-2][gamer.y]==0){
//空地改成箱子
map1[level][gamer.x-2][gamer.y]=4;
//箱子改成人
map1[level][gamer.x-1][gamer.y]=6;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
//3.2箱子的前面是目的地
if(map1[level][gamer.x-2][gamer.y]==3){
//目的地改成箱子与目的地重合
map1[level][gamer.x-2][gamer.y]=7;
//箱子改成人
map1[level][gamer.x-1][gamer.y]=6;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//4 人的前面是箱子和目的地重合
if(map1[level][gamer.x-1][gamer.y]==7){
//4.1箱子的前面是空地
if(map1[level][gamer.x-2][gamer.y]==0){
//空地改成箱子
map1[level][gamer.x-2][gamer.y]=4;
//箱子改成人
map1[level][gamer.x-1][gamer.y]=9;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
//4.2箱子的前面是目的地
if(map1[level][gamer.x-2][gamer.y]==3){
//目的地改成箱子与目的地的重合
map1[level][gamer.x-2][gamer.y]=7;
//箱子和目的地的重合改成人与目的地的重合
map1[level][gamer.x-1][gamer.y]=9;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
}
void Down()
{
Pos gamer=GetGamerPosition();
//1 人的前面是空地
if(map1[level][gamer.x+1][gamer.y]==0){
//空地改成人
map1[level][gamer.x+1][gamer.y]=6;
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//2 人的前面是目的地
if(map1[level][gamer.x+1][gamer.y]==3){
//目的地改成人站在上面
map1[level][gamer.x+1][gamer.y]=9;
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//3 人的前面是箱子
if(map1[level][gamer.x+1][gamer.y]==4){
//3.1箱子的前面是空地
if(map1[level][gamer.x+2][gamer.y]==0){
//空地改成箱子
map1[level][gamer.x+2][gamer.y]=4;
//箱子改成人
map1[level][gamer.x+1][gamer.y]=6;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
//3.2箱子的前面是目的地
if(map1[level][gamer.x+2][gamer.y]==3){
//目的地改成箱子与目的地重合
map1[level][gamer.x+2][gamer.y]=7;
//箱子改成人
map1[level][gamer.x+1][gamer.y]=6;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//4 人的前面是箱子和目的地重合
if(map1[level][gamer.x+1][gamer.y]==7){
//4.1箱子的前面是空地
if(map1[level][gamer.x+2][gamer.y]==0){
//空地改成箱子
map1[level][gamer.x+2][gamer.y]=4;
//箱子改成人
map1[level][gamer.x+1][gamer.y]=9;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
//4.2箱子的前面是目的地
if(map1[level][gamer.x+2][gamer.y]==3){
//目的地改成箱子与目的地的重合
map1[level][gamer.x+2][gamer.y]=7;
//箱子和目的地的重合改成人与目的地的重合
map1[level][gamer.x+1][gamer.y]=9;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
}
void Right()//Left()
{
Pos gamer=GetGamerPosition();
//1 人的前面是空地
if(map1[level][gamer.x][gamer.y+1]==0){
//空地改成人
map1[level][gamer.x][gamer.y+1]=6;
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//2 人的前面是目的地
if(map1[level][gamer.x][gamer.y+1]==3){
//目的地改成人站在上面
map1[level][gamer.x][gamer.y+1]=9;
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//3 人的前面是箱子
if(map1[level][gamer.x][gamer.y+1]==4){
//3.1箱子的前面是空地
if(map1[level][gamer.x][gamer.y+2]==0){
//空地改成箱子
map1[level][gamer.x][gamer.y+2]=4;
//箱子改成人
map1[level][gamer.x][gamer.y+1]=6;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
//3.2箱子的前面是目的地
if(map1[level][gamer.x][gamer.y+2]==3){
//目的地改成箱子与目的地重合
map1[level][gamer.x][gamer.y+2]=7;
//箱子改成人
map1[level][gamer.x][gamer.y+1]=6;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//4 人的前面是箱子和目的地重合
if(map1[level][gamer.x][gamer.y+1]==7){
//4.1箱子的前面是空地
if(map1[level][gamer.x][gamer.y+2]==0){
//空地改成箱子
map1[level][gamer.x][gamer.y+2]=4;
//箱子改成人
map1[level][gamer.x][gamer.y+1]=9;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
//4.2箱子的前面是目的地
if(map1[level][gamer.x][gamer.y+2]==3){
//目的地改成箱子与目的地的重合
map1[level][gamer.x][gamer.y+2]=7;
//箱子和目的地的重合改成人与目的地的重合
map1[level][gamer.x][gamer.y+1]=9;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
}
void Left()
{
Pos gamer=GetGamerPosition();
//1 人的前面是空地
if(map1[level][gamer.x][gamer.y-1]==0){
//空地改成人
map1[level][gamer.x][gamer.y-1]=6;
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//2 人的前面是目的地
if(map1[level][gamer.x][gamer.y-1]==3){
//目的地改成人站在上面
map1[level][gamer.x][gamer.y-1]=9;
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//3 人的前面是箱子
if(map1[level][gamer.x][gamer.y-1]==4){
//3.1箱子的前面是空地
if(map1[level][gamer.x][gamer.y-2]==0){
//空地改成箱子
map1[level][gamer.x][gamer.y-2]=4;
//箱子改成人
map1[level][gamer.x][gamer.y-1]=6;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
//3.2箱子的前面是目的地
if(map1[level][gamer.x][gamer.y-2]==3){
//目的地改成箱子与目的地重合
map1[level][gamer.x][gamer.y-2]=7;
//箱子改成人
map1[level][gamer.x][gamer.y-1]=6;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
//4 人的前面是箱子和目的地重合
if(map1[level][gamer.x][gamer.y-1]==7){
//4.1箱子的前面是空地
if(map1[level][gamer.x][gamer.y-2]==0){
//空地改成箱子
map1[level][gamer.x][gamer.y-2]=4;
//箱子改成人
map1[level][gamer.x][gamer.y-1]=9;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
//4.2箱子的前面是目的地
if(map1[level][gamer.x][gamer.y-2]==3){
//目的地改成箱子与目的地的重合
map1[level][gamer.x][gamer.y-2]=7;
//箱子和目的地的重合改成人与目的地的重合
map1[level][gamer.x][gamer.y-1]=9;
}
//原来的位置还原
if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
else map1[level][gamer.x][gamer.y]=0;
}
}
void Recovery(){
for(int i=0;i<10;i++){
for(int j=0;j<12;j++){
map1[level][i][j]=map2[level][i][j];
}
}
}
void WriteTemp(){
for(int i=0;i<10;i++){
for(int j=0;j<12;j++){
tmp[0][i][j]=map1[level][i][j];
}
}
}
void BakeOneStep() {
for(int i=0;i<10;i++){
for(int j=0;j<12;j++){
map1[level][i][j]=tmp[0][i][j];
}
}
}
int GetSpaceBox( ){
int count=0;
for(int i=0;i<10;i++){
for(int j=0;j<12;j++){
if( map1[level][i][j]==4 ){
count++;
}
}
}
return count;
}
void Menu(){
system("mode con cols=19 lines=20") ;
cout<<"┏ ┓\n";
cout<<" 推箱子 \n";
cout<<" 先按shift \n";
cout<<" 按下空格 \n";
cout<<" 即将开始 \n";
cout<<"┗ ┛\n";
while(true){
//getch()可以检测按键
if(getch()==' '){
for(int i=3;i>=1;i--){
cout<<" "<<i<<"S "<<i<<"S "<<i<<"S "<<i<<"S \n";
Sleep(1000);//暂停1000毫秒
}
cout<<" Go it! \n";
break;
}
}
}
void Write_map(){
cout<<" ********第"<< level+1 <<"关********\n";
for(int a=0;a<10;a++) //从50开始
{
for(int b=0;b<12;b++)
{
switch(map1[level][a][b]){
case 0:cout<<" "; break;
case 1:cout<<"■"; break;//墙
case 3:cout<<"☆"; break;//目的地
case 4:cout<<"◎"; break;//箱子
case 6:cout<<"♂"; break;//人
case 7:cout<<"★"; break;//箱子与目的地重合
case 9:cout<<"♂"; break;//人与目的地重合
}
}
cout<<endl;
}
}
int main() {
//map
system("color 74");
Menu();
system("mode con cols=25 lines=20") ;
while(1){
if(GetSpaceBox()==0) {
system("cls");
system("mode con cols=24 lines=22") ;
cout<<"┏ ┓\n";
cout<<" !!!成功过关!!!\n";
cout<<"┗ ┛\n\n";
cout<<"┏ ┓\n";
cout<<" !!!成功过关!!!\n";
cout<<"┗ ┛\n\n";
cout<<"┏ ┓\n";
cout<<" !!!成功过关!!!\n";
cout<<"┗ ┛\n\n";
cout<<"┏ ┓\n";
cout<<" 祝你有一个开挂的人生 \n";
cout<<"┗ ┛\n";
Sleep(11000);
if(level+1==2){
cout<<"通关!!!" ;
return 0;
}
else {
cout<<"即将进入第二关!";
Sleep(1500);
level++;//进入下一关
}
}
system("cls");
Write_map();
cout<<"\n w:↑s:↓a:←d:→ r:重来 b:撤回";
char ch=getch();
switch(ch){
case 'w':WriteTemp(); Up(); break; //往上
case 's':WriteTemp(); Down(); break; //往下
case 'a':WriteTemp(); Left(); break; //往左
case 'd':Right(); break; //往右
case 'r':Recovery(); break; //恢复
case 'b':BakeOneStep(); break; //撤回
}
}
return 0;
}
更新日志:
- 添加恢复功能
- 添加了2个地图
- 添加撤回功能