Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1063108
  • 博文数量: 284
  • 博客积分: 8223
  • 博客等级: 中将
  • 技术积分: 3188
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 13:26
文章分类

全部博文(284)

文章存档

2012年(18)

2011年(33)

2010年(83)

2009年(147)

2008年(3)

分类: C/C++

2010-06-19 07:26:19

程序员自己的定位以及怪物追踪寻路AI
     先从程序员的思想定位开始.程序员是什么,其实我们不是什么高深摸测的数学家,能使用多少种算法,能把计算机玩得那么厉害,其实程序的本质就是一个翻译者,是一个将人类的行为描述成计算机语言的翻译者.在这个解释里面,有一个根本的定位,就是计算机从属于人类思想!而现在的程序员,大部分习惯使用计算机思想去思考一个问题,当这些程序员看到需求的时候,他们脑子里面第一反映出来的是各种算法,比如说一看到寻路,脑子里面就出现A*两个字,然后就是"可靠" "消耗资源巨大"等一系列字眼,然后就会在这些字眼里面苦苦最求最完美的方案.
    
     但是,第一,我们只是人类的行为的计算机翻译者;第二,从以上观点出发,计算机的算法首先来自于人类的思想;所以,在我们面对需求的时候,为什么不先把自己代入实际环境中,问问人是怎么完成的,当你在各种算法之中苦苦追求完美的时候,为什么不问问自己,如果你在当时的环境下,是否能做到如此完美,如果连人都做不到,为什么要求计算机能完成呢?

    罗嗦的话说完,我说说现实中的两个例子:
   1、洗牌
      要用程序实现洗牌功能, 而且每次洗牌以后扑克牌的顺序不能一样。我想一搬程序员刚开始看到这个题目,基本上会这样想,建立一个数组,然后逐个给数组的成员赋一随即值,这个值是52个扑克牌之一,而且不与之前数组成员的值相同了,还要考虑花啊、大王小王等情况,于是大家的头都开始痛了
      但是在现实里面洗牌,我们好象不会头痛吧。那我们现实中是怎么洗牌的?首先我们要有一副牌!然后用各种手段将扑克牌的位置打乱,所谓打乱其实就是改变了牌之间的位置,那么我们程序中只要老老实实地翻译这个行为就可以了,首先建立一个定长数组,然后将扑克牌按照顺序逐个赋值到数组里面去,然后使用随机数抽取两个下标,将两个下标下的数据成员的值调换,多调换几次就完成洗牌了,是不是很简单?
   2、怪物寻路追踪
      一般的想法,如果要可靠地让怪物可以饶过所有障碍,不断地追踪玩家,就要不断地使用A*算法,如果一台服务器上的怪都这样做的话,我想这个服务器起码要使用100年后的超前技术才行
      如果你去追一个人,你怎么追的?首先,你要看到你的目标,然后你向着目标冲过去,如果目标躲起来了,你是不是会先跑到目标消失前一刻的位置?如果在那里你找不到目标,你就只好作罢了,如果看见目标,那你可以继续追,所以我的怪物AI可以表示成下面
      traget curTraget , lastTraget ;
      if( lenth( monsterPos - playerPos ) < accackRadius )
      {
           if( isBlock( monsterPos ,playerPos  ) ) //玩家与怪物之间的直线上存在障碍
           {
               monster.curTraget = lastTraget ;
           }else
           {
               lastTraget = curTraget ;
               monster.curTraget = playPos ;
           }
      }
       一段不仑不类的伪代码,希望大家能看懂,而且这个东西暂时只是个大方向,还有很多要改善的地方,也有很多条件没有考虑,希望大家多给意见

阅读(1478) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~