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

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

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

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

使用vector容器實(shí)現(xiàn)貪吃蛇簡化了很多繁瑣操作,且相比之前我的代碼已經(jīng)做到了盡量的簡潔

技術(shù)環(huán)節(jié):

編譯環(huán)境:windows VS2019

需求:

控制貪吃蛇吃食物,吃到一個(gè)食物蛇身變長一節(jié),得分增加,撞墻或撞自己則游戲結(jié)束。

思路:

創(chuàng)建一個(gè)vector容器,容器內(nèi)存儲蛇的每節(jié)身體的結(jié)構(gòu)變量,結(jié)構(gòu)變量中保存蛇身體的xy坐標(biāo),通過使用vector成員方法不斷添加和刪除容器中的數(shù)據(jù),實(shí)現(xiàn)蛇坐標(biāo)的規(guī)律移動(dòng),吃到食物等時(shí)執(zhí)行對應(yīng)操作。

在代碼注釋中標(biāo)注了每一步是怎么實(shí)現(xiàn)的。

注意:

由于編譯器原因程序中_kbhit()和_getch()函數(shù)可能在其他編譯器上編譯會出現(xiàn)錯(cuò)誤,解決辦法是去掉函數(shù)前面的“_”。

運(yùn)行效果:

#include <iostream>
#include <vector>
#include <windows.h>
#include <conio.h>
#include <ctime>

using namespace std;


void gotoxy(int x, int y); //光標(biāo)定位

//食物類
class Food
{
private:
 int m_x;
 int m_y;
public:
 void randfood() //隨機(jī)產(chǎn)生一個(gè)食物
 {
 srand((int)time(NULL));
 L1:
 m_x = rand() % (85) + 2;
 m_y = rand() % (25) + 2;

 if (m_x % 2) //如果食物的x坐標(biāo)不是偶數(shù)則重新確定食物的坐標(biāo)
 goto L1;

 gotoxy(m_x, m_y); //在確認(rèn)好的位置輸出食物
 cout << "★";
 }
 int getFoodm_x() //返回食物的x坐標(biāo)
 {
 return m_x;
 }
 int getFoodm_y() //返回食物的y坐標(biāo)
 {
 return m_y;
 }
};

//蛇類
class Snake
{
private:
 //蛇坐標(biāo)結(jié)構(gòu)
 struct Snakecoor
 {
 int x;
 int y;
 };
 //蛇容器
 vector<Snakecoor> snakecoor;


 //判斷和改變方向函數(shù)
 void degdir(Snakecoor& nexthead) //參數(shù):新蛇頭結(jié)構(gòu)變量、蛇坐標(biāo)容器
 {
 static char key = 'd'; //靜態(tài)變量防止改變移動(dòng)方向后重新改回來

 if (_kbhit()) //改變蛇前進(jìn)的方向
 {
 char temp = _getch();

 switch (temp) //如果臨時(shí)變量的值為wasd中的一個(gè),則賦值給key
 {
 default:
 break;
 case 'w':
 case 'a':
 case 's':
 case 'd':
 //如果temp的方向和key的方向不相反則賦值
 if ((key == 'w' && temp != 's') || (key == 's' && temp != 'w') || \
 (key == 'a' && temp != 'd') || (key == 'd' && temp != 'a'))
 key = temp;
 }
 }


 switch (key) //根據(jù)key的值確定蛇的移動(dòng)方向
 {
 case 'd':
 nexthead.x = snakecoor.front().x + 2; //新的蛇頭的頭部等于容器內(nèi)第一個(gè)數(shù)據(jù)(舊蛇頭)x坐標(biāo)+2
 nexthead.y = snakecoor.front().y;
 break;
 case 'a':
 nexthead.x = snakecoor.front().x - 2;
 nexthead.y = snakecoor.front().y;
 break;
 case 'w':
 nexthead.x = snakecoor.front().x;
 nexthead.y = snakecoor.front().y - 1;
 break;
 case 's':
 nexthead.x = snakecoor.front().x;
 nexthead.y = snakecoor.front().y + 1;
 }

 }

 //游戲結(jié)束時(shí)需要做的事情
 void finmatt(const int score)
 {
 system("cls");
 gotoxy(40, 14);
 cout << "游戲結(jié)束";
 gotoxy(40, 16);
 cout << "得分:" << score;
 gotoxy(0, 26);
 exit(0);
 }

 //游戲結(jié)束的情況
 void finishgame(const int score)
 {
 //撞墻情況
 if (snakecoor[0].x >= 88 || snakecoor[0].x < 0 || snakecoor[0].y >= 28 || snakecoor[0].y < 0)
 finmatt(score);

 //撞到自己情況
 for (int i = 1; i < snakecoor.size(); i++)
 if (snakecoor[0].x == snakecoor[i].x && snakecoor[0].y == snakecoor[i].y)
 finmatt(score);
 }
public:
 //構(gòu)造初始化蛇的位置
 Snake()
 {
 Snakecoor temp; //臨時(shí)結(jié)構(gòu)變量用于創(chuàng)建蛇

 for (int i = 5; i >= 0; i--) //反向創(chuàng)建初始蛇身,初始蛇頭朝東
 {
 temp.x = 16 + (i << 1); //偶數(shù)
 temp.y = 8;
 snakecoor.push_back(temp);
 }

 }

 //蛇運(yùn)動(dòng)主要函數(shù)
 void move(Food& food, int& score)
 {
 Snakecoor nexthead; //新蛇頭變量

 degdir(nexthead); //判斷和改變蛇前進(jìn)的方向

 snakecoor.insert(snakecoor.begin(), nexthead); //將新的蛇頭插入容器頭部

 gotoxy(0, 0);
 cout << "得分:" << score; //每次移動(dòng)都在左上角刷新得分

 finishgame(score); //判斷游戲結(jié)束函數(shù)

 if (snakecoor[0].x == food.getFoodm_x() && snakecoor[0].y == food.getFoodm_y()) //蛇頭與食物重合
 {
 gotoxy(snakecoor[0].x, snakecoor[0].y); //吃到食物時(shí)因?yàn)橹苯臃祷卮舜我苿?dòng)沒有輸出蛇身,會少輸出一次蛇
 cout << "●"; //所以在這里補(bǔ)上蛇移動(dòng)時(shí)需要輸出的字符
 gotoxy(snakecoor[1].x, snakecoor[1].y);
 cout << "■";

 score++; //吃到食物得分+1

 food.randfood(); //如果蛇頭坐標(biāo)和食物坐標(biāo)重合則重新產(chǎn)生一個(gè)食物
 return; //直接結(jié)束本次移動(dòng)
 }

 for (int i = 0; i < snakecoor.size(); i++) //遍歷容器,判斷食物與蛇身是否重合并輸出整條蛇
 {
 gotoxy(snakecoor[i].x, snakecoor[i].y);

 if (!i) //頭部輸出圓形否則輸出方塊
 cout << "●";
 else
 cout << "■";

 //如果食物刷新到了蛇身上,則重新產(chǎn)生一個(gè)食物
 if (snakecoor[i].x == food.getFoodm_x() && snakecoor[i].y == food.getFoodm_y())
 food.randfood();
 }

 gotoxy(snakecoor.back().x, snakecoor.back().y); //在容器尾部的地方輸出空格
 cout << " ";
 snakecoor.pop_back(); //刪除容器中最后一個(gè)數(shù)據(jù)
 }

};


void HideCursor() //隱藏光標(biāo)
{
 CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void gotoxy(int x, int y) //光標(biāo)定位
{
 COORD pos = { x,y };
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

//主函數(shù)
int main()
{
 system("mode con cols=88 lines=28"); //設(shè)置控制臺窗口大小
 system("title C++ 貪吃蛇");  //設(shè)置標(biāo)題
 HideCursor();  //光標(biāo)隱藏

 int score = 0; //得分變量

 Food food; //食物對象
 food.randfood(); //開局隨機(jī)產(chǎn)生一個(gè)食物

 Snake snake; //蛇對象


 while (true)
 {
 snake.move(food, score);//蛇移動(dòng)

 Sleep(150); //游戲速度
 }

 return 0;
}

不足之處:

因?yàn)槌鯇W(xué)C++,所以程序中肯定還有一些不規(guī)范或不合理的地方。

關(guān)于C++小游戲的更多精彩內(nèi)容請點(diǎn)擊專題: 《C++經(jīng)典小游戲》 學(xué)習(xí)了解

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

相關(guān)文章

  • C++中的Lambda表達(dá)式詳解

    C++中的Lambda表達(dá)式詳解

    這篇文章主要介紹了C++中的Lambda表達(dá)式詳解,本文講解了基本語法、Lambda的使用等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C++內(nèi)存模型和名稱空間詳解

    C++內(nèi)存模型和名稱空間詳解

    這篇文章主要給大家介紹了關(guān)于C/C++中的內(nèi)存模型和名稱空間詳解,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c/c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧
    2021-09-09
  • 淺談int8_t int64_t size_t ssize_t的相關(guān)問題(詳解)

    淺談int8_t int64_t size_t ssize_t的相關(guān)問題(詳解)

    下面小編就為大家?guī)硪黄獪\談int8_t int64_t size_t ssize_t的相關(guān)問題(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 淺談c++構(gòu)造函數(shù)問題,初始化和賦值問題

    淺談c++構(gòu)造函數(shù)問題,初始化和賦值問題

    下面小編就為大家?guī)硪黄獪\談c++構(gòu)造函數(shù)問題,初始化和賦值問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++二維數(shù)組螺旋加密信息

    C++二維數(shù)組螺旋加密信息

    大家好,本篇文章主要講的是C++二維數(shù)組螺旋加密信息,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++ Boost.Signals2信號/槽概念

    C++ Boost.Signals2信號/槽概念

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-12-12
  • C++11 線程同步接口std::condition_variable和std::future的簡單使用示例詳解

    C++11 線程同步接口std::condition_variable和std::future的簡單使用示例詳

    本文介紹了std::condition_variable和std::future在C++中的應(yīng)用,用于線程間的同步和異步執(zhí)行,通過示例代碼,展示了如何使用std::condition_variable的wait和notify接口進(jìn)行線程間同步
    2024-09-09
  • 詳解C++中shared_ptr的使用教程

    詳解C++中shared_ptr的使用教程

    shared_ptr能夠記錄對象被引用的次數(shù),主要被用來管理動(dòng)態(tài)創(chuàng)建的對象的銷毀,這里我們就來詳解C++中shared_ptr的使用教程,需要的朋友可以參考下
    2016-05-05
  • C++11線程、互斥量以及條件變量示例詳解

    C++11線程、互斥量以及條件變量示例詳解

    這篇文章主要介紹了C++11線程、互斥量以及條件變量,C++11增加了線程以及線程相關(guān)的類,很方便地支持了并發(fā)編程,使得編寫多線程程序的可移植性得到了很大的提高,本文通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2023-03-03
  • C語言字符串原地壓縮實(shí)現(xiàn)方法

    C語言字符串原地壓縮實(shí)現(xiàn)方法

    這篇文章主要介紹了C語言字符串原地壓縮實(shí)現(xiàn)方法,包含了字符串的遍歷與轉(zhuǎn)換等操作,是很實(shí)用的操作技巧,需要的朋友可以參考下
    2014-09-09

最新評論

丰台区| 龙川县| 额济纳旗| 柞水县| 太和县| 瑞丽市| 吉木萨尔县| 营口市| 寻乌县| 监利县| 邮箱| 梁河县| 邵东县| 哈尔滨市| 丽水市| 平和县| 响水县| 松阳县| 东港市| 阿图什市| 晋州市| 阜阳市| 呼和浩特市| 阜宁县| 贡觉县| 永泰县| 南陵县| 石渠县| 壶关县| 台前县| 榆树市| 贡嘎县| 井陉县| 彭州市| 余江县| 资阳市| 新密市| 边坝县| 沽源县| 福泉市| 海兴县|