最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)貪吃蛇游戲

 更新時(shí)間:2020年12月27日 12:36:11   作者:RanDoll_  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、基本思路

制作貪吃蛇游戲,首先必須要有的材料是蛇和得分的食物;其次是游戲邏輯,1.要能使用鍵盤控制蛇的移動(dòng);2.食物被吃掉要能再次生成并且蛇要做出相應(yīng)變化;3.蛇咬到自己的身體和墻會(huì)死亡;最后是圖形界面的顯示。

二、蛇和食物

蛇和食物使用結(jié)構(gòu)體來儲(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. 鍵盤控制蛇的移動(dòng)

蛇的移動(dòng)和方向改變主要是依靠SnakeMove和ChangeSnake兩個(gè)函數(shù)實(shí)現(xiàn),ChangeSnake函數(shù)通過鍵盤輸入的ch值來判斷用戶對(duì)蛇方向的控制,從而修改snake.ch(蛇的方向)的值,然后SnakeMove函數(shù)通過修改后的snake.ch的值來控制蛇的移動(dòng),如果沒有新的ch值從鍵盤輸入,蛇會(huì)一直保持原來的方向移動(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)目文件夾即可直接在代碼中通過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"游戲開始");
 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)單,這里就不多說了。

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)沒有鍵盤輸入時(shí),游戲會(huì)按設(shè)計(jì)好的邏輯運(yùn)行和判斷,而當(dāng)有鍵盤輸入時(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;
}

六、成品演示

游戲開始界面
游戲運(yùn)行界面
游戲結(jié)束界面

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c++ qsort 與sort 對(duì)結(jié)構(gòu)體排序?qū)嵗a

    c++ qsort 與sort 對(duì)結(jié)構(gòu)體排序?qū)嵗a

    這篇文章主要介紹了c++ qsort 與sort 對(duì)結(jié)構(gòu)體排序?qū)嵗a,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-11-11
  • c++基礎(chǔ)算法動(dòng)態(tài)DP解決CoinChange問題

    c++基礎(chǔ)算法動(dòng)態(tài)DP解決CoinChange問題

    這篇文章主要為大家介紹了c++基礎(chǔ)算法如何利用動(dòng)態(tài)DP來解決Coin Change的問題示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Qt中QPixmap、QImage、QPicture、QBitmap四者區(qū)別詳解

    Qt中QPixmap、QImage、QPicture、QBitmap四者區(qū)別詳解

    Qt 提供了四個(gè)類來處理圖像數(shù)據(jù):QImage、QPixmap、QBitmap 和 QPicture,本文就詳細(xì)的介紹一下四者區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定示例詳解

    OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定示例詳解

    相機(jī)標(biāo)定是圖像處理的基礎(chǔ),現(xiàn)在市面上買到的相機(jī),都存在著或多或少的畸變。本文將介紹如何利用一系列棋盤照片進(jìn)行攝像機(jī)標(biāo)定的,感興趣的小伙伴可以關(guān)注一下
    2021-11-11
  • C語言實(shí)現(xiàn)的順序表功能完整實(shí)例

    C語言實(shí)現(xiàn)的順序表功能完整實(shí)例

    這篇文章主要介紹了C語言實(shí)現(xiàn)的順序表功能,結(jié)合完整實(shí)例形式分析了C語言順序表的創(chuàng)建、添加、刪除、排序、合并等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • C/C++獲取Windows平臺(tái)CPU占用率的方法

    C/C++獲取Windows平臺(tái)CPU占用率的方法

    最近在做系統(tǒng)信息相關(guān)的接口,為了實(shí)現(xiàn)跨平臺(tái),故在linux和Windows平臺(tái)獲取占用率信息,文章主要介紹Windows下的方法,文中給出了參考代碼,需要的朋友可以參考下
    2023-12-12
  • C++執(zhí)行shell命令的多種實(shí)現(xiàn)方法

    C++執(zhí)行shell命令的多種實(shí)現(xiàn)方法

    在linux系統(tǒng)下,用C++程序執(zhí)行shell命令有多種方式,主要介紹了3中方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-11-11
  • QT實(shí)現(xiàn)自定義Http客戶端的示例代碼

    QT實(shí)現(xiàn)自定義Http客戶端的示例代碼

    這篇文章主要為大家詳細(xì)介紹了QT如何實(shí)現(xiàn)自定義Http客戶端的,可以實(shí)現(xiàn)支持get,post請(qǐng)求方式;支持連接超時(shí)處理;支持網(wǎng)絡(luò)錯(cuò)誤,嘗試重連等功能,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-11-11
  • Qt實(shí)現(xiàn)生成指定范圍內(nèi)隨機(jī)數(shù)與隨機(jī)字符串

    Qt實(shí)現(xiàn)生成指定范圍內(nèi)隨機(jī)數(shù)與隨機(jī)字符串

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)生成指定范圍內(nèi)隨機(jī)數(shù)與隨機(jī)字符串,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以自己動(dòng)手嘗試一下
    2023-07-07
  • 詳解C++ string字符串類

    詳解C++ string字符串類

    這篇文章主要介紹了C++ string字符串類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

左云县| 司法| 中山市| 兰考县| 和平区| 舟山市| 满城县| 苏尼特左旗| 临夏县| 吉林省| 长泰县| 新泰市| 雷州市| 历史| 柏乡县| 巴林右旗| 炎陵县| 北安市| 古田县| 财经| 石河子市| 绥滨县| 灯塔市| 青龙| 东方市| 岳西县| 景宁| 合作市| 廉江市| 扎兰屯市| 富顺县| 苍南县| 廊坊市| 龙门县| 井陉县| 无棣县| 大厂| 上蔡县| 高尔夫| 霍山县| 屏边|