大家可以改进哦
/*
Name: Retro Snake
Copyright: (c) 2021 Eric Huang. All rights reserved.
Author: Eric Huang
Date: 2021/08/05
Description: A C++ Retro Snake Game.
*/
#include<bits/stdc++.h>
#include"mycolor.h"
#include<conio.h>
#include<windows.h>
using namespace std;
bool flag = true;
int SCORE = 0;
int LIFE = 5;
int foodx = rand() % 48;
int foody = rand() % 20;
char pos[20][48];
enum dir {UP, DOWN, LEFT, RIGHT};
vector<int> xs = {0};
vector<int> ys = {0};
vector<dir> ds = {RIGHT};
void settings()
{
srand(time(0));
for (int i = 0; i < 20; i++)
for (int j = 0; j < 48; j++)
pos[i][j] = ' ';
}
void play()
{
for (int i = 0; i < ys.size(); i++)
pos[ys[i]][xs[i]] = '*';
pos[foody][foodx] = 'o';
printf(" ");
char s[40];
if (LIFE > 0) strcpy(s, "HAPPY RETRO SNAKE");
else
{
strcpy(s, "GAME ------- OVER\n 按下任意键退出");
flag = false;
}
for (int i = 0; s[i] != '\0'; i++)
{
switch (rand() % 7)
{
case 0: color(FRED); break;
case 1: color(FYELLOW); break;
case 2: color(FGREEN); break;
case 3: color(FCYAN); break;
case 4: color(FBLUE); break;
case 5: color(FPURPLE); break;
case 6: color(FWHITE); break;
}
printf("%c", s[i]);
reset();
}
printf("\n");
printf("SCORE: %d\n", SCORE);
printf("LIFE: %d\n", LIFE);
color(BWHITE);
printf("--------------------------------------------------\n");
reset();
for (int i = 0; i < 20; i++)
{
color(BWHITE);
printf("|");
reset();
for (int j = 0; j < 48; j++)
{
if (pos[i][j] == 'o') color(BRED);
if (pos[i][j] == '*') color(BGREEN);
printf(" ");
//printf("%c", pos[i][j]);
if (pos[i][j] == 'o') reset();
if (pos[i][j] == '*') reset();
pos[i][j] = ' ';
}
color(BWHITE);
printf("|\n");
reset();
}
color(BWHITE);
printf("--------------------------------------------------\n");
reset();
if (xs[xs.size() - 1] == foodx && ys[ys.size() - 1] == foody)
{
SCORE++;
while (foodx == xs[xs.size() - 1] && foody == ys[ys.size() - 1])
{
foodx = rand() % 48;
foody = rand() % 20;
}
switch (ds[ds.size() - 1])
{
case UP: xs.push_back(xs[xs.size() - 1]); ys.push_back(ys[ys.size() - 1] - 1); ds.push_back(UP); break;
case DOWN: xs.push_back(xs[xs.size() - 1]); ys.push_back(ys[ys.size() - 1] + 1); ds.push_back(DOWN); break;
case LEFT: xs.push_back(xs[xs.size() - 1] - 1); ys.push_back(ys[ys.size() - 1]); ds.push_back(LEFT); break;
case RIGHT: xs.push_back(xs[xs.size() - 1] + 1); ys.push_back(ys[ys.size() - 1]); ds.push_back(RIGHT); break;
}
}
int tx;
int ty;
dir td;
switch (ds[ds.size() - 1])
{
case UP: tx = xs[xs.size() - 1]; ty = ys[ys.size() - 1] - 1; break;
case DOWN: tx = xs[xs.size() - 1]; ty = ys[ys.size() - 1] + 1; break;
case LEFT: tx = xs[xs.size() - 1] - 1; ty = ys[ys.size() - 1]; break;
case RIGHT: tx = xs[xs.size() - 1] + 1; ty = ys[ys.size() - 1]; break;
}
td = ds[ds.size() - 1];
if (tx < 0) {tx = 0; LIFE--; td = RIGHT; }
if (tx > 47) {tx = 47; LIFE--; td = LEFT; }
if (ty < 0) {ty = 0; LIFE--; td = DOWN; }
if (ty > 19) {ty = 19; LIFE--; td = UP; }
xs.erase(xs.begin());
ys.erase(ys.begin());
ds.erase(ds.begin());
xs.push_back(tx);
ys.push_back(ty);
ds.push_back(td);
if (_kbhit())
{
char ch = getch();
switch (ch)
{
case 'w': ds[ds.size() - 1] = UP; break;
case 's': ds[ds.size() - 1] = DOWN; break;
case 'a': ds[ds.size() - 1] = LEFT; break;
case 'd': ds[ds.size() - 1] = RIGHT; break;
}
}
Sleep(100);
if (!flag)
{
getch();
return;
}
system("cls");
play();
}
int main()
{
SetConsoleTitle("快乐贪吃蛇");
printf( "快乐贪吃蛇\n\n"
"绿色是蛇,红色是食物。\n"
"按w,s,a,d表示上,下,左,右。\n"
"尽可能吃到食物,吃到食物后,蛇会增加一节身体,得分会加1。\n"
"碰到边缘生命值会减1,蛇会自动向相反方向移动。\n"
"生命值为0时GAMEOVER。\n\n"
"请按任意键开始游戏. . .");
getch();
system("cls");
settings();
play();
return 0;
}