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

只有在tc2.0下才能编译通过,vc不能通过,因为vc下不提供dos.h头文件。

基本算法:

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

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);

    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) = 345; /*top*/
        *(p+320*151+i) = 345; /*botton*/
    }
    for (i=9; i<=151; i++)
    {
        *(p+320*i+79)=345; /*left*/
        *(p+320*i+221)=345; /*right*/
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值