2048游戏C++板来啦!

2024-02-15 09:44
文章标签 c++ 游戏 2048 板来

本文主要是介绍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小游戏,希望大家有所收获,如果有好的建议欢迎留言,谢谢大家啦!

这篇关于2048游戏C++板来啦!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711039

相关文章

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么