栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STM32实现2048小游戏

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STM32实现2048小游戏

一. 前言

在我们的DIY套件上,终于集成了第三个小游戏----2048。怎么感觉做成了个游戏机呢(#.#)。
这款游戏也是非常流行的,玩起来也是非常的轻松,要想过关的话,还是需要一点的技巧。
欢迎关注 微信公众号 FPGA之旅 获取最新的资料


二. 游戏规则简介
  1. 游戏地图为 4 * 4。
  2. 每次移动所以方块都会向指定的方向移动,同时会在地图上随机生成值为2或者4的方块。
  3. 在移动的过程中,如果相邻的两个方块的值一样,那么它们就会融合成一个值为它们之合的方块,每一次移动,只能进行一次融合。
  4. 如果方块中的值为2048,则游戏胜利。如果整个地图都被方块添满了,则游戏失败。

三. 核心代码介绍

方块的随机生成,和胜利的判断的实现都较为容易。整个游戏的核心部分为第三点,方块的移动和融合,这个部分如果弄懂了的话,整个游戏实现起来会非常容易。
先在Visual Studio实现这一过程的准确性,然后在搬运到keil中去,这一方便debug发现问题。

这里先合并,后移动

  1. 通过定义一个长度为4的数组,来模拟一行数据。
int Map[4] = { 0,8,0,8 };
  1. 通过循环来找到可以合并的两个数,将其合并
for (j = i + 1; j < 4; j++)
{
	//如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过
	if (Map[j] != Map[i] && Map[j] != 0)
		break;

	//如果有相等的两个方块,且中没有其余方块,进行融合
	if (Map[j] == Map[i])
	{
		Map[j] = 0; //先将这方块消除掉
		unsigned char k;
		for (k = i + 1; k < 3; k++)
		{
			Map[k] = Map[k + 1]; //移动一次方块
		}
		Map[i] += Map[i];//更新融合后的方块的值
		Map[3] = 0;
		flag = 1;
		break;
	}
}
  1. 移动所有方块,直到所有方块都靠在一起
while (1)
{
	int j, flag = 0;
	for (i = 0; i < 3; i++)
	{
		if (Map[i] == 0) //有空的方块,说明可以移动
		{
			Map[i] = Map[i + 1];
			Map[i + 1] = 0;
		}
	}
	for (j = 0; j < 3; j++)
	{
		if (Map[j] == 0)
		{
			int k;
			for (k = j + 1; k < 4; k++)
			{
				if (Map[k] != 0) //判断是否继续移动
				{
					flag = 1;  
					break;
				}
			}
		}
	}
	if (flag == 0)
		break;
}
  1. 测试结果展示




完整测试代码

int main(void)
{
	int Map[4] = { 0,2,4,8};
	int i,flag = 0;
	int flags = 0;
	for (i = 0; i < 4; i++)
		printf("%dt", Map[i]);
	printf("n");

	for (i = 0; i < 3; i++)
	{
		unsigned char j;
		for (j = i + 1; j < 4; j++)
		{
			//如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过
			if (Map[j] != Map[i] && Map[j] != 0)
				break;

			//如果有相等的两个方块,且中没有其余方块
			if (Map[j] == Map[i])
			{
				Map[j] = 0;
				unsigned char k;
				for (k = i + 1; k < 3; k++)
				{
					Map[k] = Map[k + 1];
				}
				Map[i] += Map[i];
				Map[3] = 0;
				flags = 1;
				break;
			}
		}
		
			while (1)
			{
				int j, flag = 0;
				for (i = 0; i < 3; i++)
				{
					if (Map[i] == 0)
					{
						Map[i] = Map[i + 1];
						Map[i + 1] = 0;
					}
				}
				for (j = 0; j < 3; j++)
				{
					if (Map[j] == 0)
					{
						int k;
						for (k = j + 1; k < 4; k++)
						{
							if (Map[k] != 0)
							{
								flag = 1;
								break;
							}
						}
					}
				}
				if (flag == 0)
					break;
			}
			for (i = 0; i < 4; i++)
				printf("%dt", Map[i]);
			printf("n");
		
	}
	return flags;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/879853.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号