checkers je jednoduchý program pro hraní dámy podle mezinárodních pravidel. Umožňuje hru proti počítačovému hráči a hru po síti.
checkers [-d difficulty]
- hra proti počítačovému hráči, obtížnost se vyjadřuje číslem, čím vyšší, tím vyšší obtížnost. Defaultní obtížnost je 2.checkers -s [-p port]
- hra po síti, spuštění programu v módu servercheckers -c host [-p port]
- hra po síti, spuštění programu v módu klient, připojení k serveru na adrese addressProgram je rozdělen do pěti modulů:
struct Command
- reprezentuje příkaz uživatele. Tím může být ukončení, uložení či načtení hry, nápověda nebo tah. Tah má zvláštní postavení, protože se posílá soupeři.
int main(int argc, char *argv[])
- zpracuje vstupní argumenty a spustí hlavní herní cyklus
int play(Position *position, const Player me, const int opponent)
- tělo herního cyklu, vyzývá hráče, který je na tahu, ke hře. Dokud nevloží tah, obsluhuje jeho ostatní příkazy. Když je vložen tah, je odeslán soupeři. Hráči, který čeká na tah soupeře, zajistí jeho doručení. Vložení, poslání, přijetí a vykonání tahu je realizováno funkcemi input_command, send_command, receive_command, execute_command.
void print_board(const Position *position)
- vykreslí herní plochu
void print_help()
- vytiskne stručnou nápovědu
Command input_command(Position *position)
- přijme příkaz od uživatele a zavoláním funkce parse ho rozparsuje
Command parse(char *cmd, Position *position)
- zpracuje příkaz (řetězec) do struktury Command
int execute_command(const Command command, Position *position)
- vykoná příkaz
void send_command(const Command command, const int opponent)
- pošle příkaz (tah) soupeři (ať už po síti, či lokálně počítačovému hráči)
Command receive_command(const int opponent, Position *position)
- přijme příkaz (tah) od soupeře
enum Player
- hráč: bílý (WHITE) nebo černý (BLACK)enum Move_type
- typ tahu: tah nebo skok pěšcem nebo dámou a navíc proměna pěšce v dámu z tahu nebo skokuenum Piece
- figurka: bílý (WHITE_) nebo černý(BLACK_) pěšec (PAWN) nebo dáma (KING) nebo nic (NONE)enum Game_state
: stav hry - hraje se (PROCEEDING), bílý nebo černý vyhrál (WINS), remíza (DRAW)enum Direction
- směr pohybu figurky NE, NW, SE, SWstruct Sq_coords
- souřadnice na šachovnici x, ystruct Move
- struktura popisující tah. Obsahuje souřadnice startovního pole, cílového pole a polestruct Moves
- struktura obsahující dynamické pole tahů, jejich počet a počet tahů, které se vlezou do alokovaného místastruct Position
- struktura popisující pozici na šachovnici a hráče na tahustruct Occured_position
- pozice, která se již vyskytla a počet jejích výskytůinitialize_board(Position *position)
- nastaví počáteční postaveníGame_state get_game_state()
- zjístí v jakém stavu je hra (podle pozice)Moves get_all_moves(Position *position)
- vygeneruje všechny možné tahy z dané pozicevoid do_move(Position *position, Move move)
- provede tahvoid undo_move(Position *position, Move move)
- vezme tah zpětint is_member(Sq_coords sq_start, Sq_coords sq_dest, Moves moves)
- určí zda se v poli moves vyskytuje tah, který začíná pohybem z pole sq_start na pole sq_destMoves select_moves_by_start(Sq_coords sq_start, Moves moves)
- z pole moves vybere ty tahy, které začínají na poli sq_startint eq_positions(Position position1, Position position2)
- zjistí zda pozice position1 a position2 jsou stejnéMove match_move(Move move, const Moves *moves)
- "doplní neúplný tah" - z pole moves vybere takový tah, který probíhá přes stejné souřadnice jako daný tah movevoid add_moves(Moves *moves, Moves moves1)
- správa proveditelných tahů z určité pozice. Přidá tahy z moves1 do moves (nechává pouze tahy s nejvyšší délkou skoku a předpokládá, že v jednotlivých polích jsou délky skoků stejné).Moves extend_jump(Move first_part, Moves extensions)
- rozšiřuje skok o další pokračování (plné) používá se při generování vícenásobných skoků.Moves king_jump()
Moves king_step()
Moves pawn_jump()
Moves pawn_step()
- vrací možné posuny (skoky) pěšce (dámy) z dané pozice v daném směruMoves pawn_steps()
Moves pawn_jumps()
Moves king_jumps()
Moves king_steps()
- dtto ve všech směrechMoves get_pawn_moves(Position *position, int x, int y)
- vrací všechny možné tahy pěšce z dané pozice (posuny nebo skoky)Moves get_king_moves(Position *position, int x, int y)
- vrací všechny možné tahy dámy z dané pozice (posuny nebo skoky)Moves get_piece_moves(Position *position, int x, int y)
- vrací všechny možné tahy z dané pozice. (volá get_pawn_moves nebo get_king_moves, podle toho, jaká je figura na x,y)Move choose_best_move(Position *position, int skill)
- vybere "nejlepší" tah z dané pozice (kvalita výsledku závisí na zadané obtížnosti (skill)). volá alpha_beta
int alpha_beta()
- alfa beta algoritmus na výběr nejlepšího tahu.
int evaluate_position(Position *position)
- statická ohodnovací funkce
void sort_moves(Moves moves, Position *position)
- setřídí pole tahů podle jejich ohodnocení funkcí evaluate_position()
do globální proměnné Moves history se zaznamenávají provedené tahy ("partiář")
void insert_move(Move move)
- vloží tah do history
void history2pdn(char *filename)
- zapíše tahy z history do souboru
void pdn2history(char *filename)
- načte tahy ze souboru do history
void load_from_history(Position *position)
- přehraje tahy z history
int coords2no(Sq_coords coords)
- převedení souřadnic na číslo políčka
Sq_coords no2coords(int no)
- převedení číselné reprezentace políčka na souřadnice
void str2move(const char *str, Move *move)
- převedení řetězce reprezentujícího tah do struktury Move
void move2str(const Move *move, char *str)
- převedení struktury Move na notační řetězec tahu
int initialize_server(const int port)
- inicializuje spojeni v modu server, vrati fd klienta
int initialize_client(const char *host, const int port)
- inicializuje spojeni v modu klient, vrati fd serveru
int netwrite(int sock, char *b)
- zapise zpravu do soketu sock
int netread(int sock, char *b)
- precte zpravu ze socketu sock
void terminate_server(const int client, const int server)
- ukonci spojeni v modu server
void terminate_client(const int client)
- ukonci spojeni v modu klient