C++代碼實(shí)現(xiàn)貪吃蛇小游戲
本文實(shí)例為大家分享了C++實(shí)現(xiàn)貪吃蛇小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1.游戲描述
貪吃蛇可謂是從小玩到大的經(jīng)典趣味小游戲,蛇每吃到一次食物,身體就會(huì)長(zhǎng)一節(jié),如果撞到墻或者撞到自身,游戲結(jié)束。
2.代碼實(shí)現(xiàn)
1.首先需要思考的問(wèn)題是如何指定位置輸出字符?這時(shí)候就有一個(gè)非常強(qiáng)大的函數(shù)叫 gotoxy() ,現(xiàn)在庫(kù)函數(shù)里邊已經(jīng)沒(méi)有了,只能我們自己實(shí)現(xiàn),代碼中注釋很完整,自行閱讀即可。
2.實(shí)現(xiàn)了指哪畫(huà)哪的目標(biāo)之后,就可以開(kāi)始游戲內(nèi)容制作了。首先便是圈地,即畫(huà)地圖,一個(gè)簡(jiǎn)簡(jiǎn)單單的循環(huán)就能安排的明明白白。
3.偉大的圈地運(yùn)動(dòng)就結(jié)束了,接下來(lái)我們就實(shí)現(xiàn)畫(huà)一條蛇,我們選擇使用deque雙端隊(duì)列,這個(gè)操作更為方便,畫(huà)好蛇之后就給畫(huà)一個(gè)食物出來(lái),食物的位置坐標(biāo)使用隨機(jī)數(shù)來(lái)實(shí)現(xiàn),簡(jiǎn)單吧~
4.讓蛇動(dòng)起來(lái)。我們默認(rèn)讓蛇往上走,即‘w'方向,之后便是按鍵響應(yīng),這個(gè)只要懂點(diǎn)語(yǔ)法,小白都能實(shí)現(xiàn),就不多說(shuō)了。
5.貪吃蛇的大體框架就這樣搭好了,是不是soeasy~
3.裝飾環(huán)節(jié)
只是會(huì)跑當(dāng)然不能滿(mǎn)足我們?nèi)找嬖鲩L(zhǎng)的精神需求,那就加點(diǎn)料唄,下面的代碼中只加入了計(jì)分、等級(jí),其他的都沒(méi)有加,為的是新手能快速上手,你也可以再往里邊加吃到食物時(shí)“滴~”響一聲等元素,這都不是問(wèn)題。

話(huà)不多說(shuō),上代碼!
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <deque>
#include <ctime>
#pragma warning(disable:4996)
using namespace std;
HANDLE hOut;
COORD pos;
//1.實(shí)現(xiàn)gotoxy函數(shù)
void gotoxy(short x, short y)
{
hOut = GetStdHandle(STD_OUTPUT_HANDLE); //獲取句柄
pos = { x, y };
SetConsoleCursorPosition(hOut, pos); //移動(dòng)光標(biāo)到指定位置
}
void HideCursor() //隱藏光標(biāo)
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//獲取控制臺(tái)光標(biāo)信息
CursorInfo.bVisible = false; //隱藏控制臺(tái)光標(biāo)
SetConsoleCursorInfo(handle, &CursorInfo);//設(shè)置控制臺(tái)光標(biāo)狀態(tài)
}
//2.蛇的結(jié)構(gòu)體
struct Snake
{
char body;
short position_x, position_y; //蛇的坐標(biāo)
};
//3.游戲運(yùn)行類(lèi)
class Game
{
private:
char image;
enum mapSize { width = 60, height = 30 }; //游戲地圖
deque<Snake> snake; //定義一個(gè)隊(duì)列,裝蛇的身體
int score = 0; //游戲分?jǐn)?shù)
char hit = 'w'; //按鍵輸入
bool eat_Food = false; //是否吃到食物
short food_x, food_y; //食物坐標(biāo)
int speed = 400; //蛇的速度
bool snake_state = true; //蛇的狀態(tài)
int level = 1; //游戲關(guān)卡
public:
Game();
void draw_Frame() //畫(huà)邊框
{
for (int i = 0; i < height; i++)
{
gotoxy(0, i);
cout << "■";
gotoxy(width, i);
cout << "■";
}
for (int i = 0; i <= width; i += 2) //■ 這個(gè)符號(hào)占兩個(gè)字符位置,所以是+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++) //蛇的初始身體節(jié)數(shù),可自定
snake.push_back({ char('o'), width / 2, static_cast<short>((height / 2) + 1 + i) });
snake.push_back({ ' ', width / 2, static_cast<short>((height / 2) + 4) }); //添加蛇尾,先放空,以便于后面添加節(jié)數(shù)時(shí)操作
}
void draw_Snake() //畫(huà)蛇
{
for (int k = 0; k < snake.size(); k++)
{
gotoxy(snake[k].position_x, snake[k].position_y);
cout << snake[k].body;
}
}
void clear_Tail() //清除蛇尾,不建議使用清屏函數(shù),避免屏閃
{
int k = snake.size() - 1;
gotoxy(snake[k].position_x, snake[k].position_y);
cout << " "; //蛇每移動(dòng)一次(即一格),就把上一次畫(huà)出來(lái)的蛇尾擦掉
}
void draw_Food() //畫(huà)食物
{
while (1)
{
food_x = rand() % (width - 4) + 2; //食物要在地圖中,不能再地圖邊框上,地圖的符號(hào)在x方向占兩個(gè)字符位置所以+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() //判斷食物的坐標(biāo)是否合理
{
for (auto i : snake) //c++11的基于范圍的循環(huán)
{
if (food_x == i.position_x && food_y == i.position_y) //食物不能出現(xiàn)在蛇的身體上
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; //實(shí)際就是把snake容器里第一個(gè)(即蛇頭)存在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() //按鍵響應(yīng)
{
char key = hit;
if (_kbhit()) //接受按鍵
hit = _getch();
for (int i = snake.size() - 1; i > 0; i--) //蛇的移動(dòng)方法,每移動(dòng)一次,后面一節(jié)的身體到了它的前一節(jié)身體上
{
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 << "關(guān)卡:" << level;
}
};
Game::Game()
{
HideCursor();
srand(static_cast<unsigned int>(time(NULL))); //隨機(jī)數(shù)種子
init_snake();
draw_Food();
Snake tail; //蛇尾
while (1)
{
draw_Frame();
tail = snake.back();
if (eat_Food)
{
snake.back().body = 'o'; //把初始化蛇的空尾顯示化為o,看到的效果就是加了一節(jié)
snake.push_back(tail); //再添加一節(jié)空尾,便于下次操作
gotoxy(food_x, food_y);
cout << " "; //食物被吃后要在原來(lái)的位置畫(huà)空,否則光標(biāo)會(huì)退位,導(dǎo)致邊框錯(cuò)位
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"); //設(shè)置打開(kāi)窗口大小
system("color 7C"); //設(shè)置背景色和前景色
system("title 貪吃蛇 v1.0"); 設(shè)置窗口標(biāo)題
Game game;
gotoxy(0, 32);
cout << "Game over!" << endl;
}
本期教程到這里就結(jié)束了。
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專(zhuān)題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例,有感興趣的同學(xué)可以借鑒參考下2021-02-02
C++使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù)
TinyXML2是一個(gè)輕量級(jí)的、開(kāi)源的C++庫(kù),專(zhuān)門(mén)用于解析和生成XML文檔,本文主要為大家介紹了如何使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù),需要的可以參考下2024-04-04
QT實(shí)現(xiàn)TCP客戶(hù)端自動(dòng)連接
這篇文章主要為大家詳細(xì)介紹了QT中一個(gè)TCP客戶(hù)端自動(dòng)連接的測(cè)試模型,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
利用C語(yǔ)言實(shí)現(xiàn)經(jīng)典多級(jí)時(shí)間輪定時(shí)器
C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā),這篇文章主要給大家介紹了關(guān)于利用C語(yǔ)言實(shí)現(xiàn)經(jīng)典多級(jí)時(shí)間輪定時(shí)器的相關(guān)資料,需要的朋友可以參考下2021-07-07
C++ const限定符以及頂層const和底層const的案例詳解
這篇文章主要介紹了C++ const限定符以及頂層const和底層const的案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09

