2015-12-02 116 views
0

我想簡化一個代碼片段,其中我有一個主循環,其中放置了2個if語句。第一條if語句是關於測試「if (test1 or test2)」,第二條是測試「if (test1 and test2)」。爲了區分它們,我必須在更高的層次上(但仍然在主循環中)提供另一個「if」(在diagExpression boolean上測試,見下文)。下面的代碼:將if語句簡化爲循環

// Main loop 
    while (Hit.arrayCurrent[Hit.coordCurrent[0]+k][Hit.coordCurrent[1]+l] == Hit.currentPlayer[1]) 
    { 
    if (diagExpression) 
    { 
     if ((a > b) || (b > c)) 
     return; 
     else if (d) 
     { 
     //do stuff1 
     } 
    } 
    else 
    { 
    if ((a > b) && (b > c)) 
     return; 
    else if (d) 
     { 
     //do stuff1 
     } 
    } 
    } 

我不知道如何來簡化這個代碼片斷,避免使用stuff1 2次做。

如果有人可以看到解決方案。

UPDATE:

diagExpression的主循環前計算:

// Boolean for 2 versions 
    var diagExpression = false; 

    if (Hit.direction == 'rightbottom') 
    { 
     diagExpression = true; 
     shift_x = 1; 
     shift_y = 1; 
     factor_x = 1; 
     factor_y = 1; 
     limit_x = 7; 
     limit_y = 7; 
    } 
else if (Hit.direction == 'left') 
    { 
     shift_x = -1; 
     shift_y = 0; 
     factor_x = -1; 
     factor_y = 1; 
     limit_x = 0; 
     limit_y = -1; 
    } 

... 

// Main loop 
    while (Hit.arrayCurrent[Hit.coordCurrent[0]+k][Hit.coordCurrent[1]+l] == Hit.currentPlayer[1]) 

我用不同的方向上的值到我的代碼,如果我有對角線方向和虛假垂直這個布爾值爲true /水平方向。

+1

您的diagExpression請..請確保代碼讀取良好..也標記使用的語言 – nullpointer

+0

diagExpression是一個布爾值,它是在主循環之前計算的。這是Javascript語言 – youpilat13

+1

把上面的兩個回報。在他們之後,只有沒有返回的代碼執行它,寫'if(d)// do stuff1',一次。 –

回答

0

首先,你可以簡化你的代碼,這樣你需要編寫stuff1只有一次:

while (…) { 
    if (diagExpression) { 
    if ((a > b) || (b > c)) 
     return; 
    } else { 
    if ((a > b) && (b > c)) 
     return; 
    } 
    if (d) { 
    // do stuff1 
    } 
} 

甚至

while (…) { 
    if (diagExpression ? (a > b) || (b > c) : (a > b) && (b > c)) { 
    return; 
    } else if (d) { 
    // do stuff1 
    } 
} 

,然後你可以得到更高級東西,就像

while (…) { 
    if ((a > b) + (b > c) >= 2 - diagExpression) { 
    return; 
    } else if (d) { 
    // do stuff1 
    } 
} 

雖然這變得相當不可讀e,甚至可能會變慢。

0

您可以用這種方式:

if (diagExpression) { 
    if ((a > b) || (b > c)) 
     return; 
    if ((a > b) && (b > c)) 
     return; 
} 
if (d){ 
    //do stuff1 
} 

這是什麼,我相信@Daniel Daranas意味着爲好。

+0

不完全。你需要另一個'if(diagExpression)'並且把'if((a> b)&&(b> c))'放在那裏,就像[其他答案]一樣(http://stackoverflow.com/a/34047143/96780)。否則,你正在改變行爲。 –