2048小游戏C++板来啦! - 指南

news/2025/10/5 18:49:16/文章来源:https://www.cnblogs.com/tlnshuju/p/19126889

2048小游戏C++板来啦! - 指南

2025-10-05 18:44  tlnshuju  阅读(0)  评论(0)    收藏  举报

个人主页: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 
#include 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.mzph.cn/news/928597.shtml

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

相关文章

重庆 网站 建设 公司网络商城需要什么资质

对话框 消息对话框、字体对话框、颜色对话框、文件对话框 消息对话框 消息对话框提供了一个模态的对话框&#xff0c;用来提示用户信息&#xff0c;或者询问用户问题并得到回答 基于属性版本的API 使用该类调用构造函数&#xff0c;构造一个类对象调用成员函数exec进入执行…

详细介绍:vue+cesium示例:3Dtiles三维模型高度调整(附源码下载)

详细介绍:vue+cesium示例:3Dtiles三维模型高度调整(附源码下载)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

st表 + 变形的djs (好题

st表 + 变形的djs (好题https://codeforces.com/gym/105386/problem/J #include <bits/stdc++.h>using i64 = long long;struct STList {int n, k;std::vector<std::vector<int>> Max;STList() {}S…

1.什么是node.js、npm、vue - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

科技园区建设网站的意义个人网站名字

【Rust】001-基础语法&#xff1a;变量声明及数据类型 文章目录 【Rust】001-基础语法&#xff1a;变量声明及数据类型一、概述1、学习起源2、依托课程 二、入门程序1、Hello World2、交互程序代码演示执行结果 3、继续上难度&#xff1a;访问链接并打印响应依赖代码执行命令 三…

网站建设的常见技术有哪些怎么查询在建工程

useMemo和useCallback的用法以及区别 useCallback 和 useMemo 是 React 中的两个钩子函数&#xff0c;它们的目标都是优化性能&#xff0c;但它们在用途和使用场景上有一些区别。 useCallback useCallback 用于缓存一个回调函数&#xff0c;并在依赖项发生变化时&#xff0c…

深圳网站设计是什么简单网站搭建

1.认识二分查找 二分查找的时间复杂度:O(logN) 二分查找属于算法中耳熟能详的一类&#xff0c;通常的我们会说只有数组有序才可以使用二分查找&#xff0c;不过这种说法并不完全正确&#xff0c;只要数据具有"二段性"就可以使用二分查找&#xff0c;即我们可以找出一…

在wpf .net 8项目中使用materialDesign 4 以上版本的的注意事项

在wpf .net 8项目中使用materialDesign 4 以上版本的的注意事项新建.net8 wpf项目 nuget添加MaterialDesignThemes引用,现在可以用5.2.1,注意:可以只有添加这个包即可,因为新nuget会自动依赖引用MaterialDesignCol…

李臻20242817_安全文件传输系统项目报告_第14周 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

一站多通怎么做网站饲料行业建设网站方案设计免费下载ppt

学习java之电脑的常用快捷键和DOS窗口下的常用命令电脑一些常用的快捷键win快捷键&#xff1a;单独按Windows&#xff1a;显示或隐藏 “开始”功能表WindowsBREAK&#xff1a;显示“系统属性” 对话框WindowsD&#xff1a;显示桌面或恢复桌面WindowsM&#xff1a;最小化所有窗口…

做网站套餐enjooy wordpress

本机文件夹同步到云服务器 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。本节操作介绍本地MacOS系统主机通过安装“Microsoft Rem…

长沙做网站 必看 磐石网络网店设计理念

随着我国人民精神文化与物质生活的不断升级&#xff0c;定制真人手办摆件的需求变得广泛&#xff0c;易模推出易模真人手办定制服务&#xff08;小程序&#xff09;&#xff0c;帮助市场合作伙伴能够以全线上、手机端形式为用户制作真人手办&#xff0c;“全线上”的内涵包括手…

洛谷P14120 题解 - lemon

思维路径 容易注意到,这个赛制对于 BaoBao 非常不友好,因为 DreamGrid 可以通过他出的牌来决定自己的出牌。也就是说,我们不需要关注 BaoBao 的出牌顺序,只需要关注他出的每一张牌对应 DreamGrid 出的牌即可。 对于…

通州网站建设服务做网站建设销售

主要实现的那种光晕效果&#xff1a;中间亮&#xff0c;四周逐渐变淡的。 这边有三种发光效果&#xff0c;先上效果图。 第一种、圆形发光体 实现代码&#xff1a;新建shape_light.xml&#xff0c;导入以下代码。使用时&#xff0c;直接给view设置为background。 <?xml …

请网站制作公司费用网站制作与网站建设pdf

Navicat创建数据库表 、导入sql文件&#xff0c;生成表结构 1.打开Navicat2.远程连接mysql连接3.创建数据库4.导入sql文件5.生成表结构 1.打开Navicat 2.远程连接mysql连接 3.创建数据库 4.导入sql文件 导入源代码中的sql文件 5.生成表结构

33 ACwing 294 Count The Repetitions 题解

Count The Repetitions 题面 定义 conn(s,n) 为 n 个字符串 s 首尾相接形成的字符串,例如: conn(“abc”,2)=”abcabc” 称字符串 a 能由字符串 b 生成,当且仅当 a 为 b 的子序列。 例如 abdbec 可以生成 abc,但是…

南沙做网站公司中国百强县市榜单

windows使用redis 安装和配置 下载安装方式一-使用压缩包安装解压到指定的文件Redis安装为Windows服务安装成功 方式二-MSI安装包安装完成 Redis配置远程访问1.修改配置文件redis.windows.conf2.修改完redis配置文件&#xff0c;必须重启redis 下载 先下载Redis for windows 的…

北京天通苑网站建设做网站公司报价

这是树的第10篇算法&#xff0c;力扣链接。 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], po…

电赛电装实习总结

电赛电装实习总结电赛最致命的问题是验收时仪器没有调好,可能是输入阻抗的问题,导致指标全部不对,最好还是拿自己做的时候用的仪器。 很多实验室仪器落灰,不常用的仪器大多是有问题的,用之前一定要矫正,没有验证…