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)了指哪畫哪的目標(biāo)之后,就可以開(kāi)始游戲內(nèi)容制作了。首先便是圈地,即畫地圖,一個(gè)簡(jiǎn)簡(jiǎn)單單的循環(huán)就能安排的明明白白。
3.偉大的圈地運(yùn)動(dòng)就結(jié)束了,接下來(lái)我們就實(shí)現(xiàn)畫一條蛇,我們選擇使用deque雙端隊(duì)列,這個(gè)操作更為方便,畫好蛇之后就給畫一個(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)然不能滿足我們?nèi)找嬖鲩L(zhǎng)的精神需求,那就加點(diǎn)料唄,下面的代碼中只加入了計(jì)分、等級(jí),其他的都沒(méi)有加,為的是新手能快速上手,你也可以再往里邊加吃到食物時(shí)“滴~”響一聲等元素,這都不是問(wèn)題。
話不多說(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)行類 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() //畫邊框 { 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() //畫蛇 { 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)一次(即一格),就把上一次畫出來(lái)的蛇尾擦掉 } void draw_Food() //畫食物 { 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)的位置畫空,否則光標(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)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談使用C++多級(jí)指針存儲(chǔ)海量qq號(hào)和密碼
這篇文章主要介紹了淺談使用C++多級(jí)指針存儲(chǔ)海量qq號(hào)和密碼,分享了相關(guān)實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)易計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11C語(yǔ)言動(dòng)態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解
在C語(yǔ)言中,動(dòng)態(tài)內(nèi)存函數(shù)是塊重要的知識(shí)點(diǎn),以往,我們開(kāi)辟空間都是固定得,數(shù)組編譯結(jié)束后就不能繼續(xù)給它開(kāi)辟空間了,開(kāi)辟的空間滿了,就不能在開(kāi)辟空間了,學(xué)習(xí)本文章,我們就可以解決這個(gè)問(wèn)題,向內(nèi)存申請(qǐng)空間,感興趣的小伙伴跟著小編一起來(lái)看看吧2023-08-08判斷指定的進(jìn)程或程序是否存在方法小結(jié)(vc等)
VC判斷進(jìn)程是否存在?比如我想知道記事本是否運(yùn)行,要用到哪些函數(shù)等實(shí)例,需要的朋友可以參考下2013-01-01C++實(shí)現(xiàn)LeetCode(42.收集雨水)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(42.收集雨水),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07