贪吃蛇C实现

来源:互联网 发布:拼长图软件哪个好 编辑:程序博客网 时间:2024/04/28 22:42

给自己的生日礼物

#include "stdlib.h"
#include "graphics.h"
#define UP 1
#define LEFT 2
#define DOWN 3
#define RIGHT 4
#define KEY_UP 0x4800
#define KEY_LEFT 0x4b00
#define KEY_DOWN 0x5000
#define KEY_RIGHT 0x4d00
#define KEY_SPACE 0x3920

struct node {
    unsigned int x;
    unsigned int y;
    struct node *next;
};
struct apple {
    unsigned int x;
    unsigned int y;
};
struct snake {
    struct node *head;
    struct node *rear;
    int direct;
    int length;
};

struct snake greedy;
struct apple akiss;

void init()
{
    int i;
    struct node *p;
    setfillstyle(SOLID_FILL,2);
    for(i=1;i<6;i++)
    {
        p=(struct node *)malloc(sizeof(struct node));
        if(p==NULL)
     {
            printf("Memory alloc faild!/n");
            return ;
     }
        p->x=20*i;
        p->y=20;
        p->next=NULL;
        if(greedy.head==NULL)
     {
            greedy.head=p;
            greedy.rear=p;
     }
        else
     {
            greedy.head->next=p;
            greedy.head=greedy.head->next;
     }
        bar(p->x+1,p->y+1,p->x+19,p->y+19);
    }
    greedy.direct=4;
    greedy.length=5;
    setcolor(2);
    line(20,20,620,20);
    line(20,460,620,460);
    line(20,20,20,460);
    line(620,20,620,460);
}

void delsnake()
{
    struct node *p;
    for(p=greedy.rear;p!=NULL;p=greedy.rear)
    {
        greedy.rear=greedy.rear->next;
        free(p);
    }
}

void putapple()
{
    struct node *p=greedy.rear;
AGAIN:
    srand(time(NULL));
    akiss.x=random(30)*20+20;
    akiss.y=random(20)*20+20;
    for(;;p=p->next)
    {
        if(p->x==akiss.x && p->y==akiss.y)
            goto  AGAIN;
        if(p==greedy.head)
            break;
    }
    setcolor(4);
    bar(akiss.x+2,akiss.y+2,akiss.x+18,akiss.y+18);
}

void moveandeat()
{
    struct node *p=NULL;

    if(greedy.head->x!=akiss.x || greedy.head->y!=akiss.y)
    {
        setfillstyle(SOLID_FILL,BLACK);
        bar(greedy.rear->x+1,greedy.rear->y+1,greedy.rear->x+19,greedy.rear->y+19);
        setfillstyle(SOLID_FILL,2);
        bar(greedy.head->x+1,greedy.head->y+1,greedy.head->x+19,greedy.head->y+19);
        for(p=greedy.rear;p!=greedy.head;p=p->next)
     {
            p->x=p->next->x;
            p->y=p->next->y;
     }
    }
    else
    {
        p=(struct node *)malloc(sizeof(struct node));
        if(p==NULL)
            return ;
        p->x=greedy.head->x;
        p->y=greedy.head->y;
        p->next=NULL;
        greedy.head->next=p;
        setfillstyle(SOLID_FILL,2);
        bar(greedy.head->x+1,greedy.head->y+1,greedy.head->x+19,greedy.head->y+19);
        greedy.head=p;
        putapple();
        greedy.length++;
    }
    if(greedy.direct==1)
        greedy.head->y-=20;
    if(greedy.direct==2)
        greedy.head->x-=20;
    if(greedy.direct==3)
        greedy.head->y+=20;
    if(greedy.direct==4)
        greedy.head->x+=20;
    setfillstyle(SOLID_FILL,14);
    bar(greedy.head->x+1,greedy.head->y+1,greedy.head->x+19,greedy.head->y+19);
}

int check()      /*normal--0  ortherwise--1*/
{
    struct node *p=greedy.rear;
    if(greedy.head->x>600 || greedy.head->x<20 || greedy.head->y>440 || greedy.head->y<20)
        return 1;
    for(;p!=greedy.head;p=p->next)
        if(p->x==greedy.head->x && p->y==greedy.head->y)
            return 1;
    return 0;
}

void play(long speed)
{
    int key;
    for(putapple();;)
    {
        if(kbhit()!=0)
     {
            key=bioskey(0);
            switch (key)
      {
                case KEY_UP:
                    if(greedy.direct!=3)
                        greedy.direct=1;
              break;
                case KEY_LEFT:
                    if(greedy.direct!=4)
                        greedy.direct=2;
              break;
                case KEY_DOWN:
                    if(greedy.direct!=1)
                        greedy.direct=3;
              break;
                case KEY_RIGHT:
                    if(greedy.direct!=2)
                        greedy.direct=4;
      }
            if(key==KEY_SPACE)
                while(getch()!=' ');
     }
        moveandeat();
        if(check()==1)
            break;
        delay(speed);
    }
}

main()
{
    int gdrive=DETECT,mode,speed;
    char *str=NULL;
    clrscr();
    gotoxy(30,10);
    printf("Input level(1-10):");
    scanf("%d",&speed);
    registerbgidriver(EGAVGA_driver);
    initgraph(&gdrive,&mode,"d://tc");
    init();
    while(getch()!=' ');
    play(speed*2000);
    setcolor(15);
    outtext("GAME OVER!    SCORE:");
    outtext(itoa(greedy.length-5,str,10));
    while(getch()!=' ');
    delsnake();
    closegraph();
}

原创粉丝点击