数据结构实验四扩展_推箱子游戏

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
} 

猜你喜欢

转载自blog.csdn.net/qq_40833790/article/details/89491027