//0丶头文件
#include<stdio.h> //标准函数
#include<stdlib.h> //库文件
#include<graphics.h> //图形窗口
#include<conio.h> //控制台
#define SNAKE_NUM 500 //蛇的最大节数
//1丶蛇方向
enum DIR
{
UP, //上
DOWN, //下
LEFT, //左
RIGHT, //右
}
//2丶蛇结构
struct snake
{
int size; //蛇的节数
int speed; //蛇的速度
int dir; //蛇的方向
POINT coor[SNAKE_NUM]; //蛇坐标
}sanke;
//3丶食物结构
struct food
{
int x; //食物横坐标
int y; //食物纵坐标
int r; //食物半径
bool flag; 食物是否被吃
DWORD color; //食物颜色
}food;
//4丶数据初始化
void GameInit()
{
initgraph(640,480); //初始化图形窗口大小
srand(GetTickCount()); //从开机到现在经过的毫秒数,随机生成食物
snake.size=3; //初始化蛇的节数
snake.speed=10; //初始化蛇的速度
snake.dir=RIGHT; //初始化蛇的方向
for(int i=0;i<snake.size;i++)
{
snake.coor[i].x=40-10*i; //初始化蛇的三段节数代表 0 1 2 依此类推
snake.coor[i].y=10;
}
food.x=rand()%640;
food.y=rand()%480;
food.r=rand()%10+5; //随机生成半径为0~4的食物
food.flag=true;
food.color=RGB(rand()%256,rand()%256,rand()%256);
}
//5丶游戏绘制
void GameDraw()
{
BeginBatchDraw(); //双缓冲绘制
setbkcolor(RGB(28,115,119)); //图形窗口背景颜色
cleardevice(); //清空图形
setfillcolor(GREEN); //蛇和食物颜色
for(int i=0;i<snake.size;i++)
{
solidcircle(snake.coor[i].x,snake.coor[i].y,5); //绘制蛇 solidcircle - 圆形填充物
}
if(food.flag)
{
solidcircle(food.x,food.y,food.r); //绘制食物
}
EndBatchDraw(); //结束绘制
}
//6丶让蛇动起来
void snakeMove()
{
for(int i=0;i<snake.size;i++)
{
snake.coor[i]=snake.coor[i-1]; //移动时位置发生改变
}
switch(_getch()) //_getch()接收按键
{
case UP:
snake.coor[0].y-=snake.speed;
if(snake.coor[0].y+10<=0)
{
snake.coor[0].y=480;
}
break;
case DOWN:
snake.coor[0].y+=snake.speed;
if(snake.coor[0].y-10>=480)
{
snake.coor[0].y=0;
}
break;
case LEFT:
snake.coor[0].x-=snake.speed;
if(snake.coor[0].x+10<=0)
{
snake.coor[0].x=640;
}
break;
case RIGHT:
snake.coor[0].x-=snake.speed;
if(snake.coor[0].x-10>=640)
{
snake.coor[0].x=0;
}
break;
}
}
//7丶通过按键控制蛇的方向
void KeyControl()
{
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 '78':
if(snake.dir!=LEFT)
{
snake.dir=RIGHT;
}
break;
case ' ': //空格暂停游戏逻辑
while(1)
{
if(_getch()==' ')
return;
}
}
}
}
//8丶吃食物
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.r=rand()%10+5;
food.flag=true;
food.color=RGB(rand()%256,rand()%256,rand()%256);
}
}
//9丶暂停游戏
void stop()
{
if(_kbhit())
{
if(_getch()==' ')
{
while(_getch()==' ')
{
}
}
}
}
//10丶主函数
int main()
{
GameInit(); //初始化数据
while(1)
{
GameDraw(); //游戏绘制
snakeMove(); //让蛇动起来
KeyControl(); //通过按键改变蛇的方向
Eatfood(); //吃食物
Sleep(40); //控制蛇的速度
}
贪吃蛇完整代码(史上最详细)
于 2023-02-19 23:20:48 首次发布