我目前正在为MMORPG编写机器人。虽然,目前我仍然在努力弄清楚如何很好地实现这一点。设计问题与以正确顺序施放角色法术有关。这是一个简单的例子,我需要达到的目的。它与投射它们无关,而是以正确的顺序进行。我会知道如何简单地通过检查哪些技能尚未被投射来随机投射它们,但是按照GUI中显示的正确顺序,而不是真的。
注意:技能数量可能会有所不同,但并不总是3,最高为10。
Charactername< foobar>有3个技能。
技能1:名称(random1)冷却时间(1000毫秒)施法持续时间(500毫秒)
技能2:名称(随机2)冷却时间(1500毫秒)施法持续时间(700毫秒)
技能3:名称(random3)冷却时间(2000毫秒)施法持续时间(900毫秒)
我真的不知道如何实现这一点,如果有人有想法,请随意分享。我知道大多数人不喜欢在游戏中作弊的想法,我也不喜欢它,我也不喜欢玩游戏,但对我来说这是一个有趣的领域。
谢谢。
答案 0 :(得分:3)
这是冒险进入更“智能代理”的领域。考虑为您的AI设计计划数据库。你的投掷火球法术计划可能具有点燃火焰法术的先决条件,其本身可能具有成功封闭创造气泡法术的先决条件。选择一个计划需要满足所有前提条件,所以如果你的人工智能可以制造气泡但不会点燃泡沫,那么计划会失败,他们必须做其他事情(也许是重试)。
答案 1 :(得分:2)
也许从某个事件处理程序中,您想要决定要施放什么咒语。也许你可以从像这个施法者这样的东西开始:
public class Caster
{
private readonly ICastable[] _spells;
private int _canCastAt;
public Caster(ICastable[] spells)
{
_spells = spells;
_canCastAt = -1;
}
public string GetNextSpellToCast(int currentTime)
{
if (currentTime < _canCastAt)
return null;
for (int i = 0; i < _spells.Length; i++)
{
int durationOfCast = _spells[i].AttemptCast(currentTime);
if (durationOfCast > 0)
{
_canCastAt = currentTime + durationOfCast;
return _spells[i].GetName();
}
}
return null;
}
}
施法者将施放法术:
public interface ICastable
{
string GetName();
int AttemptCast(int msCurrentTime);
}
你描述了一种特殊的法术:
public class ChanneledSpell : ICastable
{
private readonly string _name;
private readonly int _castDuration;
private readonly int _castCooldown;
private int _lastCast;
public ChanneledSpell(string name, int castDuration, int castCooldown)
{
Debug.Assert(castDuration < castCooldown); // a reasonable assumption the tests makes
_name = name;
_castDuration = castDuration;
_castCooldown = castCooldown;
_lastCast = -_castCooldown;
}
public string GetName()
{
return _name;
}
public int AttemptCast(int msCurrentTime)
{
if (msCurrentTime > _lastCast + _castCooldown)
{
_lastCast = msCurrentTime;
return _castDuration;
}
return 0;
}
}
我看到这个标记为C ++,这个答案是C#,虽然我只使用了C ++中可用的语言结构,所以它应该是一个简单的翻译。我无法轻易翻译的是一些测试,
[TestFixture]
public class SpellTest
{
[Test]
public void TestCanCastOnStartup()
{
var sut = new ChanneledSpell(Some.String(), Some.PositiveNonzeroInteger(), Some.PositiveNonzeroInteger());
int result = sut.AttemptCast(Some.PositiveNonzeroInteger());
Assert.IsTrue(CastWasMade(result));
}
[Test]
public void TestCantCastUntilCooldown()
{
int firstCast = Some.PositiveNonzeroInteger();
int duration = Some.PositiveNonzeroInteger();
int cooldown = duration + Some.PositiveNonzeroInteger(); // assuming spell duration is less then cooldown
var sut = new ChanneledSpell(Some.String(), duration, cooldown);
int ignored = sut.AttemptCast(firstCast);
int secondCastAttempt = sut.AttemptCast(firstCast + cooldown - 1);
int thirdCastAttempt = sut.AttemptCast(firstCast + cooldown + 1);
Assert.IsFalse(CastWasMade(secondCastAttempt));
Assert.IsTrue(CastWasMade(thirdCastAttempt));
}
[Test]
public void TestReportsTimeOnCast()
{
int duration = Some.PositiveNonzeroInteger();
int firstCastTime = Some.PositiveNonzeroInteger();
var sut = new ChanneledSpell(Some.String(), duration, Some.PositiveNonzeroInteger());
int firstCastAttempt = sut.AttemptCast(firstCastTime);
Assert.AreEqual(duration, firstCastAttempt);
}
private bool CastWasMade(int result)
{
return result > 0;
}
}
答案 2 :(得分:1)
也许您想要一个包含计划任务的队列。
答案 3 :(得分:1)
您将要查看“调度算法”。这是一个帮助您入门的链接。
http://www.ctl.ua.edu/math103/scheduling/scheduling_algorithms.htm
基本上,您需要以最佳方式安排无限数量的任务1,2和3。
答案 4 :(得分:0)
看看OpenKore bot - 我见过的最先进的机器人。它是一个很大的opensource project,存在了几年,并且许多bot-AI特定的问题都得到了解决。我想,你可以从中获得/学习一些想法。但 OpenKore 主要是用Perl编写的。