C语言大作业《贪吃蛇》个人作品

/*
技术支持: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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值