Toto je starší verze dokumentu!
Úloha 3
Jak na to:
Overview
Naprogramujeme generátor všech možných validních tahů všech figur pro danou pozici (viz úloha 3a)
Naprogramujeme funkci, která vyhodnotí zda je daná pozice pro někoho vítězná (šach mat)
Vždy vygenerujeme jeden tah, ověříme jestli to není mat a když není tak se rekurzivně zeptáme na další tahy založeném na tomto tahu
Rekurze končí když:
Daná situace je pro někoho vítězná
Stejná situace už se opakovala 3x (pat)
Jsme v maximální hloubce (neurčité řešení)
Výstupy z rekurze spojujeme podle pravidel
Aktuální hráč zvolí vždy svojí výhru před čímkoli
Aktuální hráč zvolí raději neurčito nebo pat před prohrou
Pat a pat je pat
Neurčito a neurčito je neurčito
Černý hráč zvolí radši pat před neurčito
Bílý hráč zvolí radši neurčito před patem
Když někde výhra probublá až nahoru, končíme algoritmus
Implementace
Závisí na ukládání situací (uzlů):
figury se dají uložit jako proměnné obsahující číslo 0..48 značící souřadnice, -1 = vyhozená figura
nebo lze celá situace zakódovat binárně do jednoho intu
Na zrychlení je potřeba mít předgenerované tabulky
tabulku čísel na souřadnice
tabulku souřadnic na čísla
tabulku 49×49 jestli se ohrožuje věž s králem (asi zbytečné, mělo by stačit otestovat, jestli se shoduje sloupec nebo řádek, navíc z tabulky nezjistí, jestli mezi nimi něco není)
tabulku možných tahů krále pro všechny políčka
tabulku možných tahů jezdce pro všechny políčka
(doplňte další)
Na zakodovani celé šachovnice do jednoho integeru v jave (32 bitů) by šlo něco takovýho:
//Čísla označují pozice na na šachovnici 0..6*0..6
//Pořadí jednotlivých figurek se nesmí měnit
//V co je proměněnej pěšák je vyjádřený proměnou mutace - stavy:
// 0(nic),1(dama),2(střelec),3(jezdec)
int BK=9,BV=23,Bp=7,CK=6,CV=40,mutace=0;
//Naskládám to tam odzadu
//Posun o 6 pozic tu je proto, že do 6 pozic nacpu číslo velké 0..63(šachovnice má -1..48)
int hash = mutace;
hash = (hash<<6) | BK;
hash = (hash<<6) | BV;
hash = (hash<<6) | Bp;
hash = (hash<<6) | CK;
hash = (hash<<6) | CV;
//A pak to zase vyzvednu
//Maska 63 je v binárním zápisu (26 nul)111111, aby se vytáhlo posledních 6 bitů
BK = hash & 63;
hash = hash>>>6;
BV = hash & 63;
hash = hash>>>6;
Bp = hash & 63;
hash = hash>>>6;
CK = hash & 63;
hash = hash>>>6;
CV = hash & 63;
hash = hash>>>6;
mutace = hash & 3;
Problém je v tom, že v Javě jsou všechny typy se znaménkem…tedy první bit ve 32 bitovém intu určuje znaménko a my potřebujem i tenhle bit…takže se bude stávat že výsledný hash bude záporný. Kvůli tomu nemůže výsledný hash označovat index v poli, kam by se hashe ukládali.
Nahoru