人妻系列无码专区av在线,国内精品久久久久久婷婷,久草视频在线播放,精品国产线拍大陆久久尤物

用c語(yǔ)言編寫(xiě)貪吃蛇(C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲代碼分享思路注釋)

用c語(yǔ)言編寫(xiě)貪吃蛇(C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲代碼分享思路注釋)

禮鑠 2025-04-14 科技 13 次瀏覽 0個(gè)評(píng)論

貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有PC和手機(jī)等多平臺(tái)版本。既簡(jiǎn)單又耐玩。該游戲通過(guò)控制蛇頭方向吃蛋,從而使得蛇變得越來(lái)越長(zhǎng)。 [1]

貪吃蛇游戲最初為單機(jī)模式,后續(xù)又陸續(xù)推出團(tuán)戰(zhàn)模式、賞金模式、挑戰(zhàn)模式等多種玩法。

本次我們將用C語(yǔ)言編寫(xiě)貪吃蛇游戲,效果如圖所示:

C語(yǔ)言實(shí)現(xiàn)《貪吃蛇》小游戲!代碼分享+思路注釋

用游戲把子上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,而且蛇的身子會(huì)越吃越長(zhǎng),身子越長(zhǎng)玩的難度就越大,不能碰墻,不能咬到自己的身體,更不能咬自己的尾巴,等到了一定的分?jǐn)?shù),就能過(guò)關(guān),然后繼續(xù)玩下一關(guān)。

貪吃蛇的唯一的目標(biāo)就是長(zhǎng)成最長(zhǎng)的一條蛇!滑動(dòng)搖桿控制小蛇走位,吃掉地圖上彩色的小圓點(diǎn),就會(huì)變長(zhǎng)。小心!蛇頭碰到其他蛇就會(huì)死亡,并且產(chǎn)生大量小圓點(diǎn)。長(zhǎng)按加速鍵,用巧妙的走位讓蛇身被別人撞上,就可以吃掉尸體迅速變長(zhǎng)。

C語(yǔ)言實(shí)現(xiàn)《貪吃蛇》小游戲!代碼分享+思路注釋

首先利用全局變量和函數(shù)的知識(shí),設(shè)計(jì)了一個(gè)游戲開(kāi)發(fā)框架;然后學(xué)習(xí)二維數(shù)組的知識(shí),構(gòu)造了地圖和小蛇,實(shí)現(xiàn)了小蛇向四個(gè)方向移動(dòng);接著學(xué)習(xí)了靜態(tài)變量的概念,進(jìn)行了時(shí)間控制的改進(jìn);最后實(shí)現(xiàn)了失敗判斷與顯示、吃食物增加長(zhǎng)度的功能。

源碼:

#include <graphics.h> #include <conio.h>#include <stdio.h>#define BLOCK_SIZE 20 // 每個(gè)小格子的長(zhǎng)寬大小 #define HEIGHT 30 // 高度上一共30個(gè)小格子#define WIDTH 40 // 寬度上一共40個(gè)小格子 // 全局變量定義int Blocks[HEIGHT][WIDTH] = {0}; // 二維數(shù)組,用于記錄所有的游戲數(shù)據(jù)char moveDirection; // 小蛇移動(dòng)方向int food_i,food_j; // 食物的位置int isFailure = 0; // 是否游戲失敗void moveSnake() // 移動(dòng)小蛇及相關(guān)處理函數(shù){ int i,j; for (i=0;i<HEIGHT;i++) // 對(duì)行遍歷 for (j=0;j<WIDTH;j++) // 對(duì)列遍歷 if (Blocks[i][j]>0) // 大于0的為小蛇元素 Blocks[i][j]++; // 讓其+1 int oldTail_i,oldTail_j,oldHead_i,oldHead_j; // 定義變量,存儲(chǔ)舊蛇尾、舊蛇頭坐標(biāo) int max = 0; // 用于記錄最大值 for (i=0;i<HEIGHT;i++) // 對(duì)行列遍歷 { for (j=0;j<WIDTH;j++) { if (max<Blocks[i][j]) // 如果當(dāng)前元素值比max大 { max = Blocks[i][j]; // 更新max的值 oldTail_i = i; // 記錄最大值的坐標(biāo),就是舊蛇尾的位置 oldTail_j = j; // } if (Blocks[i][j]==2) // 找到數(shù)值為2 { oldHead_i = i; // 數(shù)值為2恰好是舊蛇頭的位置 oldHead_j = j; // } } } int newHead_i = oldHead_i; // 設(shè)定變量存儲(chǔ)新蛇頭的位置 int newHead_j = oldHead_j; // 根據(jù)用戶按鍵,設(shè)定新蛇頭的位置 if (moveDirection=='w') // 向上移動(dòng) newHead_i = oldHead_i-1; else if (moveDirection=='s') // 向下移動(dòng) newHead_i = oldHead_i+1; else if (moveDirection=='a') // 向左移動(dòng) newHead_j = oldHead_j-1; else if (moveDirection=='d') // 向右移動(dòng) newHead_j = oldHead_j+1; // 如果蛇頭超出邊界,或者蛇頭碰到蛇身,游戲失敗 if ( newHead_i>=HEIGHT || newHead_i<0|| newHead_j>=WIDTH || newHead_j<0 || Blocks[newHead_i][newHead_j]>0 ) { isFailure = 1; // 游戲失敗 return; // 函數(shù)返回 } Blocks[newHead_i][newHead_j] = 1; // 新蛇頭位置數(shù)值為1 if (newHead_i==food_i && newHead_j==food_j) // 如果新蛇頭正好碰到食物 { food_i = rand()%(HEIGHT-5) + 2; // 食物重新隨機(jī)位置 food_j = rand()%(WIDTH-5) + 2; // // 不對(duì)舊蛇尾處理,相當(dāng)于蛇的長(zhǎng)度+1 } else // 新蛇頭沒(méi)有碰到食物 Blocks[oldTail_i][oldTail_j] = 0; // 舊蛇尾變成空白,不吃食物時(shí)保持蛇的長(zhǎng)度不變}void startup() // 初始化函數(shù){ int i; Blocks[HEIGHT/2][WIDTH/2] = 1; // 畫(huà)面中間畫(huà)蛇頭,數(shù)字為1 for (i=1;i<=4;i++) // 向左依次4個(gè)蛇身,數(shù)值依次為2,3,4,5 Blocks[HEIGHT/2][WIDTH/2-i] = i+1; moveDirection = 'd'; // 初始向右移動(dòng) food_i = rand()%(HEIGHT-5) + 2; // 初始化隨機(jī)食物位置 food_j = rand()%(WIDTH-5) + 2; // initgraph(WIDTH*BLOCK_SIZE,HEIGHT*BLOCK_SIZE); // 新開(kāi)畫(huà)面 setlinecolor(RGB(200,200,200)); // 設(shè)置線條顏色 BeginBatchDraw(); // 開(kāi)始批量繪制}void show() // 繪制函數(shù){ cleardevice(); // 清屏 int i,j; for (i=0;i<HEIGHT;i++) // 對(duì)二維數(shù)組所有元素遍歷 { for (j=0;j<WIDTH;j++) { if (Blocks[i][j]>0) // 元素大于0表示是蛇,這里讓蛇的身體顏色色調(diào)漸變 setfillcolor(HSVtoRGB(Blocks[i][j]*10,0.9,1)); else setfillcolor(RGB(150,150,150)); // 元素為0表示為空,顏色為灰色 // 在對(duì)應(yīng)位置處,以對(duì)應(yīng)顏色繪制小方格 fillrectangle(j*BLOCK_SIZE,i*BLOCK_SIZE, (j+1)*BLOCK_SIZE,(i+1)*BLOCK_SIZE); } } setfillcolor(RGB(0,255,0)); // 食物為綠色 // 繪制食物小方塊 fillrectangle(food_j*BLOCK_SIZE,food_i*BLOCK_SIZE, (food_j+1)*BLOCK_SIZE,(food_i+1)*BLOCK_SIZE); if (isFailure) // 如果游戲失敗 { setbkmode(TRANSPARENT); // 文字字體透明 settextcolor(RGB(255,0,0));// 設(shè)定文字顏色 settextstyle(80, 0, _T("宋體")); // 設(shè)定文字大小、樣式 outtextxy(240,220,_T("游戲失敗")); // 輸出文字內(nèi)容 } FlushBatchDraw(); // 批量繪制} void updateWithoutInput() // 與輸入無(wú)關(guān)的更新函數(shù){ if (isFailure) // 如果游戲失敗,函數(shù)返回 return; static int waitIndex = 1; // 靜態(tài)局部變量,初始化時(shí)為1 waitIndex++; // 每一幀+1 if (waitIndex==10) // 如果等于10才執(zhí)行,這樣小蛇每隔10幀移動(dòng)一次 { moveSnake(); // 調(diào)用小蛇移動(dòng)函數(shù) waitIndex = 1; // 再變成1 }}void updateWithInput() // 和輸入有關(guān)的更新函數(shù){ if(kbhit() && isFailure==0) // 如果有按鍵輸入,并且不失敗 { char input = getch(); // 獲得按鍵輸入 if (input=='a' || input=='s' || input=='d' || input=='w') // 如果是asdw { moveDirection = input; // 設(shè)定移動(dòng)方向 moveSnake(); // 調(diào)用小蛇移動(dòng)函數(shù) } }}int main() // 主函數(shù){ startup(); // 初始化函數(shù),僅執(zhí)行一次 while (1) // 一直循環(huán) { show(); // 進(jìn)行繪制 updateWithoutInput(); // 和輸入無(wú)關(guān)的更新 updateWithInput(); // 和輸入有關(guān)的更新 } return 0;}

這一章主要講解了二維數(shù)組、if-else、scanf、局部變量與全局變量、動(dòng)態(tài)變量與靜態(tài)變量等語(yǔ)法知識(shí),利用游戲開(kāi)發(fā)框架,實(shí)現(xiàn)了貪吃蛇游戲。讀者可以嘗試在本章代碼基礎(chǔ)上繼續(xù)改進(jìn):

1. 實(shí)現(xiàn)得分越高,游戲速度越快的效果;

2. 增加道具,吃完可以加命或減速;

3. 嘗試雙人版貪吃蛇大戰(zhàn),如果碰到對(duì)方蛇身則游戲失敗。

希望對(duì)大家有幫助!

作者:童晶

此外,我也給大家分享我收集的其他資源,從最零基礎(chǔ)開(kāi)始的教程到C語(yǔ)言C++項(xiàng)目案例,幫助大家在學(xué)習(xí)C語(yǔ)言的道路上披荊斬棘!

編程學(xué)習(xí)書(shū)籍分享:

C語(yǔ)言實(shí)現(xiàn)《貪吃蛇》小游戲!代碼分享+思路注釋

編程學(xué)習(xí)視頻分享:

C語(yǔ)言實(shí)現(xiàn)《貪吃蛇》小游戲!代碼分享+思路注釋

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)最重要的是你可以在群里面交流提問(wèn)編程問(wèn)題哦!

對(duì)于C/C++感興趣可以關(guān)注小編在后臺(tái)私信我:【編程交流】一起來(lái)學(xué)習(xí)哦!可以領(lǐng)取一些C/C++的項(xiàng)目學(xué)習(xí)視頻資料哦!已經(jīng)設(shè)置好了關(guān)鍵詞自動(dòng)回復(fù),自動(dòng)領(lǐng)取就好了!

轉(zhuǎn)載請(qǐng)注明來(lái)自夕逆IT,本文標(biāo)題:《用c語(yǔ)言編寫(xiě)貪吃蛇(C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲代碼分享思路注釋)》

每一天,每一秒,你所做的決定都會(huì)改變你的人生!

發(fā)表評(píng)論

快捷回復(fù):

評(píng)論列表 (暫無(wú)評(píng)論,13人圍觀)參與討論

還沒(méi)有評(píng)論,來(lái)說(shuō)兩句吧...