我目前正在开发一个基于文本的网络游戏,我在其中自动模拟战斗序列,如 MyBrute和 Pockie Ninja
原来是这样
我们有 2 个攻击速度不同的玩家
攻击速度
(决定玩家开始攻击所需的秒数)
(简单示例)假设玩家 1 有 6s
,玩家 2 有 3
这意味着玩家 2 将在玩家 1 之前攻击两次
(这是因为如果两个玩家在一个攻击回合中并列,则攻击速度更快的玩家先行)
(但如果攻击速度相同,则最近没有攻击的玩家会去)
现在我的问题在循环中。
我想确定轮到谁的循环次数最少
对于我们的Easy Example,我们可以创建一个无限循环,其中有一个递增 3 个值的计数器来确定轮到谁,然后检查每次迭代是否有赢家并退出环形。 (这是我的算法,您可以提出更好的建议)
对我来说最大的问题是当我现在有 attack speed
的十进制值时
现实示例(假设我只使用 1 位小数)
Player1 攻击速度 = 5.7
Player2 攻击速度 = 6.6
在最坏的情况下,我们可以将 0.1 作为 LCD 并用作每个循环的减数,但我想确定最佳减数 (LCD) 值。
希望它有意义。
谢谢。感谢您分享您的伟大思想。
更新 //这不是实际代码,但这是逻辑
decimal Player1Turn = Player1.attackspeed;
decimal Player2Turn = Player2.attackspeed;
decimal LCD = GetLCD(Player1.attackspeed,Player2.attackspeed) ***//THIS IS WHAT I WANT TO DETERMINE***
while (Player1.HP >0 && Player2.HP >0)
{
Player1Turn -= LCD;
Player2Turn -= LCD;
if (Player1Turn<=0)
{
//DO STUFF
Player1Turn = Player1.attackspeed;
}
if (Player2Turn<=0)
{
//DO STUFF
Player2Turn = Player2.attackspeed;
}
}
我们可以使用类似的函数
public decimal GetLCD(decimal num1, decimal num2)
{
//returns the lcd
}
最佳答案
以下代码在不使用最小公分母的情况下处理战斗序列。它还将比所有可能的尝试快约 100 万倍,使用玩家攻击速度的最低公分母等于例如分别为 1000 和 1000.001。
decimal time = 0;
while (player1.HP > 0 && player2.HP > 0) {
decimal player1remainingtime = player1.attackspeed - (time % player1.attackspeed);
decimal player2remainingtime = player2.attackspeed - (time % player2.attackspeed);
time += Math.Min(player1remainingtime, player2remainingtime);
if(player1remainingtime < player2remainingtime) {
//it is player 1 turn; do stuff;
} else if(player1remainingtime > player2remainingtime) {
//it is player 2 turn; do stuff;
} else {
//both player turns now
if(player1.attackspeed < player2.attackspeed) {
//player 1 is faster, its player 1 turn; do stuff
//now do stuff for player 2
} else {
//player 2 is faster, its player 2 turn; do stuff
//now do stuff for player 1
}
}
}
关于algorithm - 求两位小数的最小公分母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9390914/