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
英文地址,請注明出處:http://en.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…