QNA > C > Come Fare Un Gioco Di Scacchi In C

Come fare un gioco di scacchi in C

Ho scritto un programma di scacchi quando avevo 19 anni, nel 1985. Due anni dopo, ha giocato nei tornei della United States Chess Federation con l'ID USCF 12528567. Dopo 13 partite di controlli a tempo regolamentare, era classificato 2129 e ha perso solo contro giocatori classificati oltre 2300 (Mark Eidemiller, USCF meber ID 10145791, e Stefan Rakowsky, USCF member ID 12544065. Il programma si chiamava The Sniper e girava su un lentissimo Macintosh SE/30 da 16 MHz con un processore Motorola 68030.

main-qimg-e4d688edbfafbea6224d684bfd329c75

Cito tutto questo per farvi sapere che ho effettivamente portato a termine il compito, e non sono solo un "quarterback da poltrona" che lancia vaghe generalizzazioni. In seguito, ho pubblicato un programma chiamato World Championship Checkers and Blackjack Deluxe sulla piattaforma Macintosh, dal 1994-1999. Il programma di dama era in grado di annunciare una vittoria da una distanza di 157 mosse inizialmente (contando i turni per entrambe le parti) e alla fine 293 mosse.

main-qimg-25258d53bcba146c62fe5a4328fdcff2

E, infine, ho inventato il gioco degli Scacchi Gotici, una variante degli scacchi a 80 caselle con due pezzi extra sulla scacchiera: uno si muove come un Cavaliere o una Torre, e l'altro si muove come un Cavaliere o un Alfiere. E, naturalmente, ho scritto un programma per giocare anche a quel gioco!

main-qimg-06fb6d13d8635bbf620806c33ae5f03b

Spero che i lettori apprezzino la mia risposta molto prolissa. Volevo solo mostrare le mie credenziali prima.

Il primo passo nello scrivere il vostro programma di scacchi dovrebbe essere quello di rispondere a questa domanda:

Il programma sarà caratterizzato da un generatore di mosse bitboard (un po' difficile) o sarà un generatore di mosse array (più facile da scrivere, e debug, ma può essere più lento di un generatore bitboard).

Un bitboard è fondamentalmente una rappresentazione tale che una cifra binaria (ciò a cui "bit" si riferisce letteralmente) indica la presenza o assenza di un particolare tipo di pezzo su una data casella. Un "1" indica che c'è qualcosa su quella casella, e uno "0" significa che la casella NON ha quel particolare tipo di pezzo, anche se potrebbe avere un altro tipo di pezzo. Per esempio:

Binario:

00000000 1111111111 00000000 00000000 00000000 00000000

...potrebbero essere i pedoni neri che sono sulla tavola. Questo verrebbe memorizzato come una singola variabile a 64 bit, un unsigned long long nelle vecchie convenzioni C o uint64 in convenzioni più recenti.

Il vantaggio di usare una bitboard è che la matematica binaria ti permette di calcolare usando le funzioni "bit OR" e "bit AND" molto velocemente, e il "bit shifting" ti permette di "muovere" i pezzi a velocità di registro, più velocemente di qualsiasi altro metodo.

Come puoi immaginare, è molto più difficile fare il debug e testare una bitboard. Dovete scrivere molte delle vostre funzioni di test, come BitboardToBoard() per visualizzare come appare la resa dei bit in modo da poter effettivamente vedere cosa sta succedendo.

Una rappresentazione ad array è molto più semplice.

Black_Pawns[64] = {0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0 ... }; è molto più intuitiva. Se definisci la casella A8 come 1, B8 come 2, ecc, allora Black_Pawn[C7 - 1] restituirà il numero 1. Ricorda, in C, tutti gli array sono basati su un indice 0. Quindi, il primo elemento nell'array è sempre [0] e non [1].

Quindi, già prima di iniziare, hai una domanda difficile a cui rispondere. Una volta che hai deciso quale tipo di generatore di mosse vuoi, allora potrò rispondere alla domanda in modo più completo.

Di Anitra

Negli scacchi, come posso migliorare il mio gioco difensivo? :: Ci sono progetti di scacchi open source?
Link utili