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

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

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

1.設(shè)計目標(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)兩個相同的數(shù)字"相撞"則將它們兩個數(shù)字合成一個是它們和的數(shù)字,當(dāng)兩個數(shù)字不同"相撞"則不進(jìn)行合成;當(dāng)所有格子滿了并且無法進(jìn)行移動的時則判斷為輸流炕,當(dāng)數(shù)字有一個出現(xiàn)2048的字樣則判斷為贏澎现。

2.創(chuàng)新點

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

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

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

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

(5)界面的刷新流暢

(6)屏蔽其他按鍵

3.對未來的展望

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

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

4.重難點剖析

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

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

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

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

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

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

(4)怎么判斷輸

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

(5)怎么判斷贏

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

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

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

分析左移代碼

void MoveLeft()

{

? ? int i = 0;

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

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

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

? ? {

? ? ? ? if (g_map[i])

? ? ? ? {

? ? ? ? ? ? MoveMostLeft(i); ? ?//移動單個元素0~15

? ? ? ? ? ? }

? ? }

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

}

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

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

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

void MoveMostLeft(int pos)

{

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

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

? ? {

? ? ? ? ?--i;

? ? }

? ? ?//此時的i指向的是剛剛出左邊的界或者是pos左邊的第一個數(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指向的是左邊第一個數(shù)字

? ? {

? ? ? ? if (g_map[i] == g_map[pos]) ? ? ? ? //判斷pos位置的數(shù)字和左邊第一個數(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位置的值不等于左邊第一個數(shù)字的值則吧左邊第一個數(shù)字的右邊的一個空格修改為pos位置的值竞端,然后修改pos位置的值為空格

? ? ? ? {

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

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

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

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

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

? ? ? ? ? ? ? ? ? ? }

? ? }

}

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

5.總結(jié)

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

附加: 編譯方法

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恰画,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瓷马,更是在濱河造成了極大的恐慌拴还,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欧聘,死亡現(xiàn)場離奇詭異片林,居然都是意外死亡,警方通過查閱死者的電腦和手機怀骤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門费封,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒋伦,你說我怎么就攤上這事弓摘。” “怎么了痕届?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵衣盾,是天一觀的道長。 經(jīng)常有香客問我爷抓,道長势决,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任蓝撇,我火速辦了婚禮果复,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渤昌。我一直安慰自己虽抄,他們只是感情好走搁,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迈窟,像睡著了一般私植。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上车酣,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天曲稼,我揣著相機與錄音,去河邊找鬼湖员。 笑死贫悄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娘摔。 我是一名探鬼主播窄坦,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凳寺!你這毒婦竟也來了鸭津?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肠缨,失蹤者是張志新(化名)和其女友劉穎曙博,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜瞒,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡父泳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吴汪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠窄。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漾橙,靈堂內(nèi)的尸體忽然破棺而出杆融,到底是詐尸還是另有隱情,我是刑警寧澤霜运,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布脾歇,位于F島的核電站,受9級特大地震影響淘捡,放射性物質(zhì)發(fā)生泄漏藕各。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一焦除、第九天 我趴在偏房一處隱蔽的房頂上張望激况。 院中可真熱鬧,春花似錦、人聲如沸乌逐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浙踢。三九已至绢慢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洛波,已是汗流浹背胰舆。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奋岁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓荸百,卻偏偏與公主長得像闻伶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子够话,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354