获得两位小数的最小公分母

时间:2012-02-22 07:46:50

标签: algorithm

我目前正在开发一款基于文字的网页游戏,我会自动模拟战斗序列,如MyBrutePockie Ninja

所以情况就是这样。

我们有2名不同攻击速度的玩家

attack speed (确定玩家开始攻击所需的秒数)

简单示例)让我们假设玩家1有 6s 而玩家2有 3s

这意味着玩家2将在玩家1之前进行两次攻击

(its because if two player tied on a attack turn, the one with the better attack speed goes first)

(but if they have the same attack speed, the player who have not attack lately will go)

现在我的问题出现了。

我想用最少的循环次数确定轮到谁

对于我们的简单示例,我们可以创建一个带有计数器的无限循环,该计数器增加3个值以确定它将变为什么,只检查每次迭代是否有赢家并退出环。 (this is my algo you can suggest better one)

对我来说最大的问题是我现在为 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  
   }

2 个答案:

答案 0 :(得分:1)

以下代码在不使用最小公分母的情况下处理战斗序列。与使用最小公分母对玩家攻击速度相等的所有尝试相比,它也将比所有可能的尝试快约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
        }
    }
}

答案 1 :(得分:0)

如果您使用的是面向对象的语言,那么您可以这样做:

玩家将是Player类型的对象,并且会有Timer个对象 Timer将使用Observer设计模式。

玩家将在响应时间内将自己注册到Timer。 当他们的时间到期时,他们会被告知他们可以采取行动。