#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#include <windows.h>
const int height = 20;
const int length = 20;
char Map[height][length];
int key;
int snakeLen = 4;
int gameOver = 0;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
enum
{
LeftKey = 75,
RightKey = 77,
UpKey = 72,
DownKey = 80
};
struct Snake
{
int r;
int c;
int dir;
}Snake[height * length];
const char head = '@';
const char body = '#';
const char food = '*';
void Initial();
void CreateFood();
void Show();
void GetPressKey();
void Move();
void CheckBorder();
void CheckHead(int r, int c);
int main()
{
Initial();
Show();
return 0;
}
void Initial()
{
int i, j;
int hx, hy;
system("title 贪吃蛇");
memset(Map, '.', sizeof(Map));
srand(time(0));
hx = rand() % height;
hy = rand() % length;
Map[hx][hy] = head;
Snake[0].r = hx; Snake[0].c = hy;
Snake[0].dir = -1;
CreateFood();
for(i = 0; i < height; i++)
{
for(j = 0; j < length; j++)
{
printf("%c", Map[i][j]);
}
printf("\n");
}
printf("\nC语言贪吃蛇\n");
printf("按任意方向键开始游戏\n");
getch();
GetPressKey();
}
void CreateFood()
{
int fx, fy;
while(1)
{
fx = rand() % height;
fy = rand() % length;
if(Map[fx][fy] == '.')
{
Map[fx][fy] = food;
break;
}
}
}
void Show()
{
int i, j;
while(1)
{
Sleep(500);
GetPressKey();
Move();
if(gameOver)
{
printf("\n**游戏结束**\n");
printf(" >_<\n");
getchar();
break;
}
system("cls");
for(i = 0; i < height; i++)
{
for(j = 0; j < length; j++)
{
printf("%c", Map[i][j]);
}
printf("\n");
}
printf("\nC语言贪吃蛇\n");
printf("按任意方向键开始游戏\n");
}
}
void GetPressKey()
{
if(kbhit() != 0)
{
while(kbhit() != 0)
{
key = getch();
}
switch(key)
{
case LeftKey:
{
Snake[0].dir = 0;
break;
}
case RightKey:
{
Snake[0].dir = 1;
break;
}
case UpKey:
{
Snake[0].dir = 2;
break;
}
case DownKey:
{
Snake[0].dir = 3;
break;
}
}
}
}
void Move()
{
int i, r, c;
int len = snakeLen;
r = Snake[0].r;
c = Snake[0].c;
Map[r][c] = '.';
Snake[0].r = Snake[0].r + dx[ Snake[0].dir ];
Snake[0].c = Snake[0].c + dy[ Snake[0].dir ];
CheckBorder();
CheckHead(r, c);
if(snakeLen == len)
{
for(i = 1; i < snakeLen; i++)
{
if(i == 1)
{
Map[ Snake[i].r ][ Snake[i].c ] = '.';
}
if(i == snakeLen-1)
{
Snake[i].r = r;
Snake[i].c = c;
Snake[i].dir = Snake[0].dir;
}
else
{
Snake[i].r = Snake[i+1].r;
Snake[i].c = Snake[i+1].c;
Snake[i].dir = Snake[i+1].dir;
}
Map[ Snake[i].r ][ Snake[i].c ] = '#';
}
}
}
void CheckBorder()
{
if(Snake[0].r < 0 || Snake[0].r >= height || Snake[0].c < 0 || Snake[0].c >= length)
{
gameOver = 1;
}
}
void CheckHead(int r, int c)
{
if(Map[ Snake[0].r ][ Snake[0].c ] == '.')
{
Map[ Snake[0].r ][ Snake[0].c ] = '@';
}
else
{
if(Map[ Snake[0].r ][ Snake[0].c ] == '*')
{
Map[ Snake[0].r ][ Snake[0].c ] = '@';
Snake[snakeLen].r = r;
Snake[snakeLen].c = c;
Snake[snakeLen].dir = Snake[0].dir;
Map[ Snake[snakeLen].r ][ Snake[snakeLen].c ] = '#';
snakeLen++;
CreateFood();
}
else
{
gameOver = 1;
}
}
}
了解中小学信息学竞赛请加微信307591841(QQ同号)