【备注】使用的是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