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