贪吃蛇游戏代码

时间:2022-03-12 15:23:57
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

const int maxn = 100;
const int n = 20;

struct node
{
int x, y;
};

int map[maxn][maxn]; // 0表示空格,1表示蛇身,2表示食物,3表示撞死的位置, 4表示蛇头.
node food;
node squence[maxn]; // 蛇的身子的坐标.
int len; // 蛇的长度.
bool eat; // 判断当前事物是否被吃了.
bool gameover; // 游戏是否失败.
int direction; // 判断当前蛇头是朝哪个方向.

void Output(void);
void Move(int direction);
void Move_up(void);
void Move_down(void);
void Move_left(void);
void Move_right(void);

int main()
{
int i, j;
double start;
int gamespeed; // 游戏速度自己调整.
int timeover;
int game_times = 1; // 游戏的次数.
char c = 'x';
printf("请输入游戏的级别(1到500,1最难,500最简单):\n");
scanf("%d", &gamespeed);
gamespeed = gamespeed;
// 对图的初始化.
for (i = 0; i <= n + 1; i++)
{
for (j = 0; j <= n + 1; j++)
{
map[i][j] = 0;
}
}
// 对蛇的初始化.
for (i = 1; i <= n; i++)
{
squence[i].x = 0;
squence[i].y = 0;
}
len = 1; // 蛇的长度为1.
squence[len].x = 1;
squence[len].y = 1; // 初始位置在点(1, 1).
map[1][1] = 4;
direction = 4; // 默认开始时蛇向右走.
srand(time(0));
while (game_times <= 20)
{
eat = 0; // 食物还没被吃.
while (true)
{ // 随机生出食物的坐标,注意不能与蛇身重合,否则就重新随机产生.
food.x = rand() % 20 + 1;
food.y = rand() % 20 + 1;
if (map[food.x][food.y] == 0)
{
break;
}
}
map[food.x][food.y] = 2; // 食物位置.
system("cls");
Output();
// 以下这段半秒钟不按键还取原方向继续前行.
while (!eat)
{
start = clock();
timeover=1;
while(!kbhit())
{ // 说明没有按键.
if (clock() - start <= gamespeed)
{ // 如果时间超过游戏时间.
timeover = 1;
}
else
{
timeover = 0;
break;
}
}
if (timeover)
{ // 说明有按键.
// 按一次键,可以连取两个
c = getch();
c = getch();
// 以下几行告诉怎样判断用户按的哪个方向键
if(c==72) direction = 1; // printf("向上");
if(c==80) direction = 2; // printf("向下");
if(c==75) direction = 3; // printf("向左");
if(c==77) direction = 4; // printf("向右");
}
Move(direction);
system("cls");
if (gameover)
{
Output();
printf("Game Over!!!\n");
return 0;
}
Output();
}
game_times++; // 又成功吃到一次食物.
}
printf("You win!!!\n");
return 0;
}

void Move(int direction)
{
switch (direction)
{
case 1 : Move_up(); break;
case 2 : Move_down(); break;
case 3 : Move_left(); break;
default : Move_right();
}
}

void Output(void)
{
int i, j;
for (j = 0; j <= n + 1; j++)
{
printf("#");
}
printf("\n");
for (i = 1; i <= n; i++)
{
for (j = 0; j <= n + 1; j++)
{
if (j == 0 || j == n + 1)
{
if (map[i][j] == 3)
{
printf("!");
}
else
{
printf("#");
}
}
else
{
if (map[i][j] == 1)
{
printf("*");
}
else if (map[i][j] == 2)
{
printf("@");
}
else if (map[i][j] == 3)
{
printf("!");
}
else if (map[i][j] == 4)
{
switch (direction)
{
case 1 : printf("%c", 30); break;
case 2 : printf("%c", 31); break;
case 3 : printf("%c", 17); break;
default : printf("%c", 16);
}
}
else
{
printf(" ");
}
}
}
printf("\n");
}
for (j = 0; j <= n + 1; j++)
{
printf("#");
}
printf("\n");
}

void Move_up(void)
{
int i;
int x, y;
if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x + 1)
{ // 不能移动,则按原来的移动.
direction = 2; // 按原来的向下移动.
Move(direction);
return ;
}
// 开始移动.
x = squence[len].x - 1;
y = squence[len].y;
if (x == 0 || map[x][y] == 1)
{ // 撞到边界或者自己撞到自己.
map[x][y] = 3;
gameover = 1;
}
if (map[x][y] == 2)
{ // 说明已经吃到事物.
map[squence[len].x][squence[len].y] = 1;
len++;
squence[len].x = x;
squence[len].y = y;
map[x][y] = 4;
eat = 1;
}
else
{
map[squence[1].x][squence[1].y] = 0;
for (i = 1; i <= len - 1; i++)
{
squence[i].x = squence[i + 1].x;
squence[i].y = squence[i + 1].y;
map[squence[i + 1].x][squence[i + 1].y] = 1;
}
squence[len].x = squence[len].x - 1;
if (gameover)
{
map[squence[len].x][squence[len].y] = 3;
}
else
{
map[squence[len].x][squence[len].y] = 4;
}
}
}

void Move_down(void)
{
int i;
int x, y;
if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x - 1)
{ // 不能移动,则按原来的移动.
direction = 1; // 按原来的向上移动.
Move(direction);
return ;
}
// 开始移动.
x = squence[len].x + 1;
y = squence[len].y;
if (x == n + 1 || map[x][y] == 1)
{ // 撞到边界或者自己撞到自己.
map[x][y] = 3;
gameover = 1;
}
if (map[x][y] == 2)
{ // 说明已经吃到事物.
map[squence[len].x][squence[len].y] = 1;
len++;
squence[len].x = x;
squence[len].y = y;
map[x][y] = 4;
eat = 1;
}
else
{
map[squence[1].x][squence[1].y] = 0;
for (i = 1; i <= len - 1; i++)
{
squence[i].x = squence[i + 1].x;
squence[i].y = squence[i + 1].y;
map[squence[i + 1].x][squence[i + 1].y] = 1;
}
squence[len].x = squence[len].x + 1;
if (gameover)
{
map[squence[len].x][squence[len].y] = 3;
}
else
{
map[squence[len].x][squence[len].y] = 4;
}
}
}

void Move_left(void)
{
int i;
int x, y;
if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y + 1)
{ // 不能移动,则按原来的移动.
direction = 4; // 按原来的向右移动.
Move(direction);
return ;
}
// 开始移动.
x = squence[len].x;
y = squence[len].y - 1;
if (y == 0 || map[x][y] == 1)
{ // 撞到边界或者自己撞到自己.
map[x][y] = 3;
gameover = 1;
}
if (map[x][y] == 2)
{ // 说明已经吃到事物.
map[squence[len].x][squence[len].y] = 1;
len++;
squence[len].x = x;
squence[len].y = y;
map[x][y] = 4;
eat = 1;
}
else
{
map[squence[1].x][squence[1].y] = 0;
for (i = 1; i <= len - 1; i++)
{
squence[i].x = squence[i + 1].x;
squence[i].y = squence[i + 1].y;
map[squence[i + 1].x][squence[i + 1].y] = 1;
}
squence[len].y = squence[len].y - 1;
if (gameover)
{
map[squence[len].x][squence[len].y] = 3;
}
else
{
map[squence[len].x][squence[len].y] = 4;
}
}
}

void Move_right(void)
{
int i;
int x, y;
if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y - 1)
{ // 不能移动,则按原来的移动.
direction = 3; // 按原来的向左移动.
Move(direction);
return ;
}
// 开始移动.
x = squence[len].x;
y = squence[len].y + 1;
if (y == n + 1 || map[x][y] == 1)
{ // 撞到边界或者自己撞到自己.
map[x][y] = 3;
gameover = 1;
}
if (map[x][y] == 2)
{ // 说明已经吃到事物.
map[squence[len].x][squence[len].y] = 1;
len++;
squence[len].x = x;
squence[len].y = y;
map[x][y] = 4;
eat = 1;
}
else
{
map[squence[1].x][squence[1].y] = 0;
for (i = 1; i <= len - 1; i++)
{
squence[i].x = squence[i + 1].x;
squence[i].y = squence[i + 1].y;
map[squence[i + 1].x][squence[i + 1].y] = 1;
}
squence[len].y = squence[len].y + 1;
if (gameover)
{
map[squence[len].x][squence[len].y] = 3;
}
else
{
map[squence[len].x][squence[len].y] = 4;
}
}
}