-
Notifications
You must be signed in to change notification settings - Fork 0
/
README
154 lines (120 loc) · 5.72 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
** 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.