中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用C++怎么編寫一個貪吃蛇游戲

發布時間:2020-12-28 14:11:09 來源:億速云 閱讀:310 作者:Leah 欄目:開發技術

這篇文章給大家介紹使用C++怎么編寫一個貪吃蛇游戲,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一、基本思路

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

二、蛇和食物

蛇和食物使用結構體來儲存,代碼比較簡單。

#include <graphics.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>

#define SIZE 30
#define N 1000 //蛇的長度限制

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;//食物坐標
 int flag;//標記食物是否被吃掉
}food;

三、游戲邏輯實現

1. 鍵盤控制蛇的移動

蛇的移動和方向改變主要是依靠SnakeMove和ChangeSnake兩個函數實現,ChangeSnake函數通過鍵盤輸入的ch值來判斷用戶對蛇方向的控制,從而修改snake.ch(蛇的方向)的值,然后SnakeMove函數通過修改后的snake.ch的值來控制蛇的移動,如果沒有新的ch值從鍵盤輸入,蛇會一直保持原來的方向移動到地圖邊界。

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. 食物被吃的觸發事件

當食物被蛇吃掉(蛇頭坐標和食物坐標重合),蛇身長度加一,食物存在標記置0;

void EatFood() {
 if (snake.scr[0].x == food.fsr.x&&snake.scr[0].y == food.fsr.y) {
 snake.n++;
 food.flag = 0;
 }
}

3. 游戲結束事件

當蛇頭觸碰邊界或者自己的身體(蛇頭坐標超出地圖邊界或與蛇身任一坐標重合),窗口打印OverGame函數中預設的界面,并且關閉程序。

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. 素材準備

需要準備的素材有蛇頭的圖片(如果不是對稱圖形,可以準備四個不同方向的圖片),蛇身的圖片(如果制作蛇頭和蛇身一樣的話則可以直接使用蛇頭的圖片),得分果實的圖片。

2.背景制作及圖片導入

將所有圖片放入vs的項目文件夾即可直接在代碼中通過loadimage函數對圖片名字調用,GameInit函數主要進行游戲初始化,將蛇長度置為一,坐標置為(0,0),食物存在標記置零,打印游戲歡迎界面(GameStart函數)。

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"果實.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.蛇和食物的打印

當食物存在標記為0時調用FoodCoor函數,隨機重置食物坐標并且將標記置1,圖片的打印主要依靠putimage函數,函數用法比較簡單,這里就不多說了。

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);
}

五、游戲的運行

首先調用GameInit函數進行初始化,第一層while保證游戲始終運行,第二層while是保證當沒有鍵盤輸入時,游戲會按設計好的邏輯運行和判斷,而當有鍵盤輸入時,調用ChangeSnake函數判斷用戶對蛇的控制,從而進行相應的改變。

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;
}

關于使用C++怎么編寫一個貪吃蛇游戲就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滨州市| 嘉兴市| 顺义区| 海口市| 札达县| 肥西县| 榆树市| 天气| 富平县| 眉山市| 西峡县| 淮安市| 巩留县| 广汉市| 高碑店市| 康乐县| 正安县| 临汾市| 县级市| 青冈县| 兴业县| 龙里县| 中卫市| 沁水县| 朝阳县| 明溪县| 雷波县| 汝州市| 遂宁市| 凤冈县| 蕲春县| 理塘县| 淅川县| 龙江县| 苗栗县| 安龙县| 鄂州市| 德州市| 娄烦县| 天祝| 乐平市|