Skip to content

Commit 172a480

Browse files
committed
Initial commit
0 parents  commit 172a480

36 files changed

+5470
-0
lines changed

.gitignore

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/.debug
2+
/xboard.debug
3+
/han-chesu
4+
5+
/.vscode/settings.json
6+
7+
/checker/
8+
9+
/obj/
10+
11+
/others/
12+
/sources/

.vscode/c_cpp_properties.json

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"configurations": [
3+
{
4+
"name": "Linux",
5+
"includePath": [
6+
"${workspaceFolder}/include"
7+
],
8+
"defines": [
9+
"DEBUG"
10+
],
11+
"cStandard": "c99",
12+
"intelliSenseMode": "gcc-x64"
13+
}
14+
],
15+
"version": 4
16+
}

.vscode/launch.json

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"name": "gcc build and debug",
9+
"type": "cppdbg",
10+
"request": "launch",
11+
"program": "${workspaceFolder}/han-chesu",
12+
"args": [],
13+
"stopAtEntry": false,
14+
"cwd": "${workspaceFolder}",
15+
"environment": [],
16+
"externalConsole": false,
17+
"MIMode": "gdb",
18+
"setupCommands": [
19+
{
20+
"description": "Enable pretty-printing for gdb",
21+
"text": "-enable-pretty-printing",
22+
"ignoreFailures": true
23+
}
24+
],
25+
"preLaunchTask": "gcc build",
26+
"miDebuggerPath": "/usr/bin/gdb"
27+
}
28+
]
29+
}

.vscode/tasks.json

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"tasks": [
3+
{
4+
"type": "shell",
5+
"label": "gcc build",
6+
"command": "make",
7+
"args": [
8+
"DEBUG=1"
9+
]
10+
}
11+
],
12+
"version": "2.0.0"
13+
}

LICENSE.txt

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
MIT License
2+
3+
Copyright (c) 2020 Andrei "cheez3d" Stoian
4+
Copyright (c) 2020 Ionuț Ranja
5+
6+
Permission is hereby granted, free of charge, to any person obtaining a copy
7+
of this software and associated documentation files (the "Software"), to deal
8+
in the Software without restriction, including without limitation the rights
9+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
copies of the Software, and to permit persons to whom the Software is
11+
furnished to do so, subject to the following conditions:
12+
13+
The above copyright notice and this permission notice shall be included in all
14+
copies or substantial portions of the Software.
15+
16+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20+
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21+
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
22+
OR OTHER DEALINGS IN THE SOFTWARE.

LOG.txt

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
Andrei, 26 februarie 2020
2+
-> am creat repository-ul
3+
4+
Ionuț, 29 februarie 2020
5+
-> am creat un Makefile simplu cu cele trei reguli de bază
6+
-> am creat fișierul xboard.c care conține câteva structuri
7+
pentru piesele de șah și tabla de șah + 3 funcții de creat
8+
piese, tabla și afișarea tablei de joc
9+
-> rămâne de discutat dacă se păstrează aceste structuri de date
10+
și scheletele aferente acestora pentru rezolvarea etapei 1
11+
12+
Andrei, 1 martie 2020
13+
-> ne-am hotărât să utilizăm bitboard-uri pentru memorarea stării joculul,
14+
astfel că am modificat codul în consecință
15+
-> am conceput un mic schelet pe baza căruia vom dezvolta engine-ul de șah
16+
-> am actualizat Makefile-ul
17+
-> momentan engine-ul afișează o tablă de șah la început de joc
18+
19+
Andrei, 2 martie 2020
20+
-> mici modificari de notații prin cod
21+
22+
Andrei, 5 martie 2020
23+
-> am adaugat noi tabele cu bitboard-uri utile ce vor folosi mai târziu
24+
pentru generarea de mișcări pentru fiecare piesă în parte
25+
-> am rescris codul de inițializare a tablei de joc pentru a fi mai intuitiv
26+
27+
Ionuț, 7 martie 2020
28+
-> am făcut un schelet de cod pentru xboard.c în care va trebui să completez
29+
comenzile neimplementate
30+
-> pentru continuarea implementării aveam nevoie de partea de cod pentru
31+
atacuri a lui Andrei, dar nu a mers gitlab-ul
32+
-> voi continua după ce își revine gitlab
33+
34+
Andrei, 10 martie 2020
35+
-> am implementat generarea tuturor seturilor de atacuri pentru fiecare piesă
36+
-> pentru piesele „sliding” (tură, nebun, regina=tură+nebun) se folosesc
37+
bitboard-uri „magice”, adică se generează toate seturile de atacuri pentru
38+
fiecare pătrat, pentru fiecare posibilitate de ocupare a tablei de joc
39+
(ce piese ocupa tabla de joc) și se pun într-un lookup table; partea
40+
„magică” constă în faptul că indexarea LUT-ului se face printr-un hash creat
41+
prin înmulțirea unui număr „magic” care să nu creeze coliziuni cu biții
42+
semnificativi de ocupare a tablei de joc (biți semnificativi înseamna pentru
43+
tura „ce mă blocheaza pe verticala mea și pe orizontala mea?”, iar pentru
44+
nebun „ce mă blochează pe cele 2 diagonale ale mele?”)
45+
-> pentru piesele non-„sliding” (cal, rege, pion) se generează de asemenea
46+
lookup table-uri pentru seturile de atac pentru fiecare pătrat în parte, dar
47+
se poate indexa direct după pătrat
48+
49+
Ionuț, 15 martie 2020
50+
-> am realizat o implementare minimală a mișcării cailor pentru prima etapă
51+
-> realizez, după ce a fost dată o comandă de către jucător, o listă a tuturor
52+
mișcărilor posibile pentru engine pentru un anumit tip de piesă (momentan
53+
doar pentru cal), iar apoi, ținând cont de faptul că e doar prima etapă,
54+
aleg aleatoriu o mișcare din setul de mișcări posibile după care golesc
55+
lista de mișcări
56+
-> pentru a asigura faptul că jocul se încheie cu succes, dupa ce engine-ul
57+
primește o mișcare de la jucător, verifică - momentan hardcodat, va fi
58+
automat după ce vor fi implementate restul de mișcări - dacă acea mișcare
59+
a însemnat pierderea unui cal, iar dacă da, va șterge calul din
60+
bitboard-urile tablei de joc
61+
-> tot aici, dacă a pierdut toți caii, înseamnă că lista de mutări posibile
62+
este goală, deci numărul total de mutări pe care poate să le faca engine-ul
63+
este 0, în acest moment dând resign
64+
65+
Andrei, 16 martie 2020
66+
-> am îmbunătățit considerabil API-ul de comunicare cu xboard (vezi fișierele
67+
sursă care încep cu „xboard”)
68+
-> am făcut posibil ca engine-ul să joace atât cu alb, cât și cu negru,
69+
astfel că acum se poate juca și engine vs. engine
70+
71+
Andrei, 17 martie 2020
72+
-> am terminat prima etapă => am creat arhiva `Etapa1.zip`
73+
74+
Andrei, 17 aprilie 2020
75+
-> am adăugat un script (debug-xboard.sh) pentru facilitarea depanării;
76+
pentru rulare se poate folosi `make xboard`
77+
-> am restructurat o parte din cod
78+
-> am implementat parsarea șirurilor FEN pentru comanda `setboard`
79+
80+
Ionuț, 18 aprilie 2020
81+
-> am implementat majoritatea mișcărilor
82+
-> acum lista de mișcări va cuprinde destule mișcări pentru un joc demo
83+
-> voi restructura codul și implementa restul de mișcări mai târziu
84+
85+
Andrei, 19 aprilie 2020
86+
-> am implementat modul force utilizat de XBoard
87+
88+
Ionuț, 19 aprilie 2020
89+
-> am restructurat codul pentru generarea mișcărilor
90+
-> am implementat toate mișcările posibile
91+
92+
Ionuț, 20 aprilie 2020
93+
-> am adăugat implementare pentru piece-square-table necesar pentru funcția
94+
de evaluare
95+
-> am implementat funcția de evaluare care va oferi, pentru
96+
culoarea dată ca argument, avantajul jucătorului cu acea
97+
culoare în centipawns
98+
99+
Andrei, 20 aprilie 2020
100+
-> am finalizat menținerea corectă a tablei de șah interne
101+
102+
Andrei, 21 aprilie 2020
103+
-> am implementat o variantă simplă de negamax
104+
-> am terminat a doua etapă => am creat arhiva `Etapa2.zip`
105+
106+
Andrei, 19 mai 2020
107+
-> am implementat suport pentru opening books
108+
109+
Ionuț, 19 mai 2020
110+
-> am terminat de implementat alpha-beta pruning & euristici elevate
111+
-> am terminat a treia etapă => am creat arhiva `Etapa3.zip`

Makefile

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
DEBUG ?= 0
2+
DEBUG_MARKER := .debug
3+
4+
CC := gcc
5+
6+
CFLAGS := -std=gnu99 -Wall -Wextra
7+
CFLAGS_DEBUG := -DDEBUG -g
8+
CFLAGS_NDEBUG := -DNDEBUG -O3 -flto
9+
10+
LDFLAGS := -Wall -Wextra
11+
LDFLAGS_DEBUG := -g
12+
LDFLAGS_NDEBUG := -O3 -flto
13+
14+
LDLIBS :=
15+
16+
INC_DIR := include
17+
SRC_DIR := src
18+
OBJ_DIR := obj
19+
20+
BIN := han-chesu
21+
SRC := $(wildcard $(SRC_DIR)/*.c)
22+
OBJ := $(subst $(SRC_DIR)/,$(OBJ_DIR)/,$(SRC:%.c=%.o))
23+
DEP := $(OBJ:%.o=%.d)
24+
25+
$(shell mkdir -p $(INC_DIR) $(SRC_DIR) $(OBJ_DIR))
26+
27+
.DEFAULT_GOAL := build
28+
29+
ifneq ($(filter 0 valgrind,$(DEBUG) $(MAKECMDGOALS)),0)
30+
CFLAGS += $(CFLAGS_DEBUG)
31+
LDFLAGS += $(LDFLAGS_DEBUG)
32+
33+
ifeq ($(wildcard $(DEBUG_MARKER)),)
34+
$(shell touch $(DEBUG_MARKER))
35+
$(shell touch Makefile)
36+
endif
37+
else
38+
CFLAGS += $(CFLAGS_NDEBUG)
39+
LDFLAGS += $(LDFLAGS_NDEBUG)
40+
41+
ifneq ($(wildcard $(DEBUG_MARKER)),)
42+
$(shell rm -f $(DEBUG_MARKER))
43+
$(shell touch Makefile)
44+
endif
45+
endif
46+
47+
$(BIN): $(OBJ)
48+
$(CC) $(LDFLAGS) $(LDLIBS) -o $(BIN) $^
49+
50+
-include $(DEP)
51+
52+
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c Makefile
53+
$(CC) -iquote $(INC_DIR) -MMD -c $(CFLAGS) -o $@ $<
54+
55+
build: $(BIN)
56+
57+
valgrind: build
58+
@valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --track-origins=yes ./$(BIN)
59+
60+
.PHONY: run
61+
run: build
62+
@./$(BIN)
63+
64+
.PHONY: xboard
65+
xboard: build
66+
@./debug-xboard.sh
67+
68+
.PHONY: clean
69+
clean:
70+
@-rm -f $(OBJ) $(DEP) $(BIN)

README.md

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
[cecp]: https://www.gnu.org/software/xboard/engine-intf.html#9
2+
[bitboards]: https://www.chessprogramming.org/Bitboards
3+
[opening-book]: https://www.chessprogramming.org/Opening_Book
4+
[demo]: doc/demo.gif
5+
6+
[makefile]: Makefile
7+
8+
# Han-Chesu Chess Engine
9+
_Han-Chesu_ is a 2-person team effort chess engine which understands the [Chess Engine Communication Protocol][cecp], makes use of [bitboards][bitboards] for achieving high performance in its computations and also supports [opening books][opening-book]. It won 1st place in the faculty chess engine tournament against the engines of the other teams. The following is a small demonstration of playing against the engine:
10+
11+
![demo]
12+
13+
## Compiling & Running the Engine
14+
The following commands can be used to compile and/or run the chess engine. For compiling in _debug_ mode, prefix the commands below with `DEBUG=1` (the [Makefile][makefile] compiles by default in _release_ mode).
15+
```shell
16+
$ make build # build the engine
17+
$ make run # run the engine in the CLI
18+
$ make xboard # run the engine in XBoard
19+
```

book.bin

4.95 MB
Binary file not shown.

debug-xboard.sh

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env bash
2+
3+
export DISPLAY=:0
4+
5+
XB_FCP="make -s run"
6+
XB_DEBUG_FILE="xboard.debug"
7+
8+
>"$XB_DEBUG_FILE"
9+
10+
{
11+
setsid -w \
12+
xboard -fcp "$XB_FCP" \
13+
-debug \
14+
-nameOfDebugFile "$XB_DEBUG_FILE" \
15+
-engineDebugOutput 1 \
16+
2>/dev/null
17+
18+
# kill -SIGTERM $$ &>/dev/null
19+
} &
20+
21+
xb_pid=$(pgrep -P $!)
22+
23+
less -Q +F "$XB_DEBUG_FILE"
24+
25+
kill -SIGTERM $xb_pid &>/dev/null
26+
kill -SIGHUP $xb_pid &>/dev/null
27+
28+
exit 0

doc/demo.gif

976 KB
Loading

0 commit comments

Comments
 (0)