用到函数的调用和实现,用到easyx,结构体,数组等
也可以用链表来写,在linux上用vim写贪吃蛇原理差不多。
进行初始化
原本想用srand(time(null))的发下有时食物出不来就用了GETtick...
移动蛇:
用键位控制:
_kbhit是确认是否有按键按下,有就为1否则为0,_getch()是输入的字符.
画图:
调用easyx头文件,用来画图
食物随机出现:
蛇头碰到食物蛇尾加1
上面移动的是没有死亡的,下面这个移动到边界就是死亡:
打印菜单:
主函数:
#include<stdio.h>
#include<graphics.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<string.h>
void Game_draw();
void Game_Init();
void Move_snake();
void keyborad();
void snake_food();
int menu();
void snake_food_hard();
int Move_snake_siwang();
#define MAX_num 500
#define my_high 800
#define my_wide 800
enum dir
{
RIGHT,
DOWN,
UP,
LEFT,
};
struct Sanke
{
int szie;//蛇的节数
int dir;//蛇的方向
int speed;//蛇的速度
POINT coor[MAX_num];//坐标
}sanke;
struct Food
{
int x;
int y;
int r;
bool flag;
}food;
int main(void)
{
k:
int choose,i;
int l = 1;
choose=menu();
switch (choose)
{
case 3:
Game_Init();
while (1)
{
Game_draw();
Move_snake();
keyborad();
snake_food();
Sleep(100);
}
break;
case 2:
Game_Init();
while (1)
{
Game_draw();
if (l == 1)
{
l = Move_snake_siwang();
}
else
{
goto p;
}
keyborad();
snake_food();
Sleep(20);
}
break;
case 1:
Game_Init();
while (1)
{
Game_draw();
if (l == 1)
{
l = Move_snake_siwang();
}
else
{
goto p;
}
keyborad();
snake_food();
Sleep(100);
}
break;
}
p:
printf("you die ,please choose repeat or quit 1 or 0 :");
scanf_s("%d", &i);
if (i == 1)
{
goto k;
}
return 0;
}
void Game_Init()
{
initgraph(my_high,my_wide,SHOWCONSOLE);//设置命令框格,图形大小,SHOWCONSOLE显示控制台;
sanke.szie = 3;//初始话蛇定义其节数
sanke.speed = 10;
sanke.dir=RIGHT;
for (int i = 0; i<= sanke.szie-1; i++)
{
sanke.coor[i].y = 10;
sanke.coor[i].x = 100-10*i;
}
srand(GetTickCount());
food.x = rand() % my_wide+20;
food.y = rand() % my_high+20;
food.flag = true;
food.r = rand() % 10 + 5;
}
void Move_snake()
{
for (int i = sanke.szie- 1; i >0; i--)
{
sanke.coor[i] = sanke.coor[i - 1];
}
switch (sanke.dir)
{
case UP:
if (sanke.coor[0].y <= 0)
{
sanke.coor[0].y = my_high;
}
sanke.coor[0].y -= sanke.speed;
break;
case DOWN:
if (sanke.coor[0].y >= my_high)
{
sanke.coor[0].y = 0;
}
sanke.coor[0].y += sanke.speed;
break;
case LEFT:
if (sanke.coor[0].x <= 0)
{
sanke.coor[0].x = my_wide;
}
sanke.coor[0].x -= sanke.speed;
break;
case RIGHT:
if (sanke.coor[0].x>=my_wide)
{
sanke.coor[0].x = 0;
}
sanke.coor[0].x += sanke.speed;
break;
}
}
void keyborad()
{
if (_kbhit())
{
switch (_getch())
{
case 'W':
case 'w':
if (sanke.dir != DOWN)
{
sanke.dir =UP;
}
break;
case 'S':
case 's':
if (sanke.dir != UP)
{
sanke.dir = DOWN;
}
break;
case 'A':
case 'a':
if (sanke.dir != RIGHT)
{
sanke.dir = LEFT;
}
break;
case 'D':
case 'd':
if (sanke.dir != LEFT)
{
sanke.dir = RIGHT;
}
break;
case ' ':
while (1)
{
if (_kbhit())
{
if (_getch() == ' ')
{
break;
}
}
}
break;
}
}
}
void Game_draw()
{
BeginBatchDraw();
setbkcolor(RGB(28, 115, 119));//设置背景颜色
cleardevice();
setfillcolor(WHITE);
//绘制蛇
for (int i =0; i <= sanke.szie-1; i++)
{
solidcircle(sanke.coor[i].x, sanke.coor[i].y, 5);//绘制⚪函数
}
if (food.flag)
{
solidcircle(food.x, food.y, food.r);
}
//solidcircle(sanke.coor[0].x, sanke.coor[0].y, 5);
EndBatchDraw();
}
void snake_food()
{
if (sanke.coor[0].x <= food.x +food.r && sanke.coor[0].x >= food.x -food.r&&sanke.coor[0].y >= food.y - food.r && sanke.coor[0].y <= food.y + food.r)
{
food.flag = false;
sanke.szie++;
}
if (!food.flag)
{
srand(GetTickCount());
food.x = rand() % my_wide+1;
food.y = rand() % my_high+1;
food.flag = true;
food.r = rand() % 10 + 5;
}
}
int menu()
{
int a;
printf("#############################\n");
printf("#### welcome to game ####\n");
printf("#### 1.start easy game ####\n");
printf("#### 2.start hard game ####\n");
printf("#### 3.start wudi game ####\n");
printf("#### 4.close game ####\n");
printf("#############################\n");
printf(" please choose the number:");
scanf_s("%d", &a);
return a;
}
void snake_food_hard()
{
if (sanke.coor[0].x <= food.x + food.r && sanke.coor[0].x >= food.x - food.r && sanke.coor[0].y >= food.y - food.r && sanke.coor[0].y <= food.y + food.r)
{
food.flag = false;
sanke.szie++;
sanke.speed ++;
}
if (!food.flag)
{
srand(GetTickCount());
food.x = rand() % my_wide+1;
food.y = rand() % my_high+1;
food.flag = true;
food.r = rand() % 10 + 5;
}
}
int Move_snake_siwang()
{
int l = 1;
for (int i = sanke.szie - 1; i > 0; i--)
{
sanke.coor[i] = sanke.coor[i - 1];
}
switch (sanke.dir)
{
case UP:
if (sanke.coor[0].y <= 0)
{
l = 0;
return l;
}
sanke.coor[0].y -= sanke.speed;
break;
case DOWN:
if (sanke.coor[0].y >= my_high)
{
l = 0;
return l;
}
sanke.coor[0].y += sanke.speed;
break;
case LEFT:
if (sanke.coor[0].x <= 0)
{
l = 0;
return l;
}
sanke.coor[0].x -= sanke.speed;
break;
case RIGHT:
if (sanke.coor[0].x >= my_wide)
{
l = 0;
return l;
}
sanke.coor[0].x += sanke.speed;
break;
}
return 1;
}