#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;
int r; //食物大小
bool flag; //是否被吃
DWORD color;
}food;
//游戏数据初始化
void GameInit()
{
//创建窗口
initgraph(640, 480,SHOWCONSOLE);
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;//i == 0 x = 20 的位置
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 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);
}
EndBatchDraw();
//生成食物
if (food.flag)
{
solidcircle(food.x, food.y, food.r);
}
}
void SnakeMove()//蛇的移动
{
// Move the tail first
for (int i = snake.size - 1; i > 0; i--)
{
snake.coor[i] = snake.coor[i - 1];
}
// Move the head based on the direction
switch (snake.dir)
{
case UP:
snake.coor[0].y -= snake.speed;
if (snake.coor[0].y+10 <= 0)
{
snake.coor[0].y = 640;
}
break;
case DOWN:
snake.coor[0].y+= snake.speed;
if (snake.coor[0].y - 10 >= 480)
{
snake.coor[0].y = 0;
}
break;
case RIGHT:
snake.coor[0].x+= snake.speed;
if (snake.coor[0].x + 10 >= 640)
{
snake.coor[0].x = 0;
}
break;
case LEFT:
snake.coor[0].x-= snake.speed;
if (snake.coor[0].x + 10 <= 0)
{
snake.coor[0].x = 640;
}
break;
}
}
//判断吃食物
void eat_food()
{
if (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++;
}
}
//重新生成食物
void remake_food()
{
//如果食物消失,重新生成一个食物
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;
}
}
//通过按键改变蛇的移动方向
void KeyControl()
{
//判断有没有按键,如果有按键,就返回真
if (_kbhit())
{
int key = _getch();
switch (key)
{
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;
case ' ':
{
while (1)
{
if (_getch() == ' ')
{
break;
}
}
}
}
}
}
int main()
{
GameInit();
GameDraw();
while (1)
{
GameDraw();
SnakeMove();
KeyControl();
eat_food();
remake_food();
Sleep(50);
}
return 0;
}
【c语言/easyX】贪吃蛇--源码
最新推荐文章于 2024-07-13 12:01:25 发布