我自己写的第一个游戏--贪吃蛇(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*/
    }
}

C语言贪吃蛇Linux版

/* ======================================= */Update: 20170713新版贪吃蛇:传送门/* =========================...
  • stc_XC
  • stc_XC
  • 2015年12月20日 17:53
  • 1978

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

在linux系统下的非图形界面(在命令界面按ctrl+alt+F2,然后输入账号密码),用root用户进行编译。 #include #include #include #include #includ...
  • lingfeng2019
  • lingfeng2019
  • 2017年04月25日 20:23
  • 355

一个C语言编写的贪吃蛇游戏

在VC6.0平台上,通过C语言和EasyX图形库编写的贪吃蛇小游戏,为了使用图形库函数,建立的文件是.cpp文件,使用的是C语言编写,游戏具有背景音乐,代码长度500行左右,代码和算法,都是我自己源生...
  • wang_dong001
  • wang_dong001
  • 2015年07月27日 15:59
  • 23500

贪吃蛇游戏,基于C语言,vs2010平台

贪吃蛇游戏,基于C语言,vs2010平台
  • njut_water
  • njut_water
  • 2017年02月26日 20:20
  • 1090

C语言-手把手教你写贪吃蛇AI(中)

1. 目标 这一部分主要是讲解编写贪吃蛇AI所需要用到的算法基础。 2. 问题分析 贪吃蛇AI说白了就是寻找一条从蛇头到蛇尾的一条最短路径,同时这条路径需要避开障碍物,这里仅有的障碍就是蛇身。而A...
  • kuweicai
  • kuweicai
  • 2017年03月28日 22:19
  • 2126

用C语言编写贪吃蛇代码(难度可选)

/********************************************************* ********************贪吃蛇(难道可选)************...
  • u012220268
  • u012220268
  • 2013年10月24日 17:56
  • 10536

纯C语言实现贪吃蛇游戏(VC6.0)

转自C语言网 今天笔者为大家展示C语言写的贪吃蛇游戏,让大家玩一玩自己写的游戏~ 是纯C语言哦~VC6.0开发 无问题   首先,开始界面: 游戏界面如下: ...
  • gin1008
  • gin1008
  • 2016年10月10日 19:51
  • 30329

C语言实现贪吃蛇(一)----数组实现

本人是一个C语言新手,在网上看到有的人用C实现了贪吃蛇的游戏,想着为了巩固一下自己的C语言,然后就学着写了一个,当然基本上是Copy别人的代码,然后加上自己的理解。在这里做一下记录,也希望能够帮助那些...
  • baidu_30000217
  • baidu_30000217
  • 2016年11月16日 22:54
  • 5230

c语言版贪吃蛇《课程设计》

主要运用了光标的移动-.- 教程会在一个月内发布-.-最近考试好多...... 看代码应该能看懂.... 代码: #include #include #include #include #includ...
  • leibniz_zhang
  • leibniz_zhang
  • 2016年06月28日 10:35
  • 4265

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

早自习时突然想到怎么写贪吃蛇,话不多说,代码如下: 开发环境:vs2015 虽然开始还是出了很多指针问题。。。(很烦C语言指针)调试了很久也大概是可以畅快的玩了。 C语言新手,有很多写得不好的...
  • LYCAYF1
  • LYCAYF1
  • 2017年03月30日 17:37
  • 1113
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我自己写的第一个游戏--贪吃蛇(c语言实现)
举报原因:
原因补充:

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