C语言写的简易推箱子游戏

须彭亮
2023-12-01
#include <stdio.h>
#include <conio.h>
#include <windows.h>
/*
1.人,箱子,空地,墙,目的地,在目的地的箱子,在目的地的人
人->1
箱子->2
空地->0
墙->3
目的地->4
在目的地的箱子->2+4=6
在目的地的人->4+1=5;


*/
//定义地图
int win=0;//判断输赢的标志 
int place=0;//目的地的个数 
int place_box=0;//在目的地的箱子的个数 
int map[8][8] = {
{ 0,0,3,3,3,0,0,0 },
{ 0,0,3,4,3,0,0,0 },
{ 0,0,3,0,3,3,3,3 },
{ 3,3,3,2,0,2,4,3 },
{ 3,4,0,2,1,3,3,3 },
{ 3,3,3,3,2,3,0,0 },
{ 0,0,0,3,4,3,0,0 },
{ 0,0,0,3,3,3,0,0 }
};
//计算目的地的个数
void number_place() 
{
	for(int i = 0; i < 8;i++)
	{
		for(int j = 0; j < 8; j++)
		{
			if(map[i][j] == 4)
			{
				place++;
			}
		}
	}
}
//上下左右移动
/*
上 w;
下 s,
左 a,
右 d
*/
void move()
{
	int row, col;
	//找到人的位置
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (map[i][j] == 1)
			{
				row = i;
				col = j;
				break;
			}
		}
	}
	char ch;
	ch = getch();//获取方向 
	switch (ch)
	{
		case 'w':
		if (map[row - 1][col] == 0)//如果人的上方是空地,直接空地与人交换
		{
			map[row - 1][col] = 1;
			map[row][col] = 0;
		}
		else if (map[row - 1][col] == 2 && map[row - 2][col] == 0)//如果人的上方是箱子,箱子的上方是空地
		{
			map[row - 2][col] = 2;
			map[row - 1][col] = 1;
			map[row][col] = 0;
		}
		else if(map[row - 1][col] == 2 && map[row - 2][col] == 4)//如果人的上方是箱子,箱子的上方是目的地
		{
			map[row - 2][col] = 6;
			map[row - 1][col] = 1;
			map[row][col] = 0;
			place_box++;
		}
		break;
		case 's':
		if (map[row + 1][col] == 0)//如果人的下方是空地,直接空地与人交换
		{
			map[row + 1][col] = 1;
			map[row][col] = 0;
		}
		else if (map[row + 1][col] == 2 && map[row + 2][col] == 0)//如果人的下方是箱子,箱子的上方是空地
		{
			map[row + 2][col] = 2;
			map[row + 1][col] = 1;
			map[row][col] = 0;
		}
		else if(map[row + 1][col] == 2 && map[row + 2][col] == 4)//如果人的下方是箱子,箱子的上方是目的地
		{
			map[row + 2][col] = 6;
			map[row + 1][col] = 1;
			map[row][col] = 0;
			place_box++;
		}
		break;
		case 'a':
		if (map[row][col - 1] == 0)//如果人的左方是空地,直接空地与人交换
		{
			map[row][col - 1] = 1;
			map[row][col] = 0;
		}
		else if (map[row][col - 1] == 2 && map[row][col - 2] == 0)//如果人的左方是箱子,箱子的左方是空地
		{
			map[row][col - 2] = 2;
			map[row][col - 1] = 1;
			map[row][col] = 0;
		}
		else if(map[row][col - 1] == 2 && map[row][col - 2] == 4)//如果人的左方是箱子,箱子的左方是目的地
		{
			map[row][col - 2] = 6;
			map[row][col - 1] = 1;
			map[row][col] = 0;
			place_box++;
		}
		break;
		case 'd':
		if (map[row][col + 1] == 0)//如果人的右方是空地,直接空地与人交换
		{
			map[row][col + 1] = 1;
			map[row][col] = 0;
		}
		else if (map[row][col + 1] == 2 && map[row][col + 2] == 0)//如果人的右方是箱子,箱子的右方是空地
		{
			map[row][col + 2] = 2;
			map[row][col + 1] = 1;
			map[row][col] = 0;
		}
		else if (map[row][col + 1] == 2 && map[row][col + 2] == 4)//如果人的右方是箱子,箱子的右方是目的地
		{
			map[row][col + 2] = 6;
			map[row][col + 1] = 1;
			map[row][col] = 0;
			place_box++;
		}
		break;
	}
	if(place_box == place)//如果在目的地的箱子数等于目的地数,就赢了 
	{
		win=1;
		return ;
	}
}
//绘制界面
void print()
{
	system("cls");
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (map[i][j] == 1 || map[i][j] == 5)
			{
				printf("▲");
			}
			else if (map[i][j] == 2 || map[i][j] == 6)
			{
				printf("□");
			}
			else if (map[i][j] == 3)
			{
				printf("■");
			}
			else if (map[i][j] == 4)
			{
				printf("★");
			}
			else
			{
				printf("  ");
			}
		}
		printf("\n");
	}
	if(win == 1)//如果已经赢了,就只需打印最后一次,不必再移动 
	{
		return ;
	}
	move();
}
int main()
{
	number_place();
	while (1)
	{
		print();
		if(win == 1)//如果赢了 
		{
			print();//打印最后一次,然后退出循环
			break;
		}
	}
	printf("恭喜你!游戏通关了!\n");
	return 0;
}

 

 类似资料: