版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40833790/article/details/89491027
一、运行结果显示
二、源码
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h> //getch()需要的头文件
void display(); //地图显示
void create(); //初始化位置数据
void begin(); //游戏开始
void choose(); //选项
void playgame(); //开始游戏
void gameprocess();//操作游戏
void chooselevel(); //选择关卡
void testflag(); //过关提示
void up(); //向上移动
void down(); //向下移动
void left(); //向左移动
void right(); //向右移动
struct box
{
int manx; //人的横坐标
int many; //人的纵坐标
int flag; //标志位,记录人在目标位置上
int count; //记录步数
int level; //记录关数
}game;
const int roomsize=9; //设计房子内部为正方形,边长为9
int map[roomsize+2][roomsize+2]; //房子布局
//房子地图
int map1[roomsize+2][roomsize+2]=
{
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,0,0,0,0,1,1,1,1,1,-1},
{-1,0,0,0,0,1,0,0,0,1,-1},
{-1,1,1,1,0,1,0,0,0,1,-1},
{-1,1,2,1,0,1,0,0,0,1,-1},
{-1,1,2,1,0,1,0,3,0,1,-1},
{-1,1,2,1,1,1,0,3,0,1,-1},
{-1,1,0,0,0,0,3,4,0,1,-1},
{-1,1,0,0,1,0,0,0,0,1,-1},
{-1,1,1,1,1,1,1,1,1,1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}
};
int map2[roomsize+2][roomsize+2]=
{
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,0,1,1,1,1,1,0,0,-1},
{-1,-1,0,1,4,0,1,1,1,0,-1},
{-1,-1,0,1,0,3,0,0,1,0,-1},
{-1,-1,1,1,1,0,1,0,1,1,-1},
{-1,-1,1,2,1,0,1,0,0,1,-1},
{-1,-1,1,2,3,0,0,1,0,1,-1},
{-1,-1,1,2,0,0,0,3,0,1,-1},
{-1,-1,1,1,1,1,1,1,1,1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}
};
void choose()
{
int choose;
}
void create() //初始化
{
game.count=0;
game.flag=0;
game.level=0;
game.manx=0;
game.many=0;
}
void display() //地图显示
{
for(int i=1;i<=roomsize;i++)
{
for(int j=1;j<=roomsize;j++)
{
if(map[i][j]==0) printf(" ");
if(map[i][j]==1) printf("■"); //墙
if(map[i][j]==2) printf("○"); //目标位置
if(map[i][j]==3) printf("★"); //箱子
if(map[i][j]==4) printf("♀"); //人
if(map[i][j]==5) printf("√"); //箱子在目标位置上
}
printf("\n");
}
}
void begin() //游戏开始
{
printf("\n===========================\n");
printf("\t1、开始游戏\n");
printf("\t2、退出游戏\n");
printf("===========================\n");
printf("请输入选择:");
int choose;
scanf("%d",&choose);
switch(choose)
{
case 1:
playgame();
break;
case 2:exit(0);
}
}
void playgame() //开始游戏
{
system("cls");
create(); //初始化位置
chooselevel();//选择关卡
gameprocess();//操作游戏
}
void chooselevel() //选择关卡
{
system("cls");
int i,j;
printf("\n===========================\n");
printf("\t1、第一关\n");
printf("\t2、第二关\n");
printf("\t3、第三关\n");
printf("===========================\n");
scanf("%d",&game.level);
do
{
switch(game.level)
{
case 1:
for(i=0;i<=roomsize;i++)
{
for(j=0;j<=roomsize;j++)
{
map[i][j]=map1[i][j];
}
}
game.manx=7;
game.many=7;
break;
case 2:
for(i=0;i<=roomsize;i++)
{
for(j=0;j<=roomsize;j++)
{
map[i][j]=map2[i][j];
}
}
game.manx=3;
game.many=3;
break;
default:
printf("输入有误,重新输入:");
scanf("%d",&game.level);
}
}while(game.level>4);
}
void gameprocess() //操作游戏
{
system("cls");
int choice;
game.count=0;
while(1)
{
display();//显示地图
//getch()用法:从控制台读取一个字符,但不显示在屏幕上
switch(getch()) //ASCII码键盘键位:左为75右为77上为72下为80
{
case 72:
up();
game.count++;
break;
case 80:
down();
game.count++;
break;
case 75:
left();//左
game.count++;
break;
case 77: //右
right();
game.count++;
break;
case 'c':
case 'C':
choose();
break;
case 'q':
case 'Q':
printf("是退出游戏还是返回到主界面?\n");
printf("1、返回主界面\n");
printf("2、退出游戏\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
game.count=0;
// Sleep(500);
system("cls");
begin();
break;
case 2:
exit(0);
}
default:
break;
}
system("cls");
}
}
void right() //向右移动
{
if(map[game.many][game.manx+1]==0) //1-下一个位置为空
{
map[game.many][game.manx+1]=4; //显示人向右移动
if(game.flag==1)
{
map[game.many][game.manx]=2; //恢复为为目标位置
game.flag=0;
}
else
map[game.many][game.manx]=0; //恢复空状态
game.manx++; //向右移动
}
else if(map[game.many][game.manx+1]==2) //2-人要到目标位置上
{
map[game.many][game.manx+1]=4; //显示人向右移动
if(game.flag==1) //人已在目标位置上
{
map[game.many][game.manx]=2; //恢复目标位置
}
else //准备进目标位置
{
map[game.many][game.manx]=0; //恢复原来的状态
game.flag=1; //标志位,记录人在目标位置上
}
game.manx++; //向右移动
}
else if(map[game.many][game.manx+1]==3&&map[game.many][game.manx+2]==0) //3-将箱子推到空白位置上
{
map[game.many][game.manx+2]=3;
map[game.many][game.manx+1]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
game.flag==0;
}
else
{
map[game.many][game.manx]=0;
}
game.manx++;
}
else if(map[game.many][game.manx+1]==5&&map[game.many][game.manx+2]!=1) //4-要将箱子从目标位置上推出
{
if(map[game.many][game.manx+2]==2) //下一个位置还是目标位置
{
map[game.many][game.manx+2]=5;
map[game.many][game.manx+1]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
}
else if(map[game.many][game.manx+2]==0) //下一个位置是空白
{
map[game.many][game.manx+2]=3;
map[game.many][game.manx+1]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
}
game.manx++;
}
else if(map[game.many][game.manx+1]==3&&map[game.many][game.manx+2]==2) //5-要将箱子推到目标位置上
{
map[game.many][game.manx+2]=5; //箱子在目标位置上
map[game.many][game.manx+1]=4;
if(game.flag==1) //人在目标位置上
{
map[game.many][game.manx]=2;
game.flag=0;
}
else //人不在目标位置上
{
map[game.many][game.manx]=0;
}
game.manx++;
}
else
{
game.count--; //6-抵消人不动的情况
}
testflag();
}
void left() //向左移动
{
if(map[game.many][game.manx-1]==0) //1-下一个位置为空
{
map[game.many][game.manx-1]=4;
if(game.flag==1) //人已经在目标位置上
{
map[game.many][game.manx]=2;
game.flag=0;
}
else
{
map[game.many][game.manx]=0;
}
game.manx--;
}
else if(map[game.many][game.manx-1]==2) //2-下一个位置为目标位置
{
map[game.many][game.manx-1]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
game.manx--;
}
else if(map[game.many][game.manx-1]==3&&map[game.many][game.manx-2]==0) //3-将箱子推向空白
{
map[game.many][game.manx-2]=3;
map[game.many][game.manx-1]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
game.flag=0;
}
else
{
map[game.many][game.manx]=0;
}
game.manx--;
}
else if(map[game.many][game.manx-1]==5&&map[game.many][game.manx-2]!=1)//4-将箱子推出目标位置
{
if(map[game.many][game.manx-2]==2) //4-1下一个位置还是目标位置
{
map[game.many][game.manx-2]=5;
map[game.many][game.manx-1]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
}
else if(map[game.many][game.manx-2]==0) //4-2下一个位置是空白
{
map[game.many][game.manx-2]=3;
map[game.many][game.manx-1]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
}
game.manx--;
}
else if(map[game.many][game.manx-1]==5&&map[game.many][game.manx-2]==2) //5-将箱子推进目标
{
map[game.many][game.manx-1]=4;
map[game.many][game.manx-2]=5;
if(game.flag==1)
{
map[game.many][game.manx]=2;
game.flag=0;
}
else
{
map[game.many][game.manx]=0;
game.flag=0;
}
game.manx--;
}
else
{
game.count--;
}
testflag();
}
void up() //向上
{
if(map[game.many-1][game.manx]==0) //1-下一个位置为空
{
map[game.many-1][game.manx]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
game.flag=0;
}
else
{
map[game.many][game.manx]=0;
}
game.many--;
}
else if(map[game.many-1][game.manx]==2) //2-下一个位置为目标位置
{
map[game.many-1][game.manx]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
game.many--;
}
else if(map[game.many-1][game.manx]==3&&map[game.many-2][game.manx]==0) //3-将箱子推向空白
{
map[game.many-1][game.manx]=4;
map[game.many-2][game.manx]=3;
if(game.flag==1)
{
map[game.many][game.manx]=2;
game.flag=1;
}
else
{
map[game.many][game.manx]=0;
}
game.many--;
}
else if(map[game.many-1][game.manx]==5&&map[game.many-2][game.manx]!=1) //4-将箱子推出空白
{
if(map[game.many-2][game.manx]==2) //下一个位置还是目标位置
{
map[game.many-2][game.manx]=5;
map[game.many-1][game.manx]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
}
else if(map[game.many-2][game.manx]==0) //下一个位置是空白
{
map[game.many-2][game.manx]=3;
map[game.many-1][game.manx]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
}
game.many--;
}
else if(map[game.many-1][game.manx]==3&&map[game.many-2][game.manx]==2) //5-将箱子推进目标位置
{
map[game.many-1][game.manx]=4;
map[game.many-2][game.manx]=5;
if(game.flag==1)
{
map[game.many][game.manx]=2;
game.flag=0;
}
else
{
map[game.many][game.manx]=0;
game.flag=0;
}
game.many--;
}
else
{
game.count--; //6-不动
}
testflag();
}
void down() //向下
{
if(map[game.many+1][game.manx]==0) //1-下一个位置为空白
{
map[game.many+1][game.manx]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
game.flag=0;
}
else
{
map[game.many][game.manx]=0;
}
game.many++;
}
else if(map[game.many+1][game.manx]==2) //2-下一个位置为目标位置
{
map[game.many+1][game.manx]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
game.many++;
}
else if(map[game.many+1][game.manx]==3&&map[game.many+2][game.manx]==0) //3-将箱子推出空白
{
map[game.many+1][game.manx]=4;
map[game.many+2][game.manx]=3;
if(game.flag==1)
{
map[game.many][game.manx]=2;
game.flag=1;
}
else
{
map[game.many][game.manx]=0;
}
game.many++;
}
else if(map[game.many+1][game.manx]==5&&map[game.many+2][game.manx]!=1) //将箱子推出目标位置
{
if(map[game.many+2][game.manx]==2) //下一个位置还是目标位置
{
map[game.many+2][game.manx]=5;
map[game.many+1][game.manx]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
}
else if(map[game.many+2][game.manx]==0) //下一个位置是空白
{
map[game.many+2][game.manx]=3;
map[game.many+1][game.manx]=4;
if(game.flag==1)
{
map[game.many][game.manx]=2;
}
else
{
map[game.many][game.manx]=0;
game.flag=1;
}
}
game.many++;
}
else if(map[game.many+1][game.manx]==3&&map[game.many+2][game.manx]==2) //将箱子推进目标位置
{
map[game.many+1][game.manx]=4;
map[game.many+2][game.manx]=5;
if(game.flag==1)
{
map[game.many][game.manx]=2;
game.flag=0;
}
else
{
map[game.many][game.manx]=0;
game.flag=0;
}
game.many++;
}
else
{
game.count--;
}
testflag();
}
void testflag()
{
int choose;
for(int i=0;i<=roomsize;i++)
{
for(int j=0;j<roomsize;j++)
{
if(map[i][j]==3)
return;
}
}
system("cls");
game.count++;
display();
printf("\n恭喜通关!\n");
game.level++;
printf("1、重玩游戏\n");
printf("2、继续下一关\n");
printf("3、退出游戏\n");
scanf("%d",&choose);
switch(choose)
{
case 1:
chooselevel();
case 2:
chooselevel();
case 3:
printf("欢迎下次继续!\n");
getch();
exit(0);
}
}
int main()
{
system("color f0");
begin();
}