易码技术论坛

 找回密码
 加入易码
搜索
12
返回列表 发新帖
楼主: juyan

[演示] 求贪食蛇游戏算法

[复制链接]
 楼主| 发表于 2008-11-20 12:16:11 | 显示全部楼层
VERY GOOD
 楼主| 发表于 2008-11-26 21:35:28 | 显示全部楼层

我找到源码研究有问题了

//变量声明
char Direction; //1:向上; 2:向下; 3:向左; 4:向右;
char UINum; //1:主界面; 2:"关于"界面;
char Status; //1:停止; 2:暂停; 3:游戏中;
int Snake[308]; //蛇的坐标 Bit0-3:纵坐标 Bit4-8:横坐标 Bit9-15:0
int BackUp[308]; //蛇坐标备份数组
这段代码中的‘int Snake[308]; //蛇的坐标 Bit0-3:纵坐标 Bit4-8:横坐标 Bit9-15:0’这句想不明的是怎么回事。
void drawbody()
{
  char TailX;
  char TailY;
  
  char headX;
  char headY;
  
  char score_buf[5];
  
  //获取蛇尾坐标
  TailX=Snake[SnakeLen]/16;
  TailY=Snake[SnakeLen]-TailX*16;
  
  //获取蛇头坐标
这段代码中的获取蛇尾坐标的代码也不太明白,望高手指点呀
发表于 2008-11-27 16:01:14 | 显示全部楼层
LS知不知道二进制?
在二进制当中缝二进一(废话),比如3在二进制里面表示成11。
在电脑当中是以字节(Byte)来存储的,1个字节有8个比特(Bit),也就是说1个字节实际上有8位,每一位就是一个Bit。
了解了这些以后就好办了。(如3在字节当中的二进制表示成00000011。)
既然一个字节那么大(可以存0到255的数,这个自己用计算器验证,2的8次方减1,因为要表示0,所以是0到255),假如用来存一些小数字也用Byte,那就有些浪费了,所以可以把一个字节拆成许多单位来储存数据。
使用0到3这4个比特就可以记录0到2^4-1=15的数值,这样子,一个int(int是两个字节长度,也就是有16个Bit)里面就可以用来:0到3的Bit记录纵坐标,4到8Bit记录横坐标。
(可以看出这个贪食蛇的地图是16×16大小的,因为这样记录就只能记录到这么大)
你查到的这个源代码就是利用数据的长度来节省内存开支的。

第一问,Clear!

第二问当中得到横纵坐标的方法就是把记录在一起的数据分开来。

不知道你明白没有。
发表于 2008-11-27 18:33:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-11-27 19:34:37 | 显示全部楼层
激情同学,你不会没看懂吧?

难道是我死得太久,语言能力退化了?
发表于 2008-11-27 20:18:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2008-11-28 13:30:29 | 显示全部楼层
这好像和那个用位运算的俄罗斯方块一个原理。。。
不过我在这还是没有看懂,,
蛇的坐标 Bit0-3:纵坐标 Bit4-8:横坐标 Bit9-15:0
这句注释是什么意思也不明白呀
附上我找的源码,大家帮忙看下

SnakeEx.rar

2.53 KB, 下载次数: 65

贪食蛇源码

发表于 2008-11-28 15:52:09 | 显示全部楼层
这个区不能版聊吧?

那句注释就是说:
假如用A代表这个数据,那么这个数据的0到3位是蛇的纵坐标,4到8位是蛇的横坐标,9到15位没用,留作0啦。

比如蛇现在坐标是(5,3),那么这个数据A就是0000000001010011(二进制),你把它的0到3位拿出来,是0011,也就是十进制当中的3,刚好就是纵坐标,把4到8位拿出来,是0101,就是十进制当中的5,也就是横坐标。这个就是作者为了节省,免得用两个数组来记录蛇的坐标。

如果还不懂,那就找找讲数据结构的教程看看。
发表于 2008-11-28 17:54:49 | 显示全部楼层
不知这种节省有何意义……对于贪食蛇来说,执行速度显然比空间占用重要。
发表于 2008-11-28 19:25:11 | 显示全部楼层
我也觉得这样没什么意义,况且使用char数组不也只用差不多的空间嘛,还能快些呢。
郁闷。
发表于 2008-11-28 20:35:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-11-29 07:29:46 | 显示全部楼层
原帖由 绿鸟 于 2008-11-28 15:52 发表
这个区不能版聊吧?

那句注释就是说:
假如用A代表这个数据,那么这个数据的0到3位是蛇的纵坐标,4到8位是蛇的横坐标,9到15位没用,留作0啦。

比如蛇现在坐标是(5,3),那么这个数据A就是0000000001010011(二进制),你把它的0到3位拿出 ...


是4-7位。。。
发表于 2008-11-29 09:49:53 | 显示全部楼层
这个已经讲给他听了,上面是写的4到8位嘛,我就沿用了,错了的话,谢谢大神更正。
发表于 2008-12-1 12:36:50 | 显示全部楼层
其实简单(或专业)点说就是使用位域(或称作位段),就是在一个普通变量里存放多个数据,比如我们常用到的16位(格式为RGB=565)色的图片,其实就是用一个int型变量(占二字节,合计十六位)中的前面(左边的,也称高)五位表示R(RED红色),中间的六位表示G(GREEN绿色),后边五位表示B(BLUE蓝色),也就是说,三个数据挤在两个字节当中.

说回来,
TailX=Snake[SnakeLen]/16;
TailY=Snake[SnakeLen]-TailX*16;
上面的代码其实完全可以用以下代码代替
TailX=Snake[SnakeLen]>>4;
TailY=Snake[SnakeLen]&31;
其实Snake[SnakeLen]保存了X,Y两个坐标,我前面帖子里说的用一组数组存坐标也是这种方法,在Snake[SnakeLen]中的高(左边)四位是X坐标,低四位是Y坐标,因此,我们把高四位向右移动四位,char型数据会自动在高位补0,那么位移以后就成了X坐标了,而我们再用31(二进制表示为00001111)去与Snake[SnakeLen]进行位与,那么根据位与的定义(两数据中只要有一个为0则结果为0),那么我们就可以把高四位的X数据过滤掉,这样就得到了Y坐标,不过建议您你下面的方法,也就是位运算,这样的代码执行效率大大高于上面的代码.

[ 本帖最后由 wqstar028 于 2008-12-1 12:38 编辑 ]
发表于 2008-12-2 19:40:12 | 显示全部楼层
原帖由 wqstar028 于 2008-12-1 12:36 发表
其实简单(或专业)点说就是使用位域(或称作位段),就是在一个普通变量里存放多个数据,比如我们常用到的16位(格式为RGB=565)色的图片,其实就是用一个int型变量(占二字节,合计十六位)中的前面(左边的,也称高)五位表示R(R ...

?????
发表于 2008-12-2 19:42:15 | 显示全部楼层
原帖由 绿鸟 于 2008-11-29 09:49 发表
这个已经讲给他听了,上面是写的4到8位嘛,我就沿用了,错了的话,谢谢大神更正。

我不能确定我对,我没看代码。只是用0-3bit做第一个数据,那么按常理接着的4-7bit应该是一组,所以下的那个结论~
另我不是大神,我也很多不懂的地方~~~
发表于 2008-12-4 09:47:11 | 显示全部楼层
我自己也写过一个贪吃蛇,原理是:比如一个
                    /^\/^\
                  _|__|  O|
         \/     /~     \_/ \
          \____|__________/  \
                 \_______      \
                         `\     \                 \
                           |     |                  \
                          /      /                    \
                         /     /                       \\
                       /      /                         \ \
                      /     /                            \  \
                    /     /             _----_            \   \
                   /     /           _-~      ~-_         |   |
                  (      (        _-~    _--_    ~-_     _/   |
                   \      ~-____-~    _-~    ~-_    ~-_-~    /
                     ~-_           _-~          ~-_       _-~   
                        ~--______-~                ~-___-~身上有5个结点,分别是12345,移动一次,结点变为23451然后是34512,不断的从蛇尾移到蛇头,这样蛇就运动起来了。根据方向选择将蛇尾移向蛇头的相对位置,蛇就能转弯了,还可以做各种各样的造型。匹配度很好。
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-26 01:29 , Processed in 0.011822 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表