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

C++通過(guò)類(lèi)實(shí)現(xiàn)控制臺(tái)貪吃蛇

 更新時(shí)間:2020年04月28日 09:23:23   作者:Ones''''  
這篇文章主要為大家詳細(xì)介紹了C++通過(guò)類(lèi)實(shí)現(xiàn)控制臺(tái)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

初學(xué)c++,算剛學(xué)完類(lèi)吧,寫(xiě)個(gè)貪吃蛇來(lái)玩玩。

現(xiàn)是頭文件

#pragma once
#ifndef SNACK_H
#define SNACK_H
 
#define Frame_X 5//邊框起點(diǎn)橫坐標(biāo)
#define Frame_Y 5//邊框起點(diǎn)縱坐標(biāo)
#define Frame_width 50//邊框長(zhǎng)度
#define Frame_height 25//邊框高度
 
struct point//蛇個(gè)點(diǎn)坐標(biāo)
{
 int x[100]; //蛇的橫坐標(biāo),其中x[0]表示蛇尾的橫坐標(biāo),x[N-1]表示蛇頭的橫坐標(biāo)
 int y[100]; //蛇的豎坐標(biāo),其中y[0]表示蛇尾的豎坐標(biāo),y[N-1]表示蛇頭的豎坐標(biāo)
};
struct Food//食物坐標(biāo)
{
 int x;
 int y;
};
 
 
class snack
{
public:
 snack();
 void init_snack(point *snake);//初始化蛇
 void gotoxy(int x, int y);//光標(biāo)移動(dòng)
 void begin_view();//封面
 void frame();//打印邊界與游戲說(shuō)明
 void menu(point *snake,Food *food);//打?qū)崟r(shí)印信息
 void print_snack(point *snake);//打印蛇
 void move(point *snake);//移動(dòng)蛇
 void get_food(point *snake,Food *food);//隨機(jī)產(chǎn)生食物
 void eating(point *snake,Food *food);//吃食物
 bool die(point *snake);//判斷蛇是否死亡
 
 void start_game();//主函數(shù)
 void end_game();//結(jié)束界面
 
private:
 int length;//蛇長(zhǎng)度
 int score;//得分
 int account;//已吃的食物數(shù)量
 int difficulty;//難度 
 int stage;//關(guān)卡
 int life;//生命值
 
};
 
#endif

主要的cpp

#include"stdafx.h"
#include"snack.h"
#include<Windows.h>
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<conio.h>
 
using std::cout;
using std::cin;
using std::endl;
 
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
/*************獲取按鍵************/
#define key_number 11//虛擬鍵數(shù)
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 
enum keyboard { up_, down_, left_, right_ ,w_,s_,a_,d_,y_,n_,esc_,other_};
int keyboard_list[] = {VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT,'W','S','A','D','Y','N',VK_ESCAPE};
keyboard keyboardarray[] = { up_,down_,left_,right_,w_,s_,a_,d_,y_,n_,esc_,other_ };
keyboard get_the_key()
{
 for (int i = 0; i < key_number; i++)
 {
 if (KEYDOWN(keyboard_list[i]))
 return keyboardarray[i];
 }
 return keyboardarray[key_number];
}
 
 
int a[2];//記錄蛇尾坐標(biāo)
 
snack::snack()
{
 length = 3;
 score = 0;
 account = 0;
 difficulty = 1;
 stage = 1;
 life = 3;
}
 
void snack::init_snack(point *snake)
{
 snake->x[0] = Frame_X + 2;  //初始化蛇的橫坐標(biāo)
 snake->y[0] = Frame_Y + Frame_height / 2; //初始化蛇的豎坐標(biāo)
 for (int i = 1; i < length; i++)/* 依次得到蛇身、蛇頭的坐標(biāo) */
 {
 snake->x[i] = snake->x[i - 1] + 2;
 snake->y[i] = snake->y[i - 1];
 }
}
 
void snack::gotoxy(int x,int y)
{ 
 COORD pos;
 pos.X = x;
 pos.Y = y;
 SetConsoleCursorPosition(hOut, pos);
}
 
void snack::begin_view()
{
 SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
 cout << "\n\n\n\n";
 cout << "   ****  *  *  *   ****  *  *\n";
 cout << "  *   * **  *  *  *  * * *\n";
 cout << "  *   * * *  ***  *   * *\n";
 cout << "   ***  * * *  * *  *   **\n";
 cout << "      *  * * *  * *  *   * *\n";
 cout << "       * * * *  *****  *   * *\n";
 cout << "  *    * *  ** *  *  *   * *  *\n";
 cout << "   ****  *  * **  **   ****  *  *\n";
 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
 cout << "\n\n\n\n";
 cout << "    /^\\/^\\ "<<endl;
 cout << "    _|__| O|"<<endl;
 cout << " \\/  /~  \_/ \\ "<<endl;
 cout << "  \\____|__________/ \\ "<<endl;
 cout << "   \\_______  \\ "<<endl;
 cout << "     `\\  \\     \\ "<<endl;
 cout << "      |  |     \\ "<<endl;
 cout << "      /  /      \\ "<<endl;
 cout << "     /  /      \\\\ "<<endl;
 cout << "     /  /       \\ \\ "<<endl;
 cout << "     /  /       \\ \\ "<<endl;
 cout << "    /  /    _----_   \\ \\ "<<endl;
 cout << "    /  /   _-~  ~-_   | |"<<endl;
 cout << "    (  (  _-~ _--_ ~-_  _/ |"<<endl;
 cout << "    \\  ~-____-~ _-~ ~-_ ~-_-~ /"<<endl;
 cout << "    ~-_   _-~   ~-_  _-~"<<endl;
 cout << "     ~--______-~    ~-___-~"<<endl;
 
}
 
void snack::frame()
{
 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
 //打印上邊界
 gotoxy(Frame_X, Frame_Y);
 cout << "┏";
 for (int i = 0; i < Frame_width/2-2; i++)
 cout << "━";
 cout << "┓";
 //打印下邊界
 gotoxy(Frame_X, Frame_Y + Frame_height);
 cout << "┗";
 for (int i = 0; i < Frame_width/2-2; i++)
 cout << "━";
 cout << "┛"; 
 //打印左右邊界
 for (int i = 0; i < Frame_height-1; i++)
 {
 gotoxy(Frame_X, Frame_Y + 1 + i);
 cout << "┃";
 gotoxy(Frame_X+Frame_width-2, Frame_Y + 1 + i);
 cout << "┃";
 }
 SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 1);
 cout << "按鍵說(shuō)明:方向鍵或WSAD鍵控制";
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 3);
 cout << " 長(zhǎng)按加速";
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 5);
 cout << " 按ESC退出游戲";
 
}
 
 
void snack::menu(point *snake,Food *food)
{
 gotoxy(Frame_X + 3, Frame_Y - 2);
 cout << "分?jǐn)?shù):" << score;
 gotoxy(Frame_X + Frame_width -11, Frame_Y - 2);
 cout << "生命值:" << life;
 gotoxy(Frame_X + Frame_width - 30, Frame_Y - 2);
 cout << "等級(jí):" << stage;
 /*gotoxy(Frame_X + Frame_width + 3, Frame_Y + 5);
 cout << "橫坐標(biāo):" << food->x;
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 7);
 cout << "縱坐標(biāo):" << food->y;
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 9);
 cout << "X: " << snake->x[length - 1];
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 11);
 cout << "Y: " << snake->y[length - 1];*/
 
 
}
 
 
void snack::print_snack(point *snake)
{
 for (int i = 0; i<length; i++)
 {
 gotoxy(snake->x[i], snake->y[i]);
 if (i == 0)
 cout << "○";//打印蛇尾
 else if (i == length - 1)
 cout << "¤";//打印蛇頭
 else
 cout << "◎";//打印蛇身
 }
}
 
 
void snack::move(point *snake)
{
 gotoxy(snake->x[0], snake->y[0]);
 cout << " ";//清除蛇尾
 for (int i = 1; i < length ; i++)/* 后一節(jié)的坐標(biāo)依次取代前一節(jié)的坐標(biāo) */
 {
 snake->x[i - 1] = snake->x[i];
 snake->y[i - 1] = snake->y[i];
 }
}
 
 
void snack::get_food(point *snake,Food *food)
{
 int i, j; 
 srand(static_cast<unsigned int>(time(0)));
 SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
 
 /* 產(chǎn)生食物的條件:1.在游戲窗口內(nèi) 2.不在蛇的身上 */
 while (1)
 {
 j = 0;
 food->x = Frame_X + 2 * (rand() % (Frame_width / 2 - 2)) + 2;//得到食物的橫坐標(biāo)
 food->y = Frame_Y + rand() % (Frame_height - 2) + 1;//得到食物的縱坐標(biāo) 
 for (i = 0; i<length; i++)
 {/* 判斷食物是否在蛇的身上,如果在蛇身上,則重新產(chǎn)生;否則,打印蛇身 */
 if (food->x == snake->x[i] && food->y == snake->y[i])
 {
 j = 1;
 break;
 }
 }
 if (i == length)
 {
 gotoxy(food->x, food->y);
 cout << "⊙";
 break;
 }
 else
 continue;
 }
 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);//設(shè)置蛇顏色
}
 
 
void snack::eating(point *snake,Food *food)
{
 if (snake->x[length - 1] == food->x&&snake->y[length - 1] == food->y)
 {
 length++;
 for (int i = length - 1; i > 0; i--)/* 蛇后節(jié)坐標(biāo)依次賦值給蛇前一節(jié)的坐標(biāo),依次得到蛇身及蛇頭的坐標(biāo) */
 {
 snake->x[i] = snake->x[i - 1];
 snake->y[i] = snake->y[i - 1];
 }
 snake->x[0] = a[0];//得到蛇尾移動(dòng)前的橫坐標(biāo) 
 snake->y[0] = a[1];//得到蛇尾移動(dòng)前的縱坐標(biāo) 
 get_food(snake, food);
 account++; 
 score+=difficulty*10;//分?jǐn)?shù)增加
 if (account % 5 == 0)
 {
 difficulty++;
 stage++;
 }
 }
}
 
bool snack::die(point *snake)
{
 for (int i = 0; i < length-1; i++)
 {
 if (snake->x[length - 1] == snake->x[i] && snake->y[length - 1] == snake->y[i])
 return true;
 }
 if (snake->x[length - 1] == Frame_X || snake->y[length - 1] == Frame_Y || snake->x[length - 1] == Frame_X + Frame_width - 2 || snake->y[length - 1] == Frame_Y + Frame_height - 1)
 return true;
 return false;
}
 
 
void snack::start_game()
{
 //光標(biāo)隱藏
 CONSOLE_CURSOR_INFO Cursorlnfo;
 GetConsoleCursorInfo(hOut, &Cursorlnfo);//獲取控制臺(tái)光標(biāo)信息
 Cursorlnfo.bVisible = false;//隱藏控制臺(tái)光標(biāo)信息
 SetConsoleCursorInfo(hOut, &Cursorlnfo);//設(shè)置控制臺(tái)光標(biāo)信息
 system("mode con cols=100 lines=40");//設(shè)置窗口大小
 
 point s, *snake = &s; //定義蛇的結(jié)構(gòu)體指針并指向蛇的結(jié)構(gòu)體
 Food f, *food = &f; //定義食物的結(jié)構(gòu)體指針并指向食物的結(jié)構(gòu)體
 keyboard key_state, Key;
 keyboard temp = right_;
 int j = 0;
 char ch=77;
 
 begin_view();
 gotoxy(12, 34);
 cout << "按任意鍵繼續(xù)......";
 while(!_kbhit())
 { }
 system("cls");
 frame();
 init_snack(snake);
 get_food(snake,food);
 
 while (1)
 {
 j = 0;
 menu(snake,food);
 a[0] = snake->x[0];
 a[1] = snake->y[0];
 key_state = get_the_key();
 if (key_state == temp)//長(zhǎng)按加速
 {
 j = 1;
 Sleep(20);
 }
 if(key_state!=other_)
 temp = key_state;
 switch (temp)
 {
 case up_:
 case w_:
 move(snake);
 snake->y[length - 1] -= 1;
 break;
 case down_:
 case s_:
 move(snake);
 snake->y[length - 1] += 1;
 break;
 case left_:
 case a_:
 move(snake);
 snake->x[length - 1] -= 2;
 break;
 case right_:
 case d_:
 move(snake);
 snake->x[length - 1] += 2;
 break;
 case esc_:
 end_game();
 break;
 }
 
 
 eating(snake, food);
 print_snack(snake);
 if (die(snake))
 {
 life--;
 if (life == 0)
 end_game();
 else
 {
 length = 3;
 start_game();
 }
 
 }
 if (j == 0)
 {
 if (difficulty < 10)
 Sleep(200 - difficulty * 20);
 else
 Sleep(10);
 }
 else
 Sleep(10);
 }
}
 
void snack::end_game()
{
 system("CLS");
 system("color 0D");
 cout << "\n   ***  *   **  **  *********";
 cout << "\n  *  *  *   **  **  *  ";
 cout << "\n *     ***   * * * *  *  ";
 cout << "\n *     * *  * * * *  ******** ";
 cout << "\n *  ***  * *  *  *  * *  ";
 cout << "\n *   *  *****  *  *  * *  ";
 cout << "\n  *  * *  *  *  *  * *  ";
 cout << "\n   **  **  ** *  *  * *********";
 cout << "\n\n\n\n\n\n";
 cout << "\n  ***  **  ** ********** ******  ";
 cout << "\n *   *   *   *   *      *  * ";
 cout << "\n *  *  *  *  *    *  * ";
 cout << "\n *  *  * *  ********  ******  ";
 cout << "\n *  *  * *  *    * *  ";
 cout << "\n *  *  * *  *    *  *  ";
 cout << "\n *  *  ***  *    *  ** ";
 cout << "\n  ***   *  ********** *  ** ";
 
 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY);
 gotoxy(Frame_X + Frame_width / 2, 27);
 cout << "總得分:" << score;
 Sleep(200);
 exit(0);
 
}

然后是main函數(shù)

#include "stdafx.h"
#include"snack.h"
 
int main()
{ 
 snack a;
 a.start_game();
 return 0;
}

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

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

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(144.二叉樹(shù)的先序遍歷)

    C++實(shí)現(xiàn)LeetCode(144.二叉樹(shù)的先序遍歷)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(144.二叉樹(shù)的先序遍歷),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ 大根堆排序?qū)W習(xí)筆記

    C++ 大根堆排序?qū)W習(xí)筆記

    這篇文章主要為大家介紹了C++ 大根堆排序的學(xué)習(xí)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • C++實(shí)踐數(shù)組作數(shù)據(jù)成員的參考

    C++實(shí)踐數(shù)組作數(shù)據(jù)成員的參考

    今天小編就為大家分享一篇關(guān)于C++實(shí)踐數(shù)組作數(shù)據(jù)成員的參考,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • C/C++ 凸多邊形求對(duì)角線交點(diǎn)的示例代碼

    C/C++ 凸多邊形求對(duì)角線交點(diǎn)的示例代碼

    這篇文章主要介紹了C/C++ 凸多邊形求對(duì)角線交點(diǎn)的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 詳解C++?智能指針的刪除器

    詳解C++?智能指針的刪除器

    標(biāo)準(zhǔn)庫(kù)為智能指針提供了兩個(gè)默認(rèn)版本的刪除器,可簡(jiǎn)化智能指針的代碼編寫(xiě),這篇文章主要介紹了C++智能指針的刪除器的相關(guān)知識(shí),需要的朋友可以參考下
    2025-05-05
  • c語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解(Stack&Queue)

    c語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解(Stack&Queue)

    這篇文章主要介紹了c語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解(Stack&Queue),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版

    C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++begin和end運(yùn)算符的返回迭代器的類(lèi)型如何判斷?

    C++begin和end運(yùn)算符的返回迭代器的類(lèi)型如何判斷?

    今天小編就為大家分享一篇關(guān)于C++begin和end運(yùn)算符的返回迭代器的類(lèi)型如何判斷?,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法

    C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法

    這篇文章主要為大家詳細(xì)介紹了C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解

    C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解

    這篇文章主要介紹了C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10

最新評(píng)論

东源县| 平昌县| 黄石市| 若尔盖县| 麟游县| 大荔县| 岑溪市| 梁山县| 贞丰县| 凌云县| 建瓯市| 东港市| 达日县| 岐山县| 许昌市| 武川县| 红河县| 万安县| 西乌| 梁平县| 惠安县| 吴忠市| 石门县| 海宁市| 临潭县| 湖北省| 彰化县| 新安县| 余庆县| 应用必备| 吉安县| 洱源县| 南皮县| 宁陵县| 色达县| 台中县| 洪泽县| 永福县| 保山市| 台湾省| 天镇县|