Come altri hanno sottolineato, rendere le condizioni più concise non velocizzerà la compilazione o l'esecuzione, e non necessariamente aiuta nemmeno con la leggibilità.
Può aiutare a rendere il tuo programma più flessibile, nel caso in cui decidi in seguito di volere la versione del gioco per bambini su una tavola 6 x 6, o una versione avanzata (che puoi giocare tutta la notte) su una tavola 40 x 50 .
Quindi lo codificherei come segue:
// What is the size of the game board?
#define ROWS 10
#define COLUMNS 10
// The numbers of the squares go from 1 (bottom-left) to (ROWS * COLUMNS)
// (top-left if ROWS is even, or top-right if ROWS is odd)
#define firstSquare 1
#define lastSquare (ROWS * COLUMNS)
// We haven't started until we roll the die and move onto the first square,
// so there is an imaginary 'square zero'
#define notStarted(num) (num == 0)
// and we only win when we land exactly on the last square
#define finished(num) (num == lastSquare)
#define overShot(num) (num > lastSquare)
// We will number our rows from 1 to ROWS, and our columns from 1 to COLUMNS
// (apologies to C fanatics who believe the world should be zero-based, which would
// have simplified these expressions)
#define getRow(num) (((num - 1) / COLUMNS) + 1)
#define getCol(num) (((num - 1) % COLUMNS) + 1)
// What direction are we moving in?
// On rows 1, 3, 5, etc. we go from left to right
#define isLeftToRightRow(num) ((getRow(num) % 2) == 1)
// On rows 2, 4, 6, etc. we go from right to left
#define isRightToLeftRow(num) ((getRow(num) % 2) == 0)
// Are we on the last square in the row?
#define isLastInRow(num) (getCol(num) == COLUMNS)
// And finally we can get onto the code
if (notStarted(mySquare))
{
// Some code for when we haven't got our piece on the board yet
}
else
{
if (isLastInRow(mySquare))
{
// Some code for when we're on the last square in a row
}
if (isRightToLeftRow(mySquare))
{
// Some code for when we're travelling from right to left
}
else
{
// Some code for when we're travelling from left to right
}
}
Sì, è prolisso, ma chiarisce esattamente cosa sta succedendo sul tabellone.
Se stavo sviluppando questo gioco da visualizzare su un telefono o tablet, creerei variabili ROWS e COLUMNS invece di costanti, in modo che possano essere impostate dinamicamente (all'inizio di un gioco) in modo che corrispondano alle dimensioni e all'orientamento dello schermo.
Consentirei anche di modificare l'orientamento dello schermo in qualsiasi momento, a metà partita: tutto ciò che devi fare è cambiare i valori di RIGHE e COLONNE, lasciando tutto il resto (il numero quadrato corrente su cui si trova ciascun giocatore e il i quadrati di inizio / fine di tutti i serpenti e le scale) invariati. Quindi devi 'solo' disegnare bene la lavagna e scrivere il codice per le tue animazioni (presumo che fosse lo scopo delle tue if
dichiarazioni) ...