一、游戲介紹
《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分別對應如下:
P1:b[k]==b[j],則b[k] = 2 * b[k](說明兩數合并了),且b[j] = 0(合并之后要將殘留的j項值清零),接著k自加1,然后進行下一次回圈,
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 <stdio.h>
#include <time.h> /* 包含設定亂數種子所需要的time()函式 */
#include <conio.h> /* 包含Windows平臺上完成輸入字符不帶回顯和回車確認的getch()函式 */
#include <windows.h> /* 包含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++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
UP在主頁上傳了一些學習C/C++編程的視頻教程,有興趣或者正在學習的小伙伴一定要去看一看哦!會對你有幫助的~
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
免費學習書籍:

免費學習資料:

五、截圖


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254660.html
標籤:C
