Toto je starší verze dokumentu!


Úloha 3

Šachová koncovka

Provizorní zadání

Limit: ?s

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

(tady by mohl ale asi nastat problém s hashováním dané šachovnice - v té úloze to bude potřeba)

  • 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ší)
Hash

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(jezdec)   //Poupraveno - nesmí měnit na střelce
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á 0..48,49)
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, je potřeba vyzvedávat v opačném pořadí!
//Maska 63 je v binárním zápisu (26 nul)111111, aby se vytáhlo posledních 6 bitů 
CV = hash & 63;
hash = hash>>>6;
CK = hash & 63;
hash = hash>>>6;
Bp = hash & 63;
hash = hash>>>6;
BV = hash & 63;
hash = hash>>>6;
BK = 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.
  • Ono ale stejně mít pole velké jako rozsah intu (2^32) je sebevražda. Neví někdo o nějakém lepším ukládání ? (zřetězený seznam a tak)
  • Tahle úloha je dost killer, bylo by fajn to tady dát dohromady
Generator tahů

Zkoušel si někdo udělat generátor tahů? Předpokládám že je nemožné ukládat si všechny možný tahy i v závislosti na rozestavění ostatních figurek - jestli blokují políčka. Jak se potom efektivně zjištuje například u střelce kam může a kam ne ?

Jediné co mě napadlo je zkusit cyklit od střelce směrem doleva nahoru, doprava nahoru atd. dokud nenarazí na jinou figurku/konec šachovnice. Tohle by šlo ještě vylepšit tím, že by se rovnou v poli reprezentujícím šachovnici označili pozice ostatních figurek a při tom cyklení by se jen koukalo jestli se nenarazilo na označený pole - odpadnou tak v nejhorším případě 4 testy na každé pole, bude je 1 test.

courses/a4m33pal/uloha3-2010.1289897302.txt.gz · Poslední úprava: 2025/01/03 18:24 (upraveno mimo DokuWiki)
Nahoru
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0