C語言實現(xiàn)2048游戲(ege圖形庫版)
這幾天看到我們班上一個大神寫了一個2048出來,我自己也想嘗試一下,經(jīng)過幾天自己嘗試努力下,自己終于寫出來了?,F(xiàn)在和大家分享一下,也希望能得到大神的指點。
實現(xiàn)的效果如圖
先來講一下我的思路吧
1.首先肯定是要一個4X4的二維數(shù)組來存放數(shù)字存放0、2、4……
2.游戲開始與過程中需要隨機出現(xiàn)2或者4,所以需要調(diào)用time.h這個庫
3.游戲開始時,假如當獲取字符為‘w'則先用循環(huán)判定這個數(shù)字的下方有無和它相等的數(shù)字。如無則跳過,如有相加。然后在判定是否可以向上移動
下面是我的代碼
(我本來是還要寫一個撤回的函數(shù) 可惜寫出來卻不能運行。求大神指教)
#include<stdio.h> //#include<conio.h> #include<graphics.h> #include<Windows.h> #include<time.h> int _back[4][4] = {}; void draw();//繪圖 void play(); void init();//初始化數(shù)字 void _up();//向上移動 void _down();//向下移動 void _left();//像左移動 void _right();//向右移動 void add_number();//增加一個數(shù)字 int a[4][4] = { 0 }; int emtpy; //空格的數(shù)量 void draw() { int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { _back[i][j] = a[i][j]; PIMAGE img; img = newimage(); switch (a[i][j]) { case 0: { getimage(img, "2048\\0.png"); putimage(j * 180, i * 180, img); break; } case 2: { getimage(img, "2048\\2.png"); putimage(j * 180, i * 180, img); break; } case 4: { getimage(img, "2048\\4.png"); putimage(j * 180, i * 180, img); break; } case 8: { getimage(img, "2048\\8.png"); putimage(j * 180, i * 180, img); break; } case 16: { getimage(img, "2048\\16.png"); putimage(j * 180, i * 180, img); break; } case 32: { getimage(img, "2048\\32.png"); putimage(j * 180, i * 180, img); break; } case 64: { getimage(img, "2048\\64.png"); putimage(j * 180, i * 180, img); break; } case 128: { getimage(img, "2048\\128.png"); putimage(j * 180, i * 180, img); break; } case 256: { getimage(img, "2048\\256.png"); putimage(j * 180, i * 180, img); break; } case 512: { getimage(img, "2048\\512.png"); putimage(j * 180, i * 180, img); break; } case 1024: { getimage(img, "2048\\1024.png"); putimage(j * 180, i * 180, img); break; } case 2048: { getimage(img, "2048\\2048.png"); putimage(j * 180, i * 180, img); break; } } } } } void init() { int x, y; srand(time(0)); x = rand() % 4; y = rand() % 4; a[x][y] = 2; emtpy = 15; } void _up() { int x, y, i; for (y = 0; y < 4; ++y) { // 從上向下合并相同的方塊 for (x = 0; x < 4; ++x) { if (a[x][y] == 0) ; else { for (i = x + 1; i < 4; ++i) { if (a[i][y] == 0) ; else if (a[x][y] == a[i][y]) { a[x][y] += a[i][y]; a[i][y] = 0; ++emtpy; x = i; break; } else { break; } } } } } for (y = 0; y < 4; ++y) // 向上移動箱子 for (x = 0; x < 4; ++x) { if (a[x][y] == 0) ; else { for (i = x; (i > 0) && (a[i - 1][y] == 0); --i) { a[i - 1][y] = a[i][y]; a[i][y] = 0; } } } } void _down() { int x, y, i; for (y = 0; y < 4; ++y) // 向下合并相同的方格 for (x = 3; x >= 0; --x) { if (a[x][y] == 0) ; else { for (i = x - 1; i >= 0; --i) { if (a[i][y] == 0) ; else if (a[x][y] == a[i][y]) { a[x][y] += a[i][y]; a[i][y] = 0; ++emtpy; x = i; break; } else break; } } } for (y = 0; y < 4; ++y) // 向下移動方格 for (x = 3; x >= 0; --x) { if (a[x][y] == 0) ; else { for (i = x; (i < 3) && (a[i + 1][y] == 0); ++i) { a[i + 1][y] = a[i][y]; a[i][y] = 0; } } } } void _left() { int x, y, i; for (x = 0; x < 4; ++x) // 向左合并相同的方格 for (y = 0; y < 4; ++y) { if (a[x][y] == 0) ; else { for (i = y + 1; i < 4; ++i) { if (a[x][i] == 0) ; else if (a[x][y] == a[x][i]) { a[x][y] += a[x][i]; a[x][i] = 0; emtpy++; y = i; break; } else break; } } } for (x = 0; x < 4; ++x) // 向左移動方格 for (y = 0; y < 4; ++y) { if (a[x][y] == 0) ; else { for (i = y; (i > 0) && (a[x][i - 1] == 0); --i) { a[x][i - 1] = a[x][i]; a[x][i] = 0; } } } } void _right() { int x, y, i; for (x = 0; x < 4; ++x) // 向右合并相同的方格 for (y = 3; y >= 0; --y) { if (a[x][y] == 0) ; else { for (i = y - 1; i >= 0; --i) { if (a[x][i] == 0) ; else if (a[x][y] == a[x][i]) { a[x][y] += a[x][i]; a[x][i] = 0; ++emtpy; y = i; break; } else break; } } } for (x = 0; x < 4; ++x) // 向右移動方格 for (y = 3; y >= 0; --y) { if (a[x][y] == 0) ; else { for (i = y; (i < 3) && (a[x][i + 1] == 0); ++i) { a[x][i + 1] = a[x][i]; a[x][i] = 0; } } } } void add_number() { srand(time(0)); if (emtpy > 0) { int x, y, temp; do { x = rand() % 4; y = rand() % 4; } while (a[x][y] != 0); temp = rand(); int i = temp % 2; if (i == 1) { a[x][y] = 2; emtpy--; } else { a[x][y] = 4; emtpy--; } } } void play() { char c = getch(); switch (c) { case 'w': case'W': { _up(); add_number(); draw(); break; } case 's': case'S': { _down(); add_number(); draw(); break; } case 'a': case'A': { _left(); add_number(); draw(); break; }case 'd': case'D': { _right(); add_number(); draw(); break; } case 'q': case 'Q': { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { a[i][j] = _back[i][j]; draw(); } } } } } int main() { init(); int i, j; initgraph(724, 724);//初始化 PIMAGE img; img = newimage(); getimage(img, "2048/背景.jpg"); putimage(0, 0, img); draw(); for (; is_run(); delay_fps(30)) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { _back[i][j] = a[i][j]; } } play(); } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10C#中split用法實例總結
- 04-02jquery與jsp,用jquery