好玩的2048編程小游戲,C語言寫的代碼分享給你了!

學(xué)習(xí)C語言/C++已經(jīng)接近一個(gè)月了,在老師的帶領(lǐng)下,我們已經(jīng)學(xué)習(xí)了c語言數(shù)據(jù)的基本類型、變量的輸入輸出、進(jìn)制轉(zhuǎn)換、運(yùn)算符和分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、數(shù)組、指針、函數(shù)和字符串結(jié)構(gòu)體等等,在老師帶著我們作出了一個(gè)貪吃蛇的過程中讓我深刻的體會(huì)到了字符界面做游戲的快感,原來c語言如此強(qiáng)大,利用所學(xué)的基礎(chǔ)居然可以實(shí)現(xiàn)這樣精巧的功能。然后老師又介紹了一個(gè)2048的游戲,說這個(gè)游戲的實(shí)現(xiàn)比較有挑戰(zhàn),本來就對c語言憧憬的我對2048這個(gè)游戲充滿了好奇,然后自己下載了一個(gè)2048的游戲玩了一下就開始實(shí)現(xiàn)自己的代碼了,挑戰(zhàn)了一下自己。

下面我會(huì)把實(shí)現(xiàn)這個(gè)游戲的思路以及相應(yīng)的解決辦法進(jìn)行了總結(jié),并提供自己的代碼和詳細(xì)注釋。

1.設(shè)計(jì)目標(biāo)

(1)界面顯示

? ?////////////////

? ?/ ?2 ? 2 ? 2 ?8/

? ?/ ? ? ? ? ? ? ?/

? ?/ ? ? ?2 ? ? ? /

? ?/ ? ? ? ? ? ? ?/

? /////////////////

(2)游戲操作

r ? ---> ? ? ?開始游戲

q ? ---> ? ? ?結(jié)束游戲

2 ? ----> ? ? 下移

4 ? ----> ? ? 左移

6 ? ----> ? ? 右移

8 ? ----> ? ? 上移

任意鍵 -> ? ? ? ?重新開始

(3)游戲規(guī)則

按r鍵開始游戲,然后進(jìn)行游戲,可以輸入任意方向鍵進(jìn)行操作;進(jìn)行相應(yīng)的平移操作,當(dāng)兩個(gè)相同的數(shù)字"相撞"則將它們兩個(gè)數(shù)字合成一個(gè)是它們和的數(shù)字,當(dāng)兩個(gè)數(shù)字不同"相撞"則不進(jìn)行合成;當(dāng)所有格子滿了并且無法進(jìn)行移動(dòng)的時(shí)則判斷為輸,當(dāng)數(shù)字有一個(gè)出現(xiàn)2048的字樣則判斷為贏。

2.創(chuàng)新點(diǎn)

(1)可以改變游戲的勝利值(2048可以修改為1024等等)

(2)任何時(shí)刻都可以按住r重新開始游戲

(3)代碼用一維數(shù)組代替二維數(shù)組,減少了遍歷數(shù)組的時(shí)間復(fù)雜度

(4)操作方向的時(shí)候不需要輸入回車,使用戶得到更舒適的體驗(yàn)

(5)界面的刷新流暢

(6)屏蔽其他按鍵

3.對未來的展望

(1)修改成為圖形界面并增加一些動(dòng)畫特效

(2)優(yōu)化代碼

4.重難點(diǎn)剖析

(1)如何利用2 4 6 8進(jìn)行方向控制?

答:可以利用switch...case語句,當(dāng)輸入字符為2時(shí)調(diào)用下移函數(shù),當(dāng)輸入字符為4時(shí)則調(diào)用左移函數(shù)等

(2)如何不輸入回車就可以輸入字符?

答:可以通過getch(),輸入字符并且不用輸入回車即可達(dá)到效果

(3)為什么地圖數(shù)組用一維數(shù)組代替二維數(shù)組

答:由于每一幀畫面都會(huì)要遍歷該數(shù)組,使用一維數(shù)組可以方便的用一個(gè)循環(huán)就可以遍歷數(shù)組

(4)怎么判斷輸

答:當(dāng)數(shù)組中全部都被占用,并且每個(gè)數(shù)字的上下左右都沒有與它相同的數(shù)字即為輸

(5)怎么判斷贏

答:遍歷數(shù)組出現(xiàn)2048即為贏

(6)移動(dòng)時(shí)內(nèi)部數(shù)據(jù)怎么變化

答:由于上下左右比較類似,我就以左移做詳細(xì)介紹,其他的可以類推。

分析左移代碼

void MoveLeft()

{

? ? int i = 0;

? ? int tempmap[GAMERANGE ] = {0}; ??

? ? memcpy(tempmap,g_map,GAMERANGE *sizeof(int)); //拷貝移動(dòng)的之前的數(shù)組

? ? for (i; i < GAMERANGE ; ++i) ?

? ? {

? ? ? ? if (g_map[i])

? ? ? ? {

? ? ? ? ? ? MoveMostLeft(i); ? ?//移動(dòng)單個(gè)元素0~15

? ? ? ? ? ? }

? ? }

? ? HandleState(tempmap,g_map,GAMERANGE );//處理游戲?qū)?yīng)的狀態(tài),判斷輸贏并做處理

}

HandleState函數(shù)我就不多解釋了, 主要是判斷輸贏并做處理的函數(shù)

下面主要看一下MoveMostLeft函數(shù), 這個(gè)函數(shù)是將數(shù)組中的pos位置的元素移動(dòng)

/*游戲地圖單個(gè)坐標(biāo)左移*/

void MoveMostLeft(int pos)

{

? ? int i = pos - 1; ?//i為pos左邊的元素

? ? while (i >= pos - pos % 4 && !g_map[i]) //i不出界 && i是空格

? ? {

? ? ? ? ?--i;

? ? }

? ? ?//此時(shí)的i指向的是剛剛出左邊的界或者是pos左邊的第一個(gè)數(shù)字

? ? if (i < 0) //說明pos左邊全為0 ? ? ? ? ? ? ?//i<0 說明左邊全部是空格

? ? {

? ? ? ? g_map[i+1] = g_map[pos]; ? ? ? ? ?//將pos位置的數(shù)字賦值給最左邊的數(shù)字

? ? ? ?if (i+1 != pos) //排除i+1和pos位置一樣,使得i+1的數(shù)值賦值為0

? ? ? ? ? ?{

? ? ? ? ? ? g_map[pos] = 0;

? ? ? ? ? ?}

? ? }

? ? else ? ? ? ?//說明pos左邊有非0數(shù)字, 左邊坐標(biāo)為i ?i指向的是左邊第一個(gè)數(shù)字

? ? {

? ? ? ? if (g_map[i] == g_map[pos]) ? ? ? ? //判斷pos位置的數(shù)字和左邊第一個(gè)數(shù)字是不是相等的,如果是相等的話,i的位置的數(shù)字乘2,pos位置的值賦值為空格

? ? ? ? {

? ? ? ? ? ? g_map [i] = g_map[i] << 1;//如果i和pos數(shù)字相同,則將位置i的數(shù)值乘以2 <<左移1則是乘以2

? ? ? ? ? ? g_map[pos] = 0;

? ? ? ? }

? ? ? ? else ? ? ? ? ? ? ? ? ? //如果pos位置的值不等于左邊第一個(gè)數(shù)字的值則吧左邊第一個(gè)數(shù)字的右邊的一個(gè)空格修改為pos位置的值,然后修改pos位置的值為空格

? ? ? ? {

? ? ? ? ? ? g_map[i+1] = g_map[pos];

? ? ? ? ? ? if (i+1 != pos)

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? g_map[pos] = 0;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }

? ? }

}

上面主要是左移部分的代碼已經(jīng)詳細(xì)解釋, 右移,上移,下移都類似

5.總結(jié)

在剛剛寫代碼的時(shí)候感覺方向不明確,不知道如何下手,便寫了一個(gè)左移函數(shù)后來發(fā)現(xiàn)其他方向類似,其他方向的代碼基本上都是復(fù)制的左移代碼,然后400多行的代碼就出來了, 寫出來之后感覺自己很有成就感,通過自己所學(xué)的東西完成了一個(gè)小小的項(xiàng)目,也算是對前面所學(xué)知識的一個(gè)綜合性的運(yùn)用。自己對項(xiàng)目的編寫有了一定的體會(huì), 先將整個(gè)項(xiàng)目分成一些小模塊,然后在分開寫代碼,最后將代碼整合出來一個(gè)項(xiàng)目,整個(gè)游戲就是這樣出來了,當(dāng)然一個(gè)項(xiàng)目的完成還會(huì)碰到一些問題,還了解了一些常見問題的解決辦法。

附加: 編譯方法

gcc 2048.c -l curses ? ? //使用了curses庫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容