编译环境 Microsoft Visual Studio 2010 安装easyx图像库
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<conio.h>
#include<time.h>
/********************************
* 坐标轴
* 蛇的属性
* 食物的属性
*********************************/
typedef struct piontXY
{
int X;
int Y;
}MYPOINT;
struct Snake
{
int nun;
MYPOINT xy[1000] ;
char postion;
}snake;
struct Food
{
MYPOINT fdxy;
int eatgrade;
int flag;
}food;
HWND hwnd=NULL;//表示窗口
enum movPostion{right=77,left=75,down=80,up=72};
/********************************
* 初始化蛇 initSnake
* 画蛇 drawSnake
* 移动蛇 moveSnake
* 案件处理 keyDown
* 初始化食物 initFood
* 画食物 drawFood
* 吃食物 eatFood
* 挂掉 snakeDei
*********************************/
void initSnake();
void drawSnake();
void moveSnake();
void keyDown();
void initFood();
void drawFood();
void eatFood();
int snakeDei();
void showGrade();
void pauseMoment();
int main()
{
srand((unsigned int)time(NULL));//随机函数种子
hwnd=initgraph(650,480);
setbkcolor(WHITE);
initSnake();
while(1)
{
cleardevice();
drawFood();
if (food.flag==0)
{
initFood();
}
drawSnake();
eatFood();
showGrade();
moveSnake();
if(snakeDei())
break;
while(_kbhit())
{
pauseMoment();
keyDown();
}
Sleep(50);
}
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.nun=3;
snake.postion=right;
food.eatgrade=0;
}
void drawSnake()
{
for(int i =0 ; i<snake.nun ; i++)
{
setlinecolor(BLUE);
setfillcolor(GREEN);
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.nun-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 ;//产生10的倍数
food.fdxy.Y=rand()%48*10 ;
food.flag=1;
for(int i = 0 ;i<snake.nun;i++)
{
if (food.fdxy.X== snake.xy[i].X && food.fdxy.Y== snake.xy[i].Y )
{
food.fdxy.X=rand()%65*10 ;//重合则重新产生
food.fdxy.Y=rand()%48*10 ;
}
}
}
void drawFood()
{
setlinecolor(BLUE);
setfillcolor(RED);
fillrectangle(food.fdxy.X,food.fdxy.Y,food.fdxy.X+10,food.fdxy.Y+10);
}
void eatFood()
{
if(food.fdxy.X== snake.xy[0].X && food.fdxy.Y== snake.xy[0].Y)
{
snake.nun++;
food.eatgrade+=10;
food.flag=0;
}
}
int snakeDei()
{
if (snake.xy[0].X>650 || snake.xy[0].X < 0 || snake.xy[0].Y>480 || snake.xy[0].Y < 0 )
{
outtextxy(200,200,"你撞南墙了!!!");
MessageBox(hwnd,"Game Over !!!","撞墙警告!!!",MB_OK);
return 1;
}
for (int i =1;i<snake.nun;i++)
{
if (snake.xy[0].X==snake.xy[i].X && snake.xy[0].Y==snake.xy[i].Y)
{
outtextxy(200,200,"你撞自己了!!!");
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-30,20,"分数");
outtextxy(580+50-30,20,grade);
}
void pauseMoment()
{
if(_getch()==32)
while(_getch()!=32);
}