我正在为gameboy advance编写游戏,我正在以二叉搜索树的形式实现基本的AI。有1个人类玩家和1个电脑玩家。我需要找出一种方法来告诉人类玩家攻击计算机的攻击性。人类将按下按钮进行攻击(并且必须在计算机的某个半径范围内),所以我首先想到的是看到攻击次数与我的主while
循环的迭代次数相比有多大经历了。这似乎是一种糟糕的方式,因为这个数字将取决于帧速率,帧速率可能会波动。有没有人有更好的方法来做到这一点?
答案 0 :(得分:13)
为什么不只计算人类玩家可以攻击计算机玩家的时刻?我的意思是,你显然必须检查他是否在范围内,所以为什么不检查他是否在范围内,如果他是,则增加could_have_attacked
计数器。然后,如果他确实进行了攻击,请增加attacked
计数器。然后你可以比较人类玩家攻击的频率和他有机会的频率。
或者,比较他在范围内的频率与他在范围内的频率,或者更一般地跟踪玩家之间的平均距离。更积极的玩家可能会比被动玩家更接近对手。
您最好的选择可能是不同方法的组合。保持几种不同的测量方法,并尝试几种不同的方法来相互比较方法,并使用广泛的游戏测试来选择更好的方法。
答案 1 :(得分:1)
你必须定义积极的东西。例如,你可以说攻击性是一个追求AI的玩家,所以你会检查他是否比他超出范围更频繁。或者你可以说攻击性是一个攻击他获得的每一次机会的玩家,所以你要检查成功攻击的比例和玩家必须攻击的时间。或者你可以说一个好斗的球员会在受伤时进攻。一旦你定义了游戏世界中“积极”的含义,你就可以建立玩家属于该定义的关键绩效指标。
答案 2 :(得分:0)
您可以使用伪随机生成器。假设你有一个rnd()函数,它返回一个从0到1的值 - 更大的值对应于更高的攻击性。你引入了一个从0到1的系数。每次你需要确定角色是否会攻击时你调用rnd()并将该值与系数进行比较。如果它大于那个 - 攻击,否则不是。
答案 3 :(得分:0)
我想到了计算战斗之间平均时间和计算战斗中平均射速的方法。要做到这一点,你需要5个这样的变量:
float avgTimeWithoutCombat;
float currentTimeWithoutCombat;
float avgRateOfFire;
int shotsFired;
float combatTimeElapsed;
只要玩家没有战斗,你就算在currentTimeWithoutCombat中的“和平”时间。当他开火时,将其添加到avgTimeWithoutCombat并将其除以2以获得平均值。
每次玩家攻击时,都会增加射击次数。此外,计算战斗的时间。如果某个时间没有任何攻击,请检查主循环。如果是这样,战斗已经结束,你可以计算出avgRateOfFire。
现在你有两个值来衡量玩家的攻击性: