C++實(shí)現(xiàn)貪吃蛇游戲
一、基本思路
制作貪吃蛇游戲,首先必須要有的材料是蛇和得分的食物;其次是游戲邏輯,1.要能使用鍵盤(pán)控制蛇的移動(dòng);2.食物被吃掉要能再次生成并且蛇要做出相應(yīng)變化;3.蛇咬到自己的身體和墻會(huì)死亡;最后是圖形界面的顯示。
二、蛇和食物
蛇和食物使用結(jié)構(gòu)體來(lái)儲(chǔ)存,代碼比較簡(jiǎn)單。
#include <graphics.h> #include <stdio.h> #include <time.h> #include <conio.h> #define SIZE 30 #define N 1000 //蛇的長(zhǎng)度限制 struct Coor { int x; int y; }; enum Ch{ up = 72,down = 80,left = 75,right = 77,P=112 };//ASCII碼 枚舉 struct Snake { int n; Coor scr[N]; Ch ch;//蛇的方向 }snake; struct Food { Coor fsr;//食物坐標(biāo) int flag;//標(biāo)記食物是否被吃掉 }food;
三、游戲邏輯實(shí)現(xiàn)
1. 鍵盤(pán)控制蛇的移動(dòng)
蛇的移動(dòng)和方向改變主要是依靠SnakeMove和ChangeSnake兩個(gè)函數(shù)實(shí)現(xiàn),ChangeSnake函數(shù)通過(guò)鍵盤(pán)輸入的ch值來(lái)判斷用戶對(duì)蛇方向的控制,從而修改snake.ch(蛇的方向)的值,然后SnakeMove函數(shù)通過(guò)修改后的snake.ch的值來(lái)控制蛇的移動(dòng),如果沒(méi)有新的ch值從鍵盤(pán)輸入,蛇會(huì)一直保持原來(lái)的方向移動(dòng)到地圖邊界。
void SnakeMove() { for (int i = snake.n - 1; i > 0; i--) { snake.scr[i].x = snake.scr[i - 1].x; snake.scr[i].y = snake.scr[i - 1].y; } switch (snake.ch) { case up: snake.scr[0].y -= SIZE; break; case down: snake.scr[0].y += SIZE; break; case left: snake.scr[0].x -= SIZE; break; case right: snake.scr[0].x += SIZE; break; } } void ChangeSnake() { switch (getch()) { case 72: if (snake.ch != down) { snake.ch = up; } break; case 80: if (snake.ch != up) { snake.ch = down; } break; case 75: if (snake.ch != right) { snake.ch = left; } break; case 77: if (snake.ch != left) { snake.ch = right; } break; case 112: system("pause"); } }
2. 食物被吃的觸發(fā)事件
當(dāng)食物被蛇吃掉(蛇頭坐標(biāo)和食物坐標(biāo)重合),蛇身長(zhǎng)度加一,食物存在標(biāo)記置0;
void EatFood() { if (snake.scr[0].x == food.fsr.x&&snake.scr[0].y == food.fsr.y) { snake.n++; food.flag = 0; } }
3. 游戲結(jié)束事件
當(dāng)蛇頭觸碰邊界或者自己的身體(蛇頭坐標(biāo)超出地圖邊界或與蛇身任一坐標(biāo)重合),窗口打印OverGame函數(shù)中預(yù)設(shè)的界面,并且關(guān)閉程序。
void GameBreak() { //撞墻 if (snake.scr[0].y < -1 || snake.scr[0].y>706 || snake.scr[0].x < -1 || snake.scr[0].x>946) { OverGame(); } //撞身體 for (int i = snake.n - 1; i > 0; i--) { if (snake.scr[0].x == snake.scr[i].x&&snake.scr[0].y == snake.scr[i].y) { OverGame(); } } } void OverGame() { cleardevice(); settextcolor(RED); settextstyle(100, 0, L"黑體"); outtextxy(400, 250, L"菜"); Sleep(2000); exit(0); }
四、圖形界面的顯示
1. 素材準(zhǔn)備
需要準(zhǔn)備的素材有蛇頭的圖片(如果不是對(duì)稱圖形,可以準(zhǔn)備四個(gè)不同方向的圖片),蛇身的圖片(如果制作蛇頭和蛇身一樣的話則可以直接使用蛇頭的圖片),得分果實(shí)的圖片。
2.背景制作及圖片導(dǎo)入
將所有圖片放入vs的項(xiàng)目文件夾即可直接在代碼中通過(guò)loadimage函數(shù)對(duì)圖片名字調(diào)用,GameInit函數(shù)主要進(jìn)行游戲初始化,將蛇長(zhǎng)度置為一,坐標(biāo)置為(0,0),食物存在標(biāo)記置零,打印游戲歡迎界面(GameStart函數(shù))。
IMAGE snakeleft, snakeright, snakedown, snakeup, she, shiwu; void GameInit() { initgraph(960, 720); setbkcolor(BLACK); cleardevice(); loadimage(&snakeleft, L"蛇頭.jpg", SIZE, SIZE); loadimage(&snakeright, L"蛇頭.jpg", SIZE, SIZE); loadimage(&snakeup, L"蛇頭.jpg", SIZE, SIZE); loadimage(&snakedown,L"蛇頭.jpg", SIZE, SIZE); loadimage(&she, L"蛇身1.jpg", SIZE, SIZE); loadimage(&shiwu, L"果實(shí).jpg", SIZE, SIZE); //蛇初始化 snake.scr[0].x = 0; snake.scr[0].y = 0; snake.n = 1; snake.ch = P; food.flag = 0; GameStart(); } void GameStart() { cleardevice(); settextcolor(WHITE); settextstyle(50, 0, L"黑體"); outtextxy(350, 250, L"游戲開(kāi)始"); outtextxy(300, 400, L"按“P”鍵暫停"); system("pause"); }
3.蛇和食物的打印
當(dāng)食物存在標(biāo)記為0時(shí)調(diào)用FoodCoor函數(shù),隨機(jī)重置食物坐標(biāo)并且將標(biāo)記置1,圖片的打印主要依靠putimage函數(shù),函數(shù)用法比較簡(jiǎn)單,這里就不多說(shuō)了。
void SnakePaint(IMAGE snakeright, IMAGE snakeleft, IMAGE snakedown, IMAGE snakeup, IMAGE she) { switch (snake.ch) { case up: putimage(snake.scr[0].x, snake.scr[0].y, &snakeup); break; case down: putimage(snake.scr[0].x, snake.scr[0].y, &snakedown); break; case left: putimage(snake.scr[0].x, snake.scr[0].y, &snakeleft); break; case right: putimage(snake.scr[0].x, snake.scr[0].y, &snakeright); break; } for(int i=snake.n-1;i>0;i--){ putimage(snake.scr[i].x, snake.scr[i].y, &she); } } void FoodCoor() { srand((unsigned int)time(NULL)); food.fsr.x = (rand() % 31 + 1)*SIZE; food.fsr.y = (rand() % 23 + 1)*SIZE; food.flag = 1; //有食物 } void FoodPaint(IMAGE shiwu) { putimage(food.fsr.x, food.fsr.y, &shiwu); }
五、游戲的運(yùn)行
首先調(diào)用GameInit函數(shù)進(jìn)行初始化,第一層while保證游戲始終運(yùn)行,第二層while是保證當(dāng)沒(méi)有鍵盤(pán)輸入時(shí),游戲會(huì)按設(shè)計(jì)好的邏輯運(yùn)行和判斷,而當(dāng)有鍵盤(pán)輸入時(shí),調(diào)用ChangeSnake函數(shù)判斷用戶對(duì)蛇的控制,從而進(jìn)行相應(yīng)的改變。
int main() { GameInit(); while (1) { while (!kbhit()) { if (food.flag == 0) FoodCoor(); cleardevice(); FoodPaint(shiwu); //繪制食物 SnakeMove(); SnakePaint(snakeright, snakeleft, snakedown, snakeup, she); Sleep(200-snake.n*5); EatFood(); GameBreak(); } ChangeSnake(); } return 0; }
六、成品演示
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解
- 利用C/C++實(shí)現(xiàn)貪吃蛇游戲
- C++入門(mén)指南之貪吃蛇游戲的實(shí)現(xiàn)
- C++實(shí)現(xiàn)簡(jiǎn)易貪吃蛇游戲
- C++實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲
- C++代碼實(shí)現(xiàn)貪吃蛇小游戲
- 基于easyx的C++實(shí)現(xiàn)貪吃蛇
- C++控制臺(tái)循環(huán)鏈表實(shí)現(xiàn)貪吃蛇
- C++控制臺(tái)實(shí)現(xiàn)貪吃蛇游戲
- C++通過(guò)類實(shí)現(xiàn)控制臺(tái)貪吃蛇
- C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇
- c++實(shí)現(xiàn)超簡(jiǎn)單的貪吃蛇游戲?qū)嵗榻B
相關(guān)文章
C語(yǔ)言常用庫(kù)函數(shù)的使用及模擬實(shí)現(xiàn)詳解例舉
C語(yǔ)言庫(kù)函數(shù)是把自定義函數(shù)放到庫(kù)里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來(lái)詳細(xì)了解它2022-04-04淺談int8_t int64_t size_t ssize_t的相關(guān)問(wèn)題(詳解)
下面小編就為大家?guī)?lái)一篇淺談int8_t int64_t size_t ssize_t的相關(guān)問(wèn)題(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03OpenCV實(shí)現(xiàn)視頻綠幕背景替換功能的示例代碼
這篇文章主要介紹了如何利用OpenCV實(shí)現(xiàn)視頻綠幕背景替換功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,感興趣的可以學(xué)習(xí)一下2023-02-02C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C語(yǔ)言實(shí)現(xiàn)常見(jiàn)進(jìn)制轉(zhuǎn)換的示例代碼
生活中最常見(jiàn)的進(jìn)制是十進(jìn)制,而有一類編程題會(huì)要求將十進(jìn)制轉(zhuǎn)換為其他進(jìn)制,本文將主要講述C語(yǔ)言中常見(jiàn)的幾類進(jìn)制轉(zhuǎn)換問(wèn)題,希望對(duì)大家有所幫助2023-04-04C語(yǔ)言字符函數(shù)、內(nèi)存函數(shù)功能及實(shí)現(xiàn)代碼
這篇文章主要介紹了C語(yǔ)言字符函數(shù)、內(nèi)存函數(shù) 功能及實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02