2048-控制臺版本

2048控制臺版

文章目錄

    • 2048控制臺版
      • 實現效果:
    • 在這里插入圖片描述
      • 庫函數使用:
      • 初始化變量
      • 功能函數實現:
        • 狀態判斷函數int Judge();
        • 數字生成函數 bool CtreateNumber()
        • 打印游戲界面 void Print()
        • 操作函數void Process()
        • 鍵盤輸入函數int Input()
      • 主函數
      • 彩蛋:

實現效果:

在這里插入圖片描述

庫函數使用:

#include<iostream>
#include<Windows.h>//鍵盤輸入讀取
#include<iomanip>//控制格式
#include<ctime>//生成隨機數種子

初始化變量

int const ROW = 4;
int const COL = 4;
int game[ROW][COL] = { 0};int const GAME_CONTINUE = 1;
int const GAME_WIN = 2;
int const GAME_LOSE = 3;int const UP = 1;
int const DOWN = 2;
int const LEFT = 3;
int const RIGHT = 4;

功能函數實現:

int Judge();//判斷游戲狀態
bool CreateNumber();//生成下一個數
void Print();//打印初始化界面
void Process(int move);//實現移動效果
int Input();//讀取鍵盤輸入
bool is_Empty(int const a);//可不需要,判斷某行謀列是否為0

狀態判斷函數int Judge();

設計思路:除去最后一行,逐行逐列的檢查正下方和右方有無可以消去的元素

int Judge() {int count = 0;for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {if (game[i][j] == 2024){return GAME_WIN;}if (!is_Empty(game[i][j])) {count++;if (i == ROW - 1) {if (j != COL - 1&&(game[i][j]==game[i][j+1])) {count--;}}else {if (j != COL - 1) {if (game[i][j] == game[i][j + 1] || game[i][j] == game[i + 1][j]) {count--;}}else continue;}}}}if (count < ROW * COL)return GAME_CONTINUE;else return GAME_LOSE;
}

數字生成函數 bool CtreateNumber()

實際思路:rand生成隨機數,通過非零情況控制生成2和4的概率

bool CreateNumber() {/*int x =0;int y = 0;*/int x = -1;int y = -1;int times = 0,max_times=ROW*COL;//max_times防止滿表的時候無限循環do {x = rand() % 4;y = rand() % 4;times++;} while (!is_Empty(game[x][y]) && times <= max_times);//有一個為0就跳出去//控制得到2和4的概率int value = rand() % 3;if (times > max_times) {return false;}else {if (value == 0)game[x][y] = 4;elsegame[x][y] = 2;return true;}
}

打印游戲界面 void Print()
void Print() {system("cls");/*cout << setfill('=') << setw(5 * COL)<<'='<<endl ;*/cout << setfill('-') << setw(5 * COL) << '-' << endl;for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {if (is_Empty(game[i][j])) {cout <<'|' << setfill(' ')<<setw(4) << ' ';}else {cout << '|' << setfill(' ')<<setw(4) << game[i][j];}}cout << '|' << endl;cout <<setfill('-') << setw(5 * COL) << '-'<<endl ;}
}

操作函數void Process()

教訓:第一次寫的時候寫了個count,用來記錄上面一行(在UP中)的每一列是否都滿足為空或者可以相消,這種操作是錯的,因為只要可以相消或者只要有空位,就都應該可以往上走
ps:LEFT和Right的函數實現代碼與UP和DOWN類似,把對應的col和row對調一下即可


void Process(int move) {if (move == UP) {for (int row = 1; row < ROW; ++row) {for (int crow = row; crow >= 1; --crow) {for (int col = 0; col < COL; col++) {if (is_Empty(game[crow - 1][col])) {game[crow - 1][col] = game[crow][col];game[crow][col] = 0;}if (game[crow - 1][col] == game[crow][col]) {game[crow - 1][col] *= 2;game[crow][col] = 0;}}}}}if (move == DOWN) {//注意ROW-2指的是倒數第二排int count = 0;for (int row = ROW-2; row>=0; --row) {//crow<ROW-1for (int crow = row; crow < ROW-1; ++crow) {for (int col = 0; col < COL; col++) {if (is_Empty(game[crow + 1][col])) {game[crow + 1][col] = game[crow][col];game[crow][col] = 0;}else if(game[crow+1][col]==game[crow][col]){game[crow + 1][col] *= 2;game[crow][col] = 0;}}}}
}
}

鍵盤輸入函數int Input()

說明:sleep函數是為了減少誤觸,降低敏感性

int Input() {int directionUP = 0;int directionDOWN =0;int directionLeft = 0;int directionRight = 0;int direction = 0;while (true) {directionUP = GetAsyncKeyState(VK_UP);directionDOWN = GetAsyncKeyState(VK_DOWN);directionLeft = GetAsyncKeyState(VK_LEFT);directionRight = GetAsyncKeyState(VK_RIGHT);if (directionUP) {/*cout << "UP" << endl;*/direction= UP;break;}if (directionDOWN) {/*cout << "DOWN" << endl;*/direction= DOWN;break;}if (directionLeft) {/*cout << "LEFT"  << endl;*/direction= LEFT;break;}if (directionRight) {/*cout << "RIGHT" << endl;*/direction= RIGHT;break;}Sleep(100);}return direction;
}

主函數

int main() {srand((unsigned int)time(0));CreateNumber();Print();while (true) {int gameState = Judge();int direction = Input();if ((direction)&&(gameState == GAME_CONTINUE)) {/*CreateNumber();Print();Process(direction);*/Process(direction);CreateNumber();Print();Sleep(100);//防止太敏感}else if (gameState == GAME_WIN) {Print();cout << "You Win" << endl;break;}else if (gameState == GAME_LOSE) {Print();cout << "Sorry,You Lose" << endl;break;}}return 0;
}

彩蛋:

如果時間足夠,會再出有前端版本的實現代碼!
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88189.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

提取出Wallpaper Engine壁紙的mpkg類靜態壁紙

github 地址 https://github.com/notscuffed/repkg先下載軟件2853…26目錄這樣獲取有的直接mp4格式&#xff0c;就不能用這方法準備好后 cmd 進入repkg目錄 執行 repkg extract ./294...333/scene.pkg

AI健康小屋“15分鐘服務圈”:如何重構社區健康生態?

AI健康小屋作為“15分鐘服務圈”的核心載體&#xff0c;通過技術賦能與場景重構&#xff0c;正推動社區健康生態從被動治療向主動預防、從單一服務向全周期管理轉型。那我們應該如何重構社區健康生態呢&#xff1f;服務模式創新1.全時段覆蓋AI健康小屋通過分時段服務滿足不同群…

[netty5: WebSocketFrame]-源碼分析

WebSocketFrame WebSocketFrame 是 Netty 中用于表示 WebSocket 消息幀的抽象基類&#xff0c;封裝了幀的內容、分片標志和擴展位信息&#xff0c;供各類具體幀&#xff08;如文本、二進制、控制幀&#xff09;繼承使用。 public abstract class WebSocketFrame extends Buffer…

【加解密與C】非對稱加解密(三)ECC橢圓曲線

ECC橢圓曲線的基本概念橢圓曲線密碼學&#xff08;Elliptic Curve Cryptography&#xff0c;ECC&#xff09;是一種基于橢圓曲線數學的公鑰密碼體制。與傳統的RSA相比&#xff0c;ECC在相同安全級別下使用更短的密鑰&#xff0c;計算效率更高&#xff0c;適用于資源受限的環境。…

力扣網編程150題:加油站(貪心解法)

一. 簡介 前面一篇文章使用暴力解法來解決力扣網150 題目&#xff1a;加油站。文章如下&#xff1a; 力扣網編程150題&#xff1a;加油站&#xff08;暴力解法&#xff09;-CSDN博客 暴力解法就是遍歷了所有元素作為起始點的可能&#xff0c;算法時間復雜度為 O(n*n)&#x…

windwos 設置redis長久密碼不生效

1、設置長久密碼redis.windows.conf 文件修改對應的設置密碼2、啟動時設置對應的加載配置文件

物聯網(IoT)領域存在多種協議

物聯網&#xff08;IoT&#xff09;領域存在多種協議&#xff0c;主要是因為不同的應用場景對通信的需求差異很大&#xff0c;包括實時性、帶寬、功耗、設備兼容性、安全性等。以下從協議多樣性的原因和你提到的具體協議&#xff08;如 dc3-driver-* 模塊&#xff09;展開說明&…

二、encoders

文章目錄一、batch_encoder (用于 BFV)1. 概述2. 數學原理3. 使用方法4. 代碼示例二、ckks_encoder (用于 CKKS)在 1. bfv_basics.cpp 中&#xff0c;我們展示了如何使用BFV方案執行非常簡單的計算。計算是在 plain_modulus 參數的模下執行的&#xff0c;并且 只使用了 BFV 明文…

數據一致性解決方案總結

數據一致性解決方案總結 我們在系統中&#xff0c;主要進行了數據冗余&#xff0c;那么就會帶來數據一致性的問題。常見的數據一致性問題有&#xff1a;數據庫主從同步延遲導致的讀數據不一致&#xff1b;數據庫主主之間數據的不一致&#xff1b;緩存和數據庫之間的數據不一致。…

17.Spring Boot的Bean詳解(新手版)

文章目錄1. 什么是Bean&#xff1f;從零開始理解1.1 Bean的定義1.2 為什么需要Bean&#xff1f;1.3 Bean vs 普通對象的區別2. Spring容器&#xff1a;Bean的家2.1 什么是Spring容器&#xff1f;2.2 容器的工作流程3. Bean的聲明方式詳解3.1 使用Component及其專門化注解3.1.1 …

cherryStudio electron因為環境問題無法安裝解決方法或打包失敗解決方法

$env:ELECTRON_MIRROR"https://npmmirror.com/mirrors/electron/"; $env:ELECTRON_CUSTOM_DIR"{{ version }}"; yarn install1. 上面是關于electron安裝失敗的解決方法. 也可以通過到git上下面包,解壓后,放到對應的目錄下面,并把里面的build文件夾刪除, b…

微服務架構中數據一致性保證機制深度解析

在微服務架構中&#xff0c;數據一致性是分布式系統設計的核心挑戰。由于服務拆分后數據自治&#xff08;每個服務獨立數據庫&#xff09;&#xff0c;跨服務操作的一致性保障需突破傳統單體事務的局限。本文從一致性模型、核心解決方案、技術實現及面試高頻問題四個維度&#…

【Gin】HTTP 請求調試器

文章目錄 項目概述代碼功能詳解1. 導入必要的包2. 主函數和路由設置3. 請求信息捕獲4. 請求參數和頭信息5. 請求體處理5.1 JSON 數據處理5.2 表單數據處理5.3 Multipart 表單數據處理5.4 其他類型數據處理6. 構造響應對象7. 返回 JSON 響應功能特點使用場景完整代碼項目概述 這…

物聯網(IoT)領域的協議

物聯網&#xff08;IoT&#xff09;領域的通信協議種類繁多&#xff0c;不同協議適用于不同的應用場景&#xff08;如低功耗設備、工業自動化、家庭智能設備等&#xff09;。以下是主要物聯網協議的分類及詳細解釋&#xff1a;一、物聯網協議分類物聯網協議通常分為兩大類&…

專題一_雙指針_四數之和

一&#xff1a;題目解析 題目鏈接&#xff1a;18. 四數之和 - 力扣&#xff08;LeetCode&#xff09; 注&#xff1a;本題是在上題的基礎上講解的&#xff1a;專題一_雙指針_三數之和-CSDN博客 解析&#xff1a;和三數之區別在于找四元組和為targe的數字 而不是0 二&#xff1a…

Spring Boot多數據源配置詳解

Spring Boot多數據源配置詳解 在實際企業開發中&#xff0c;隨著業務復雜度提升&#xff0c;單一數據源已無法滿足所有場景需求。比如&#xff1a;讀寫分離、分庫分表、數據遷移、微服務整合等&#xff0c;這時就需要用到多數據源配置。本文將從原理、配置、常見問題和最佳實踐…

項目進度嚴重依賴關鍵人,如何分散風險

項目進度嚴重依賴關鍵人的風險&#xff0c;可以通過建立知識共享機制、強化團隊協作模式、實施交叉培訓和培養后備人才、優化流程標準化等措施有效分散。其中&#xff0c;實施交叉培訓和培養后備人才尤為重要&#xff0c;通過培養多個成員具備相似的關鍵技能&#xff0c;能夠迅…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | 以太網傳輸實驗例程

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com)1.實驗簡介實驗目的&#xff1a;完成 DDR3 的讀寫測試。實驗環境&#xff1a;Window11 PDS2022.2-SP6.4芯片型號&#x…

《每日AI-人工智能-編程日報》--2025年7月9日

介紹:AI 方面1. Manus 通用智能體初成型&#xff0c;開啟 AIAgent 新時代?中泰證券發布研報稱&#xff0c;首款通用型 AI 智能體 Manus 已問世&#xff0c;能夠將復雜任務拆解為可執行的步驟鏈&#xff0c;并在虛擬環境中靈活調用工具&#xff0c;標志著 AI 從 “Reasoner” 走…

MyBatis之數據操作增刪改查基礎全解

目錄 1. ?MyBatis添加數據 1.1. 持久層接口添加方法 1.2. 映射文件添加標簽 1.3. 編寫測試方法 2. ??MyBatis修改數據 2.1. 代碼的優化 2.2. 持久層接口添加方法 2.3. 映射文件添加標簽 2.4. 編寫測試方法 3. &#x1f5d1;?MyBatis刪除數據與根據Id查詢 3.1. 刪…