推箱子游戏,可自定义

话不多说,上
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void PrintUI(int(*GUI)[32])
{
	for (int i = 0; i < 16; i++)
	{
		for (int j = 0; j < 32; j++)
		{
			if (GUI[i][j] == 1)
				printf("█");
			else if (GUI[i][j] == 0)
				printf("  ");
			else if (GUI[i][j] == 2)
				printf("◇");
			else if (GUI[i][j] == 3)
				printf("●");
			else if (GUI[i][j] == 4)
				printf("□");
		}
		printf("\n");
	}
}
void Preset(int(*GUI)[32])
{
	int GUI2[16][32] =
	{
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 3, 4, 4, 4, 1, 1, 1, 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, 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, 1, 1, 1, 1, 1, 1, 2, 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, 1, 0, 0, 0, 1, 2, 1, 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, 1, 0, 2, 0, 1, 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, 1, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	};
	for (int i = 0; i < 16; i++)
	{
		for (int j = 0; j < 32; j++)
		{
			GUI[i][j] = GUI2[i][j];
		}
	}
}
void UIData(int(*GUI)[32])
{
	printf("用0表示空区 用1表示障碍 用2表示箱子 用3表示人物 用4表示置区,游戏区域高*宽:16*32\n ");
	printf("最外一层必须都是障碍,否则游戏可能崩溃\n");
	printf("箱子和置区数量应该相等\n");
	printf("文件以ui.dat命名,用记事本编辑文件,数字间有空格\n");
	printf("1:4示例:\n");
	printf("1 1 1 1 1 1 1 1\n");
	printf("1 0 0 0 0 0 0 1\n");
	printf("1 4 2 3 0 0 0 1\n");
	printf("1 1 1 1 1 1 1 1\n\n");
	printf("████████\n");
	printf("█            █\n");
	printf("█□◇●      █\n");
	printf("████████\n\n");
	FILE* filep = fopen("ui.dat", "r+");
	if (filep)
	{
		for (int i = 0; i < 16; i++)
		{
			for (int j = 0; j < 32; j++)
			{
				fscanf(filep, "%d", &GUI[i][j]);
			}
		}
		fclose(filep);
		getch();
		system("cls");
		PrintUI(GUI);
	}
	else
	{
		printf("NOT FOUND \"ui.dat\"");
	}
		

}
int* Find_3(const int(*GUI)[32], int *Position_3)
{
	for (int i = 0; i < 16; i++)
	{
		for (int j = 0; j < 32; j++)
		{
			if (GUI[i][j] == 3)
			{
				Position_3[0] = i;
				Position_3[1] = j;
				return Position_3;
			}
		}
	}
}
void Find_4(const int(*GUI)[32], int(*Position_4)[2],int* Num4)
{
	int ii = 0;
	for (int i = 0; i < 16; i++)
	{
		for (int j = 0; j < 32; j++)
		{
			if (GUI[i][j] == 4 && ii < 10)
			{
				if (GUI[i][j] == 4)
				{
					Position_4[ii][0] = i;
					Position_4[ii][1] = j;
					*Num4 = *Num4 + 1;
				}
				ii++;
			}
		}
	}
}
int Flag_4(int(*GUI)[32],const int(*Position_4)[2],const int *Num4)
{
	int flag = 0;
	for (int i = 0; i < *Num4; i++)
	{
		if (GUI[Position_4[i][0]][Position_4[i][1]] != 4)
			if (GUI[Position_4[i][0]][Position_4[i][1]] != 3)
				if (GUI[Position_4[i][0]][Position_4[i][1]] != 0)
					flag++;
	}
	if (flag == *Num4)
	{
		printf("FUCK!YOU WIN!GET OUT!\n");
		return 1;
	}
	else
		return 0;
}
void OperateGUI(char KeyBoardInput, int(*GUI)[32])
{
	int Position_3[2] = { 0 };		//Position_3[0]是i,Position_3[1]是j
	system("cls");
	if (KeyBoardInput == 'w')
	{
		Find_3(GUI, Position_3);
		if (GUI[Position_3[0] - 1][Position_3[1]] == 0 || GUI[Position_3[0] - 1][Position_3[1]] == 4)			//上一格是空区或置区
		{
			GUI[Position_3[0] - 1][Position_3[1]] = 3;			//人物上一格
			GUI[Position_3[0]][Position_3[1]] = 0;				//原位置置空
		}
		else if (GUI[Position_3[0] - 1][Position_3[1]] == 2)	//上一格是箱子
		{
			if (GUI[Position_3[0] - 2][Position_3[1]] == 0 || GUI[Position_3[0] - 2][Position_3[1]] == 4)		//上两格是空区或置区
			{
				GUI[Position_3[0] - 2][Position_3[1]] = 2;
				GUI[Position_3[0] - 1][Position_3[1]] = 3;
				GUI[Position_3[0]][Position_3[1]] = 0;
			}
		}
	}
	else if (KeyBoardInput == 's')
	{
		Find_3(GUI, Position_3);
		if (GUI[Position_3[0] + 1][Position_3[1]] == 0 || GUI[Position_3[0] + 1][Position_3[1]] == 4)	//下一格是空区或置区
		{
			GUI[Position_3[0] + 1][Position_3[1]] = 3;
			GUI[Position_3[0]][Position_3[1]] = 0;
		}
		else if (GUI[Position_3[0] + 1][Position_3[1]] == 2)	//下一格是箱子
		{
			if (GUI[Position_3[0] + 2][Position_3[1]] == 0 || GUI[Position_3[0] + 2][Position_3[1]] == 4)		//下两格是空区
			{
				GUI[Position_3[0] + 2][Position_3[1]] = 2;
				GUI[Position_3[0] + 1][Position_3[1]] = 3;
				GUI[Position_3[0]][Position_3[1]] = 0;
			}
		}
	}
	else if (KeyBoardInput == 'a')
	{
		Find_3(GUI, Position_3);
		if (GUI[Position_3[0]][Position_3[1] - 1] == 0 || GUI[Position_3[0]][Position_3[1] - 1] == 4)	//左一格是空区或置区
		{
			GUI[Position_3[0]][Position_3[1] - 1] = 3;
			GUI[Position_3[0]][Position_3[1]] = 0;
		}
		else if (GUI[Position_3[0]][Position_3[1] - 1] == 2)	//左一格是箱子
		{
			if (GUI[Position_3[0]][Position_3[1] - 2] == 0 || GUI[Position_3[0]][Position_3[1] - 2] == 4)
			{
				GUI[Position_3[0]][Position_3[1] - 2] = 2;
				GUI[Position_3[0]][Position_3[1] - 1] = 3;
				GUI[Position_3[0]][Position_3[1]] = 0;
			}
			
		}
	}
	else if (KeyBoardInput == 'd')
	{
		Find_3(GUI, Position_3);
		if (GUI[Position_3[0]][Position_3[1] + 1] == 0 || GUI[Position_3[0]][Position_3[1] + 1] == 4)	//右一格是空区
		{
			GUI[Position_3[0]][Position_3[1] + 1] = 3;
			GUI[Position_3[0]][Position_3[1]] = 0;
		}
		else if (GUI[Position_3[0]][Position_3[1] + 1] == 2)	//右一格是箱子
		{
			if (GUI[Position_3[0]][Position_3[1] + 2] == 0 || GUI[Position_3[0]][Position_3[1] + 2] == 4)
			{
				GUI[Position_3[0]][Position_3[1] + 2] = 2;
				GUI[Position_3[0]][Position_3[1] + 1] = 3;
				GUI[Position_3[0]][Position_3[1]] = 0;
			}

		}
	}
	PrintUI(GUI);
}
int main()
{
	int GUI[16][32];
	int Position_4[10][2] = { 0 };
	int xz = 0;
	printf("推箱子  @指针 作品\n");
	printf("1.预置关卡\n2.导入关卡\n输入数字>>>");
	scanf("%d", &xz);
	if (1 == xz)
		Preset(GUI);
	else if (2 == xz)
		UIData(GUI);
	int Num4 = 0;			//计算箱子数量
	Find_4(GUI, Position_4,&Num4);
	char KeyBoardInput = 0;
	printf("操作:上'w'下's'左'a'右'd'\n");
	while (1)
	{
		KeyBoardInput = getch();
		switch (KeyBoardInput)
		{
			case 'w':		//上
				OperateGUI(KeyBoardInput, GUI);
				break;
			case 's':		//下
				OperateGUI(KeyBoardInput, GUI);
				break;
			case 'a':		//左
				OperateGUI(KeyBoardInput, GUI);
				break;
			case 'd':		//右
				OperateGUI(KeyBoardInput, GUI);
				break;
		}
		if (Flag_4(GUI,Position_4,&Num4))			//获取置区状态
		{
			system("color 1f");				//置区已消失
			break;
		}
		else
		{	
			for (int i = 0; i < Num4; i++)
			{
				if (GUI[Position_4[i][0]][Position_4[i][1]] != 2 && GUI[Position_4[i][0]][Position_4[i][1]] != 3)
					GUI[Position_4[i][0]][Position_4[i][1]] = 4;
			}
			system("cls");
			PrintUI(GUI);
		}
	}
	return 0;
}

代码

猜你喜欢

转载自blog.csdn.net/kyaa111/article/details/79285552