2048小游戏C++板来啦!

个人主页:PingdiGuo_guo

收录专栏:C++干货专栏

大家好呀,我是PingdiGuo_guo,今天我们来学习如何用C++编写一个2048小游戏。

文章目录

1.2048的规则

2.步骤实现

2.1: 初始化游戏界面

2.1.1知识点

2.1.2: 创建游戏界面

2.2: 随机生成数字

2.2.1知识点:

2.2.2: 随机生成两个数字

2.3: 处理用户输入

2.3.1知识点

2.3.2: 处理用户输入

2.4: 更新游戏界面

2.4.1知识点

2.4.2: 合并相同数字

2.4.3: 移动数字

2.5: 判断游戏结束

2.5.1知识点

2.5.2: 判断是否达到2048

2.5.3: 判断是否无法移动

3.总结


1.2048的规则

在进行编写游戏时,我们首先要知道2048游戏的规则:

开始时,游戏棋盘内会随机出现两个数字,这两个数字通常是2或4。

玩家可以通过滑动屏幕来控制棋盘上的数字方块,每次滑动都会使数字方块向滑动的方向移动,直到遇到障碍物(如其他数字方块或棋盘边缘)。

当两个相同数字的方块相遇时,它们会合并成一个新的方块,这个新方块的大小是原来两个方块大小的和。

游戏的目标是合并数字方块,直到得到“2048”这个数字,一旦棋盘被数字填满,且相邻的格子数字不同,游戏就结束了。

在游戏过程中,系统会在空白的方格处随机生成新的数字方块,这些新方块的大小可能是2或4。

因此,我们可以退出一下几个步骤:

1.初始化游戏界面

2.随机生成数字(只能是2或4)

3.处理用户输入(W,A,S,D键)

4.更新游戏界面

5.判断游戏结束(达到2048或无法移动)

2.步骤实现

2.1: 初始化游戏界面

我们首先需要创建一个游戏界面,使用一个二维数组来表示。每个元素代表一个格子,初始值为0。

2.1.1知识点


- 数组的定义和初始化

2.1.2: 创建游戏界面

首先,我们需要定义一个4x4的二维数组gameBoard,用来表示游戏界面。然后,将所有元素的值初始化为0。
 

int gameBoard[4][4] = {0};

2.2: 随机生成数字

游戏开始时,我们需要在游戏界面的两个格子中随机生成两个数字,可以是2或4。

2.2.1知识点:


- 伪随机数的生成

2.2.2: 随机生成两个数字

使用rand()函数来生成伪随机数,并使用取模运算将其限定在特定范围内。然后,将生成的数字放入游戏界面的随机位置。


 

#include <cstdlib>
#include <ctime>void generateRandomNumbers() {int x1 = rand() % 4;int y1 = rand() % 4;int x2 = rand() % 4;int y2 = rand() % 4;int num1 = (rand() % 2 + 1) * 2;int num2 = (rand() % 2 + 1) * 2;gameBoard[x1][y1] = num1;gameBoard[x2][y2] = num2;
}

2.3: 处理用户输入

捕捉用户的输入,根据用户的操作来移动格子。

2.3.1知识点

- 标准输入的处理

2.3.2: 处理用户输入


使用getchar()函数来获取用户的键盘输入,并根据输入来移动或操作格子。

void processUserInput() {char userInput = getchar();switch (userInput) {case 'w':// 处理上键操作break;case 's':// 处理下键操作break;case 'a':// 处理左键操作break;case 'd':// 处理右键操作break;default:break;}
}


2.4: 更新游戏界面

将数字向指定方向移动,并填充空白格子。

2.4.1知识点


- 循环结构的使用

2.4.2: 合并相同数字


当用户移动格子时,如果相邻的两个格子的数字相同,我们需要将它们合并为一个,并将结果放入新的位置。

2.4.3: 移动数字


将所有数字向用户指定的方向移动,并填充空白格子。


 

bool moveUp(int board[SIZE][SIZE]) {bool moved = false;for (int j = 0; j < SIZE; j++) {for (int i = 1; i < SIZE; i++) {if (board[i][j] != 0) {int k = i;while (k > 0 && board[k-1][j] == 0) {board[k-1][j] = board[k][j];board[k][j] = 0;k--;moved = true;}if (k > 0 && board[k-1][j] == board[k][j]) {board[k-1][j] *= 2;board[k][j] = 0;moved = true;}}}}return moved;
}bool moveDown(int board[SIZE][SIZE]) {bool moved = false;for (int j = 0; j < SIZE; j++) {for (int i = SIZE - 2; i >= 0; i--) {if (board[i][j] != 0) {int k = i;while (k < SIZE - 1 && board[k+1][j] == 0) {board[k+1][j] = board[k][j];board[k][j] = 0;k++;moved = true;}if (k < SIZE - 1 && board[k+1][j] == board[k][j]) {board[k+1][j] *= 2;board[k][j] = 0;moved = true;}}}}return moved;
}bool moveLeft(int board[SIZE][SIZE]) {bool moved = false;for (int i = 0; i < SIZE; i++) {for (int j = 1; j < SIZE; j++) {if (board[i][j] != 0) {int k = j;while (k > 0 && board[i][k-1] == 0) {board[i][k-1] = board[i][k];board[i][k] = 0;k--;moved = true;}if (k > 0 && board[i][k-1] == board[i][k]) {board[i][k-1] *= 2;board[i][k] = 0;moved = true;}}}}return moved;
}bool moveRight(int board[SIZE][SIZE]) {bool moved = false;for (int i = 0; i < SIZE; i++) {for (int j = SIZE - 2; j >= 0; j--) {if (board[i][j] != 0) {int k = j;while (k < SIZE - 1 && board[i][k+1] == 0) {board[i][k+1] = board[i][k];board[i][k] = 0;k++;moved = true;}if (k < SIZE - 1 && board[i][k+1] == board[i][k]) {board[i][k+1] *= 2;board[i][k] = 0;moved = true;}}}}return moved;
}

2.5: 判断游戏结束

判断游戏是否结束,可以是达到2048或者无法移动。

2.5.1知识点

- 条件语句的使用

2.5.2: 判断是否达到2048


判断游戏界面是否达到了2048,如果达到则游戏获胜。

2.5.3: 判断是否无法移动


判断游戏界面是否已经无法进行任何移动,即所有格子已满且相邻格子的值都不相同,如果是则游戏失败。


 

bool isGameWon() {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (gameBoard[i][j] == 2048) {return true;}}}return false;
}bool isGameOver() {bool canMove = false;for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (gameBoard[i][j] == 0) {canMove = true;break;}if (i < 3 && gameBoard[i][j] == gameBoard[i + 1][j]) {canMove = true;break;}if (j < 3 && gameBoard[i][j] == gameBoard[i][j + 1]) {canMove = true;break;}}}return !canMove;
}

通过以上步骤及代码,我们实现了2048这个小游戏,以下是运行代码时显示的:

3.总结

本篇博客教大家如何实现一个2048小游戏,希望大家有所收获,如果有好的建议欢迎留言,谢谢大家啦!

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

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

相关文章

TensorFlow深度学习实战——Transformer变体模型

TensorFlow深度学习实战——Transformer变体模型 0. 前言1. BERT2. GPT-23. GPT-34. Reformer5. BigBird6. Transformer-XL7. XLNet8. RoBERTa9. ALBERT10. StructBERT11. T5 和 MUM12. ELECTRA13. DeBERTa14. 进化 Transformer 和 MEENA15. LaMDA16. Switch Transformer17. RE…

还原自动驾驶的“前世今生”:用 Python 实现数据记录与回放系统

还原自动驾驶的“前世今生”:用 Python 实现数据记录与回放系统 你有没有想过这样一个场景: 一辆自动驾驶测试车,在街头拐了个弯,却突然急刹。测试员一脸懵,研发团队问:“数据记录了吗?” 他摊摊手:“系统当时没挂上录制……” 对不起,重测吧。 这不是段子,而是我在…

access和excel用vba进行辅助办公软件开发

1、access用vba创建子窗口child查询 出现这个报错的时候&#xff0c;一般是用vba通过ado.connection连接&#xff0c;没有绑定数据源造成的&#xff1a; 先绑定再使用 Me.Child2.SourceObject "表.资产管理" 连接数据源 Me.Child2.Form.RecordSource strSql …

Nginx+tomcat集群

Nginxtomcat集群 一、Nginx 简介 1.1 定义 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器&#xff0c;同时支持 IMAP/POP3/SMTP 服务。由俄罗斯工程师伊戈尔・赛索耶夫开发&#xff0c;于 2004 年首次公开发布&#xff0c;基于 BSD-like 协议&#xff0c;代码开源且免费…

RPC - 客户端注册和发现模块

registryMethod 函数详解&#xff1a; 函数目的 registryMethod 是 Provider 类的核心方法&#xff0c;用于向服务注册中心注册服务。注册成功后&#xff0c;服务注册中心会更新内部的服务映射表&#xff0c;建立服务名称到提供者地址的映射关系。 执行流程示例 场景: 多米…

leetcode332.重新安排行程:优先队列与DFS实现欧拉路径的行程规划

一、题目深度解析与行程规划本质 题目描述 给定一个机票的字符串二维数组 tickets&#xff0c;每个元素是 [from, to] 的形式&#xff0c;表示从 from 到 to 的机票。要求找出从 JFK 出发的行程&#xff0c;且必须使用所有机票&#xff0c;若存在多种可能的行程&#xff0c;返…

1.21SQLCipher 简介

SQLCipher 是一个基于 SQLite 的扩展&#xff0c;提供了透明的数据库加密功能。与普通 SQLite 不同&#xff0c;SQLCipher 在数据写入磁盘前自动加密&#xff0c;读取时自动解密&#xff0c;无需开发者手动处理加密逻辑。这使得它非常适合移动应用、桌面应用等需要本地数据加密…

无人机不再“盲飞”!用Python搞定实时目标识别与跟踪

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…

Vue-7-前端框架Vue之应用基础从Vue2语法到Vue3语法的演变

文章目录 1 基于vite创建1.1 对比webpack和vite1.2 创建工程1.3 启动项目2 调试工具Vue.js Devtools3 src结构3.1 index.html3.2 main.ts3.3 App.vue(根组件)4 示例(Vue2的语法)4.1 Person.vue4.2 App.vue4.3 选项式API对比组合式API4.4 程序流程5 示例(Vue3的语法)5.1 setup概…

上线iOSApp前抓包工具协作保障接口行为一致性(iOS抓包)

项目上线前&#xff0c;你是否总会担心“接口是不是在某个边缘条件下表现不一致”&#xff1f;哪怕单元测试通过、接口文档齐全&#xff0c;真到线上用户手上&#xff0c;总还是可能出现一些环境相关的异常。 最近参与某App大版本上线前的质量验证流程&#xff0c;我们特别安排…

Java可变参数:灵活编程的秘密武器

Java可变参数的理解与应用 Java中的可变参数&#xff08;Varargs&#xff09;允许方法接受数量不定的同类型参数&#xff0c;简化了方法调用时的参数传递。可变参数通过在参数类型后添加...实现&#xff0c;本质上是一个数组&#xff0c;但在调用时可以传入多个单独的参数。 …

汽车 CDC威胁分析与风险评估

汽车 CDC&#xff08;连续阻尼控制系统&#xff09;的威胁分析与风险评估需结合其技术特性、应用场景及行业标准展开。以下是详细解析及实例说明&#xff1a; 一、CDC 系统技术原理与结构 CDC&#xff08;Continuous Damping Control&#xff09;通过实时调节悬挂阻尼力提升驾…

TensorFlow 安装与 GPU 驱动兼容(h800)

环境说明TensorFlow 安装与 GPU 驱动兼容CUDA/H800 特殊注意事项PyCharm 和终端环境变量设置方法测试 GPU 是否可用的 Python 脚本 # 使用 TensorFlow 2.13 在 NVIDIA H800 上启用 GPU 加速完整指南在使用 TensorFlow 进行深度学习训练时&#xff0c;充分利用 GPU 能力至关重要…

Laravel 项目中图片上传后无法访问的问题

情况&#xff1a; Laravel 提供了 php artisan storage:link 命令&#xff0c;用于创建符号链接&#xff08;Symbolic Link&#xff09;&#xff0c;将 storage/app/public 映射到 public/storage。但是上传图片之后 文件目录确实有 但是无法访问。 1. 删除已经创建的 rm -rf…

Tesollo携人形机器人手进军国内市场

Tesollo灵巧手是Tesollo公司研发的一系列机器人灵巧手产品&#xff0c;涵盖两指到五指的设计 产品型号与特点 Delto-5F五指灵巧手&#xff1a;具备20个自由度&#xff0c;每个手指配备4个独立关节&#xff0c;抓握力达到7公斤&#xff0c;每个关节空载可达75转/分钟&#xff0…

Python文件操作的“保险箱”:with语句深度实战指南

目录 一、with语句的底层运作原理 资源获取阶段 资源释放阶段 二、文件操作实战场景解析 场景1:基础文件读写 场景2:异常处理进阶 场景3:复合资源管理 三、自定义上下文管理器 四、with语句的性能考量 五、实战经验总结 在Python编程中,文件操作是日常开发的高频…

openKylin高校沙龙 | 走进成都高校,推动开源技术交流与人才培养

openKylin高校沙龙 | 成都高校 4月25日&#xff0c;CCF开源发展委员会“开源高校行”暨红山开源openKylin高校行成都站圆满举办&#xff0c;这场连接两所大学的开源知识盛会&#xff0c;为成都信息工程大学与电子科技大学的300余名与会师生带来了前沿的行业思考与技术实践。Op…

即梦3.0更新后市面上的的评价如何?

设计师紧握数位板缩在墙角&#xff0c;全息投影中的AI正在生成同风格设计图&#xff0c;地面倒影显示“人类设计师生涯倒计时”。当最新一代AI绘图工具悄然开启测试时&#xff0c;设计圈陷入集体震动——有人惊叹“以后还干XX&#xff0c;都回家卖煎饼吧”&#xff0c;也有人彻…

haproxy搭建nginx网站访问

文章目录 一.案例概述2.1 HTTP请求2.2 负载均衡常用调度算法①RR&#xff08;Round robin&#xff09;②LC&#xff08;least connections&#xff09;③SH&#xff08;source hashing&#xff09; 2.3 常见的web群集调度器3.实验环境 二.实验步骤1.两台web网站步骤相同 安装we…

进程间通信之socketpair

进程间通信之socketpair 源代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/wait.h>int main() {//父子通讯管道int m_pipe[2];//创建管道if(socketpa…