-
Notifications
You must be signed in to change notification settings - Fork 0
ioannanedelcu/Chess-Engine
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
** Proiect PA 2020 Etapa1 ** Echipa: Pisici explozive { Milcu Ana-Maria, 325 CC Nedelcu Ioana, 325 CC } Instructiuni de compilare: Codul sursa este scris in C++, in IDE-ul Clion care isi creeaza automat un fisier de tip Makefile. Astfel, pentru compilare se va utiliza comanda make care va genera executabilul ourEngine, ce poate fi apoi incarcat in xboard pentru testare. > make > xboard -fcp "path_to_project/ourEngine" Structura proiectului: Pentru o mai buna structurare a implementarii am folosit pentru definirea jocului de sah o clasa (Board), care are ca atribute: -> un vector (boardArray), care reprezinta structura efectiva a tablei de joc, la care am adaugat o margine pentru verificarea posibilitatii pieselor de a face miscari ilegale, parasind suprafata de joc. Vectorul are 120 de pozitii si are, la inceperea jocului, urmatoarea structura: IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, WR, WN, WB, WQ, WK, WB, WN, WR, IV, IV, WP, WP, WP, WP, WP, WP, WP, WP, IV, IV, EM, EM, EM, EM, EM, EM, EM, EM, IV, IV, EM, EM, EM, EM, EM, EM, EM, EM, IV, IV, EM, EM, EM, EM, EM, EM, EM, EM, IV, IV, EM, EM, EM, EM, EM, EM, EM, EM, IV, IV, BP, BP, BP, BP, BP, BP, BP, BP, IV, IV, BR, BN, BB, BQ, BK, BB, BN, BR, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV Pentru a lucra mai usor cu piesele, am folosit urmatoarea codificare: EM = 0, // Empty WP = 1, // White Pawn WN = 2, // White Knight WB = 3, // White Bishop WR = 4, // White Rook WQ = 5, // White Queen WK = 6, // White King BP = -1, // Black Pawn BN = -2, // Black Knight BB = -3, // Black Bishop BR = -4, // Black Rook BQ = -5, // Black Queen BK = -6, // Black King IV = 99 // INVALID -> un intreg (stm), in care se retine al cui e randul sa faca o mutare -> un vector (legalMoves), in care sunt generate, la fiecare pas, toate miscarile legale pe care le poate face unul dintre jucatori Comportamental, clasa Board este descrisa de mai multe functii pe care noi le-am considerat necesare acestei etape si a caror implementare o vom descrie ulterior. Pentru a descrie o MUTARE, am folosit structura MOVE: typedef struct MOVE { int from; int to; int piece; int captured; int promoted; MOVE() {} MOVE(int from_, int to_, int piece_, int captured_, int promoted_) { from = from_; to = to_; piece = piece_; captured = captured_; promoted = promoted_; } } MOVE; Aceasta are ca atribute, pozitia din care se pleaca, pozitia destinatie, tipul piesei mutate, precum si doua campuri in care se retine daca mutarea respectiva presupune capturarea unei alte piese, respetiv daca in urma mutarii s-a facut o promovare (specifica pionilor). Pe langa implementarea propriu-zisa a jocului de sah, o parte importanta a acestei etape a reprezentat-o REALIZAREA CONEXIUNII CU programul XBOARD. Astfel, programul permite interactiunea cu urmatoarele comenzi: xboard, new, force, go, white, black, quit, resign, move. Fiecare realizeaza diferite actiuni, asa cum sunt ele descrise in documentatia oficiala a XBOARD. Pentru realizarea acestui protocol ne-am inspirat si din scheletul pus la dispozitie de H.G.Muller (Example of a WinBoard-protocol driver, by H.G.Muller), disponibil pe Winboard Forum. Detalii despre abordarea algoritmică a etapei Asa cum am mentionat deja, clasa Board contine diferite functii, pe care le-am considerat necesare implementarii acestei etape a jocului. Din punct de vedere "algoritmic", cele mai relevante pentru aceasta etapa sunt: -> findLegalMoves Aceasta functie populeaza vectorul legalMoves cu toate miscarile valide in punctul curent al jocului. Acest lucru se realizeaza luand pe rand fiecare tip de piesa in parte (pion, cal, nebun, tura, regina, rege) si cicland prin posibilele miscari ale fiecareia, in functie de directiile in care ii este permis sa mearga si luand in considerare eventualele obstacole. O strctura ajutatoare pe care am folosit-o in cadrul acestei functii este: N = 10, S = -10, E = -1, W = 1, NW = 11, SW = -9, NE = 9, SE = -11, NNW = 21, NNE = 19, NWW = 12, NEE = 8, SSW = -19, SSE = -21, SWW = -8, SEE = -12 , in care am retinut offset-urile corespunzatoare mutarii in diferite directii. De exemplu, tura poate merge N, S, E, W, in timp ce nebunul poate merge NW, NE, SW, SE etc. Un alt aspect relevant este ca, in cazul pionilor, am tratat separat cazurile in care acestia ajung la capatul tablei si deci, vor fi promovati. -> makeMove Aceasta functie realizeaza efectiv mutarea pe care o primeste ca parametru, modificand structura tablei de joc, adica a vectorului boardArray. -> searchBestMove In cadrul acestei etape, functia searchBestMove face un apel al functei rand pe vectorul legalMoves, returnand deci o miscare valida oarecare. Surse de inspiratie: Pentru realizarea protocolului de comunicare cu xboard, ne-am inspirat din scheletul pus la dispozitie pe Winboard Forum: http://www.open-aurec.com/wbforum/viewtopic.php?f=24&t=51739 ,respectiv din documentatia oficiala xboard: https://www.gnu.org/software/xboard/engine-intf.html Pentru implementarea efectiva a jocului ne-am inspirat din conventiile puse la dispozitie pe: https://www.chessprogramming.org/Main_Page , respectiv din implementarile diferitelor engine-uri, precum gnuchess, Fairy-Max, microMax, mchess etc. Responsabilitatea membrilor Pentru aceasta etapa, am lucrat fizic impreuna atat la implementarea codului sursa, cat si la partea de documentatie, debug, corectarea erorilor etc.
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published