Quindi sto facendo un gioco da tavolo che è 19 per 19. Fondamentalmente è connesso 5, chiamato Gomoku.Trova se esiste diagonalmente, orizzontalmente o verticalmente in 2D - valori uno dopo l'altro
Voglio fare un algoritmo efficiente per trovare se ci sono "n" pezzi di fila. I dati vengono archiviati come array 2D di 19x19. Ma nell'interesse della domanda, diciamo che è 6x6.
0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 1
Questi sono due esempi di '5' di 1 in una fila. Come posso testare per ORIZZONTALE, VERTICALE ed entrambi i DIAGONALI?
Ecco il mio codice inefficiente:
private boolean firstDiagonalCheck(int x, int y, int num) {
int count = 1;
int check = 0;
boolean rflag = true;
boolean lflag = true;
int pos = 1;
check = turnHuman + 1;
while (rflag) {
if (x + pos >= 19 || y + pos >= 19) {
rflag = false;
break;
}
if (gb.getBoard()[x + pos][y + pos] == check) {
count++;
pos++;
} else {
rflag = false;
}
}
pos = 1;
while (lflag) {
if (x - pos < 0 || y - pos < 0) {
lflag = false;
break;
}
if (gb.getBoard()[x - pos][y - pos] == check) {
count++;
pos++;
} else {
lflag = false;
}
}
if (count == num) {
return true;
}
return false;
}
Questo è solo un metodo per la prima diagonale. Ce ne sono altri 3.
Come posso renderlo più efficiente e controllare tutte e 4 le direzioni?
EDIT ##################
Che il mio codice fa è: - Get 'la posizione del pezzo (x, y) - Controllare sia lati (su e giù se verticale) e contare quanti di fila ci sono - Se il numero di conteggi corrisponde a desiderato, ("num"), quindi restituisce true, altrimenti restituisce false.
Sarebbe più efficiente controllare ogni volta la scheda WHOLE per vedere se ci sono pezzi di fila?
vuoi Controllo 4 condizioni allo stesso tempo? –
Bene, dovrebbe controllare tutte e 4 le condizioni. Non importa se controlla uno alla volta, ma deve esserci un modo migliore! –
Se vuoi controllare l'intera scheda, sarebbe più efficiente scansionare ogni riga, colonna e diagonale. Ma se stai solo cercando di vedere se il pezzo più recente crea 5 di fila (e puoi supporre che se 5 di fila sul tabellone fossero già stati identificati), allora controllando solo quel punto sarà più efficiente, dal momento che è possibile eliminare la maggior parte dello spazio di ricerca. – Tim