基于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;
}
最终效果如下:
希望大佬多多指教。代码有看不懂的的,私信我。我看到会一一回复!
谢谢大家!