Programátorská dokumentace programu Checkers ============================================ 1) Soubory Program je rozdělen do čtyř modulů: * checkers: správa uživatelského rozhraní, komunikace s uživatelem, integrace všech modulů * rules_int: popis pravidel mezinárodní dámy * ai_int: inteligence počítačového hráče * pdn: ukládání a načítání her (do formátu na bázi PDN (Portable Draughts Notation) 2) Popis funkcí modulu checkers WinMain(), MyWndProc() - standardní funkce programování pro Windows paint_board() - vykreslení šachovnice podle aktuální pozice (ta je uchovávána v globální proměnné position) hndl_button_up() - funkce, která ošetřuje událost WM_LBUTTONUP get_square_coords() - převedení souřadnic v okně na souřadnice na šachovnici get_board_measurements() - vypočtení rozměru šachovnice z rozměrů okna paint_square() - vykreslení jednoho políčka na šachovnici podle aktuální pozice paint_move() - vykreslení právě provedeného tahu GetOpenGameName() - otevření dialogu na načtení hry (vrací název souboru) GetSaveGameName() - otevření dialogu na uložení hry (vrací název souboru) check_player_skill() - zaškrtnutí tagu v menu u zvoleného hráče (člověk, nebo počítač dle úrovně obtížnosti) 3) Popis struktur a funkcí modulu rules_int * Struktury 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 skoku enum 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, SW struct Sq_coords - souřadnice na šachovnici x, y struct Move - struktura popisující tah. Obsahuje souřadnice startovního pole, cílového pole a pole souřadnic prostředních polí (pro případ vícenásobného přeskoku). Dále počet přeskočených polí, typ tahu, pole přeskočených figurek a jejich souřadnice. struct Moves - struktura obsahující dynamické pole tahů, jejich počet a počet tahů, které se vlezou do alokovaného místa struct Position - struktura popisující pozici na šachovnici a hráče na tahu struct Occured_position - pozice, která se již vyskytla a počet jejích výskytů * Funkce 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é pozice void do_move(Position *position, Move move) - provede tah void undo_move(Position *position, Move move) - vezme tah zpět int 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_dest Moves select_moves_by_start(Sq_coords sq_start, Moves moves) - z pole moves vybere ty tahy, které začínají na poli sq_start int 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 move * Lokální funkce (pouze vybrané, čistě mechanické vynechávám) void 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ěru Moves pawn_steps() Moves pawn_jumps() Moves king_jumps() Moves king_steps() - dtto ve všech směrech Moves 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) 4) Popis funkcí modulu ai_int 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() 5) Popis modulu pdn 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