AI算法问题求助
gamemaker吧
全部回复
仅看楼主
level 6
熊孩子030 楼主
假设有两股军团,两方的team(变量)不同,同一团队的team相同,但是每一个小人obj_person都是同一obj的不同实例,求问如何才能让每一个小人都能排除自己队友,直接将目标定位对面的某一个敌人呢?(游戏中obj_person并不是拖到房间里,而是用一个system来生成的)
2018年02月06日 14点02分 1
level 13
意思大概是obj_person里面有team这个变量对吧,那可以用obj_preson.team来判断呀
2018年02月06日 17点02分 2
说得容易。。。这个想法我已经试过了,首先第一没有直接的语句可以判断,第二,我是用的是collision_circle(),obj少一点还好,一多起来特别卡
2018年02月07日 04点02分
@熊孩子030 哦……那可以试试3楼的方法
2018年02月07日 05点02分
level 9
建两个list,创建obj_person时,如果是team1,就添加到第一个list中,如果是team2,就添加到第二个list中。
2018年02月07日 04点02分 3
team1的单位从第二个list中寻找攻击目标,team2的单位从第一个list中寻找目标。到单位死亡时,把自己从list中移除
2018年02月07日 04点02分
level 11
上面的运算量少一些。
下面讲直接用with的方法。
create事件里声明一个名字叫 Target 的变量。初始值设置为noone
然后在步事件里使用 instance_exists(Target)进行判断,看看这个目标存不存在(可能不存在,也可能存在了但被杀死了所以不存在了。)
值为真的时候不做什么。为假的的时候就进行目标搜寻。
with obj_preson {
id = other.id continue;//排除自己
team = other.tem;//排除同队员成员
other.Target = id;//然后将自己的目标变量设置为对方的id。至于为什么不是self.而是other.,不明白请去看with结构
}
说到这里你大概已经明白怎么做了吧?
2018年02月07日 07点02分 4
level 11
代码看起来大概是这样的。
因为是用记事本写的,也许会出现点错误,但是在参考思路方面上是没问题的,只要不是直接把代码抄进去
2018年02月07日 07点02分 5
level 11
如果你有强迫症的话,需要他自动选取离自己最近的敌人。
那就建议你百度一下排序法,就比如冒泡排序法。
建立两个list,一个储存id,一个储存距离。
对应排序判断。(其实instance_nearest也可以,不过你用的是同一个对象实现的实例)
或者你实在不想用上面的方法也没关系,那就再新建两个对象,都继承同一个对象(obj_person)..
然后在寻敌方面上的代码做点小小的修改。
2018年02月07日 07点02分 6
话说如果找最近的话其实不用排序
2018年02月13日 11点02分
@QAsk⛄ 此言怎说?
2018年02月15日 05点02分
@MikuScarlet 用一个min记录最近距离,minn记录最近敌人id。如果发现更近的就替换掉之前的
2018年02月17日 00点02分
@QAsk⛄ 你这个说法的话其实不用记录距离,直接目标等于最近的实例就行了,谁靠近就打谁,但是你要怎么找出离你最近的敌人就是个问题了(同对象)不过确实不用全部都排,我大概明白你的意思了,是一直比较下去,谁小就替换为谁的值。
2018年02月17日 13点02分
level 6
熊孩子030 楼主
@MikuScarlet 非常感谢!已完美解决!距离问题我自己搞定了
2018年02月07日 12点02分 7
问下怎么解决
2018年02月07日 14点02分
level 11
这是我一开始写完的
这是我写完第一个之后想到的
使用的时候实例必须有个变量叫 flag
应该没错吧?我没测试过呢。
2018年02月17日 14点02分 8
@神奇怪zxcvbnm 。。看看是不是你想的那样。
2018年02月17日 14点02分
list版本的那个检测条件return noone的那个条件是=0,不小心写=1去了
2018年02月17日 14点02分

2018年02月17日 15点02分
还有一个利用数据结构排序列表还是什么的东西,也是先with再判断,如果是就把距离加到列表里,最后返回最近的
2018年02月25日 22点02分
1