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

原创 2006年06月06日 22:18:00

只有在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*/
    }
}

相关文章推荐

在linux下用c语言写贪吃蛇游戏

在linux系统下的非图形界面(在命令界面按ctrl+alt+F2,然后输入账号密码),用root用户进行编译。 #include #include #include #include #includ...

简单贪吃蛇游戏的c语言实现

简单贪吃蛇的c语言实现

C语言游戏之贪吃蛇--链表实现

早自习时突然想到怎么写贪吃蛇,话不多说,代码如下: 开发环境:vs2015 虽然开始还是出了很多指针问题。。。(很烦C语言指针)调试了很久也大概是可以畅快的玩了。 C语言新手,有很多写得不好的...
  • LYCAYF1
  • LYCAYF1
  • 2017年03月30日 17:37
  • 716

C语言程序简单实现贪吃蛇小游戏—不需要graphics.h头文件

最近学习了一些数据结构的知识,然后试着用链表实现一个小游戏(贪吃蛇),在网上看了一些别人写的代码,然后自己重新改写(以前是一个主函数,现在分成了几个小函数方便查看功能,加了内存释放函数)了。在这里发表...

C语言实现贪吃蛇(四)----游戏存档读档(文件操作)

前言:对于C语言的初学者来说,可能会觉得文件操作是一个比较陌生的领域,但实际上无论编写怎样的程序文件操作都是必需的。在操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统中的文件,因此所有...

Linux环境下C语言实现贪吃蛇游戏

转自:http://topic.csdn.net/u/20101001/01/2280b2dd-1446-439d-b1f8-cdd9db1fd615.html #include #i...

Linux 环境下C语言编译实现贪吃蛇游戏(转载)

本文转载 http://www.linuxidc.com/Linux/2011-08/41375.htm本文可以改进的就是它的链表实现的方式,可以考虑内核的链表实现 #include stdio....

贪吃蛇游戏 C语言程序设计

《计算机程序设计》课程设计报告   课 题 名 称     贪吃蛇游戏           班       级       软件1班            姓       名       neolo...
  • neolone
  • neolone
  • 2011年07月31日 19:09
  • 10112

基于c语言的贪吃蛇游戏

#include                         /*包含srand函数*/ #include                          /*基本输入输出函数*/ #in...

C语言:贪吃蛇游戏

相信每个人都接触过贪吃蛇游戏,而对于学习C语言的同学来说,一开始是不是觉得C语言写不出什么东西来呢? 那么,贪吃蛇应该是第一步,开始了解一些模块化的知识,一些面向对象的思想,一些小项目的编写。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我自己写的第一个游戏--贪吃蛇(c语言实现)
举报原因:
原因补充:

(最多只允许输入30个字)