1.实现要素
- 定义蛇对象、食物对象
- 初始化蛇、初始化食物
- 控制流程:
1) 蛇头和墙壁的碰撞
2) 蛇头和蛇身体的碰撞
3) 蛇头和食物的碰撞
1> 蛇身增长
2> 食物消失 – 新食物产生
3> 分数累加
4> 移动速度增大
4) 蛇的移动
自动移动
手动控制移动: ASWD — 左下上右
5)显示分数
排行榜 - 图形界面。
2. 实现
2.1 snake.h
#include "snake.h"
void initSnake(void)
{
snake.size = 2;
snake.body[0].X = WIDTH / 2;
snake.body[0].Y = HIGH / 2;
snake.body[1].X = WIDTH / 2 - 1;
snake.body[1].Y = HIGH / 2;
return;
}
void initFood(void)
{
food.X = rand() % WIDTH;
food.Y = rand() % HIGH;
return;
}
void initUI(void)
{
COORD coord={0};
for (size_t i = 0; i < snake.size; i++)
{
coord.X = snake.body[i].X;
coord.Y = snake.body[i].Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
if (i)
putchar('*');
else
putchar('@');
}
coord.X = lastX;
coord.Y = lastY;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar(' ');
coord.X = food.X;
coord.Y = food.Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar('#');
}
void initWall(void)
{
for (size_t i = 0; i <= HIGH; i++)
{
for (size_t j = 0; j <= WIDTH; j++)
{
if (j == WIDTH)
{
printf("||");
}
else if (i == HIGH)
{
printf("=");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
void playGame(void)
{
char key = 'w';
while (snake.body[0].X >= 0 && snake.body[0].X < WIDTH && snake.body[0].Y >= 0 && snake.body[0].Y < HIGH)
{
initUI();
if (_kbhit()) {
key = _getch();
}
switch (key)
{
case 'w':key_x = 0; key_y = -1; break;
case 's':key_x = 0; key_y = +1; break;
case 'd':key_x = +1; key_y = 0; break;
case 'a':key_x = -1; key_y = 0; break;
default:
break;
}
for (size_t i = 1; i < snake.size; i++)
{
if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y)
{
return;
}
}
if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)
{
initFood();
snake.size++;
score+=10;
sleepSecond -= 50;
}
lastX = snake.body[snake.size - 1].X;
lastY = snake.body[snake.size - 1].Y;
for (size_t i = snake.size-1;i>0; i--)
{
snake.body[i].X = snake.body[i - 1].X;
snake.body[i].Y = snake.body[i - 1].Y;
}
snake.body[0].X += key_x;
snake.body[0].Y += key_y;
Sleep(sleepSecond);
}
return;
}
void showScore(void)
{
COORD coord;
coord.X = 0;
coord.Y = HIGH + 2;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
printf("GAME OVER!!!\n");
printf("成绩为:%d\n", score);
}
int main(void)
{
CONSOLE_CURSOR_INFO cci;
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
srand(time(NULL));
initSnake();
initFood();
initWall();
initUI();
playGame();
showScore();
system("pause");
}
2.2 snake.c
#include "snake.h"
void initSnake(void)
{
snake.size = 2;
snake.body[0].X = WIDTH / 2;
snake.body[0].Y = HIGH / 2;
snake.body[1].X = WIDTH / 2 - 1;
snake.body[1].Y = HIGH / 2;
return;
}
void initFood(void)
{
food.X = rand() % WIDTH;
food.Y = rand() % HIGH;
return;
}
void initUI(void)
{
COORD coord={0};
for (size_t i = 0; i < snake.size; i++)
{
coord.X = snake.body[i].X;
coord.Y = snake.body[i].Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
if (i)
putchar('*');
else
putchar('@');
}
coord.X = lastX;
coord.Y = lastY;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar(' ');
coord.X = food.X;
coord.Y = food.Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar('#');
}
void initWall(void)
{
for (size_t i = 0; i <= HIGH; i++)
{
for (size_t j = 0; j <= WIDTH; j++)
{
if (j == WIDTH)
{
printf("||");
}
else if (i == HIGH)
{
printf("=");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
void playGame(void)
{
char key = 'w';
while (snake.body[0].X >= 0 && snake.body[0].X < WIDTH && snake.body[0].Y >= 0 && snake.body[0].Y < HIGH)
{
initUI();
if (_kbhit()) {
key = _getch();
}
switch (key)
{
case 'w':key_x = 0; key_y = -1; break;
case 's':key_x = 0; key_y = +1; break;
case 'd':key_x = +1; key_y = 0; break;
case 'a':key_x = -1; key_y = 0; break;
default:
break;
}
for (size_t i = 1; i < snake.size; i++)
{
if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y)
{
return;
}
}
if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)
{
initFood();
snake.size++;
score+=10;
sleepSecond -= 50;
}
lastX = snake.body[snake.size - 1].X;
lastY = snake.body[snake.size - 1].Y;
for (size_t i = snake.size-1;i>0; i--)
{
snake.body[i].X = snake.body[i - 1].X;
snake.body[i].Y = snake.body[i - 1].Y;
}
snake.body[0].X += key_x;
snake.body[0].Y += key_y;
Sleep(sleepSecond);
}
return;
}
void showScore(void)
{
COORD coord;
coord.X = 0;
coord.Y = HIGH + 2;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
printf("GAME OVER!!!\n");
printf("成绩为:%d\n", score);
}
int main(void)
{
CONSOLE_CURSOR_INFO cci;
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
srand(time(NULL));
initSnake();
initFood();
initWall();
initUI();
playGame();
showScore();
system("pause");
}