Implementazione / Rappresentazione di simmetrie in scacchiera

1

In una scacchiera 8X8, mi chiedevo come implementare la simmetria della scacchiera.

Molte posizioni sono solo specchi o rotazioni l'una dell'altra (senza pedine o capacità di arrocco le direzioni sono indistinguibili).

Usando una combinazione di verticale, orizzontale e mirroring diagonale del tabellone è sempre possibile correggere la posizione di un pezzo all'interno del triangolo a1-d1-d4 .

Come implementare queste simmetrie sulla scacchiera? In che modo l'implementazione dipende dalla scelta della rappresentazione della scheda scelta (Bit-board, 0x88, matrice 8x8 e così via)?

Modifica 1: l'obiettivo principale è l'implementazione del generatore di motori di endgame e comprime i suoi risultati

    
posta TryinHard 17.01.2014 - 12:51
fonte

1 risposta

1

Ci sono diversi modi per affrontare la rotazione di una scacchiera. Il modo più semplice per implementarlo è lo stesso modo in cui ci pensiamo. Crei una griglia di 8x8 e ogni posizione sulla griglia potrebbe avere o meno un pezzo degli scacchi in cima. Per rispecchiare quella griglia, devi semplicemente creare un'altra scacchiera e posizionare ogni pezzo nella vecchia scacchiera nella sua posizione speculare.

Questo, tuttavia, può essere semplificato rimuovendo completamente la griglia. La griglia è arbitraria e serve principalmente a capire meglio. Quindi è possibile utilizzare un oggetto scacchiera per emulare tutte le posizioni sulla scacchiera, ma le sole informazioni che effettivamente richiederebbero sono i tipi e le posizioni degli stessi pezzi degli scacchi.

Lo stesso pezzo degli scacchi può essere estratto in modo da ottenere informazioni sul tipo e sulla posizione. Se non hai bisogno di sapere come si muove, allora l'unica ragione per cui il tipo sarebbe utile è che tu ti confronti con gli altri pezzi degli scacchi e assicurati che, a parte la posizione, i tipi siano gli stessi per dire che è lo stesso.

La scacchiera può specchiarsi semplicemente restituendo un'altra istanza della scacchiera con le posizioni modificate (cioè per ogni coordinata x di un pezzo degli scacchi, pezzo.x = 9 - pezzo.x).

A quel punto, il problema diventa semplicemente iterando i pezzi degli scacchi di una scacchiera e di un'altra e verificando che tutte le posizioni e i tipi siano uguali (puoi ottimizzare controllando prima il numero di pezzi).

Nota che se non hai bisogno di confrontare le versioni speculari delle scacchiere, puoi ottimizzare ulteriormente usando solo un'istanza e calcolando dove un pezzo degli scacchi, se fosse specchiato, sarebbe relativo a quel punto corrente e poi controllerà per esistenza e tipo di quel pezzo.

Spero che questo aiuti. Penso che sia importante presentare un'interfaccia facile da comprendere e lasciare che l'implementazione sottostante ottimizzi il modo in cui i dati vengono rappresentati e / o utilizzati.

    
risposta data 17.01.2014 - 13:07
fonte

Leggi altre domande sui tag