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

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

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

本文實(shí)例為大家分享了C++實(shí)現(xiàn)貪吃蛇小游戲的具體代碼,供大家參考,具體內(nèi)容如下

1.游戲描述

貪吃蛇可謂是從小玩到大的經(jīng)典趣味小游戲,蛇每吃到一次食物,身體就會長一節(jié),如果撞到墻或者撞到自身,游戲結(jié)束。

2.代碼實(shí)現(xiàn)

1.首先需要思考的問題是如何指定位置輸出字符?這時(shí)候就有一個非常強(qiáng)大的函數(shù)叫 gotoxy() ,現(xiàn)在庫函數(shù)里邊已經(jīng)沒有了,只能我們自己實(shí)現(xiàn),代碼中注釋很完整,自行閱讀即可。

2.實(shí)現(xiàn)了指哪畫哪的目標(biāo)之后,就可以開始游戲內(nèi)容制作了。首先便是圈地,即畫地圖,一個簡簡單單的循環(huán)就能安排的明明白白。

3.偉大的圈地運(yùn)動就結(jié)束了,接下來我們就實(shí)現(xiàn)畫一條蛇,我們選擇使用deque雙端隊(duì)列,這個操作更為方便,畫好蛇之后就給畫一個食物出來,食物的位置坐標(biāo)使用隨機(jī)數(shù)來實(shí)現(xiàn),簡單吧~

4.讓蛇動起來。我們默認(rèn)讓蛇往上走,即‘w'方向,之后便是按鍵響應(yīng),這個只要懂點(diǎn)語法,小白都能實(shí)現(xiàn),就不多說了。

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

3.裝飾環(huán)節(jié)

只是會跑當(dāng)然不能滿足我們?nèi)找嬖鲩L的精神需求,那就加點(diǎn)料唄,下面的代碼中只加入了計(jì)分、等級,其他的都沒有加,為的是新手能快速上手,你也可以再往里邊加吃到食物時(shí)“滴~”響一聲等元素,這都不是問題。

話不多說,上代碼!

#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);  //移動光標(biāo)到指定位置
}
void HideCursor() //隱藏光標(biāo)
{
 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
 CONSOLE_CURSOR_INFO CursorInfo;
 GetConsoleCursorInfo(handle, &CursorInfo);//獲取控制臺光標(biāo)信息
 CursorInfo.bVisible = false;    //隱藏控制臺光標(biāo)
 SetConsoleCursorInfo(handle, &CursorInfo);//設(shè)置控制臺光標(biāo)狀態(tài)
}

//2.蛇的結(jié)構(gòu)體
struct Snake
{
 char body;
 short position_x, position_y;    //蛇的坐標(biāo)
};

//3.游戲運(yùn)行類
class Game
{
private:
 char image;
 enum mapSize { width = 60, height = 30 }; //游戲地圖
 deque<Snake> snake;      //定義一個隊(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()  //畫邊框
 {
 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++) //蛇的初始身體節(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() //畫蛇
 {
 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 << " "; //蛇每移動一次(即一格),就把上一次畫出來的蛇尾擦掉
 }
 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() //判斷食物的坐標(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容器里第一個(即蛇頭)存在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--) //蛇的移動方法,每移動一次,后面一節(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 << " "; //食物被吃后要在原來的位置畫空,否則光標(biāo)會退位,導(dǎo)致邊框錯位
 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è)置打開窗口大小
 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)專題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

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

相關(guān)文章

  • C語言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例

    C語言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例

    這篇文章主要介紹了C語言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例,有感興趣的同學(xué)可以借鑒參考下
    2021-02-02
  • VC中BASE64編碼和解碼使用詳解

    VC中BASE64編碼和解碼使用詳解

    Base64是一種很常用的編碼方式,利用它可以將任何二進(jìn)制的字符編碼到可打印的64個字符之中, 這樣,不管是圖片,中文文本等都可以編碼成只有ASCII的純文本。
    2015-11-11
  • C語言中的rand()和rand_r()詳解

    C語言中的rand()和rand_r()詳解

    這篇文章主要為大家介紹了C語言中的rand()和rand_r(),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C++使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù)

    C++使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù)

    TinyXML2是一個輕量級的、開源的C++庫,專門用于解析和生成XML文檔,本文主要為大家介紹了如何使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù),需要的可以參考下
    2024-04-04
  • QT實(shí)現(xiàn)TCP客戶端自動連接

    QT實(shí)現(xiàn)TCP客戶端自動連接

    這篇文章主要為大家詳細(xì)介紹了QT中一個TCP客戶端自動連接的測試模型,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • 利用C語言實(shí)現(xiàn)經(jīng)典多級時(shí)間輪定時(shí)器

    利用C語言實(shí)現(xiàn)經(jīng)典多級時(shí)間輪定時(shí)器

    C語言是一門通用計(jì)算機(jī)編程語言,廣泛應(yīng)用于底層開發(fā),這篇文章主要給大家介紹了關(guān)于利用C語言實(shí)現(xiàn)經(jīng)典多級時(shí)間輪定時(shí)器的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C++ const限定符以及頂層const和底層const的案例詳解

    C++ const限定符以及頂層const和底層const的案例詳解

    這篇文章主要介紹了C++ const限定符以及頂層const和底層const的案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • c語言冒泡排序和選擇排序的使用代碼

    c語言冒泡排序和選擇排序的使用代碼

    算法中排序是十分重要的,而每一個學(xué)習(xí)計(jì)算機(jī)的都會在初期的時(shí)候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語言冒泡排序和選擇排序使用的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • 超級詳細(xì)講解C++中的多態(tài)

    超級詳細(xì)講解C++中的多態(tài)

    多態(tài)是在不同繼承關(guān)系的類對象,去調(diào)同一函數(shù),產(chǎn)生了不同的行為,下面這篇文章主要給大家介紹了關(guān)于C++中多態(tài)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 深入串的模式匹配算法(普通算法和KMP算法)的詳解

    深入串的模式匹配算法(普通算法和KMP算法)的詳解

    本篇文章是對串的模式匹配算法(普通算法和KMP算法)的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

涡阳县| 洛南县| 揭阳市| 宁南县| 东方市| 和硕县| 黑龙江省| 会同县| 三明市| 花莲县| 庐江县| 克拉玛依市| 五常市| 富川| 哈尔滨市| 汪清县| 鄂尔多斯市| 宣化县| 资阳市| 东宁县| 昭苏县| 定远县| 旌德县| 务川| 同德县| 广饶县| 普兰店市| 遂平县| 溧水县| 襄樊市| 潞城市| 兴隆县| 荔浦县| 双峰县| 惠安县| 武鸣县| 花莲县| 扎赉特旗| 林口县| 晋州市| 江门市|