2015-03-19 2 views
0

Я развиваю сетку 8x8. Похоже на шашки, я думаю. Игроки могут двигаться в любом направлении и прыгать/брать кусок в любом направлении.Можно ли консолидировать мои утверждения If здесь?

Я индивидуально выписываю КАЖДОЕ одно перемещение .. включая недействительные ходы. Есть ли способ очистить это? Я считаю, что есть, но я просто не вижу его в данный момент, я не могу придумать более простое решение.

Все работает нормально, мне просто интересно, если его можно сократить.

Heres некоторые из шагов:

//If player attempts to move 2 squares within the same column 
       if(checkRow == 2 && checkCol == 0){ 

       //Checks if row is OOB. If not, Checks to see if there is a player 2 one position to the right. 
       //If yes checks to see if row - 2 equals the initial player. This avoids methods getting called 
       // When surrounded by multiple pieces. 
       if(fromRow+1 < 8 && boardGame[fromRow+1][fromCol].getPlayer()== 2 && boardGame[toRow-2][toCol].getPlayer() == 1){ 
         board[fromRow+1][fromCol] = 0; 
         valid = true; 
         updateTurnCount(); 
       } 
       //Checks if row is OOB. If not, Checks to see if there is a player 2 one position to the left. 
       else if(fromRow-1 >= 0 && boardGame[fromRow-1][fromCol].getPlayer()== 2 && boardGame[toRow+2][toCol].getPlayer() == 1){ 
         board[fromRow-1][fromCol] = 0; 
         valid = true; 
         updateTurnCount(); 
       } 

       else if(fromRow+1 < 8 && boardGame[fromRow+1][fromCol].getPlayer()== 1 && boardGame[toRow-2][toCol].getPlayer() == 2){ 
         board[fromRow+1][fromCol] = 0; 
         valid = true; 
         updateTurnCount(); 
       } 

       else if(fromRow-1 >= 0 && boardGame[fromRow-1][fromCol].getPlayer()== 1 && boardGame[toRow+2][toCol].getPlayer() == 2){ 
         board[fromRow-1][fromCol] = 0; 
         valid = true; 
         updateTurnCount(); 
       } 
      } 

ответ

0

Не совсем понимаю, что ваш спрашивать здесь, но вы можете, конечно, тянуть большую часть этой логики из в простых утверждений, которые будут охватывать все случаи.

if (newRow <0 || newRow >8) { 
      disallowMove(); 
      return; 
     } 

    if (board[newRow][newCol].player() != board[oldRow][oldCol].player()){ 
      disallowMove(); 
      return;  
    } 

    board[newRow][newCol] == somethingElse; 
    updateTurnCount(); 
+0

Это в значительной степени отвечает, что я просил, я не могу показаться, чтобы выяснить логику расчленить эти ужасно, если заявления. Так что это помогает! Спасибо. – Nihat

0

лямбда может значительно сократить код: например, объявить только непосредственно перед основным циклом

auto from = [boardGame,fromRow,fromCol](int deltaRow, int deltaCol) { 
    return boardGame[fromRow+deltaRow][fromCol+deltaCol]; 
}; 
auto to = [boardGame,toRow,toCol](int deltaRow, int deltaCol) { 
    return boardGame[toRow+deltaRow][toCol+deltaCol]; 
}; 

условие может быть записано, как

if(fromRow+1 < 8 && from(+1,0) == 2 && to(-2,0) == 1){...} 

Далее очистка может вытекать из разложения повторяющегося кода: принятое действие всегда одно и то же, и использует тот же шаблон переменных: тогда лямбда (при условии, что boardGame и т. д. являются переменными-членами) может быть

auto action = [this](int df_Row, int df_Col, int dt_Row, int dt_Col) { 
int f_row = fromRow+deltaRow, f_col = fromCol+deltaCol; 
int t_row = toRow+dt_Row, t_col = toCol+dt_Col; 
if (f_row < 8 && boardGame[f_row][f_col].getPlayer()== 2 && 
    boardGame[t_row][t_col].getPlayer() == 1){ 
    boardGame[f_row][f_col] = 0; 
    valid = true; 
    return true; 
} 
return false; 
}; 

и логика становится проще:

if (action(+1,0,-2,0)) updateTurnCount(); 
... 
+0

А вот это здорово! – Nihat

Смежные вопросы