Snake Draft - 整体订单位置(数学相关)

时间:2014-08-19 05:51:36

标签: javascript math

所以我创建了一个Fantasy Football草案助手,它是一个12队蛇形式的草案格式,进行1到12 LTR,然后是13到24 RTL,然后是25到36 LTR

- - - - >

< -----

------>

因此,具有#1总体职位(A队)的人也会发现自己处于#24#25位置。

#12位置也有#13位置,因为订单"包裹"网格。

Like so

以下是我根据选秀位置动态标记任何球队的整体订单的情况,但我没有数学高手,并且看起来有点特殊情况= 1不适用于任何其他情况。这有效,但我想知道真正的数学是什么,如果有人知道的话。

根据我当前的解决方案,这是我用一些示例代码创建的小提琴。

var TEAMS = 12;
var ROUNDS = 4; 
var POS = 1;
var $overallOrder = $('#overallOrder');
var total = TEAMS * ROUNDS;
if (POS > TEAMS) { alert("only " + TEAMS + " teams"); return false; }
for (var i=1; i<=total; i++) {
    var isMyTurn = false;
    if ((i % (2*TEAMS)) == ((2*TEAMS) - (POS-1))) {
        isMyTurn = true;
    }
    if ((i % (2*TEAMS)) == POS) {
        isMyTurn = true;
    }
    //special case for first position ?
    if (POS==1 && (i % (2*TEAMS)) == 0) {
        isMyTurn = true;
    }
    var turnText = (isMyTurn) ? i + " My Turn!" : i ;
    $overallOrder.append('<li>'+turnText+'</li>');    
}

尝试从1-12更改POS var,您可以看到结果。再一次,如果有人知道的话,我正在寻找能够封装上述逻辑的数学函数。谢谢!

http://jsfiddle.net/3oy1w71c/1/

谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码中的注释会很好。

根本问题是%02*TEAMS-1,但您正在考虑从12*TEAMS:您最终需要一个POS==1的特殊情况是因为(2*TEAMS)-(POS-1)原来是2*TEAMS,但i%(2*TEAMS)永远不是2*TEAMS。简单的解决方法是将其更改为((2*TEAMS)-(POS-1))%(2*TEAMS)。这可以让你把事情搞定到

var turnText = i;

if ((i % (2*TEAMS)) == ((2*TEAMS)-(POS-1))%(2*TEAMS) 
    || (i % (2*TEAMS)) == POS) {
    turnText += " My Turn!";
}

另一种方法是使用(i-1)%(2*TEAMS)+1将模数转换为12*TEAMS

如果你想将其归结为一个不使用||的条件,你可以利用TEAMS+.5周围蛇的对称性。

if ( Math.abs(TEAMS+.5-((i-1)%(2*TEAMS)+1))==TEAMS+.5-POS )

但我觉得这比以前的版本更难阅读。