| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9864 人关注过本帖, 3 人收藏
标题:[原创]贪吃蛇
取消只看楼主 加入收藏
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏(3)
 问题点数:0 回复次数:7 
[原创]贪吃蛇
/************************    文本方式的贪吃蛇   ********************************/
/************************     tc2.0 运行成功    ********************************/
/************************       作者:沉路      ********************************/

#include <stdio.h>
#include <stdlib.h>
#define X 21
#define Y 8
#define MID_SPEED 5           /* 中等速度 */
#define MAX_SPEED 60          /* 最大速度 */

/* 键盘码 */
#define LEFT 19200
#define RIGHT 19712
#define UP 18432
#define DOWN 20480
#define ESC 283
#define SPACE 14624
#define ENTER 7181

int a,b;                   /* 食物坐标 */
int x,y;                   /* 蛇头坐标 */
int num;		   /* 蛇长 */
int room1[100][2];         /* 保存蛇各结点坐标 */
int room2[100][2];
int aspect;            /* 方向 */
int speed;              /* 速度 */

void left();
void right();
void up();
void down();
void goleft();
void goright();
void goup();
void godown();
void produce();
void getxy();
void check();
void eat();
void cut();
void set();
void mydelay();
void draw();
void start();
void go();

main()
{
    int i;
    int key;

    /* 初始化 */
    clrscr();
    start();
    printf("***\b");

    num=3;
    speed=MID_SPEED;               /* 设置初速度 */
    aspect=RIGHT;                  /* 置初始方向状态为右 */

    /* 设置初始结点坐标 */
    room1[0][0]=4;
    room1[0][1]=2;
    room1[1][0]=3;
    room1[1][1]=2;
    room1[2][0]=2;
    room1[2][1]=2;

    produce();                /* 产生第一个食物 */
    go();                     /* 行动 */

    while(1)
    {
	check();                /* 检查是否与自身相碰 */
	if(speed>MID_SPEED)     /* 模拟摩擦力,让速度趋于正常 */
	{
	    speed--;
	}
	go();                 /* 行动 */

	/* 如果有按键,进行处理 */
	if(kbhit())
	{
	    key=bioskey(0);              /* 接收按键 */
	    if(key==LEFT)
	    {
		if(x>2)
		{   /* 如果方向相反,减速 */

		    if(aspect==RIGHT)       
		    {
			speed--;
		    }
		    else
		    {    /* 如果方向相同,加速*/

			if((aspect==LEFT)&&(speed<MAX_SPEED))   
  			{			    
                                speed+=2;
			}
			else                 /* 改变方向,重置速度 */
			{
			    aspect=LEFT;
			    speed=MID_SPEED;
			}
		    }
		}
	    }

	    if(key==RIGHT)
	    {
		if(x<79)
		{
		    if(aspect==LEFT)
		    {
			speed--;
		    }
		    else
		    {
			if((aspect==RIGHT)&&(speed<MAX_SPEED))
			{
			    speed+=2;
			}
			else
			{
			    aspect=RIGHT;
			    speed=MID_SPEED;
			}
		    }
		}
	    }

	    if(key==DOWN)
	    {
		if(y<24)
		{
		    if(aspect==UP)
		    {
			speed--;
		    }
		    else
		    {
			if((aspect==DOWN)&&(speed<MAX_SPEED))
			{
			    speed+=2;
			}
			else
			{
			    aspect=DOWN;
			    speed=MID_SPEED;
			}
		    }
		}
	    }

	    if(key==UP)
	    {
		if(y>2)
		{
		    if(aspect==DOWN)
		    {
			speed--;
		    }
		    else
		    {
			if((aspect==UP)&&(speed<MAX_SPEED))
			{
			    speed+=2;
			}
			else
			{
			    aspect=UP;
			    speed=MID_SPEED;
			}
		    }
		}
	    }

	    if(key==SPACE)    /* 手动产生一个食物 */
	    {
		produce();
	    }

	    if(key==ENTER)         /* 暂停 */
	    {
		getch();
	    }
	   
	    if(key==ESC)           /* 退出游戏 */
	    {
		exit(0);
	    }

	}                          /* end of if */
    }                              /* end of while */
}                                  /* end of main */

/***************************************************************/

void left()
{
   int i;

   getxy();                      /*   取得当前坐标  */
   if((x==a+1)&&(y==b))          /* 遇到零星 */
   {
      eat();
   }
   else
   {
      cut();                     /* 砍掉尾巴 */
      gotoxy(x-1,y);             /* 前面加一个 */
      printf("*\b");
      set();                     /* 重置结点坐标 */
   }
}
/*********************************************/
void right()
{  int i;
   getxy();
   if(x==a-1 && y==b)
   {
       eat();
   }
   else
   {
       cut();
       gotoxy(x+1,y);
       printf("*\b");
       set();
   }
}
/*********************************************/
void down()
{
   int i;

   getxy();
   if((x==a)&&(y==b-1))
   {
       eat();
   }
   else
   {
       cut();
       gotoxy(x,y+1);
       printf("*\b");
       set();
   }
}
/**********************************************/
void up()
{
   int i;

   getxy();
   if((x==a)&&(y==b+1))
   {
       eat();
   }
   else
   {
       cut();
       gotoxy(x,y-1);
       printf("*\b");
       set();
   }
}
/***************** 产生一个食物函数********************************/
void produce()
{
   int i;

   getxy();

   randomize();
   a=random(78);
   randomize();
   b=random(23);
   gotoxy(a,b);
   printf("*");

   gotoxy(x,y);
}
/************** 取得当前坐标函数 ********************/
void getxy()
{
   x=wherex();
   y=wherey();
}
/*************** 检查是否与自己相遇函数 ********************/
void check()
{
    int i;

    getxy();
    for(i=1;i<num;i++)
    {
	if(x==room1[i][0] && y==room1[i][1])
	{
	    exit(0);
	}
    }
}
/***************** 吃食物函数 ********************/
void eat()
{
    int i;

    gotoxy(a,b);                        /* 把光标移动到零星的位置 */
    room2[0][0]=a;                      /* 把数组2的头座标定为零星的坐标 */
    room2[0][1]=b;
    for(i=0;i<num;i++)                  /* 把数组1接到数组2后面 */
    {
	room2[i+1][0]=room1[i][0];
	room2[i+1][1]=room1[i][1];
    }

    num++;                              /* 星数改变 */
    for(i=0;i<num;i++)                  /* 把数组2复制给数组1 */
    {
	room1[i][0]=room2[i][0];
	room1[i][1]=room2[i][1];
    }
    produce();                          /* 产生另一个星 */
}
/********************** 删除尾巴函数 ***************************/
void cut()
{
    gotoxy(room1[num-1][0],room1[num-1][1]);               
    printf(" ");
    gotoxy(room1[0][0],room1[0][1]);
}
/************************************************/
void set()
{
    int i;

    getxy();                          /* 数组2获取头坐标 */
    room2[0][0]=x;
    room2[0][1]=y;

    for(i=0;i<num-1;i++)              /* 连接 */
    {
	room2[i+1][0]=room1[i][0];
	room2[i+1][1]=room1[i][1];
    }
    for(i=0;i<num;i++)                /* 复制 */
    {
	room1[i][0]=room2[i][0];
	room1[i][1]=room2[i][1];
    }
}
/***************** 向右运动函数 ******************************/
void goright()
{
    while(!kbhit()&&(x<79))
    {
	right();
	mydelay();
    }
}
/****************** 向左运动函数 ******************************/
void goleft()
{
    while(!kbhit()&&(x>2))
    {
	left();
	mydelay();
    }
}
/****************** 向上运动函数 *******************************/
void goup()
{
    while(!kbhit()&&(y>2))
    {
	up();
	mydelay();
    }
}
/******************* 向下运动函数*********************************/
void godown()
{
    while(!kbhit()&&(y<24))
    {
	down();
	mydelay();
    }
}
/******************* 自定义延时函数 ******************************/
void mydelay()
{
    int i;
    for(i=0;i<60-speed;i++)
    {
	delay(1000);
    }
}
/************** 画边框函数 ***********************  */
void draw()
{
    int i;

    gotoxy(1,1);
    for(i=1;i<=25;i++)
    {
	printf("*\n");
    }

    gotoxy(2,1);
    for(i=1;i<79;i++)
    {
	printf("*");
    }

    for(i=1;i<=25;i++)
    {
	printf("*");
	gotoxy(80,i);
    }

    gotoxy(1,25);
    for(i=1;i<=80;i++)
    {
	printf("*");
    }

    gotoxy(X+5,25);
    printf(" Esc exit    Enter pause ");
    gotoxy(X+2,1);
    printf(" If you have no food,press Space ");

    gotoxy(2,2);
}
/****************** 运动函数 ****************************/
void go()
{
    switch(aspect)
    {
	case LEFT: goleft();
	break;
	case RIGHT: goright();
	break;
	case DOWN: godown();
	break;
	case UP: goup();
	break;
    }
}
/********************* 初始化函数 *************************/
void start()
{
    gotoxy(X,Y-3);
    printf("Welcome to play the game tanchishe");

    gotoxy(X+3,Y);
    printf("%c left  ",27);
    printf("%c right  ",26);
    printf("%c up  ",24);
    printf("%c down",25);

    gotoxy(X+7,Y+8);
    printf("Press any key to start");
    gotoxy(1,1);
    draw();
    printf("***\b");
    getch();
    clrscr();
    draw();
}
搜索更多相关主题的帖子: 贪吃 
2006-04-18 15:35
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 

呵呵,你是怎么知道的?


我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-04-18 18:06
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 
to 4楼:你说得对。我这个程序问题问题挺多的。我大量用了全局变量,这本该用指针来实现;用数组保存坐标很别扭,应该改用结构体。我会改写它的。

to 6楼:这就是tc2.0环境下运行的。

我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-04-19 19:04
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 

to soft_wind:我这个程序不是图形的,是文本的。图形教程网络上很多。我这里也有一个《C游戏编程从入门到精通》,要的人把邮箱留下。如果可以交给管理员让他发布出来给大家下载最好了。


我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-04-23 07:13
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 

to 白色兔子&everajax:文本模式写动画程序是要难些。关键是屏幕光标如何倒退(向上)问题。我曾经写过一个打字游戏,就是用清屏来实现的。但这次没有,因为我找到了一个函数gotoxy(),它可以实现光标定位。

还有一个问题就是:在文本模式下的半屏幕问题。这一直让我困惑不解。就是系统对屏幕的识别只有上半部分,对下半部分,它无法用clrscr来清屏,也无法用gotoxy来定位,这就是我这个程序的边框只限制在屏幕的上半部分的缘故——但有趣的是,EXE程序运行时,却是全屏幕的,只是“垂直分辨率”被提高了一倍。

不知道哪位高人可以解释一下上述问题,谢谢!

[此贴子已经被作者于2006-4-23 7:31:08编辑过]


我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-04-23 07:30
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 
luhao,soft_wind,tianyi1:
我已经把压缩包发给你们了,请查收。

我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-04-23 18:22
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 
以下是引用Knocker在2006-4-23 9:32:00的发言:


TC中的gotoxy是针对dos写的,TC的IO函数很多都直接使用了dos中断,而对以后才出现的XP的CMD存在兼容性问题.你所用的系统肯定是XP(因为XP我没用过,所以有如此猜测,2003的CMD是不会有如此现象的,想必2000也不会)

版主,你猜对了。我就是用XP系统。原来是兼容性问题,有趣。
还有,我把《C游戏编程》文件给你吧,你发布出来。我本想上传的,太大了。


我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-04-23 18:45
沉路
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2005-5-15
收藏
得分:0 

我这个程序是在tc2.0中编译运行的,拿到3.0或vc++中必然要作些改动。

撞壁没有结束程序是我自己设置的,不是bug。
>下来在吃过4个点后,“蛇”不能增长了
我倒没有发现这种问题~


我的博客:http://tongshengyuan. 我的博客:http://sanweishuwu2005.
2006-04-27 18:23
快速回复:[原创]贪吃蛇
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013015 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved