一、遊戲介紹
《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 初...