关闭

我自己写的第一个游戏--贪吃蛇(c语言实现)

1228人阅读 评论(1) 收藏 举报

只有在tc2.0或wintc下编译才能通过,vc不能 

基本算法:

这个程序是通过对显存的控制实现的,一个指针指向这个显存的首地址,通过改变一个点的值来实现屏幕上画点操作。

1.    有两个点,第一个根据键盘输入来实现画点操作,第二个点在后面清楚所画的点,使玩家觉得是一只蛇在屏幕上走动。

2.    第二个点(清楚点)实现:游戏开始时,这个点处于暂停状态(实现蛇的长度),当第一个点画到一定长度时,这个点开始运动(扫描周围已经画的点,然后清楚,依次类推,可以实现蛇的走动)。

其他细节在下面可以看到

不过这个程序还有个缺陷,当蛇尾和蛇身相邻走动时会出现错误,这是由扫描函数的漏洞引起的,我也不想改了,就像所有的事情都会留有遗憾一样,程序也有漏洞,就当是给我的一个教训吧。

这个程序就到此为止。

#include<dos.h>
#include <bios.h>

#define UP 5
#define LEFT 1
#define DOWN 2
#define RIGHT 3

#define BUP 18432
#define BDOWN 20480
#define BLEFT 19200
#define BRIGHT 19712
#define BESC 283

void point(int x, int y, char far *p, int i);     /*paint point*/
int scan (int x,int y, char far *p );               /*search the tail*/
void clear (char far *p);                              /*clean the marks*/
void graph(int i,char far *p);                      /*input score or fail alarm*/
void sand(char far *p);                              /*paint random point */
void box(char far *p);                                 /*edge*/
int x0=100,y0=70;
int success=0;
int pt = 0;
int tail = 0;
int i=0;

main()
{
int length = 20;
int control = 1;
int x=100,y=70;
int i;
char far *p;
union REGS r;
r.h.al=0x13;
r.h.ah=0;
int86(0x10,&r,&r) ;
p=(char far *)(0xa0000000l);                       /*It's just a format to use video cache*/

printf ("Score:%3d",success);
sand(p);
box(p);
while (1)
{
    control = bioskey(0);

    switch (control)
    {
        case BUP:
        while(!bioskey(1))
        {
            if (tail>0)      /*length more*/
                tail--;
            if (length>0)
                length--;
            if (length == 0 && tail==0)
            {clear (p);}

            y--;
            if (y == 9)
                y = 150;
            point(x, y, p,123);
        }break;
        case BDOWN:
        while(!bioskey(1))
        {
            if (tail>0)      /*length more*/
                tail--;
            if (length>0)
                length--;
            if (length == 0 && tail==0)
                clear (p);
            y++;
            if (y==151)
              y = 10;
            point(x, y, p,123);
        }break;
        case BLEFT:
        while(!bioskey(1))
        {
            if (tail>0)      /*length more*/
                tail--;
            if (length>0)
              length--;
            if (length == 0 && tail==0)
                clear (p);
            x--;
            if (x == 79)
               x = 220;
            point(x, y, p,123);
        }break;
        case BRIGHT:
        while(!bioskey(1))
        {
            if (tail>0)      /*length more*/
                tail--;
            if (length>0)
               length--;
            if (length == 0 && tail==0)
                clear (p);
            x++;
            if (x == 221)
                x = 80;
            point(x, y, p,123);
        }break;
        default:
            exit(0);
    }
}
}

void point (int x, int y, char far *p, int i)
{
    if (i == 123)  /*paint*/
    {
        if((*(p+320*y+x)==123))
        {
            graph(0,p);
        }
        else if (*(p+320*y+x)==78)
        {
            graph(1,p);
            tail =5;
            sand(p);
        }
    }
    *(p+320*y+x) = i;
    if (i == 123)
    delay (4000);
}

int scan (int x, int y, char far * p)
{
    if (*(p+320*y+x+1)==123)
        return RIGHT;
    else if (*(p+320*y+x-1)==123)
        return LEFT;
    else if (*(p+320*y+x+320)==123)
        return DOWN;
    else if (*(p+320*y+x-320)==123)
        return UP;
}

void clear (char far * p)
{
    int state;
    state = scan (x0,y0,p);
    if (state == RIGHT)
    {
        x0++; point (x0,y0,p,0);
        if (x0==220)
        {
            x0=80;
        }
        point (x0,y0,p,0);
    }
    if (state == LEFT)
    {
        x0--;  point (x0,y0,p,0);
        if (x0==80)
        {
              x0=220;
        }
        point (x0,y0,p,0);

     }
     if (state == DOWN)
     {
         y0++;   point (x0,y0,p,0);
         if (y0==150)
         {
             y0 = 10;
         }
         point (x0,y0,p,0);
     }
     if (state == UP)
     {
        y0--;  point (x0,y0,p,0);
        if (y0==10)
        {
            y0=150;
        }
        point (x0,y0,p,0);
     }
}

void graph (int i,char far *p)
{
    if (i == 0)
    {
        printf ("/n/n/n/n/n/t       FAILED!!!");
        box(p);
        sleep(1);
        getch();
        exit(0);
    }
    else
    {
        success++;
        printf ("/b/b/b%3d",success);
    }
}

void sand (char far *p)
{
    pt ++;
    if (pt == 7)
    {
        pt = 1;
        i++;
    }
    switch (pt)
    {
    case 1:
    *(p+320*14+12+320*(10+i)+80+i) = 78;break;
    case 2:
    *(p+320*48+50+320*(10+i)+80+i) = 78;break;
    case 3:
    *(p+320*67+110+320*(10+i)+80+i) = 78;break;
    case 4:
    *(p+320*53+100+320*(10+i)+80+i) = 78;break;
    case 5:
    *(p+320*90+25+320*(10+i)+80+i) = 78;break;
    case 6:
    *(p+320*80+120+320*(10+i)+80+i) = 78;
    }
}

void box(char far *p)
{
    int i;
    for (i=79; i<=221; i++)
    {
        *(p+320*9+i) = 344;     /*top*/
        *(p+320*151+i) = 344;   /*botton*/
    }
    for (i=9; i<=151; i++)
    {
        *(p+320*i+79)=344;   /*left*/
        *(p+320*i+221)=344;  /*right*/
    }
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2163次
    • 积分:43
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章存档