1. 程式人生 > 程式設計 >C++程式碼實現貪吃蛇小遊戲

C++程式碼實現貪吃蛇小遊戲

本文例項為大家分享了C++實現貪吃蛇小遊戲的具體程式碼,供大家參考,具體內容如下

1.遊戲描述

貪吃蛇可謂是從小玩到大的經典趣味小遊戲,蛇每吃到一次食物,身體就會長一節,如果撞到牆或者撞到自身,遊戲結束。

2.程式碼實現

1.首先需要思考的問題是如何指定位置輸出字元?這時候就有一個非常強大的函式叫 gotoxy() ,現在庫函式裡邊已經沒有了,只能我們自己實現,程式碼中註釋很完整,自行閱讀即可。

2.實現了指哪畫哪的目標之後,就可以開始遊戲內容製作了。首先便是圈地,即畫地圖,一個簡簡單單的迴圈就能安排的明明白白。

3.偉大的圈地運動就結束了,接下來我們就實現畫一條蛇,我們選擇使用deque雙端佇列,這個操作更為方便,畫好蛇之後就給畫一個食物出來,食物的位置座標使用隨機數來實現,簡單吧~

4.讓蛇動起來。我們預設讓蛇往上走,即‘w'方向,之後便是按鍵響應,這個只要懂點語法,小白都能實現,就不多說了。

5.貪吃蛇的大體框架就這樣搭好了,是不是soeasy~

3.裝飾環節

只是會跑當然不能滿足我們日益增長的精神需求,那就加點料唄,下面的程式碼中只加入了計分、等級,其他的都沒有加,為的是新手能快速上手,你也可以再往裡邊加吃到食物時“滴~”響一聲等元素,這都不是問題。

C++程式碼實現貪吃蛇小遊戲

話不多說,上程式碼!

#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <deque>
#include <ctime>
#pragma warning(disable:4996)
using namespace std;
HANDLE hOut;
COORD pos;

//1.實現gotoxy函式
void gotoxy(short x,short y)
{
 hOut = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制代碼
 pos = { x,y };
 SetConsoleCursorPosition(hOut,pos);  //移動游標到指定位置
}
void HideCursor() //隱藏游標
{
 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
 CONSOLE_CURSOR_INFO CursorInfo;
 GetConsoleCursorInfo(handle,&CursorInfo);//獲取控制檯游標資訊
 CursorInfo.bVisible = false;    //隱藏控制檯游標
 SetConsoleCursorInfo(handle,&CursorInfo);//設定控制檯游標狀態
}

//2.蛇的結構體
struct Snake
{
 char body;
 short position_x,position_y;    //蛇的座標
};

//3.遊戲執行類
class Game
{
private:
 char image;
 enum mapSize { width = 60,height = 30 }; //遊戲地圖
 deque<Snake> snake;      //定義一個佇列,裝蛇的身體
 int score = 0;        //遊戲分數
 char hit = 'w';       //按鍵輸入
 bool eat_Food = false;      //是否吃到食物
 short food_x,food_y;      //食物座標
 int speed = 400;       //蛇的速度
 bool snake_state = true;     //蛇的狀態
 int level = 1;        //遊戲關卡
public:
 Game();
 void draw_Frame()  //畫邊框
 {
 for (int i = 0; i < height; i++)
 {
 gotoxy(0,i);
 cout << "■";
 gotoxy(width,i);
 cout << "■";
 }
 for (int i = 0; i <= width; i += 2) //■ 這個符號佔兩個字元位置,所以是+2
 {
 gotoxy(i,0);
 cout << "■";
 gotoxy(i,height);
 cout << "■";
 }
 }
 void init_snake()  //初始化蛇
 {
 snake.push_back({ '#',width / 2,static_cast<short>(height / 2) }); //新增蛇頭
 for (int i = 0; i < 3; i++) //蛇的初始身體節數,可自定
 snake.push_back({ char('o'),static_cast<short>((height / 2) + 1 + i) });
 snake.push_back({ ' ',static_cast<short>((height / 2) + 4) }); //新增蛇尾,先放空,以便於後面新增節數時操作
 }
 void draw_Snake() //畫蛇
 {
 for (int k = 0; k < snake.size(); k++)
 {
 gotoxy(snake[k].position_x,snake[k].position_y);
 cout << snake[k].body;
 }
 }
 void clear_Tail() //清除蛇尾,不建議使用清屏函式,避免屏閃
 {
 int k = snake.size() - 1;
 gotoxy(snake[k].position_x,snake[k].position_y);
 cout << " "; //蛇每移動一次(即一格),就把上一次畫出來的蛇尾擦掉
 }
 void draw_Food() //畫食物
 {
 while (1)
 {
 food_x = rand() % (width - 4) + 2; //食物要在地圖中,不能再地圖邊框上,地圖的符號在x方向佔兩個字元位置所以+2,而-4則是減去邊框
 food_y = rand() % (height - 2) + 1; //與上同理
 if (wrong_Location() && food_x % 2 == 0)
 break;
 }
 gotoxy(food_x,food_y);
 cout << "O";
 }
 bool wrong_Location() //判斷食物的座標是否合理
 {
 for (auto i : snake) //c++11的基於範圍的迴圈
 {
 if (food_x == i.position_x && food_y == i.position_y) //食物不能出現在蛇的身體上
 return 0;
 }
 return 1;
 }
 void judge_eatFood() //判斷是否吃到食物
 {
 if (food_x == snake[0].position_x && food_y == snake[0].position_y)
 eat_Food = true;
 }
 void judge_state() //判斷蛇是否撞牆或撞身體
 {
 if (snake.size() >= 2) 
 {
 deque<Snake>::iterator iter = snake.begin() + 1; //實際就是把snake容器裡第一個(即蛇頭)存在iter裡
 int x = (iter - 1)->position_x,y = (iter - 1)->position_y;
 for (; iter != snake.end(); ++iter) 
 {
 if (iter->position_x == x && iter->position_y == y) //蛇頭不能撞自身
  snake_state = false;
 }
 }
 if(snake[0].position_x == 1 ||
 snake[0].position_x == 59 ||
 snake[0].position_y == 0 ||
 snake[0].position_y == 30) //蛇頭不能撞邊框
 snake_state = false;
 }
 void key_Down() //按鍵響應
 {
 char key = hit;
 if (_kbhit()) //接受按鍵
 hit = _getch(); 
 for (int i = snake.size() - 1; i > 0; i--) //蛇的移動方法,每移動一次,後面一節的身體到了它的前一節身體上
 {
 snake[i].position_x = snake[i - 1].position_x;
 snake[i].position_y = snake[i - 1].position_y;
 }
 if ((hit == 'a' || hit == 'A') && hit != 'd')
 {
 hit = 'a'; snake[0].position_x--;
 }
 else if ((hit == 'd' || hit == 'D') && hit != 'a')
 {
 hit = 'd'; snake[0].position_x++;
 }
 else if ((hit == 'w' || hit == 'W') && hit != 's')
 {
 hit = 'w'; snake[0].position_y--;
 }
 else if ((hit == 's' || hit == 'S') && hit != 'w')
 {
 hit = 's'; snake[0].position_y++;
 }
 }
 void show()
 {
 gotoxy(65,0);
 cout << "你的得分是:";
 gotoxy(71,1);
 cout << score;
 gotoxy(69,2);
 cout << "關卡:" << level;
 }
};
Game::Game()
{
 HideCursor();
 srand(static_cast<unsigned int>(time(NULL))); //隨機數種子
 init_snake();
 draw_Food();
 Snake tail; //蛇尾
 while (1)
 {
 draw_Frame();
 tail = snake.back();
 if (eat_Food)
 {
 snake.back().body = 'o'; //把初始化蛇的空尾顯示化為o,看到的效果就是加了一節
 snake.push_back(tail); //再新增一節空尾,便於下次操作
 gotoxy(food_x,food_y);
 cout << " "; //食物被吃後要在原來的位置畫空,否則游標會退位,導致邊框錯位
 draw_Food();
 score++;
 if (score % 5 == 0)
 {
 speed *= 0.8;
 level++;
 }
 eat_Food = false;
 }
 if (level == 10)
 break;
 key_Down();
 draw_Snake();
 judge_state();
 if (!snake_state)
 break;
 judge_eatFood(); 
 Sleep(speed);
 clear_Tail();
 show();
 }
}
int main()
{
 system("mode con cols=100 lines=40"); //設定開啟視窗大小
 system("color 7C"); //設定背景色和前景色
 system("title 貪吃蛇 v1.0"); 設定視窗標題
 Game game;
 gotoxy(0,32);
 cout << "Game over!" << endl;
}

本期教程到這裡就結束了。

更多有趣的經典小遊戲實現專題,分享給大家:

C++經典小遊戲彙總

python經典小遊戲彙總

python俄羅斯方塊遊戲集合

JavaScript經典遊戲 玩不停

java經典小遊戲彙總

javascript經典小遊戲彙總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。