贪吃蛇游戏的实现

【备注】使用的是Visual Studio,需要下载easyx。

【特色】食物使用随机颜色。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> 
#include <graphics.h> 	//报错,请装图形插件 
#include <conio.h>
#include <time.h>	//随机函数种子
/************************
*       坐标属性
*       蛇属性
*       食物属性
*************************/
//坐标属性 
typedef struct pointXY
{
	int x;
	int y;

}MYPOINT;
//蛇的属性
struct Snake
{
	int num; //蛇的节数
	MYPOINT xy[100]; //蛇最多有100节
	char postion; //方向	  
}snake;
//食物的属性 
struct Food
{
	MYPOINT fdxy;	//食物的x和y坐标 
	int eatgrade;	//吃了食物有多少分 
	int flag;	//食物是否存在 
}food;
HWND hwnd = NULL; 	//表示主窗口 
 //把方向枚举出来
 //小键盘,键码值 
enum movPostion { right = 68, left = 65, down = 83, up = 87 };
/************************
*       初始化蛇:	initSnake
*       画蛇:		drawSnake
*       移动蛇:	moveSnake
*		按键处理:	keyDown
*		初始化食物:initFood
*		画食物:	drawFood
*		吃食物:	eatFood
*		死亡:		snakeDie
*		分数:		showGrade
*************************/
void initSnake();
void drawSnake();
void moveSnake();
void keyDown();
void initFood();
void drawFood();
void eatFood();
int snakeDie();
void showGrade();
int main()
{
	srand((unsigned int)time(NULL));//随机函数种子(食物随机出现
	hwnd = initgraph(640, 480);
	setbkcolor(WHITE);		//窗口颜色白色
	initSnake();
	
	while (1)
	{
		cleardevice();		//如果颜色未变,刷新一下
		if (food.flag == 0)
		{
			initFood();
		}
		drawFood();
		drawSnake();
		if (snakeDie())
		{
			break;
		}
		eatFood();
		showGrade();
		moveSnake();
		//只有按键时接受按键
		//keyDown
		while (_kbhit())
		{
			keyDown();
		}
		Sleep(100);
	}
	getchar();		//防止闪屏
	closegraph();
	return 0;
}

void initSnake()
{
	//把前三节的属性写出来就可以——>初始化数据库 
	snake.xy[2].x = 0;
	snake.xy[2].y = 0;

	snake.xy[1].x = 10;
	snake.xy[1].y = 0;

	snake.xy[0].x = 20;
	snake.xy[0].y = 0;

	snake.num = 3;
	snake.postion = right;	//初始化方向右边 

	food.flag = 0;
	food.eatgrade = 0;
}

void drawSnake()
{	//蛇头
	setlinecolor(BLACK);	//		矩形边框颜色 
	setfillcolor(GREEN);
	fillrectangle(snake.xy[0].x, snake.xy[0].y, snake.xy[0].x + 10, snake.xy[0].y + 10);

	for (int i = 1; i < snake.num; i++)
	{
		setlinecolor(BLACK);	//		矩形边框颜色 
		setfillcolor(LIGHTGREEN);
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
	}
}

void moveSnake()
{
	//除第一节之外,后面每一节都是前面一节的坐标
	for (int i = snake.num - 1; i > 0; i--)
	{
		snake.xy[i].x = snake.xy[i - 1].x;
		snake.xy[i].y = snake.xy[i - 1].y;
	}//第一节处理
	switch (snake.postion)
	{
	case right:
		snake.xy[0].x += 10;
		break;
	case left:
		snake.xy[0].x -= 10;
		break;
	case down:
		snake.xy[0].y += 10;
		break;
	case up:
		snake.xy[0].y -= 10;
		break;
	default:
		break;
	}
}

void keyDown()
{
	char userKey = 0;
	userKey = _getch();
	switch (userKey)
	{
	case right:
		if (snake.postion != left)
			snake.postion = right;
		break;
	case left:
		if (snake.postion != right)
			snake.postion = left;
		break;
	case down:
		if (snake.postion != up)
			snake.postion = down;
		break;
	case up:
		if (snake.postion != down)
			snake.postion = up;
		break;
	default:
		break;
	}
}
//食物随机出现
//怎么产生食物
void initFood()
{		//为什么要拆开写:防止蛇吃不到食物
	food.fdxy.x = rand() % 65 * 10;		//650 651
	food.fdxy.y = rand() % 48 * 10;
	food.flag = 1;		//食物存在
	//如果出现在蛇身上
	for (int i = 0; i > snake.num; i++)
	{
		if (food.fdxy.x == snake.xy[i].x && food.fdxy.y == snake.xy[i].y)
		{		//如果食物坐标和蛇坐标重合,重新生成
			food.fdxy.x = rand() % 65 * 10;		//650 651
			food.fdxy.y = rand() % 48 * 10;
		}
	}
}

void drawFood()
{
	setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
	fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10);
}

void eatFood()
{
	//1.蛇变长
	//2.食物重新生成
	//3.分数增加
	if (snake.xy[0].x == food.fdxy.x && snake.xy[0].y == food.fdxy.y)
	{
		snake.num++;
		food.eatgrade += 10;
		food.flag = 0;
	}
}
//游戏结束判定
int snakeDie()
{
	if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
	{
		outtextxy(200, 200, "撞墙了!");
		showGrade();
		//MessageBox(hwnd, "Game Over!", "撞墙警告",MB_OK);
		return 1;		//返回1,游戏结束
	}
	//自己吃自己
	for (int i = 1; i < snake.num; i++)
	{
		if (snake.xy[0].x == snake.xy[i].x && snake.xy[0].y == snake.xy[i].y)
		{
			outtextxy(200, 200, "吃到自己了!");
			showGrade();
			//MessageBox(hwnd, "Game Over!", "自杀警告",MB_OK);
			return 1;

		}
	}
	return 0;
}
void showGrade()
{
	char grade[100] = "";
	sprintf(grade, "%d", food.eatgrade);
	setbkmode(TRANSPARENT);
	settextcolor(LIGHTBLUE);
	outtextxy(580-20, 20, "分数:");
	outtextxy(580+20, 20, grade);

}  

【跟学视频地址】C语言游戏开发:贪吃蛇(C语言精讲)!巨详细讲解必学项目,手把手带你写贪吃蛇代码,不错过每一个知识点!_哔哩哔哩_bilibili 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值