/*
技术支持:XH-Official科技
项目名:简易无链表无指针纯C贪吃蛇
项目语言:C语言
编辑器:VS 2022
控制方式:wasd(小写,可拓展)
*/
#include<stdio.h>
#include<Windows.h>
#include<time.h>
#include<stdlib.h>
#define WEIGHT 25
#define HEIGHT 25
#define MAX_LENGTH 10
int score, gamestatus;
enum DIR //枚举四个方向
{
LEFT,
RIGHT,
UP,
DOWN,
};
struct KnotInfo //每一节蛇的位置信息数组
{
int x;
int y;
}knot[MAX_LENGTH];
struct Snake
{
int length;
int speed;
int dir;
}snake;
struct Food
{
int x;
int y;
int isAte;
}food;
void GameInit()
{
score = 0; //初始化分数为:0分
gamestatus = 1; //初始化游戏状态为:开始
snake.speed = 1; //蛇的当前速度
snake.length = 3; //蛇的当前长度
snake.dir=DOWN; //蛇的当前方向
for (int i = snake.length - 1; i >= 0; i--)
{
knot[i].x = i;
knot[i].y = 1;
}//为初始的三节分配坐标
//设置随机数种子
srand(GetTickCount64());
//初始化食物坐标
food.x = rand() % 20;
food.y = rand() % 20;
food.isAte = 0;
}
void Draw(int xsnake,int ysnake,int xfood,int yfood)
{
system("cls");//刷新屏幕
for (int a = 0; a <= WEIGHT; a++) //输出上边框
{
if(a==0)
printf("┏"); //输出左上角
else if (a == WEIGHT)
printf(" ━━┓"); //输出右上角
else
printf(" ━"); //输出上边框
}
printf("\n");
for (int i = 0; i < WEIGHT; i++) //全图遍历
{
for (int j = 0; j <=HEIGHT; j++)
{
if (j == 0) //输出左边框
{
printf("┃ ");
}
if (j == HEIGHT) //输出右边框
{
printf("┃ ");
}
if (i == xsnake && j == ysnake)
{
printf("■ "); //输出蛇
}
else if (i == xfood && j == yfood && food.isAte == 0)
{
printf("O "); //如果食物存在,就输出食物
}
else
{
printf(" "); //输出空格
}
}
printf("\n");
}
for (int i = 0; i <= WEIGHT; i++)
{
if (i == 0) //输出左下角
{
printf("┗");
}
else if (i == WEIGHT) //输出右下角
{
printf(" ━━┛");
}
else //输出下边框
{
printf(" ━");
}
}
printf("\n");
}
void EatFood()
{
if (knot[0].x == food.x && knot[0].y == food.y)
{
food.isAte = 1;
snake.length++;
}
if (food.isAte == 1)//如果食物被吃掉
{
srand(GetTickCount64());
//重置食物坐标
food.x = rand() % 20;
food.y = rand() % 20;
//重置食物状态
food.isAte = 0;
}
}
void MoveSnake()
{
for (int i = snake.length-1; i >0; i--)
{
knot[i]= knot[i - 1];
}//从最后一个开始逐个跟着前面的移动,直到蛇头
switch (snake.dir)
{
case DOWN:knot[0].x+=snake.speed; break;
case UP:knot[0].x-=snake.speed; break;
case RIGHT :knot[0].y+=snake.speed; break;
case LEFT :knot[0].y-=snake.speed; break;
}
Sleep(10);
}
void Control()
{
if (_kbhit())
{
switch (_getch())
{
case 'w':if (snake.dir != DOWN) {snake.dir = UP;} break;
case 's':if (snake.dir != UP) {snake.dir = DOWN;} break;
case 'a':if (snake.dir != RIGHT) {snake.dir = LEFT;} break;
case 'd':if (snake.dir != LEFT) {snake.dir = RIGHT;} break;
}
}
}
void GameOver()
{
if (knot[0].x >= 28 || knot[0].x <= -2 || knot[0].y >= 28 || knot[0].y <= -2)
{
printf("GameOver!!!\nRestart?Y/N\n");
char a;
a=getchar();
if (a == 'Y')
{
for (int i = snake.length - 1; i >= 0; i--)
{
knot[i].x = i;
knot[i].y = 1;
}//为初始的三节分配坐标
snake.dir = DOWN;//重置蛇的移动方向
}
if(a == 'N')
{
exit(0);
}
}
}
int main()
{
GameInit();
while (1)
{
for (int i = 0; i < snake.length; i++)
{
Draw(knot[i].x,knot[i].y,food.x,food.y);
}
Control();
MoveSnake();
EatFood();
GameOver();
Sleep(10);
}
return 0;
}
C语言大作业《贪吃蛇》个人作品
于 2023-11-18 16:30:44 首次发布