#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#define WIDTH 20
#define HEIGHT 20
#define SIZE (WIDTH * HEIGHT)
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
int score;
int gameover;
int x, y, fruitX, fruitY, flag;
int tailX[SIZE];
int tailY[SIZE];
int countTail = 0;
void Setup()
{
gameover = 0;
x = WIDTH / 2;
y = HEIGHT / 2;
fruitX = rand() % WIDTH;
fruitY = rand() % HEIGHT;
}
void Draw()
{
system("cls");
int i, j, k;
for (i = 0; i < WIDTH + 2; i++)
printf("#");
printf("\n");
for (i = 0; i < HEIGHT; i++)
{
for (j = 0; j < WIDTH; j++)
{
if (j == 0)
printf("#");
if (i == y && j == x)
printf("O");
else if (i == fruitY && j == fruitX)
printf("F");
else
{
int isTail = 0;
for (k = 0; k < countTail; k++)
{
if (i == tailY[k] && j == tailX[k])
{
printf("o");
isTail = 1;
}
}
if (!isTail)
printf(" ");
}
if (j == WIDTH - 1)
printf("#");
}
printf("\n");
}
for (i = 0; i < WIDTH + 2; i++)
printf("#");
printf("\n");
printf("分数: %d\n", score);
printf("X 退出游戏\n");
printf("P 暂停游戏");
}
void Input()
{
if (_kbhit())
{
switch (_getch())
{
case 'a':
flag = LEFT;
break;
case 'd':
flag = RIGHT;
break;
case 'w':
flag = UP;
break;
case 's':
flag = DOWN;
break;
case 'x':
gameover = 1;
break;
case 'p':
system("cls");
printf("游戏暂停,按任意键继续\n");
_getch();
break;
}
}
}
void Logic()
{
int prevX = tailX[0];
int prevY = tailY[0];
int prev2X, prev2Y;
tailX[0] = x;
tailY[0] = y;
for (int i = 1; i < countTail; i++)
{
prev2X = tailX[i];
prev2Y = tailY[i];
tailX[i] = prevX;
tailY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
switch (flag)
{
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
case UP:
y--;
break;
case DOWN:
y++;
break;
default:
break;
}
if (x >= WIDTH)
x = 0;
else if (x < 0)
x = WIDTH - 1;
if (y >= HEIGHT)
y = 0;
else if (y < 0)
y = HEIGHT - 1;
for (int i = 0; i < countTail; i++)
{
if (tailX[i] == x && tailY[i] == y)
{
gameover = 1;
break;
}
}
if (x == fruitX && y == fruitY)
{
score += 10;
fruitX = rand() % WIDTH;
fruitY = rand() % HEIGHT;
countTail++;
}
}
int main()
{
int m, n;
char choice;
printf("“A,W,S,D控制“左,上,下,右”\n");
printf("1. 慢速\n");
printf("2. 普通\n");
printf("3. 快速\n");
printf("请选择: ");
scanf("%c", &choice);
switch (choice)
{
case '1':
m = 300;
break;
case '2':
m = 150;
break;
case '3':
m = 75;
break;
default:
Sleep(2000);
return 0;
}
Setup();
while (!gameover)
{
Draw();
Input();
Logic();
Sleep(m);
}
printf("\n游戏结束!\n");
printf("分数: %d\n", score);
printf("按任意键退出!");
_getch();
return 0;
}