C++实现的控制台-贪吃蛇

时间:2023-03-10 02:40:43
C++实现的控制台-贪吃蛇

周六终于可以抽出一整段时间了

想了想就写个贪吃蛇吧    第一次写 差不多下了140行  也不算太多吧

以后ACM比赛是在做不来就自己打个贪吃蛇玩

ps:本来想写个项目的 但是为了方便你们阅读 就写在一个文件里面了

测试了下  无重大BUG     但是 功德圆满 没有测试

知识点:

1:刷新窗口 system("cls");

2: time.h 用来编写时钟系统;

3:SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);  重置光标位置,即你想在那里输出就把光标移到那个地方输出就可以了

开始还有一个思路就是 不用数组存地图 只用定位光标来  更新蛇  后面发现有点困难

4:其他的就是一些C++的基本语法了

感兴趣的可以拿下去玩玩

贴代码:

//基础知识clock_t clock(void)  返回从程序开始到现在为止的时间单位毫秒 CLOCKS_PER_SEC 转换为秒的单位 相当于1000.0
/* 打开exe 后输出普通游戏画面并在地图中间提示 按任意键开始游戏
*/
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<list>
#include<string>
using namespace std;
class retro_snake
{
private:
COORD zz;//缓存前进的点用;
list<COORD>snake;//保存蛇
string ma[]; //保存游戏画面
int direction; //保存现在蛇的前进方向
int grates;
int level; //游戏等级
int rate; //游戏速率
public:
retro_snake() //初始化游戏
{
level = ; rate = ; grates = ; direction = ;
for (int i = ; i<; i++)
{
if (i == || i == )
ma[i] = "###################################";//
else
ma[i] = "# #";
}
zz.X = ; zz.Y = ;
snake.push_front(zz);
}
void draw(void) const//绘画游戏界面
{
for (int i = ; i<; i++)
cout << ma[i] << endl;
cout << "得分:" << grates << "等级:" << level << endl;
cout << "w: 上 s:下 a:左 d:右 空格:暂停 " << endl;
}
void creat_food()//生成食物
{
int x, y;
do
{
x = rand() % + ;
y = rand() % + ;
} while (ma[x][y] != ' ');
ma[x][y] = '$';
}
void clock_system(void)//时钟系统 控制游戏进行
{
double Start = clock();
char ch = 'w'; bool flag;//初始化前进方向
creat_food();
while ()
{
while ((clock() - Start)<rate && !(flag=_kbhit()));//一秒后自动读取 或者直接有键入
Start = clock();
if (flag)
{
ch = _getch();
int direction_;
if (ch == ' ')//暂停的功能实现
{
while (!_kbhit());
ch = _getch();
Start = clock();
}
else if (ch == 'r')
{ }
switch (ch)
{
case 'w':direction_ = ; break;
case 'a':direction_ = ; break;
case 's':direction_ = ; break;
case 'd':direction_ = ; break;
default:direction_ = ;
}
if (direction_ + direction != &&direction_!=) direction = direction_;//如果输入的方向不和现在前进的方向冲突 就改变
}
switch (direction)
{
case :zz.X = snake.front().X; zz.Y = snake.front().Y - ; break;
case :zz.X = snake.front().X + ; zz.Y = snake.front().Y; break;
case :zz.X = snake.front().X - ; zz.Y = snake.front().Y; break;
case :zz.X = snake.front().X; zz.Y = snake.front().Y + ; break;
}
if (ma[zz.Y][zz.X] == '#' || ma[zz.Y][zz.X] == '.')
{
COORD coord; coord.X = ; coord.Y = ;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
cout << "游戏结束";
Sleep();
break;
}
else if (ma[zz.Y][zz.X] == '$')
{
grates++; level = grates / ;
level = min(, level);
rate = - level * ;
ma[snake.front().Y][snake.front().X] = '.';
snake.push_front(zz);
ma[snake.front().Y][snake.front().X] = '@';
if (snake.size() == )
{
COORD coord; coord.X = ; coord.Y = ;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
cout << "功德圆满";
Sleep();
break;
}
creat_food();
}
else
{
ma[snake.front().Y][snake.front().X] = '.';
snake.push_front(zz);
ma[snake.front().Y][snake.front().X] = '@';
ma[snake.back().Y][snake.back().X] = ' ';
snake.pop_back();
}
system("cls");
draw();
}
}
void start(void)
{
draw();
COORD coord; coord.X = ; coord.Y = ;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
cout << "按任意键开始";
while (!_kbhit());
char ch =_getch();
system("cls");
draw();
clock_system();
}
};
int main()
{
retro_snake Game;
Game.start();
return ;
}