c语言编写贪吃蛇

这篇文章描述了一个使用MicrosoftVisualStudio2010集成开发环境和EasyX图形库编写的蛇形游戏程序。代码包括初始化蛇和食物、绘制、移动、碰撞检测以及得分显示等功能。游戏中的蛇会根据用户输入的方向键移动,碰到边界或自身则游戏结束。
摘要由CSDN通过智能技术生成

 编译环境  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);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值