简易2048游戏的实现(C++)

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波·莫听穿林打叶声》
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)

目录

      • 一、效果图
      • 二、代码(带注释)
      • 三、说明

一、效果图

在这里插入图片描述

二、代码(带注释)

//创作者:Code_流苏(CSDN)
//未经允许,禁止转载发布,可自己学习使用
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>using namespace std;const int SIZE = 4; // 定义游戏板的大小为4x4// 初始化游戏板
void initializeBoard(vector<vector<int>>& board) {board.assign(SIZE, vector<int>(SIZE, 0)); // 将游戏板初始化为SIZE x SIZE的0矩阵// 在游戏板上随机生成两个数字2board[rand() % SIZE][rand() % SIZE] = 2;board[rand() % SIZE][rand() % SIZE] = 2;
}// 打印游戏板
void printBoard(const vector<vector<int>>& board) {for (int i = 0; i < SIZE; ++i) {for (int j = 0; j < SIZE; ++j) {if(board[i][j] == 0) cout << ".";else cout << board[i][j];cout << "\t";}cout << endl;}
}// 检查是否还有可移动的格子
bool canMove(const vector<vector<int>>& board) {for (int i = 0; i < SIZE; ++i) {for (int j = 0; j < SIZE; ++j) {// 如果有空格或者有相邻的相同数字,则可以移动if (board[i][j] == 0) return true;if (i < SIZE - 1 && board[i][j] == board[i + 1][j]) return true;if (j < SIZE - 1 && board[i][j] == board[i][j + 1]) return true;}}return false;
}// 在随机位置添加一个数字2或4
void addNumber(vector<vector<int>>& board) {int i, j;do {i = rand() % SIZE;j = rand() % SIZE;} while (board[i][j] != 0); // 选择一个空的格子board[i][j] = (rand() % 10 == 0) ? 4 : 2; // 有10%的概率生成4,90%的概率生成2
}// 旋转游戏板
void rotateBoard(vector<vector<int>>& board) {vector<vector<int>> temp(SIZE, vector<int>(SIZE));for (int i = 0; i < SIZE; ++i) {for (int j = 0; j < SIZE; ++j) {temp[j][SIZE - 1 - i] = board[i][j]; // 旋转90度}}board = temp;
}// 向左移动格子并合并
void moveTiles(vector<vector<int>>& board) {for (int i = 0; i < SIZE; ++i) {int lastMergePosition = -1; for (int j = 1; j < SIZE; ++j) {if (board[i][j] == 0) continue; // 如果当前格子为空,则跳过int previousPosition = j - 1;// 寻找可以合并或移动的位置while (previousPosition > lastMergePosition && board[i][previousPosition] == 0) {previousPosition--;}if (previousPosition == j) continue; // 如果没有可移动或合并的位置,继续下一个格子// 根据情况移动或合并格子if (board[i][previousPosition] == 0) {board[i][previousPosition] = board[i][j];board[i][j] = 0;} else if (board[i][previousPosition] == board[i][j]) {board[i][previousPosition] *= 2;board[i][j] = 0;lastMergePosition = previousPosition;} else if (previousPosition + 1 != j) {board[i][previousPosition + 1] = board[i][j];board[i][j] = 0;}}}
}// 定义不同方向的移动
void moveLeft(vector<vector<int>>& board) {moveTiles(board);
}void moveRight(vector<vector<int>>& board) {rotateBoard(board);rotateBoard(board);moveTiles(board);rotateBoard(board);rotateBoard(board);
}void moveUp(vector<vector<int>>& board) {rotateBoard(board);rotateBoard(board);rotateBoard(board);moveTiles(board);rotateBoard(board);
}void moveDown(vector<vector<int>>& board) {rotateBoard(board);moveTiles(board);rotateBoard(board);rotateBoard(board);rotateBoard(board);
}// 主函数
int main() {srand(time(NULL)); // 设置随机种子vector<vector<int>> board;initializeBoard(board); // 初始化游戏板printBoard(board); // 打印游戏板while (true) {if (!canMove(board)) {cout << "游戏结束!" << endl;break;}char input;cout << "选择方向 (w/a/s/d): ";cin >> input; // 获取用户输入switch (input) {case 'a':moveLeft(board);break;case 'd':moveRight(board);break;case 'w':moveUp(board);break;case 's':moveDown(board);break;default:cout << "无效输入! 请使用 w/a/s/d." << endl;continue;}if (canMove(board)) {addNumber(board); // 在合适位置添加新的数字}printBoard(board); // 打印更新后的游戏板}return 0;
}

三、说明

上述代码实现了一个简单的2048游戏,主要由以下几个部分组成:

  1. 初始化游戏板 (initializeBoard函数):用于初始化一个SIZE x SIZE(在这个例子中是4x4)的游戏板,并随机在两个位置放置数字2。

  2. 打印游戏板 (printBoard函数):该函数用于遍历游戏板并打印每个元素,其中0被替换为.以便于观看。

  3. 检查是否可以移动 (canMove函数):这个函数用来检查游戏板上是否还有可合并的元素或者空位,以决定游戏是否结束。

  4. 添加数字 (addNumber函数):在玩家移动之后,在一个随机的空位置上添加一个新的数字(90%的概率是2,10%的概率是4)。

  5. 旋转游戏板 (rotateBoard函数):为了简化移动逻辑,此函数用来将游戏板顺时针旋转90度。

  6. 移动方块 (moveTiles函数):该函数用于处理实际的方块移动和合并逻辑。

  7. 移动方向 (moveLeft, moveRight, moveUp, moveDown函数):这些函数使用moveTilesrotateBoard来处理不同方向的移动。

  8. 主函数 (main函数):设置游戏的初始状态,然后进入一个循环,等待玩家输入来移动方块,直到没有移动可做时结束游戏。

补充说明:

  • 游戏板的大小是通过const int SIZE = 4预设的,即方格大小为4x4。
  • 游戏开始时,游戏板上有两个数字2。
  • 玩家可以通过输入’w’, ‘a’, ‘s’, 'd’来控制方块向上、左、下、右移动。
  • 当游戏板上没有空位或者没有可合并的相邻方块时,游戏结束。
  • 这个程序没有实现计分功能,可自己扩充实现。

Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
点赞加关注,收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!

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

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

相关文章

【计算机网络实验】educoder实验八 IPV6网络及其路由 头歌

第一关 IPV6网络基础 //千万不要破坏文档原有结构与内容&#xff01;&#xff01;&#xff01; //以下均为判断题&#xff0c;F&#xff1a;表示错误&#xff0c;T&#xff1a;表示正确 //答案必须写在相应行末尾括号内&#xff0c;F与T二选一&#xff0c;大写 // 1、ipv6协议…

国贸股份发来感谢信,甄知项目优质交付服务和专业实施方法获客户高度认可

近日&#xff0c;由甄知科技携手国有控股上市公司厦门国贸集团股份有限公司下属数科公司厦门国贸数字科技有限公司&#xff08;以下简称“国贸股份”&#xff09;打造的国贸股份“智服云”项目完成验收工作。为感谢甄知科技在项目顺利实施中所作的贡献和努力&#xff0c;国贸股…

企业培训系统开发: 技术创新引领学习革新

在现代企业管理中&#xff0c;培训成为推动员工发展和企业创新的核心。随着科技的快速发展&#xff0c;企业培训系统的开发已经成为提高培训效果、降低成本的有效途径。本文将介绍企业培训系统开发的一些关键技术和代码实例&#xff0c;展示如何通过技术创新引领学习革新。 1…

56K star!一键拥有跨平台 ChatGPT 应用:ChatGPT-Next-Web

前言 现在围绕 openai 的客户端层出不穷&#xff0c;各路开发大神可以说是各出绝招&#xff0c;我也试用过几个国内外的不同客户端。 今天我们推荐的开源项目是目前我用过最好的ChatGPT应用&#xff0c;在GitHub超过56K Star的开源项目&#xff1a;ChatGPT-Next-Web。 ChatGP…

chatgpt3.5和chatgpt4的区别

ChatGPT4是基于GPT-3模型的一个实例&#xff0c;但ChatGPT4已经进行了进一步的改进和优化。GPT-3&#xff08;第三代生成式预训练模型&#xff09;是OpenAl开发的一个大型语言模型&#xff0c;它在很多自然语言处理任务中表现出色。 ChatGPT4继承了GPT-3的基本架构和能力&…

在 Walrus 上轻松集成 OpenTofu

OpenTofu 是什么&#xff1f; OpenTofu 是一个开源的基础设施即代码&#xff08;IaC&#xff09;框架&#xff0c;被提出作为 Terraform 的替代方案&#xff0c;并由 Linux 基金会管理。OpenTofu 的问世为应对 HashiCorp 将 Terraform 的许可证从 Mozilla Public License v2.0…

ubuntu22.04配置双网卡绑定提升带宽

这里写自定义目录标题 Bonding简介配置验证参考链接 Bonding简介 bonding(绑定)是一种linux系统下的网卡绑定技术&#xff0c;可以把服务器上n个物理网卡在系统内部抽象(绑定)成一个逻辑上的网卡&#xff0c;能够提升网络吞吐量、实现网络冗余、负载均衡等功能&#xff0c;有很…

性能优化-OpenMP基础教程(五)-全面讲解OpenMP基本编程方法

本文主要介绍OpenMP编程的编程要素和实战&#xff0c;包括并行域管理详细实战、任务分担详细实战。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;C…

什么是reCAPTCHA?在哪里可以找到reCAPTCHA示例演示?

在当今的数字领域中&#xff0c;保护网站免受垃圾邮件、恶意活动和自动化机器人的侵害至关重要。由谷歌开发的reCAPTCHA已成为一种广泛实施的安全措施&#xff0c;用于区分人类用户和机器人。本文全面介绍了reCAPTCHA、其目的&#xff0c;并包含了一个示例reCAPTCHA演示&#x…

echarts中dataZoom拖拽不起效果

vue3项目中&#xff0c;echarts使用dataZoom进行区域拖动&#xff0c;拖动下图红色框&#xff0c;数据展示无变化拖动功能失效。 原因 vue3中使用了ref或者reactive等初始化图表的变量 //定义 let myChart ref<any>(null); //使用 myChart.value echarts.init(chartR…

微同城本地小程序源码系统:顺风车+二手市场+跑腿功能+信息发布+广告功能 带完整的搭建教程

随着移动互联网的普及&#xff0c;小程序已成为各行业进行线上业务拓展的重要工具。微同城作为一款集顺风车、二手市场、跑腿功能、信息发布和广告功能于一体的本地小程序源码系统&#xff0c;旨在满足现代城市居民的多元化需求&#xff0c;提供一个方便、快捷、实用的服务平台…

算法31:针对算法30货币问题进行拓展 + 时间复杂度 + 空间复杂度优化--------从左往右尝试模型

在算法30中&#xff0c;我们说过从左往右尝试模型&#xff0c;口诀就是针对固定集合&#xff0c;值不同&#xff0c;就是讨论要和不要的累加和。 那么对于非固定集合&#xff0c;我们应该怎么做呢&#xff1f; 针对非固定集合&#xff0c;面值固定&#xff0c;张数无限。口诀…