【无标题】

基于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, y;
}MYPOINT;
//蛇
struct Snake
{
	MYPOINT xy[100];	//坐标
	int position;	//方向
	int num;		//长度
}snake;
//食物
struct
{
	MYPOINT fdxy;		//坐标
	int flag;		//标记
	int grade;		//分数
}food;
//枚举:方向
enum position {up,down,left,right};
/*******************模块化功能设计实现**********************/
//初始化蛇
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;//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 eatFood()
{
	if (snake.xy[0].x == food.fdxy.x && snake.xy[0].y == food.fdxy.y)
	{	
		mciSendString("open 2.mp3", 0, 0, 0);
		mciSendString("play 2.mp3", 0, 0, 0);
		snake.num++;
		food.flag = 0;
		food.grade += 10;
		Sleep(500);
		mciSendString("close 2.mp3", 0, 0, 0);
	}
}
//显示分数
void showGrade()
{
	//格式化打印
	char grade[20] = "";
	sprintf_s(grade, "小羊得分:%d", food.grade);
	settextcolor(LIGHTGREEN);
	settextstyle(25, 0, "楷体");
	outtextxy(650,50,grade);
}
//蛇死亡
HWND hwnd = NULL;
int SnakeDie()
{
	//撞墙
	if (snake.xy[0].x > 800 || snake.xy[0].x < 0 || snake.xy[0].y>600 || snake.xy[0].y < 0)
	{
		mciSendString("close 1.mp3", 0, 0, 0);
		MessageBox(hwnd, "贪吃蛇撞墙了,小羊游戏结束", "gameover", MB_OK);
		return 1;
	}
	else return 0;
	//自杀
	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)
		{
			mciSendString("close 1.mp3", 0, 0, 0);
			MessageBox(hwnd, "咬到自己了,游戏结束", "gameover", MB_OK);
			return 1;
		}
		else return 0;
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	//创建图像窗口;初始化环境
	initgraph(800, 600);
	setbkcolor(RGB(224,45,212));//设置背景颜色
	cleardevice();//清屏
	mciSendString("open 1.mp3", 0, 0, 0);
	mciSendString("play 1.mp3", 0, 0, 0);
	initSnake();
	drawSnake();
	while (1)
	{
		cleardevice();
		moveSnake();
		drawSnake();
		if (food.flag == 0)
		{
			initFood();
		}
		if (_kbhit())//判断是否按键
		{
			keyDown();
		}
		if (SnakeDie())
		{
			break;
		}
		drawFood();
		eatFood();
		showGrade();
		Sleep(80);
	}
	_getch();//防止闪屏;等待用户输入一个字符
	closegraph();
	return 0;
}

最终效果如下:

游戏界面图像
希望大佬多多指教。代码有看不懂的的,私信我。我看到会一一回复!
谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python_chen_zk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值