Quale paradigma usare per scrivere il motore degli scacchi?

9

Se aveste intenzione di scrivere un motore di gioco di scacchi, quale paradigma di programmazione usereste (OOP, procedurale, ecc.) e perché dovreste sceglierlo? Per motore di scacchi, intendo la parte di un programma che valuta la scheda corrente e decide la prossima mossa del computer.

Te lo chiedo perché ho pensato che sarebbe stato divertente scrivere un motore di scacchi. Poi mi è venuto in mente che potevo usarlo come un progetto per l'apprendimento della programmazione funzionale. Poi mi è venuto in mente che alcuni problemi non sono adatti al paradigma funzionale. Poi mi è venuto in mente che questa potrebbe essere una buona fonte di discussione.

    
posta poke 08.01.2011 - 17:24
fonte

4 risposte

7

La valutazione non è un problema parallelizzabile per quanto ne so, ma la valutazione di diverse catene è, quindi la scriverò in modo definitivo per fare uso di più core e multithreading.

Che tu vada funzionale o semi-funzionale è una questione di gusti. Personalmente vorrei andare OOP e utilizzare il supporto per la programmazione funzionale e la parallelizzazione che esiste ad esempio in C #

In un sidenote, se dovessi scrivere un motore di scacchi, proverei a crearne uno che possa davvero "pensare" agli scacchi. Usando la valutazione delle schede per la forza bruta tutte le combinazioni possibili sono state condotte a morte ed estremamente bene, ma non ci sono stati molti progressi nel fare un motore di scacchi più pensante / sfocato. Sarebbe una sfida! :)

Trova alcuni giochi con un gioco di posizione davvero difficile e mosse forti (sono contrassegnati! o !!) e li usa per addestrare e testare il tuo motore.

    
risposta data 08.01.2011 - 17:30
fonte
2

Credo che dipenda dai tuoi obiettivi, che prendo sono strettamente didattici. Se stavi cercando di scrivere un prodotto competitivo, vorrai la massima efficienza nei valutatori di livello più basso. Un sacco di opportunità per il parallelismo a livello di bit qui. Anche molte opportunità per i tavoli hash. Inoltre opportunità di sfruttare il parallelismo. Quindi ai livelli più alti, probabilmente vuoi un sistema valido per l'intelligenza artificiale, quindi probabilmente significa una languauge di programmazione funzionale. Ovviamente non vuoi fare tutte queste cose, sceglierne una o due e accontentarti del fatto che il tuo progetto non sarà competitivo con i programmi migliori.

    
risposta data 08.01.2011 - 18:54
fonte
2

Ho scelto il paradigma OOP nel mio motore di scacchi chiamato Il turco . La prima versione del mio motore di scacchi è stata scritta più procedurale piuttosto che OOP. Poi ho trovato così difficile migliorare il mio motore di scacchi a causa dei lunghi blocchi di codice e del design scadente.

Dipende da ciò che si vuole ottenere mentre si scrive il motore di scacchi. Se si desidera creare un motore di scacchi che sia troppo strong, non è possibile farlo in lingue OOP a causa dei collegamenti lenti in ritardo. Se vuoi solo imparare a programmare e divertirti scrivendo il motore di scacchi in modo da gestire le lingue e OOP sarà tuo amico. Posso suggerirti di scegliere C # perché è anche possibile scrivere il motore degli scacchi in modo più procedurale con esso.

    
risposta data 08.01.2011 - 21:04
fonte
2

Ho portato un semplice programma di scacchi come mezzo per apprendere la quarta lingua. Si è rivelato molto adatto a questo problema molto imperativo e ho imparato molto. Lo stack aperto mi ha permesso di implementare la ricerca alfa-beta in un modo unico che mi ha permesso di capire meglio l'algoritmo.

Si potrebbe pensare che la programmazione funzionale sarebbe ottima per i programmi di scacchi, dal momento che gli algoritmi core (alfa-beta depth-first search, evaluation) sono ricorsivi e funzionalmente severi. Tuttavia, un programma di scacchi vive e muore per l'efficienza e nessuno degli attuali ritmi di linguaggi funzionali ha questo scopo. I primi cento motori all'avanguardia utilizzano tutti i linguaggi imperativi (principalmente C / C ++, poi Delphi) per avere il massimo controllo sull'utilizzo della memoria, il multi-threading, lo stato globale e la generazione del codice. Tutti i linguaggi funzionali utilizzano l'allocazione dinamica della memoria per le strutture dati principali, che è la morte di un programma di scacchi.

Mi piacerebbe ancora vedere qualcuno fare un tentativo di entrare nei primi 100 motori di scacchi usando un linguaggio funzionale.

    
risposta data 10.11.2012 - 17:02
fonte