c语言控制台输出制作推箱子游戏

嵌入式开发,没有学到什么实质性的东西,仅仅做了两个控制台小游戏。虽然老师说不符合课程要求,但是自己感觉还蛮有意思的,就保存下来了。

main()里面那个命令控制感觉还是很好的,因为自己在这方面是新手,之前都没有听说过fflush(stdin),感觉用在这里正好。

#include<stdio.h>

int a[5][5];
int b[5][5];

void draw_point(int n)
{
	switch(n)
	{
		case 0:
		printf("|   ");
		break;
		case 1:
		printf("| A ");
		break;
		case 2:
		printf("| B ");
		break;
		case 3:
		printf("| * ");
		break;
		case 4:
		printf("||||");
		break;
		default:
		break;
	}
}
void draw_line()
{
	int i;
	for(i = 0; i < 21; i++)
	{
		printf("-");
	}
	printf("\n");
}
void draw(int x[5][5])
{
	int i, j;
	for(j = 0; j < 5; j++)
	{
		draw_line();
		for(i = 0; i < 5; i++)
		{
			draw_point(x[i][j]);
		}
		printf("|");
		printf("\n");
	}
	draw_line();
}
void set_zero(int x[5][5])
{
	int i, j;
	for(i = 0; i < 5; i++)
	{
		for(j = 0; j < 5; j++)
		{
			x[i][j] = 0;
		}
	}
}
void set_point(int x[5][5], int i, int j, int n)
{
	x[i][j] = n;
}
void chushihua(int x[5][5])
{
	set_zero(x);
	set_point(x, 2, 0, 3);
	set_point(x, 2, 4, 3);
	set_point(x, 0, 2, 3);
	set_point(x, 4, 2, 3);
	set_point(x, 2, 1, 2);
	set_point(x, 2, 3, 2);
	set_point(x, 1, 2, 2);
	set_point(x, 3, 2, 2);
	set_point(x, 2, 2, 1);
}
void chushihua_b(int x[5][5])
{
	set_point(x, 2, 0, 3);
	set_point(x, 2, 4, 3);
	set_point(x, 0, 2, 3);
	set_point(x, 4, 2, 3);
}
int get_a_x(int x[5][5])
{
	int i, j;
	for(i = 0; i < 5; i++)
	{
		for(j = 0; j < 5; j++)
		{
			if(a[i][j] == 1)
			{
				return i;
			}
		}
	}
}
int get_a_y(int x[5][5])
{
	int i, j;
	for(i = 0; i < 5; i++)
	{
		for(j = 0; j < 5; j++)
		{
			if(a[i][j] == 1)
			{
				return j;
			}
		}
	}
}
void move(int x[5][5], char c)
{
	int i = get_a_x(x);
	int j = get_a_y(x);
	if(c == 'w')
	{
		if(j == 0)
		{
			return;
		}
		if(x[i][j - 1] == 4)
		{
			return;
		}
		if(x[i][j - 1] == 2)
		{
			if(j - 1 == 0)
			{
				return;
			}
			if(x[i][j - 2] == 2 || x[i][j - 2] == 4)
			{
				return;
			}
			x[i][j - 2] = x[i][j - 1];
			x[i][j - 1] = x[i][j];
			x[i][j] = 0;
		}
		else
		{
			x[i][j - 1] = x[i][j];
			x[i][j] = 0;
		}
	}
	else if(c == 'a')
	{
		if(i == 0)
		{
			return;
		}
		if(x[i - 1][j] == 4)
		{
			return;
		}
		if(x[i - 1][j] == 2)
		{
			if(i - 1 == 0)
			{
				return;
			}
			if(x[i - 2][j] == 2 || x[i - 2][j] == 4)
			{
				return;
			}
			x[i - 2][j] = x[i - 1][j];
			x[i - 1][j] = x[i][j];
			x[i][j] = 0;
		}
		else
		{
			x[i - 1][j] = x[i][j];
			x[i][j] = 0;
		}
	}
	else if(c == 's')
	{
		if(j == 4)
		{
			return;
		}
		if(x[i][j + 1] == 4)
		{
			return;
		}
		if(x[i][j + 1] == 2)
		{
			if(j + 1 == 4)
			{
				return;
			}
			if(x[i][j + 2] == 2 || x[i][j + 2] == 4)
			{
				return;
			}
			x[i][j + 2] = x[i][j + 1];
			x[i][j + 1] = x[i][j];
			x[i][j] = 0;
		}
		else
		{
			x[i][j + 1] = x[i][j];
			x[i][j] = 0;
		}
	}
	else if(c == 'd')
	{
		if(i == 4)
		{
			return;
		}
		if(x[i + 1][j] == 4)
		{
			return;
		}
		if(x[i + 1][j] == 2)
		{
			if(i + 1 == 4)
			{
				return;
			}
			if(x[i + 2][j] == 2 || x[i + 2][j] == 4)
			{
				return;
			}
			x[i + 2][j] = x[i + 1][j];
			x[i + 1][j] = x[i][j];
			x[i][j] = 0;
		}
		else
		{
			x[i + 1][j] = x[i][j];
			x[i][j] = 0;
		}
	}
}
void match(int x[5][5], int y[5][5])
{
	int i, j;
	for(i = 0; i < 5; i++)
	{
		for(j = 0; j < 5; j++)
		{
			if(y[i][j] == 3 && x[i][j] == 0)
			{
				x[i][j] = 3;
			}
		}
	}
}
bool isOK(int x[5][5], int y[5][5])
{
	bool bl = true;
	int i, j;
	for(i = 0; i < 5; i++)
	{
		for(j = 0; j < 5; j++)
		{
			if(y[i][j] == 3 && x[i][j] != 2)
			{
				bl = false;
			}
		}
	}
	return bl;
}
int main()
{
	chushihua(a);
	chushihua_b(b);
	draw(a);
	int k = 1;
	while(k)
	{
		char c;
		printf("请输入命令以移动:");
		scanf("%c", &c);
		fflush(stdin);
		while (c != 'w' && c != 'a' && c != 's' && c != 'd')
		{
			printf("只能输入wasd其中之一\n");
			printf("请输入新的命令:");
			scanf("%c", &c);
			fflush(stdin);
		}
		move(a, c);
		match(a, b);
		draw(a);
		if(isOK(a, b))
		{
			k = 0;
			printf("恭喜,任务达成!\n");
		}
	}
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值