C语言--2048小游戏

news2024/12/23 9:25:36

需要用到EasyX图形库

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<assert.h>
#include <conio.h>
#include <windows.h>
#include<graphics.h>
#include<string.h>
#define ROW 4 /* 行数 */
#define COL ROW /* 列数 */
#define KEY_UP 72 /* 方向键'上'的扫描码码值 */
#define KEY_DOWN 80 /* 方向键'下'的扫描码码值 */
#define KEY_LEFT 75 /* 方向键'左'的扫描码码值 */
#define KEY_RIGHT 77 /* 方向键'右'的扫描码码值 */
#define BLANK 0 /* 空白区域的数字 */
int g_seed = 0; /* 修改随机数种子 */
//产生新的数字
bool GetNum(int(*arr)[COL])
{
	srand((unsigned int)time(NULL) + g_seed);
	g_seed++;
	int row = rand() % ROW;
	int col = rand() % COL;
	int ran = 2;//ran用来确认随机数为2或4
	if (rand() % 5 == 0)
	{
		ran = 4;
	}
	while (arr[row][col] != 0)//当前格子不等于0
	{
		col++;
		if (col == COL)
		{
			row = (row + 1) % ROW;
			col = 0;
		}
	}
	if (arr[row][col] == 0)
	{
		arr[row][col] = ran;
		return true;
	}
	else
		return false;
}
//显示界面
void Show(int(*arr)[COL])
{
	system("CLS");//清除屏幕数据
	 绘图窗口初始化
	//initgraph(640, 640);

	 读取图片至绘图窗口
	//loadimage(NULL, _T("C:\\Users\\86166\\Desktop\\微信图片_20230524161021.jpg"), 640, 640);
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%d\t", arr[i][j]);
		}
		printf("\n\n");
	}
	/*_getch();
	closegraph();*/
}
//向左合并和移动函数
//有合并或移动数据返回true,否则返回false
bool MergeLeft(int(*arr)[COL])
{
	for (int i = 0; i < 4; i++)
	{
		//如果出现连续三个相同,先合并靠里面的,也就是说先合并最左边的,所以从左向右循环
		//如果后两个合并后与前一个相同,不会继续和前一个合并
		for (int j = 0; j < 3; j++)
		{//合并
			if (((*(arr + i))[j] == (*(arr + i))[j + 1]) && (*(arr + i))[j + 1] != 0)
			{
				(*(arr + i))[j] *= 2;
				(*(arr + i))[j + 1] = 0;
			}
			else if (j < 2 && (*(arr + i))[j] == (*(arr + i))[j + 2] && (*(arr + i))[j + 1] == 0)
			{//解决出现2 0 2 0->4 0 0 0的问题和0 2 0 2->0 4 0 0的问题
				(*(arr + i))[j] *= 2;
				(*(arr + i))[j + 2] = 0;
			}
			else if (j == 0 && (*(arr + i))[j] == (*(arr + i))[j + 3] && (*(arr + i))[j + 1] == 0 && (*(arr + i))[j + 2] == 0)
			{//解决出现2 0 0 2->4 0 0 0的问题
				(*(arr + i))[j] *= 2;
				(*(arr + i))[j + 3] = 0;
			}
			/*else
			{
				break;
			}*/
		}
		for (int j = 2; j >= 0; j--)
		{//平移
			if ((*(arr + i))[j] == 0 && (*(arr + i))[j + 1] != 0)
			{
				for (int k = j; k < 3; k++)
				{
					(*(arr + i))[k] = (*(arr + i))[k + 1];
				}
				(*(arr + i))[3] = 0;
			}
		}
	}
	return true;
}

//向上合并函数
bool MergeUp(int(*arr)[COL])
{
	for (int j = 0; j < 4; j++)
	{
		//如果出现连续三个相同,先合并靠里面的,也会是说先合并最左边的,所以从左向右循环
		//如果后两个合并后与前一个相同,不会继续和前一个合并
		for (int i = 0; i < 3; i++)
		{//合并
			if ((*(arr + i))[j] == (*(arr + i + 1))[j] && (*(arr + i + 1))[j] != 0)
			{
				(*(arr + i))[j] *= 2;
				(*(arr + i + 1))[j] = 0;
			}
			else if (i < 2 && (*(arr + i))[j] == (*(arr + i + 2))[j] && (*(arr + i + 1))[j] == 0)
			{//解决出现2 0 2 0->4 0 0 0的问题和0 2 0 2->0 4 0 0的问题
				(*(arr + i))[j] *= 2;
				(*(arr + i + 2))[j] = 0;
			}
			else if (i == 0 && (*(arr + i))[j] == (*(arr + i + 3))[j] && (*(arr + i + 1))[j] == 0 && (*(arr + i + 2))[j] == 0)
			{//解决出现2 0 0 2->4 0 0 0的问题
				(*(arr + i))[j] *= 2;
				(*(arr + i + 3))[j] = 0;
			}
		}
		for (int i = 2; i >= 0; i--)
		{//平移
			if ((*(arr + i))[j] == 0 && (*(arr + i + 1))[j] != 0)
			{
				for (int k = i; k < 3; k++)
				{
					(*(arr + k))[j] = (*(arr + k + 1))[j];
				}
				(*arr + 3)[j] = 0;
			}
		}
	}
	return true;
}

bool MergeRight(int(*arr)[COL])
{
	for (int i = 0; i < 4; i++)
	{
		//如果出现连续三个相同,先合并靠里面的,也会是说先合并最左边的,所以从左向右循环
		//如果后两个合并后与前一个相同,不会继续和前一个合并
		for (int j = 3; j > 0; j--)
		{//合并
			if (((*(arr + i))[j] == (*(arr + i))[j - 1]) && (*(arr + i))[j - 1] != 0)
			{
				(*(arr + i))[j] *= 2;
				(*(arr + i))[j - 1] = 0;
			}
			else if (j > 1 && (*(arr + i))[j] == (*(arr + i))[j - 2] && (*(arr + i))[j - 1] == 0)
			{//解决出现2 0 2 0->4 0 0 0的问题和0 2 0 2->0 4 0 0的问题
				(*(arr + i))[j] *= 2;
				(*(arr + i))[j - 2] = 0;
			}
			else if (j == 3 && (*(arr + i))[j] == (*(arr + i))[j - 3] && (*(arr + i))[j - 1] == 0 && (*(arr + i))[j - 2] == 0)
			{//解决出现2 0 0 2->4 0 0 0的问题
				(*(arr + i))[j] *= 2;
				(*(arr + i))[j - 3] = 0;
			}
			/*else
			{
				break;
			}*/
		}
		for (int j = 1; j <= 3; j++)
		{//平移
			if ((*(arr + i))[j] == 0 && (*(arr + i))[j - 1] != 0)
			{
				for (int k = j; k > 0; k--)
				{
					(*(arr + i))[k] = (*(arr + i))[k - 1];
				}
				(*(arr + i))[0] = 0;
			}
		}
	}
	return true;
}

//向下合并函数
bool MergeDown(int(*arr)[COL])
{
	for (int j = 0; j < 4; j++)
	{
		//如果出现连续三个相同,先合并靠里面的,也会是说先合并最左边的,所以从左向右循环
		//如果后两个合并后与前一个相同,不会继续和前一个合并
		for (int i = 3; i > 0; i--)
		{//合并
			if ((*(arr + i))[j] == (*(arr + i - 1))[j] && (*(arr + i - 1))[j] != 0)
			{
				(*(arr + i))[j] *= 2;
				(*(arr + i - 1))[j] = 0;
			}
			else if (i > 1 && (*(arr + i))[j] == (*(arr + i - 2))[j] && (*(arr + i - 1))[j] == 0)
			{//解决出现2 0 2 0->4 0 0 0的问题和0 2 0 2->0 4 0 0的问题
				(*(arr + i))[j] *= 2;
				(*(arr + i - 2))[j] = 0;
			}
			else if (i == 3 && (*(arr + i))[j] == (*(arr + i - 3))[j] && (*(arr + i - 1))[j] == 0 && (*(arr + i - 2))[j] == 0)
			{//解决出现2 0 0 2->4 0 0 0的问题
				(*(arr + i))[j] *= 2;
				(*(arr + i - 3))[j] = 0;
			}
		}
		for (int i = 1; i < 4; i++)
		{//平移
			if ((*(arr + i))[j] == 0 && (*(arr + i - 1))[j] != 0)
			{
				for (int k = i; k > 0; k--)
				{
					(*(arr + k))[j] = (*(arr + k - 1))[j];
				}
				(*arr)[j] = 0;
			}
		}
	}
	return true;
}

//根据方向键合并相应的数字
//arr:保存数据的数组,dirce :方向值
bool MergeNum(int(*arr)[COL], int dirce)
{
	bool flg = false;
	switch (dirce)
	{
	case 1:
		flg = MergeLeft(arr);//向左合并
		break;
	case 2:
		flg = MergeUp(arr);//向上合并
		break;
	case 3:
		flg = MergeRight(arr);//向右合并
		break;
	case 4:
		flg = MergeDown(arr);//向下合并
		break;
	default:
		break;
	}
	return flg;
}

// 获得方向键键值函数
int GetButton()
{
	int ch;//保存从键盘读取的值

	while (1)

	{
		if (_kbhit())//有击键发生

		{
			ch = _getch();//获取键盘值,不需要回车
			if (ch == 0xE0)//确定是方向键
			{
				ch = _getch();
				if (ch == KEY_LEFT)
					return 1;
				else if (ch == KEY_UP)
					return 2;
				else if (ch == KEY_RIGHT)
					return 3;
				else if (ch == KEY_DOWN)
					return 4;
				else
					return 0;
			}
		}
	}
	ExMessage m;
	while (peekmessage(&m, EX_KEY))
	{
		if (m.message == WM_KEYDOWN)
		{
			switch (m.vkcode)
			{
			case VK_LEFT:
				return 1;
			case VK_UP:
				return 2;
			case VK_RIGHT:
				return 3;
			case VK_DOWN:
				return 4;
			}
		}
	}
	return 0;
}

//判断游戏是否结束函数
bool IsGameover(int(*arr)[COL])
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if ((*arr + i)[j] == 0)
			{
				return false;
			}
			else if (((*(arr + i))[j] == (*(arr + i))[j + 1] && j < 3) || ((*(arr + i))[j] == (*(arr + i + 1))[j] && i < 3))
			{
				return false;
			}
		}
	}
	return true;
}

//运行游戏
void Run(int(*arr)[COL])
{
	int direc; /* 保存方向值 */
	while (1)
	{
		direc = GetButton();//获得方向键键值
		//printf("%d\n", direc);//用于测试
		if (!MergeNum(arr, direc)) //合并和移动数据
		{
			continue;
		}
		if (!GetNum(arr)) /* 游戏结束 */
		{
			return;
		}
		Show(arr);
		if (IsGameover(arr)) //游戏是否结束
		{
			return;
		}
	}
}
//开始游戏
void Start(int(*arr)[COL])
{
	for (int i = 0; i < 2; i++) /* 开始界面必须有两个数字 */
	{

		GetNum(arr);
	}
	Show(arr);
}
int main()
{
	int arr[ROW][COL] = { 0 };
	Start(arr);
	Run(arr);
	printf("Game over!\n");
	return 0;
}







本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1590322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K-means和逻辑回归

逻辑回归 一个事件的几率是该事件发生的概率/该事件不发生的概率&#xff1a;P/&#xff08;1-P&#xff09; 对数几率是&#xff1a;log(P/&#xff08;1-P&#xff09;) **考虑对输入x分类的模型&#xff1a;**log(P/&#xff08;1-P&#xff09;)wx 则 Pexp(wx)/(exp(w*x)…

进口PFA容量瓶高纯透明聚四氟乙烯材质耐强酸碱PFA定容瓶

PFA容量瓶&#xff0c;也叫特氟龙容量瓶&#xff0c;是用于配制标准浓度溶液的实验室器皿&#xff0c;是有着细长颈、梨形肚的耐强腐蚀平底塑料瓶&#xff0c;颈上有标线&#xff0c;可直接配置标准溶液和准确稀释溶液以及制备样品溶液。 因其有着不易碎、材质纯净、化学稳定性…

应急响应-战前反制主机HIDSElkeid蜜罐系统HFish

知识点 战前-反制-平台部署其他更多项目&#xff1a; https://github.com/birdhan/SecurityProduct HIDS&#xff1a;主机入侵检测系统&#xff0c;通常会有一个服务器承担服务端角色&#xff0c;其他主机就是客户端角色&#xff0c;客户端加入到服务端的检测范围里&#xff…

ERA拓展之旅:2024香港Web3峰会聚焦全球Web3发展

2024年香港Web3大型峰会是一次令人难忘的体验。这次峰会吸引了来自世界各地的Web3爱好者和从业者齐聚一堂&#xff0c;共同探讨着Web3的未来发展方向与机遇。在这个热情洋溢的氛围中&#xff0c;展现了对Web3的热情&#xff0c;分享彼此的见解和理念&#xff0c;探讨了未来的行…

Vue3学习05 一些API

Vue3-API 其它 API【shallowRef 与 shallowReactive 】shallowRefshallowReactive总结 【readonly 与 shallowReadonly】readonlyshallowReadonly 【toRaw 与 markRaw】toRawmarkRaw 【customRef】 Vue3新组件【Teleport】【Suspense】【全局API转移到应用对象】【其他】 其它 …

Spark-Scala语言实战(15)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的学习键值对方法中的lookup&#xff0c;cogroup两种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#…

CLion 2024:为Mac与Win打造的卓越跨平台集成开发环境

CLion 2024作为一款跨平台IDE&#xff0c;CLion 2024不仅完美支持Mac和Windows两大操作系统&#xff0c;更在细节之处展现了其出色的跨平台兼容性。无论你是在Mac的优雅界面下工作&#xff0c;还是在Windows的实用环境中编程&#xff0c;CLion 2024都能为你提供一致且流畅的开发…

【STM32嵌入式系统设计与开发】——17STM32Temper(ADC内部温度传感器应用)

这里写目录标题 STM32资料包&#xff1a; 百度网盘下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd8888 提取码&#xff1a;8888 一、任务描述二、任务实施1、工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#…

大数据之ClickHouse

大数据之ClickHouse 简介 ClickHouse是一种列式数据库管理系统&#xff0c;专门用于高性能数据分析和数据仓库应用。它是一个开源的数据库系统&#xff0c;最初由俄罗斯搜索引擎公司Yandex开发&#xff0c;用于满足大规模数据分析和报告的需求。 特点 开源的列式存储数据库…

计算机网络---第九天

以太网交换机的工作原理 以太网定义&#xff1a; 定义&#xff1a;输出标准Ethernet2类型帧的网络 以太网特征&#xff1a; 特征&#xff1a;多路访问&#xff0c;广播式的网络 mac地址: 每台设备都有一个唯一的物理地址&#xff0c;全球唯一 48位长度&#xff0c;16禁止…

浏览器工作原理与实践--HTTP/1:HTTP性能优化

谈及浏览器中的网络&#xff0c;就避不开HTTP。我们知道HTTP是浏览器中最重要且使用最多的协议&#xff0c;是浏览器和服务器之间的通信语言&#xff0c;也是互联网的基石。而随着浏览器的发展&#xff0c;HTTP为了能适应新的形式也在持续进化&#xff0c;我认为学习HTTP的最佳…

mac上如何安装python3

mac上如何安装python3&#xff1f; 安装homebrew 在终端执行命令 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 执行完成后&#xff0c;homebrew和pip等工具就自动安装好了。 接下来安装python3.在终端…

nfs服务器详解

nfs&#xff08;网络文件系统&#xff09;---------- 其实就是通过网络将文件共享出去。 通过TCP/IP网络去共享资源的。在NFS的应用中&#xff0c;本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件&#xff0c;就像访问本地文件一样。 客户端和服务端需要去读写共…

Let‘s Encrypt

创建文件夹 mkdir /usr/local/develop/ 安装Certbot客户端 yum install certbot 首先确保example.com和www.example.com这两个域名通过DNS解析绑定了你的web 服务器的公网 IP 就是说先要完成域名解析到服务器 下面命令会验证 /var/www/example 他会将一些命令文件存在…

国芯科技(C*Core)双芯片汽车安全气囊解决方案

汽车安全气囊是20世纪汽车上的十大发明之一&#xff0c;是目前汽车的法定标准配置&#xff0c;成为汽车驾乘人员生命安全的保护神。随着人们对汽车安全性要求的进一步提高&#xff0c;已形成前排驾驶员气囊、前排副驾驶员气囊、前排侧气囊、后排侧气囊、膝部气囊、安全气帘等等…

7、Qt--QLabel使用小记

前言&#xff1a;QLabel作为QT中基础的控件&#xff0c;功能简单使用方便频繁&#xff0c;主要用于显示文本、图片等信息。笔者这里记录下一些开发使用心路&#xff0c;方便小白快速入手。 一、添加背景图片 首先需要在资源中添加好图片资源&#xff0c;图片资源的添加参考4.1…

工智能图像降噪软件 ON1 NoNoise AI 2024 for Mac激活版

ON1 NoNoise AI 2024 for Mac是一款专为Mac用户设计的先进人工智能图像降噪软件。其核心功能在于能够利用机器学习技术&#xff0c;快速并智能地消除图像中的噪点&#xff0c;无论是亮度噪点还是颜色噪点&#xff0c;都能得到显著的改善。 软件下载&#xff1a;ON1 NoNoise AI …

自定义协议:序列化与反序列化的深度解析与实践

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 1.引言 协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如…

Java基于微信小程序的高校体育场管理小程序,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

什么是态势感知?

什么是态势感知&#xff1f; 同学&#xff0c;听说过态势感知吗&#xff1f;啥&#xff1f;不知道&#xff1f;不知道很正常&#xff0c;因为态势感知是一个比较小众、比较神秘的概念。为什么态势感知很神秘&#xff0c;首先是因为这是来自军事情报领域的概念&#xff0c;然后…