知識教程 C語言編寫2048

2021-10-18 09:20:10 字數 3788 閱讀 3201

一、遊戲介紹

《2048》是較流行的一款數字遊戲。原版2048首先在github上發布,原作者是gabriele cirulli。它是基於《1024》和《小3傳奇》(threes!)的玩法開發而成的新型數字遊戲。

二、遊戲規則

遊戲的規則很簡單,你需要控制所有方塊向同乙個方向運動,兩個相同數字的方塊撞在一起之後合併成為他們的和,每次操作之後會在空白的方格處隨機生成乙個2或者4(生成2的概率要大一些),最終得到乙個「2048」的方塊就算勝利了。

三、核心演算法

1、方塊移動和合併演算法。

主要思想:把遊戲數字面板抽象成4行4列的二維陣列a[4][4],值為0的位置表示空方塊,其他表示對應數字方塊。把每一行同等對待,只研究一行的移動和合併演算法,然後可以通過遍歷行來實現所有行的移動合併演算法。

在一行中,用b[4]表示一行的一位陣列,使用兩個下標變數來遍歷列項,這裡使用j和k,其中j總在k的後面,用來尋找k項後面第乙個不為0的數字,而k項用於表示當前待比較的項,總是和j項之間隔著若干個數字0,或者乾脆緊挨著。

不失一般性,考慮往左滑動時,初始事情況下j等於1,而k等於0,接著判斷j項數字是否大於0,若是,則判斷j項和k項數字的關係,分成3種情況處理,分別是p1: ,p2: b[k]==0和p3: b[k]!=0且b[k]!=b[j];若否,則j自加1,然後繼續尋找k項後面第乙個不為0的數字。其中p1,p2和p3分別對應如下:

p2:b[k]==0,則表示b[j]之前全是空格子,此時直接移動b[j]到k的位置,也就是b[k] = b[j],然後b[j] = 0(移動後將殘留的j項值清零),接著k值不變,然後進行下一次迴圈。

p3:b[k]!=0且b[k]!=b[j],則表示兩數不相等且都不為0,此時將兩數靠在一起,也就是b[k+1] = b[j]。接著分兩種小情況,若j!=k+1,則b[j] = 0(移動後將殘留的j項值清零);若否,則表示兩數原先就靠在一起,則不進行特殊處理(相當於未移動)。接著k自加1,然後進行下一次迴圈。

2、判斷遊戲是否結束演算法

核心思想:遍歷二維陣列,看是否存在橫向和縱向兩個相鄰的元素相等,若存在,則遊戲不結束,若不存在,則遊戲結束。

3、生成隨機數演算法

核心思想:根據生成的隨機數,對一定的值進行取模,達到生成一定概率的數。在本遊戲中,設定出現2的概率是4的兩倍,於是可以利用系統提供的隨機數函式生成乙個數,

然後對3取餘,得到的數若小於2則在遊戲面板空格處生成乙個2,若餘數等於2,則生成4。在選擇將在哪乙個空格出生成數的時候,也是根據系統提供的隨機函式生成乙個數,然後對空格數取餘,然後在第餘數個空格出生成數字。

4、繪製介面的演算法

核心思想:利用系統提供的控制台介面清屏功能,達到重新整理介面的效果,利用控制製表符位置,達到繪製遊戲數字面板的效果。

由於繪製介面不算是本遊戲的本質,且**段相對較長,所以演算法描述在這裡省略,讀者可以參考完整源**。

四、源**

#include

#include /* 包含設定隨機數種子所需要的time()函式 */

#include /* 包含windows平台上完成輸入字元不帶回顯和回車確認的getch()函式 */

#include /* 包含windows平台上完成設定輸出游標位置達到清屏功能的函式 */

void start_game(); /* 開始遊戲 */

void reset_game(); /* 重置遊戲 */

/* 往左右上下四個方向移動 */

void move_left();

void move_right();

void move_up();

void move_down();

void refresh_show();    /* 重新整理介面顯示 */

void add_rand_num();    /* 生成隨機數,本程式中僅生成2或4,概率之比設為2:1 */

void check_game_over(); /* 檢測是否輸掉遊戲,設定遊戲結束標誌 */

int get_null_count();   /* 獲取遊戲面板上空位置數量 */

int board[4][4];     /* 遊戲數字面板,抽象為二維陣列 */

int score;           /* 遊戲的分 */

int best;            /* 遊戲最高分 */

int if_need_add_num; /* 是否需要生成隨機數標誌,1表示需要,0表示不需要 */

int if_game_over;    /* 是否遊戲結束標誌,1表示遊戲結束,0表示正常 */

/* main函式 函式定義 */

int main()

start_game();

/* 開始遊戲 函式定義 */

void start_game()

reset_game();

char cmd;

while (1)

cmd = getch(); /* 接收標準輸入流字元命令 */

if (if_game_over) /* 判斷是否需已經輸掉遊戲 */

if (cmd == 'y' || cmd == 'y') /* 重玩遊戲 */

reset_game();

continue;

else if (cmd == 'n' || cmd == 'n') /* 退出 */

return;

else

continue;

if_need_add_num = 0; /* 先設定不預設需要生成隨機數,需要時再設定為1 */

switch (cmd) /* 命令解析,w,s,a,d字元代表上下左右命令 */

case 'a':

case 'a':

case 75 :

move_left();

break;

case 's':

case 's':

case 80 :

move_down();

break;

case 'w':

case 'w':

case 72 :

move_up();

break;

case 'd':

case 'd':

case 77 :

move_right();

break;

score > best ? best = score : 1; /* 打破得分紀錄 */

if (if_need_add_num) /* 預設為需要生成隨機數時也同時需要重新整理顯示,反之亦然 */

add_rand_num();

refresh_show();

另外如果你想更好的提公升你的程式設計能力,學好c語言c++程式設計!彎道超車,快人一步!筆者這裡或許可以幫到你~

免費學習書籍:

免費學習資料:

五、截圖

C語言 2048遊戲

二維陣列 include include include inttest int a 4 if a i j 2048 if b 1 if t 0 宣告乙個 區域性變數 如果沒有初始化 區域性變數的值不確定 所以陣列a裡面的元素 也是不確定的值 陣列的初始化 intmain void int i 0,...

c語言程式2048 C語言2048小遊戲演示和說明

2048遊戲是風靡一時的小遊戲,我們提供的2048小遊戲不依賴 tc 環境,不依賴任何第三方庫,可以在 vs codeblocks dev c 等常見 ide中編譯通過。我們提供給大家的 2048 小遊戲,不要求大家精通 c 語言,也不會涉及到指標的使用,只需要學會以下幾個知識點即可 設計 2048...

C語言簡易版2048

二維陣列 int board 4 4 int if need rand 是否需要生成隨機數 int if game over 遊戲是否結束 介面 void showgame else if i 3 else void gameover 隨機位置生成隨機數2或4 void addrand else 初...