分类: C/C++
2010-06-19 07:26:19
罗嗦的话说完,我说说现实中的两个例子:
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 ;
}
}
一段不仑不类的伪代码,希望大家能看懂,而且这个东西暂时只是个大方向,还有很多要改善的地方,也有很多条件没有考虑,希望大家多给意见