包含的头文件
#include <stdio.h>
#include <graphics.h>//图形库头文件
#include <conio.h>//_kbhit()函数头文件
#include <stdlib.h>//srand函数头文件
#include <time.h>//time()函数头文件
初始化界面
int main()
{
initgraph(640,480);//初始化界面
while (1);
return 0;
}
设置背景颜色
int main()
{
initgraph(640,480);
setbkcolor(RGB(31, 29, 66));//设置背景颜色
cleardevice();//清空绘图设备
while (1);
return 0;
}
定义蛇的信息结构体,枚举定义蛇的方向
#define SNAKE_NUM 500// 最大有500节
struct Snake
{
int size;//蛇的节数
int dir;//蛇的方向
int speed;//蛇的速度
POINT coor[SNAKE_NUM];//蛇的坐标
}snake;
enum DIR //表示蛇的方向
{
UP,//向上
DOWN,//向下
LEFT,//向左
RIGHT,//向右
};
数据初始化
void gameinit()
{
snake.size = 3;//初始化蛇刚开始为三节
snake.speed = 8;//初始速度是每按一次方向键改变八个像素的位置
snake.dir = RIGHT;//初始蛇的方向是向右
for (int i = 0; i < snake.size; i++)
{
snake.coor[i].x = 40 - 10 * i;
snake.coor[i].y = 10;
}
}
整合函数
函数写的太乱,我们可以将相同的功能放在一个函数里面,比如说将initgraph(640, 480);放在gameinit()里面,将画的都放在gamedraw()函数里面。
//数据初始化
void gameinit()
{
initgraph(640, 480);
snake.size = 3;
snake.speed = 8;
snake.dir = RIGHT;
for (int i = 0; i < snake.size; i++)
{
snake.coor[i].x = 40 - 10 * i;
snake.coor[i].y = 10;
}
}
void gamedraw()
{
BeginBatchDraw();//双缓冲消除闪屏
setbkcolor(RGB(31, 29, 66));//设置背景颜色
cleardevice();//清空绘图设备
//绘制蛇
setfillcolor(RED);//设置蛇的颜色
for (int i = 0; i < snake.size; i++)
{
solidcircle(snake.coor[i].x, snake.coor[i].y, 5);//循环绘制蛇的三节身体
}
EndBatchDraw();//双缓冲消除闪屏
}
int main()
{
gameinit();
gamedraw();
while (1);
return 0;
}
键盘控制移动方向
void keycontrol()
{
//72 80 75 77
if (_kbhit())
{
switch (_getch())
{
case 'w':
case 'W':
case 72:
if (snake.dir != DOWN)
{
snake.dir = UP;
}
break;
case 's':
case 'S':
case 80:
if (snake.dir != UP)
{
snake.dir = DOWN;
}
break;
case 'a':
case 'A':
case 75:
if (snake.dir != RIGHT)
{
snake.dir = LEFT;
}
break;
case 'd':
case 'D':
case 77:
if (snake.dir != LEFT)
{
snake.dir = RIGHT;
}
break;
}
}
}
蛇的移动
void snakemove()
{
for (int i = snake.size-1; i>0; i--)//身体跟着头移动
{
snake.coor[i] = snake.coor[i - 1];
}
switch (snake.dir)//头移动
{
case RIGHT:
snake.coor[0].x+=snake.speed;
if (snake.coor[0].x > 640)
{
snake.coor[0].x = 0;
}
break;
case UP:
snake.coor[0].y-= snake.speed;
if (snake.coor[0].y < 0)
{
snake.coor[0].y = 480;
}
break;
case DOWN:
snake.coor[0].y+=snake.speed;
if (snake.coor[0].y > 480)
{
snake.coor[0].y = 0;
}
break;
case LEFT:
snake.coor[0].x-=snake.speed;
if (snake.coor[0].x < 0)
{
snake.coor[0].x = 640;
}
break;
}
}
主函数变化
int main()
{
gameinit();
gamedraw();
while (1)
{
gamedraw();
keycontrol();
snakemove();
Sleep(20);
}
return 0;
}
食物信息结构体定义
struct food
{
int x;//食物的横坐标
int y;//食物的纵坐标
bool flag;//食物是否被吃
int r;//食物半径
DWORD color;//食物颜色
}food;
食物信息初始化(修改数据初始化函数)
//数据初始化
void gameinit()
{ //设置随机数种子
srand((unsigned int)time(NULL));//时间不断变化,
initgraph(640, 480);//初始化界面
snake.size = 3;
snake.speed = 8;
snake.dir=RIGHT;
for (int i = 0;i<snake.size;i++)
{
snake.coor[i].x = 40-10*i;
snake.coor[i].y = 10;
}
//随机初始化食物的横纵坐标
food.x = rand() % 640;
food.y = rand() % 480;
food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
food.r = rand() % 10 + 5;
food.flag = true;
}
蛇吃食物
void eatfood()
{
if (food.flag&&snake.coor[0].x>=food.x-food.r&&snake.coor[0].x<=food.x+food.r && snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r)
{
food.flag = false;
snake.size++;
}
if (!food.flag)//食物消失重新生成一个
{
food.x = rand() % 640;
food.y = rand() % 480;
food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
food.r = rand() % 10 + 5;
food.flag = true;
}
}
修改主函数
int main()
{
gameinit();
gamedraw();
while (1)
{
gamestop();
gamedraw();
keycontrol();
snakemove();
eatfood();
Sleep(20);
}
return 0;
}
程序源码
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#define SNAKE_NUM 500
enum DIR //表示蛇的方向
{
UP,
DOWN,
LEFT,
RIGHT,
};
struct Snake//蛇结构体
{
int size;//蛇的节数
int dir;//蛇的方向
int speed;//蛇的速度
POINT coor[SNAKE_NUM];//节数
}snake;
struct food//食物结构体
{
int x;
int y;
bool flag;//食物是否被吃
int r;//食物半径
DWORD color;//食物颜色
}food;
//数据初始化
void gameinit()
{
initgraph(640, 480);
snake.size = 3;
snake.speed = 8;
snake.dir = RIGHT;
for (int i = 0; i < snake.size; i++)
{
snake.coor[i].x = 40 - 10 * i;
snake.coor[i].y = 10;
}
}
void gamestop()//空格,游戏暂停
{
if (_kbhit())
{
if (_getch() == ' ')
{
while (_getch() != ' ');
}
}
}
void gamedraw()//画函数
{
BeginBatchDraw();
setbkcolor(RGB(31, 29, 66));//设置背景颜色
cleardevice();//清空绘图设备
//绘制蛇
setfillcolor(RED);//设置蛇的颜色
for (int i = 0; i < snake.size; i++)
{
solidcircle(snake.coor[i].x, snake.coor[i].y, 5);
}
//绘制食物
if (food.flag)
{
solidcircle(food.x, food.y, food.r);
}
EndBatchDraw();
}
void keycontrol()//键盘控制方向
{
//72 80 75 77
if (_kbhit())
{
switch (_getch())
{
case 'w':
case 'W':
case 72:
if (snake.dir != DOWN)
{
snake.dir = UP;
}
break;
case 's':
case 'S':
case 80:
if (snake.dir != UP)
{
snake.dir = DOWN;
}
break;
case 'a':
case 'A':
case 75:
if (snake.dir != RIGHT)
{
snake.dir = LEFT;
}
break;
case 'd':
case 'D':
case 77:
if (snake.dir != LEFT)
{
snake.dir = RIGHT;
}
break;
}
}
}
void snakemove()//蛇的移动
{
for (int i = snake.size - 1; i > 0; i--)//身体跟着头移动
{
snake.coor[i] = snake.coor[i - 1];
}
switch (snake.dir)//头移动
{
case RIGHT:
snake.coor[0].x += snake.speed;
if (snake.coor[0].x > 640)
{
snake.coor[0].x = 0;
}
break;
case UP:
snake.coor[0].y -= snake.speed;
if (snake.coor[0].y < 0)
{
snake.coor[0].y = 480;
}
break;
case DOWN:
snake.coor[0].y += snake.speed;
if (snake.coor[0].y > 480)
{
snake.coor[0].y = 0;
}
break;
case LEFT:
snake.coor[0].x -= snake.speed;
if (snake.coor[0].x < 0)
{
snake.coor[0].x = 640;
}
break;
}
}
void eatfood()//吃食物
{
if (food.flag && snake.coor[0].x >= food.x - food.r && snake.coor[0].x <= food.x + food.r && snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r)
{
food.flag = false;
snake.size++;
}
if (!food.flag)//食物消失重新生成一个
{
food.x = rand() % 640;
food.y = rand() % 480;
food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
food.r = rand() % 10 + 5;
food.flag = true;
}
}
int main()
{
gameinit();
gamedraw();
while (1)
{
gamestop();
gamedraw();
keycontrol();
snakemove();
eatfood();
Sleep(20);
}
return 0;
}
程序演示
20230921_184525