Programujeme jednoduchou hru v Javě: Logik

Java Základní konstrukce Programujeme jednoduchou hru v Javě: Logik

V dnešním tutoriálu si ukážeme jak naprogramovat hru Logik jen se znalostí základních konstrukcí jazyka Java.

Pokud hru někdo nezná - Jedná se o logickou hru, kde je cílem uhodnout čtyřmístné číslo (ve skutečnosti se hádají barvy, ale pro jednoduchost budeme brát v úvahu jen čísla).

Pro začátek by bylo vhodné si definovat proměnnou, která v sobě bude obsahovat kolik pozic bude mít hledaná kombinace čísel, to bude proměnná pocetCisel. Na několika místech se totiž budeme na tuto proměnou odkazovat, navíc bude jednoduché hru "oživit" přidáním dalších pozic.

int pocetCisel = 4;

Nyní víme, jak má být číslo velké, proto si ho již můžeme vytvořit. Pro přesnost použijeme pole čísel cislo. Použijeme k tomu for cyklus s metodou Math.random(), kterou vynásobíme 10, aby se objevovaly cifry 0 až 9, pokud chcete hru trochu ulehčit, můžete metodu vynásobit menším číslem. Metoda nám vrací double, proto ji přetypujeme na int.

int cislo[] = new int[pocetCisel];
for(int i=0;i<pocetCisel;i++)
    cislo[i]=(int)(Math.random()*10);

Máme připravené hledané číslo, nyní si přichystáme pomocné proměnné. Budou to vstup, do které budeme načítat pokus uživatele, presne, která bude reprezentovat počet cifer, které jsou správné a správně umístěné, dále pak priblizne, která bude uchovávat počet cifer, které jsou s porovnáním se vstupem v proměnné cislo, ale na špatné pozici. Nakonec si jen přidáme instanci Scanneru.

String volba;
int presne = 0;
int priblizne = 0;
Scanner sc = new Scanner(System.in,"UTF-8");

Řídící cyklus

Řídící cyklus bude ovládat celou naši hru. Jelikož je to logická hra a žádná typovačka, použijeme for cyklus s 10 průběhy pro 10 pokusů.

for(int a=0; a<10; a++)
{
        ...
}

Na začátku každého průběhu se uživatele zeptáme na kombinaci, kterou následně načteme do volba. Pro případ špatného vstupu uživatele přidáme na konec pár mezer. Dále vynulujeme proměnné presne a priblizne.

System.out.printf("Zadejte další kombinaci: ");
volba = sc.nextLine()+ "      ";
presne = priblizne = 0;

Už známe typovací kombinaci, můžeme tedy začít porovnávat. Jelikož potřebujeme porovnat každou cifru, použijeme opět for cyklus s počtem opakování roven pocetCisel.

for(int i=0; i<pocetCisel; i++)
{
        ...
}

Do něj vložíme podmínku, jestli cifra v proměnné číslo na i. pozici je rovna cifře na i. pozici vstupu. Pokud ano, přičteme do presne jedničku. Pokud ne, pokračujeme v else.

if (cislo[i] == volba.charAt(i) - 48)
    presne++;
else
{
        ...
}

Zde budeme porovnávat každou cifru v cislo s každou cifrou ve vstup. Proto potřebujeme for cyklus opět s počtem opakování roven pocetCisel. V něm bude podobná podmínka, jaká byla při ověřování přesnosti. Zde ale budeme porovnávat v cislo cifru na i. pozici a ve vstup na j. pozici. Platí-li podmínka, přičteme jedničku do priblizne a ukončíme cyklus. Docílíme toho tím, že j bude vyšší číslo, než jaké je uvedeno v podmínce cyklu.

for(int j=0;j<pocetCisel;j++)
{
    if(cislo[i]==volba.charAt(j)-48)
    {
        priblizne++;
        j = 10;
    }
}

Nyní vyskočíme zpět do řídícího cyklu a přidáme podmínku pro výhru. Přesněji pokud presne je rovno pocetCisel. Pokud podmínka platí, vypíšeme zprávu s výhrou a ukončíme cyklus podobně jako před chvílí. Jinak vypíšeme stav aktuální kombinace ku hledanému číslu.

if (presne == pocetCisel)
{
    System.out.println("Gratuluji, vyhrál jste!");
    a = 10;
}
else
    System.out.printf("Správně: %d, přibližně: %d\n\n",presne, priblizne);

Nakonec našeho programu, až za řídící cyklus, vložíme podobnou podmínku s tím rozdílem, že bude negovaná. Bude sloužit pro vypsání prohry. Samozřejmě tam přidáme i výpis hledaného čísla a to pomocí for each cyklu.

if(presne!=pocetCisel)
{
    System.out.printf("Prohra! Hledaná kombinace byla: ");
    for (int i:cislo)
        System.out.printf("%d", i);
}

Nyní máme všechno hotové a můžeme si ji vyzkoušet. Určitě ji můžete všelijak upravit → změnit počet pokusů, změnit počet cifer hledané kombinace nebo zmenšit číslo, které se může objevovat v kombinaci.

Hra logik v Javě

Pokud jste něčemu nerozuměli nebo něco vám nefunguje, můžete si aplikaci pod článkem stáhnout.


 

Stáhnout

Staženo 241x (18.7 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

  Aktivity (2)

Článek pro vás napsal Contrix
Avatar
Autor se věnuje programovaní v jazyce Java, ale nepohrdne tvorbou jednodušších webových stránek.

Jak se ti líbí článek?
Celkem (10 hlasů) :
4.64.64.64.64.6


 



 

 

Komentáře

Avatar
syrec3
Člen
Avatar
syrec3:

Zdravím, chcel by som sa opýtať prečo je pri "volba.charAt(i)-48" to "-48"?

Editováno 23.12.2014 13:09
 
Odpovědět 23.12.2014 13:09
Avatar
Contrix
Redaktor
Avatar
Contrix:

Slouží to k tomu, abych z cifry typu char udělal cifru typu int. Těch 48 je posunutí v ASCII tabulce, přesněji 48 odpovídá v ASCII nule.

Odpovědět 23.12.2014 15:43
Jsou zloději, které zákon netrestá, třebaže kradou člověku to nejcennější čas.
Avatar
Avev Frger
Člen
Avatar
Avev Frger:

Ak vygeneruje cislo napr. 1111 a ja zadam 1000 tak vysledkom bude Správně: 1, přibližně: 3 co je zle.

 
Odpovědět 17. července 17:44
Avatar
Richard Volčko:

Prvú jedničku si zadal správne, preto tam máš presne a približne sa počíta tak, že prejdeš ešte raz cyklom všetky štyri čísla, ak je ta tvoja jednička aspoň v jednom z štyroch čísel, tak ti vypíše približne, prvá jednička z čísla 1111 je presne, to znamená, že ostatné 3 budú približne.

 
Odpovědět 19. července 19:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.