C语言贪吃蛇小游戏

#include <stdio.h>
#include <graphics.h> //里面有easyX图形库函数
#include <conio.h>
#include <time.h>
#include <mmsystem.h>
//#pragma comment(lib,"winmm.lib")

/******************************结构体*******************************/
//坐标属性
typedef struct point {
	int x;
	int y;
}MYPOINT;
//蛇
struct Snake
{
	MYPOINT xy[1000];//坐标
	int position; //方向
	int num; //长度
}snake;


//食物
struct Food
{
	MYPOINT fdxy;
	int flag;
	int grade;
}food;
//枚举方向
enum position {up, down, left,right};
/*************************模块化设计功能*******************************/
//玩蛇
//初始化蛇宽度10像素,高度10像素,三组的长度
//定义它的初始位置:原点
//初始长度,初始移动方向
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.position = right;
	snake.num = 3;

}
//画出蛇
void drawSnake() {
	//绘制填充矩形
	for (int i = 0;i < snake.num;i++) {
		setlinecolor(BLACK);
		setfillcolor(RGB(rand()%255,rand()%255,rand()%255));
		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.position)
	{
	case up:
		snake.xy[0].y -= 10;
		break;
	case down:
		snake.xy[0].y += 10;
		break;
	case left:
		snake.xy[0].x -= 10;
		break;
	case right:
		snake.xy[0].x += 10; 
		break;
	}

}
//按键操作
void keyDown() {
	char userkey = _getch();
	switch (userkey)
	{
	case 'w':
	case 'W':
	case 72:
		if (snake.position!=down)
			snake.position = up;
		break;
	case 's':
	case 'S':
	case 80:
		if (snake.position != up)
			snake.position = down;
		break;
	case 'a':
	case 'A':
	case 75:
		if (snake.position != right)
			snake.position = left;
		break;
	case 'd':
	case 'D':
	case 77:
		if (snake.position != left)
			snake.position = right;
		break;
	}
}
//玩食物
//初始化食物
void initFood() {
	food.fdxy.x = rand() % 80 * 10;
	food.fdxy.y = rand() % 60 * 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() % 80 * 10;
			food.fdxy.y = rand() % 60 * 10;
		}
	}
}

//画食物
void drawFood() {
	setlinecolor(BLACK);
	setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
	fillrectangle(food.fdxy.x,food.fdxy.y,food.fdxy.x+10,food.fdxy.y+10);

}
//打怪吃食物过程
void earFood() {
	if (snake.xy[0].x == food.fdxy.x&&snake.xy[0].y == food.fdxy.y){
		snake.num++;
		food.flag = 0;
		food.grade += 10;
		}
}
//显示分数
void showGrade() {
	//格式化打印
	char grade[20] = "";
	sprintf_s(grade, "grade:%d", food.grade);
	settextcolor(LIGHTBLUE);
	settextstyle(25, 0, "楷体");
	outtextxy(650,50,grade);

}
int main()
{
	srand((unsigned int)time(NULL));

	//1.创建图形窗口,初始化图形环境
	initgraph(800, 600);
	
	//2.背景颜色
	setbkcolor(RGB(200,120,119));
	
	//需要清屏刷新颜色
	cleardevice();

	mciSendString("open 1.mp3", 0, 0, 0);
	mciSendString("play 1.mp3", 0, 0, 0);
	//用填充矩形代替蛇身体
	//fillrectangle(100,100,200,200);

	initSnake();
	drawSnake();
	while (1)
	{
		cleardevice();
		moveSnake();

		drawSnake();
		if (food.flag == 0) {
			initFood();
		}
		if (_kbhit())
		{
			keyDown();
		}
		drawFood();
		earFood();
		showGrade();
		Sleep(100);
	}
	_getch();  //防止闪屏,等待用户输入一个字符
	//关闭窗口
	closegraph();

	return 0;
}
posted @   略小白  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示