public class Board
extends java.lang.Object
Varianty:
Board mb = Board.builderOriginal().create();
mb.showWindow();
mb.newGame();
mb.uncover();
for (int i = 0; i < mb.getRows(); i++) {
if (mb.addGuess(mb.random()).isDone()) {
System.out.println("Won: " + mb.getCurrent());
break;
}
Utils.sleep(50);
}
Modifier and Type | Class and Description |
---|---|
static class |
Board.Builder
Stavitel (konstruktér)
hrací desky . |
static interface |
Board.Display
Zobrazovací API.
|
static interface |
Board.DisplayFactory
Továrna na zobrazovací API.
|
static interface |
Board.Strategy
Strategie (algoritmus) hry.
|
Modifier and Type | Method and Description |
---|---|
Verdict |
addGuess(Peg... guess)
Přidá další tipnutou n-tici do panelu na následující řádek.
|
Verdict |
addGuess(Tuples guess)
Přidá další tipnutou n-tici do panelu na následující řádek.
|
static Board.Builder |
builderCustom(Peg... range)
Vytvoří prázdného stavitele založeného jen na předaných barvách kolíčků.
|
static Board.Builder |
builderOriginal()
Vytvoří stavitele pro originální hru se 6 barevnými kolíčky a 4 sloupci,
ve kterých hráč tipuje.
|
static Board.Builder |
builderSuper()
Vytvoří stavitele pro vylepšenou hru s 8 barevnými kolíčky a 5 sloupci,
ve kterých hráč tipuje.
|
Tuples |
createTuples()
Vytvoří prázdnou n-tici o šířce počtu sloupců.
|
int |
getColumns()
Vrátí počet sloupců.
|
int |
getCurrent()
Vrátí aktuální číslo řádku, což je řádek, na který se umístí následující
tip.
|
Tuples |
getGuess()
Vrátí poslední přidaný tip.
|
Tuples |
getGuess(int row)
Vrátí konkrétní přidaný tip.
|
Tuples |
getGuess(int row,
Tuples guess)
Vrátí konkrétní přidaný tip.
|
Tuples |
getRange()
Vrátí kolíčky všech barev jako n-tici.
|
Peg[] |
getRangePegs()
Vrátí kolíčky všech barev jako pole kolíčků.
|
java.util.Set<Peg> |
getRangeSet()
Vrátí kolíčky všech barev jako množinu kolíčků.
|
int |
getRows()
Vrátí počet řádků.
|
Verdict |
getVerdict()
Získá verdikt posledního přidaného tipu.
|
Verdict |
getVerdict(int row)
Vrátí verdikt konkrétního přidaného tipu.
|
Verdict |
getVerdict(Tuples pattern,
Tuples guess)
Určí verdikt tipu nanečisto, který by byl vrácen po zavolání
addGuess(cz.gyarab.util.game.mastermind.Tuples) , pokud by hledanou n-ticí byl pattern . |
Tuples[] |
guessing()
Vrátí všechny možné variace (s opakováním nebo bez podle nastavení
možnosti opakování barev).
|
void |
hideWindow()
Skryje vizualizaci.
|
boolean |
isAdvice()
Zjistí, zda má
verdikt obsahovat také nápovědu. |
boolean |
isCover()
Zjistí, zda je hledaná n-tice utajená i pro pozorovatele.
|
boolean |
isRetake()
Zjistí, zda se mohou opakovat barvy v hledané n-tici.
|
static void |
main(java.lang.String[] args)
Spustí demonstraci použití této třídy.
|
void |
newGame()
Zahájí novou hru s náhodnou tajnou sekvencí barevných kolíčků.
|
void |
newGame(Peg... pattern)
Zahájí novou hru s konkrétní tajnou sekvencí barevných kolíčků.
|
void |
newGame(Tuples pattern)
Zahájí novou hru s konkrétní tajnou sekvencí barevných kolíčků.
|
Tuples |
random()
Vytvoří n-tici naplněnou náhodnými kolíčky.
|
Tuples |
random(Tuples pattern)
Při opakovaném generování náhodných n-tic může být paměťově neefektivní
vytvářet stále nová úložiště.
|
Board.Strategy |
randomStrategy()
Vytvoří triviální strategii řešení náhodnými pokusy.
|
void |
setDisplayFactory(Board.DisplayFactory displayFactory)
Nastaví továrnu na zobrazovací panel.
|
void |
showWindow()
Zobrazí vizualizaci.
|
void |
testStrategy(Board.Strategy strategy)
Spustí a vyhodnotí test strategie hry.
|
void |
uncover()
Při zapnuté vizualizaci se normálně skrytá
n-tice odkryje pozorovateli.
|
public static void main(java.lang.String[] args)
args
- (ignoruje)public static Board.Builder builderOriginal()
public static Board.Builder builderSuper()
public static Board.Builder builderCustom(Peg... range)
range
- možnosti pro hru (lze zadat jako jednotlivé objekty i jako
pole)public void setDisplayFactory(Board.DisplayFactory displayFactory)
displayFactory
- nová továrnapublic void newGame()
public void newGame(Peg... pattern)
pattern
- konkrétní hodnota šablony, kterou má hráč uhodnout (jen
pro ladící účly)java.lang.IllegalArgumentException
- pokud zadaná šablona neobsahuje
příslušný počet kolíčků nebo nejsou ze zadaného rozsahupublic void newGame(Tuples pattern)
pattern
- konkrétní hodnota šablony, kterou má hráč uhodnout (jen
pro ladící účely)java.lang.IllegalArgumentException
- pokud zadaná šablona neobsahuje
příslušný počet kolíčků nebo nejsou ze zadaného rozsahupublic final Tuples createTuples()
Tuples.setPeg(int, cz.gyarab.util.game.mastermind.Peg)
public Tuples random()
public Tuples random(Tuples pattern)
pattern
- znovupoužitelná n-tice, musí být vytvořena ve správném
rozměru (shodný počet sloupců)pattern
naplněný náhodnými kolíčkycreateTuples()
public Board.Strategy randomStrategy()
public Tuples[] guessing()
public Verdict addGuess(Tuples guess)
objektem
.
Při implementaci strategie se nesmí tato metoda volat,
ve strategii je tipem návratová hodnota metody Board.Strategy.guess()
.
guess
- tip hráčepublic Verdict addGuess(Peg... guess)
Při implementaci strategie se nesmí tato metoda volat,
ve strategii je tipem návratová hodnota metody Board.Strategy.guess()
.
guess
- tip hráčepublic Tuples getGuess()
java.lang.IllegalStateException
- bezprostředně po začátku hry, kdy ještě
nebyl žádný tip přidánpublic Tuples getGuess(int row)
row
- pořadí přidaného tipu:
0 <= row < getCurrent()
public Tuples getGuess(int row, Tuples guess)
row
- pořadí přidaného tipu:
0 <= row < getCurrent()
guess
- znovupoužitelná n-ticeguess
public Verdict getVerdict()
java.lang.IllegalStateException
- bezprostředně po začátku hry, kdy ještě
nebyl žádný tip přidánpublic Verdict getVerdict(int row)
row
- pořadí přidaného tipu:
0 <= row < getCurrent()
public Verdict getVerdict(Tuples pattern, Tuples guess)
addGuess(cz.gyarab.util.game.mastermind.Tuples)
, pokud by hledanou n-ticí byl pattern
.pattern
- predikovaná hledaná n-ticeguess
- testovaný tipaddGuess(guess)
,
kdyby pattern
byla hledaná n-ticepublic Tuples getRange()
Poznámka: Vrácená hodnota je kopií originálních dat, takže je možné hodnoty bez vlivu na chod hry měnit. To ale také znamená, že při opakovaném volání se vytvářejí další klony.
public Peg[] getRangePegs()
Poznámka: Vrácená hodnota je klonem originálních dat, takže je možné hodnoty bez vlivu na chod hry měnit. To ale také znamená, že při opakovaném volání se vytvářejí další klony.
public java.util.Set<Peg> getRangeSet()
Poznámka: Vrácená hodnota je neměnitelný obal originálních dat, takže není možné hodnoty měnit. To ale také znamená, že při opakovaném volání se vytvářejí další obaly.
public int getColumns()
public int getRows()
public int getCurrent()
0 <= getCurrent() <= getRows()
.
Nulová hodnota značí, že ještě nepadl v této hře žádný tip, a nejvyšší,
že už nelze přidávat další tipy.public boolean isRetake()
true
, pokud se barvy mohou opakovat (výchozí
hodnota)Board.Builder.setRetake(boolean)
public boolean isAdvice()
verdikt
obsahovat také nápovědu. Ta
spočívá v tom, že lze zjistit, který konkrétní kolíček má které
hodnocení. Normálně lze z verdiktu poznat jen počet správně umístěných a
správně barevných kolíčků.true
, pokud je nápověda zapnutá (výchozí je
false
)Board.Builder.setAdvice(boolean)
public boolean isCover()
true
, pokud není hledaná n-tice zobrazena (výchozí)uncover()
public void uncover()
public void showWindow()
public void hideWindow()
showWindow()
public void testStrategy(Board.Strategy strategy)
Statistika obsahuje celkový potřebný čas, celkový počet testů (= počet všech variací), celkový počet tipů, počet úspěšných a neúspěšných testů, minimální, maximální a průměrný počet nutných pokusů na úspěšné vyřešení úlohy.
Při porovnání různých strategií je nutné v první řadě vyhodnotit počet úspěšných řešení. Pouze ty strategie, které ani jednou neminou, je možné dále porovnávat na např. průměrný či maximální počet potřebných pokusů nebo celkový potřebný čas.
Originální hra obsahuje 6 barev, 4 sloupce a 12 řádků. Pro toto zadání existuje algoritmus, který s jistotou dokáže vyřešit úlohu vždy nejhůře na 5 pokusů. Jednodušší algoritmus dokáže úlohu vždy řešit v průměru na 5 pokusů. Triviální strategie (tipuje náhodně) je úspěšná v cca 1 % případů.
strategy
- testovaná strategie