【C语言学习】利用基础语句实现2048

【C语言学习】利用基础语句实现2048

基本逻辑就是二维数组储存数据;
读入字符完成操作;
每次读入操作后,清空上次内容,打印新内容;

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<string.h>

int a[5][5],compi[5][5];
int flag = 0;

int makerand()
{
	return rand() % 4 + 1;
}

void find(int* s, int* b)
{
	int min = 10000, len, q = *s, p = *b;
	for (int i = 1; i <= 4; i++)
	{
		for (int m = 1; m <= 4; m++)
			if (a[i][m] == 0)
			{
				len = (q - i) * (q - i) + (p - m) * (p - m);
				if (len <= min)
				{
					len = min;
					*s = i;
					*b = m;
				}
			}
	}
}

void addnumber()
{
	int flag = 0, s, b, c;
	while (flag == 0)
	{
		s = makerand();
		b = makerand();
		c = makerand();
		if (a[s][b] != 0)
			find(&s, &b);
		if (c % 2 == 1)
		{
			a[s][b] = 2;
			flag = 1;
		}
		else
		{
			a[s][b] = 4;
			flag = 1;
		}
	}
}

void print()
{
	printf("用wasd来控制方向qwq:\n");
	printf("---------------------\n");
	for (int i = 1; i <= 4; i++)
	{
		printf("|");
		for (int m = 1; m <= 4; m++)
		{
			if (a[i][m] == 0)
				printf("    |");
			else
				printf("%4d|", a[i][m]);
		}
		printf("\n---------------------\n");
	}
}

void downmove()
{
	for (int i = 4; i >= 1; i--)
		for (int m = 4; m >= 1; m--)
		{
			if (a[m][i] == 0)
				continue;
			else
			{
				for (int n = m; n < 4; n++)
				{
					if (a[n + 1][i] == 0)
					{
						a[n + 1][i] = a[n][i];
						a[n][i] = 0;
						flag = 1;
					}
					else
					{
						if (a[n][i] == a[n + 1][i]&&compi[n][i]==0&&compi[n+1][i]==0)
						{
							a[n + 1][i] += a[n][i];
							a[n][i] = 0;
							compi[n + 1][i] = 1;
							flag = 1;
						}
					}
				}
			}
		}
	for (int i = 1; i <= 4; i++)
		memset(compi[i], 0, sizeof(int) * 5);
}

void upmove()
{
	for (int i = 1; i <= 4; i++)
		for (int m = 1; m <= 4; m++)
		{
			if (a[m][i] == 0)
				continue;
			else
			{
				for (int n = m; n > 1; n--)
				{
					if (a[n - 1][i] == 0)
					{
						a[n - 1][i] = a[n][i];
						a[n][i] = 0;
						flag = 1;
					}
					else
					{
						if (a[n][i] == a[n - 1][i] && compi[n][i] == 0 && compi[n - 1][i] == 0)
						{
							a[n - 1][i] += a[n][i];
							a[n][i] = 0;
							compi[n - 1][i] = 1;
							flag = 1;
						}
					}
				}
			}
		}
	for (int i = 1; i <= 4; i++)
		memset(compi[i], 0, sizeof(int) * 5);
}

void rightmove()
{
	for (int i = 4; i >= 1; i--)
		for (int m = 4; m >= 1; m--)
		{
			if (a[i][m] == 0)
				continue;
			else
			{
				for (int n = m; n < 4; n++)
				{
					if (a[i][n + 1] == 0)
					{
						a[i][n + 1] = a[i][n];
						a[i][n] = 0;
						flag = 1;
					}
					else
					{
						if (a[i][n] == a[i][n + 1] && compi[i][n] == 0 && compi[i][n + 1] == 0)
						{
							a[i][n + 1] += a[i][n];
							a[i][n] = 0;
							compi[i][n + 1] = 1;
							flag = 1;
						}
					}
				}
			}
		}
	for (int i = 1; i <= 4; i++)
		memset(compi[i], 0, sizeof(int) * 5);
}

void leftmove()
{
	for (int i = 1; i <= 4; i++)
		for (int m = 1; m <= 4; m++)
		{
			if (a[i][m] == 0)
				continue;
			else
			{
				for (int n = m; n > 1; n--)
				{
					if (a[i][n - 1] == 0)
					{
						a[i][n - 1] = a[i][n];
						a[i][n] = 0;
						flag = 1;
					}
					else
					{
						if (a[i][n] == a[i][n - 1] && compi[i][n] == 0 && compi[i][n - 1] == 0)
						{
							a[i][n - 1] += a[i][n];
							a[i][n] = 0;
							compi[i][n - 1] = 1;
							flag = 1;
						}
					}
				}
			}
		}
	for (int i = 1; i <= 4; i++)
		memset(compi[i], 0, sizeof(int) * 5);
}

int judege()
{
	int conti = 0;
	for (int i = 1; i <= 4; i++)
	{
		for (int m = 1; m <= 4; m++)
		{
			if (a[i][m] == 2048)
			{
				return 1;
			}
			if (a[i][m] == 0)
				conti = 1;
		}
	}
	if (conti == 1)
		return 2;
	else
	{
		return 3;
	}
}

int main()
{
	srand((unsigned)time(0));
	char c;
	addnumber();
	print();
	while (1)
	{
		c = _getch();
		system("cls");
		if (!(c == 'w' || c == 'w' || c == 'a' || c == 'a' || c == 's' || c == 's' || c == 'd' || c == 'd'))
		{
			printf("错误输入!请重新输入!\n");
			continue;
		}
		switch (c)
		{
		case'w':
			upmove();
			break;
		case'W':
			upmove();
			break;
		case'a':
			leftmove();
			break;
		case'A':
			leftmove();
			break;
		case'd':
			rightmove();
			break;
		case'D':
			rightmove();
			break;
		case's':
			downmove();
			break;
		case'S':
			downmove();
			break;
		}
		if(flag==1)
			addnumber();
		print();
		flag = 0;
		if (judege() == 1)
		{
			printf("你赢了!!!\n");
			system("pause");
			return 0;
		}
		if (judege() == 3)
		{
			int flag = 0;
			for(int i=1;i<=3;i++)
				for (int m = 1; m <= 3; m++)
				{
					if (a[i][m] == a[i][m + 1] || a[m][i] == a[m + 1][i])
					{
						flag = 1;
						break;
					}
				}
			if (flag == 0)
			{
				printf("你输了@w@\n");
				system("pause");
				return 0;
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值