2048小游戏C++板来啦!

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

Read more

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

大模型仍未对上商业的齿轮? 编译 | 王启隆 来源 | youtu.be/aWqfH0aSGKI 出品丨AI 科技大本营(ID:rgznai100) 现在的硅谷,空气里都飘着一股“再不上车就晚了”的焦躁感。 最近 OpenClaw 风头正旺,强势登顶 GitHub,终结了 React 神话,许多人更是觉得“AI 自己干活赚钱”的日子就在明天了。 特别是在斯坦福商学院(GSB)这种地方,台下坐着的都是成天琢磨怎么用下一个技术风口搞个独角兽出来的狠人。 微软的首席科学官(CSO)Eric Horvitz 被请到了这个几乎全美最想用 AI 变现的礼堂里。作为从上世纪 80 年代就开始搞 AI 的绝对老炮、也是微软技术底座的“扫地僧”,这位老哥并没有顺着台下的胃口,去吹捧下个月大模型又要颠覆什么行业,而是兜头给大家浇了一盆带点学术味的冷水。 他讲了一个挺有画面感的比喻:大家都在聊

By Ne0inhk
Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当大模型能在几秒钟内生成一段“看起来像那么回事”的补丁时,开源社区却开始付出另一种代价。 最近,开源游戏引擎 Godot 的核心维护团队公开吐槽:他们正被大量“AI 生成的低质量代码”淹没。那些代码往往结构完整、注释齐全、描述洋洋洒洒,但真正的问题是——提交者可能并不理解自己交上来的内容。 这件事,并不是简单的“有人偷懒用 AI 写代码”。它正在触及开源协作最核心的东西:信任。 一场悄无声息的“AI 洪水” 事情的导火索来自一条 Bluesky 讨论帖。 Godot 主要维护者之一、同时也是 Godot 商业支持公司 W4 Games 联合创始人的 Rémi Verschelde 表示,所谓的“AI slop”

By Ne0inhk
诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

当宇宙级的“嘴炮”遇到降维打击。 编译 | 王启隆 来源 | youtu.be/l6ZcFa8pybE 出品丨AI 科技大本营(ID:rgznai100) 打开最新一期知名播客 StarTalk 的 YouTube 评论区,最高赞的一条留言是这样写的: “我长这么大,第一次看到尼尔·德葛司·泰森(Neil deGrasse Tyson)在一档节目里几乎全程闭嘴,像个手足无措的小学生一样乖乖听讲。” 作为全美最知名的天体物理学家,泰森平时的画风是充满激情、喋喋不休、用宇宙的宏大来震撼嘉宾。但这一次,坐在他对面的那位满头银发、带着温和英音的英国老人,仅仅用最平淡的语气,就让整个演播室陷入了数次令人窒息的沉默。 这位老人是 Geoffrey Hinton。深度学习三巨头之一,2024 年诺贝尔物理学奖得主,被公认为“AI 教父”。 对经常阅读 Hinton 演讲的我来说,这也是比较新奇的一幕—

By Ne0inhk
48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

整理 | 苏宓 出品 | ZEEKLOG(ID:ZEEKLOGnews) 「仅过了 48 小时,一笔 8.2 万美元的天价费用凭空出现,较这家小型初创公司的正常月费暴涨近 46000%。」 这不是假设的虚幻故事,而是一家墨西哥初创公司正在经历的真实危机。 近日,一位名为 RatonVaquero 的开发者在 Reddit 发帖求助称,由于他的 Gemini API 密钥被盗用,原本每月仅约 180 美元(约 1242 元)的费用,在短短 48 小时内暴涨到 82,314.44 美元(约 56.8 万元)。对于这家只有三名开发者的小型创业团队来说,这笔突如其来的账单,几乎等同于灭顶之灾。 “我现在整个人都处在震惊和恐慌之中。”RatonVaquero

By Ne0inhk