C++通過類實(shí)現(xiàn)控制臺(tái)貪吃蛇
本文實(shí)例為大家分享了C++實(shí)現(xiàn)控制臺(tái)貪吃蛇的具體代碼,供大家參考,具體內(nèi)容如下
初學(xué)c++,算剛學(xué)完類吧,寫個(gè)貪吃蛇來玩玩。
現(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();//打印邊界與游戲說明
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 << "按鍵說明:方向鍵或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)擊專題: 《C++經(jīng)典小游戲》 學(xué)習(xí)了解
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解
- 利用C/C++實(shí)現(xiàn)貪吃蛇游戲
- C++入門指南之貪吃蛇游戲的實(shí)現(xiàn)
- C++實(shí)現(xiàn)簡(jiǎn)易貪吃蛇游戲
- C++實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲
- C++實(shí)現(xiàn)貪吃蛇游戲
- C++代碼實(shí)現(xiàn)貪吃蛇小游戲
- 基于easyx的C++實(shí)現(xiàn)貪吃蛇
- C++控制臺(tái)循環(huán)鏈表實(shí)現(xiàn)貪吃蛇
- C++控制臺(tái)實(shí)現(xiàn)貪吃蛇游戲
- C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇
- c++實(shí)現(xiàn)超簡(jiǎn)單的貪吃蛇游戲?qū)嵗榻B
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu)之帶頭結(jié)點(diǎn)的單鏈表
單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。鏈表中的數(shù)據(jù)是以結(jié)點(diǎn)來表示的,每個(gè)結(jié)點(diǎn)的構(gòu)成:數(shù)據(jù)域(數(shù)據(jù)元素的映象)?+?指針域(指示后繼元素存儲(chǔ)位置),元素就是存儲(chǔ)數(shù)據(jù)的存儲(chǔ)單元,指針就是連接每個(gè)結(jié)點(diǎn)的地址數(shù)據(jù)2023-07-07
C++類靜態(tài)成員與類靜態(tài)成員函數(shù)詳解
靜態(tài)成員不可在類體內(nèi)進(jìn)行賦值,因?yàn)樗潜凰性擃惖膶?duì)象所共享的。你在一個(gè)對(duì)象里給它賦值,其他對(duì)象里的該成員也會(huì)發(fā)生變化。為了避免混亂,所以不可在類體內(nèi)進(jìn)行賦值2013-09-09
C++中的動(dòng)態(tài)分派在HotSpot?VM中的應(yīng)用小結(jié)
多態(tài)是面向?qū)ο缶幊陶Z言的重要特性,它允許基類的指針或引用指向派生類的對(duì)象,而在具體訪問時(shí)實(shí)現(xiàn)方法的動(dòng)態(tài)綁定,這篇文章主要介紹了C++的動(dòng)態(tài)分派在HotSpot?VM中的重要應(yīng)用,需要的朋友可以參考下2023-09-09
C 語言基礎(chǔ)實(shí)現(xiàn)青蛙跳臺(tái)階和漢諾塔問題
這篇文章我們九里講講C 語言基礎(chǔ)實(shí)現(xiàn)青蛙跳臺(tái)階和漢諾塔問題,感興趣的小伙伴可以參考下面文章的具體內(nèi)容2021-09-09
C++利用容器查找重復(fù)列功能實(shí)現(xiàn)
本文將詳細(xì)介紹c++容器簡(jiǎn)介,c++容器的比較 與操作實(shí)例,需要了解更多的朋友可以參考下2012-11-11
C++ 如何判斷四個(gè)點(diǎn)是否構(gòu)成正方形
這篇文章主要介紹了C++ 如何判斷四個(gè)點(diǎn)是否構(gòu)成正方形的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03

