C语言--2048小游戏

需要用到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或4if (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;}elsereturn 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;elsereturn 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.mzph.cn/news/811133.shtml

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

相关文章

Rust面试宝典第2题:逆序输出整数

题目 写一个方法&#xff0c;将一个整数逆序打印输出到控制台。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如&#xff1a;123的逆序输出为321&#xff0c;8600的逆序输出为68&#xff0c;-609的逆序输出为-906。 解析 这道题本身并没有什么…

PostgreSQL入门到实战-第二十一弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(五)官网地址PostgreSQL概述PostgreSQL中RIGHT JOIN命令理论PostgreSQL中RIGHT JOIN命令实战更新计划 PostgreSQL中表连接操作(五) 使用PostgreSQL RIGHT JOIN连接两个表&#xff0c;并从右表返回行 官网地址 声明: 由于操作系统…

打印机共享设置助手

工作中经常设置共享打印机&#xff0c;为简化操作编写了此打印机设置助手运行环境&#xff1a; 支持Windows 7以上系统直接运行Windows 7 使用PrinterTool_NET20版本Windows 10以上 使用PrinterTool_NET452版本 软件功能&#xff1a; 设置默认打印机设置共享打印机快捷连接共…

微软Office吊打WPS ?不一定,WPS未来被它“拿捏”了

微软Office Plus吊打WPS Office&#xff1f; 微软的Office套件在全球范围内内享有盛誉&#xff0c;其强大的功能和广泛的应用场景使其在办公、娱乐乃至生活的各个角落都显得不可或缺。 而与之相对&#xff0c;WPS Office作为国内办公软件的佼佼者&#xff0c;与微软的较量已历…

探新路建“枢纽” 湖南深耕中非经贸合作“试验田”

湖南作为中国与非洲经贸合作的重要窗口&#xff0c;积极推动中非经贸关系的发展和深化。通过构建覆盖全产业链的高效运作模式&#xff0c;湖南企业能够在一周内将肯尼亚干制鳀鱼加工成为麻辣鲜香的劲仔深海小鱼并投入中国市场。此外&#xff0c;湖南还致力于推动非洲优质农产品…

gitee和idea集成

1 集成插件 2 配置账号密码 3 直接将项目传到仓库 4直接从gitee下载项目

题目:斤斤计较得小Z(蓝桥OJ 2047)

问题描述&#xff1a; 题解&#xff1a; 做法一&#xff08;kmp模板&#xff09;&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e6 9; char s[N], p[N]; int nex[N];int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);// p: 子…

Stable Diffusion——SDXL Turbo让 AI 出图速度提高10倍

摘要 在本研究中&#xff0c;我们提出了一种名为对抗扩散蒸馏&#xff08;ADD&#xff09;的创新训练技术&#xff0c;它能够在1至4步的采样过程中&#xff0c;高效地对大规模基础图像扩散模型进行处理&#xff0c;同时保持图像的高质量。该方法巧妙地结合了分数蒸馏技术&…

记录linux从0部署java项目(宝塔)

目录 一、安装宝塔可视化界面 二、部署前端 三、部署后端 1、配置并连接Mysql数据库 2、配置并连接redis 3、安装jdk 这里先记录一个安装后遇到的问题 安装openJDK 四、检查 一、安装宝塔可视化界面 宝塔面板下载&#xff0c;免费全能的服务器运维软件 运行安装脚本 安…

【爬虫开发】爬虫从0到1全知识md笔记第5篇:Selenium课程概要,selenium的其它使用方法【附代码文档】

爬虫开发从0到1全知识教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;爬虫课程概要&#xff0c;爬虫基础爬虫概述,,http协议复习。requests模块&#xff0c;requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. request…

【JAVA基础篇教学】第一篇:Java基础数据类型

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第一篇&#xff1a; Java基础数据类型。 在Java中&#xff0c;数据类型是用来指定变量存储数据的类型。Java的数据类型可以分为两大类&#xff1a;原始数据类型&#xff08;Primitive Data Types&#xff09;和引用数据类型…

黄金基金和黄金有什么区别?

黄金基金本质上是一种投资工具&#xff0c;它通过间接投资黄金或与其紧密相关的金融衍生品来反映黄金市场的表现。不同于直接持有实物黄金&#xff0c;投资者购买黄金基金并不涉及实体黄金的保管问题&#xff0c;而是将资金交由专业的基金管理人管理&#xff0c;由他们代表投资…

流程图的新语法-mermaid的快速使用--推荐

chatgpt或者现在的大数据采用的流程图给出的代码如下&#xff1a; graph TD;A[接收客户请求] --> B[问题分类];B --> C[技术支持];B --> D[维修服务];C --> E[远程解决];C --> F[现场支持];D --> G[维修完成];G --> H[服务反馈];style A fill:#f9f,strok…

IO流(字节流、字符流)

一、IO概述 1&#xff0e;什么是IO流? 存储和读取数据的解决方案l: inputo: output流∶像水流一样传输数据 2.IO流的作用? 用于读写数据&#xff08;本地文件&#xff0c;网络) 3.IO流按照流向可以分类哪两种流? 输出流:程序 - > 文件 输入流:文件 - > 程…

【解决】安装模块时报错:ERROR: *.whl is not a valid wheel filename.

其实错误信息已经告诉你了&#xff0c;就是你的文件名有问题。在你下载whl文件时一定要注意原文件的文件名&#xff0c;不要改动文件名。 以我安装pandas模块为例吧。 在我下载whl文件时&#xff0c;因为网速太慢&#xff0c;我就下载了多次&#xff0c;导致文件名变成了这个…

ssm044基于java和mysql的多角色学生管理系统+jsp

学生管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处…

【汇编】计算机系统构成

计算机系统构成 计算机系统包括硬件和软件两部分 硬件 典型的计算机结构包括 中央处理器(CPU)、存储器和输入输出(I/O)子系统 三个主要组成部分&#xff0c;用系统总线把它们连接在一起 计算机硬件组成与各部分之间的联系 软件 计算机软件可以分为系统软件和用户软件两大类 …

如何查找下载国外博士论文

查找国外博士论文可以去ProQuest学位论文全文数据库&#xff0c;ProQuest学位论文全文数据库&#xff0c;是将ProQuest公司PQDD文摘库&#xff08;现名PQDT&#xff09;中适合中国科研人员科研和教学使用的论文全文建设而成&#xff0c;并向全国百数家科研教学单位的读者提供全…

【数据结构与算法】贪心算法及例题

目录 贪心算法例题一&#xff1a;找零问题例题二&#xff1a;走廊搬运物品最优方案问题输入样例例题三&#xff1a;贪心自助餐 贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;以期望最终达到全局最优解的算法。它的核心思想是每次都选择当前最…

基于动态顺序表的应用——通讯录

文章目录 顺序表的应用——基于动态顺序表实现通讯录一、顺序表的文件&#xff1a;SeqList.hSeqList.c 二、通讯录的实现思路三、通讯录代码实现通讯录的初始化通讯录的销毁通讯录添加数据通过姓名查找联系人通讯录删除数据通讯录展示通讯录修改数据通讯录查找测试代码 四、所有…