BF Summer sales
Pouze tento týden sleva až 80 % na HTML & CSS a JavaScript
80 % bodů zdarma na online výuku díky naší Letní akci!

Programujeme jednoduchou hru v Javě: Šibenice

Připravil jsem si pro vás tutoriál, ve kterém se naučíme vytvořit všem známou hru "Šibenice" v konzoli. K tomu budeme potřebovat jen základní konstrukce jazyka Java a pár maličkostí, které budou v průběhu tutoriálu vysvětleny.

Budeme potřebovat vědět, kolikrát uživatel zadal špatné písmeno. K tomu nám poslouží proměnná trest, která bude počítat "trestné body". Dále budeme potřebovat proměnnou vyhra, která nám naopak bude počítat kolik správných písmen uživatel uhodl. Hra by šla vytvořit i bez této proměnné, ale pro jednoduchost ji tu necháme. Bez čeho se ale neobejdeme bude hledané slovo, které bude ukryto v proměnné slovo. V poslední řadě potřebujeme proměnnou, která si bude pamatovat postup hry, a to bude postup.

int trest = 0;
int vyhra = 0;
String slovo = "jablko";
char[] postup = new char[slovo.length()];

Nyní, když máme proměnné vytvořené, vložíme do postup tolik pomlček, kolik je písmen ve slově. K tomu nám poslouží jednoduchý cyklus.

for(int i=0;i!=slovo.length();i++)
  postup[i] = '-';
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Máme vše potřebné připravené, tak se můžeme pustit do hlavního cyklu, který bude řídit celou aplikaci. Vytvoříme ho pomocí cyklu while, který se opakuje tak dlouho, dokud platí podmínka. V našem případě se ptáme, jestli uživatel nedosáhl hranici 7 trestných bodů a zároveň neuhodl všechny písmena.

while (trest!=7&&vyhra!=slovo.length())
{
  ...
}

Hned na začátek vypíšeme postup, ať uživatel ví, kolikatipísmenné slovo má uhodnout. Následně ho vyzveme, aby zadal písmeno, které si myslí, že je obsaženo ve slově. Pro případ, že by uživatel zadal velké písmeno, použijeme metodu toLowerCase(). Poté si přes podmínku ověříme, zda je zadané písmeno obsaženo ve slově. Pokud ano, projedeme si jednotlivá písmena a hledáme, která se shodují. Ty následně předáme na postup a přičteme 1 do vyhra. Je možné, že uživatel zadá opakovaně jedno písmeno, proto podmínku rozšíříme o podmínku, zda-li postup již toto písmeno neobsahuje. Pokud není zadané písmeno obsaženo ve slově, přičteme 1 do trest.

for(char c:postup)
  System.out.printf("%c",c);
System.out.printf("\nZadejte písmeno: ");
String volba = sc.nextLine();
volba = volba.toLowerCase();

if(slovo.contains(volba))
{
  for(int i=0;i!=slovo.length();i++)
    if(volba.equals(Character.toString(slovo.charAt(i)))&&
       postup[i]!=slovo.charAt(i))
    {
        postup[i]=slovo.charAt(i);
        vyhra+=1;
    }
}
else
  trest+=1;

Už se nám sčítají trestné body, můžeme tedy začít vykreslovat šibenici, a to pomocí switch. Záleží na vás, jak bude vypadat, já jsem si zvolil následující.

switch (trest)
{
  case 7:
      System.out.println("      ___________\n"
                       + "     ││        I\n"
                       + "     ││       ( )\n"
                       + "     ││        │\n"
                       + "     ││       /│\\\n"
                       + "     ││        │\n"
                       + "     ││       / \\\n"
                       + "    .---.\n"
                       + "   /     \\");
      System.out.println("Prohrál jste!\n"
               + "Hledané slovo bylo: " + slovo);
      break;
  case 6:
      System.out.println("      ___________\n"
                       + "     ││        I\n"
                       + "     ││       ( )\n"
                       + "     ││        │\n"
                       + "     ││        │\n"
                       + "     ││        │\n"
                       + "     ││       / \\\n"
                       + "    .---.\n"
                       + "   /     \\");
      break;
  case 5:
      System.out.println("      ___________\n"
                       + "     ││        I\n"
                       + "     ││       ( )\n"
                       + "     ││        │\n"
                       + "     ││        │\n"
                       + "     ││        │\n"
                       + "     ││\n"
                       + "    .---.\n"
                       + "   /     \\");
      break;
  case 4:
      System.out.println("      ___________\n"
                       + "     ││        I\n"
                       + "     ││       ( )\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "    .---.\n"
                       + "   /     \\");
      break;
  case 3:
      System.out.println("      ___________\n"
                       + "     ││        I\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "    .---.\n"
                       + "   /     \\");
      break;
  case 2:
      System.out.println("\n     ││\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "     ││\n"
                       + "    .---.\n"
                       + "   /     \\");
      break;
  case 1:
      System.out.println("\n\n\n\n\n\n\n    .---.\n"
                       + "   /     \\");
      break;
  default :
}

Jelikož nám cyklus skončí ve dvou případech (výhra, prohra), musíme zjistit, proč skončil a vypsat vítězství nebo porážku. Prohra je jednoduchá, tu připíšeme k poslední fázi stavby šibenice. Výpis výhry dáme do podmínky, kterou umístíme za cyklus.

if (trest != 7)
  System.out.println("Vyhrál jste!");

Šibenice nám krásně funguje, ale stále se tam objevuje jedno slovo. Aby byla hra zábavnější, vytvoříme si na začátku pole slov, které se mohou objevit a vzápětí náhodný výběr z těchto slov. Náhodné číslo nám zajistí metoda Math.random(), která vrací desetinné číslo od 0 do 1. My bychom potřebovali číslo od 0 do počtu prvků v poli slov -1 (protože jsou číslovány od 0). Proto náhodné číslo vynásobíme délkou pole a přetypujeme na int.

String[] databaze = {"auto", "pocitac", "internet", "skola"};
String slovo = databaze[(int)(Math.random()*databaze.length)];

Teď je již šibenice kompletní.

Jednoduchá hra Šibenice v Javě

Do databaze si můžete napsat slov kolik chcete. 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 692x (22.04 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

Všechny články v sekci
Zdrojákoviště Java - Základní konstrukce
Článek pro vás napsal Contrix
Avatar
Jak se ti líbí článek?
19 hlasů
Autor se věnuje programovaní v jazyce Java, ale nepohrdne tvorbou jednodušších webových stránek.
Aktivity (2)

 

 

Komentáře
Zobrazit starší komentáře (3)

Avatar
Contrix
Redaktor
Avatar
Contrix:6.11.2014 19:39

Jak již bylo uvedeno, tento tutoriál má byt pro začátečníky, kteří ještě neovládají OOP. Když programátor začátečník zdatně neovládá takovéto jednoduché prvky, stěží by je pak psal s použitím OOP.
Mým cílem není vytvářet tutoriály na dokonalé aplikace, ale na takové, aby jí byl schopen každý se základními znalostmi Javy naprogramovat. Proto jen konzole a postup takový, jaký je.
Navíc, pokud někdo OOP ovládá, tak k takové jednoduché hře nepotřebuje žádný tutoriál.

Odpovědět
6.11.2014 19:39
Jsou zloději, které zákon netrestá, třebaže kradou člověku to nejcennější čas.
Avatar
hanpari
Redaktor
Avatar
hanpari:6.11.2014 20:07

No, když už jsi v tom, proč rovnou nepoužít nějaké návrhové vzory :) Já bych navrhoval to udělat tak pružné, aby v případě potřeby mohl z té šibenice udělat piškvorky :)

 
Odpovědět
6.11.2014 20:07
Avatar
Roman Duchoň:19.9.2016 22:45

Kdyby měl někdo náladu na porovnání si zdrojáku -> Moje Šibenice .
Mám delší! Dostal jsem se na celých 180 řádků. :D
Snad jsem to moc nepřepískl, nechci psát zdlouhavé kódy. Ale chod aplikace se mi líbí.

Myslím, že naučit se OOP už je namístě. :)

Odpovědět
19.9.2016 22:45
RD
Avatar
Misko X007X
Člen
Avatar
Misko X007X:11.1.2017 18:20

Chcel by som sa spýtať dá sa do cyklu while dať další cyklus while?

 
Odpovědět
11.1.2017 18:20
Avatar
Odpovědět
11.1.2017 18:59
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Mirka Baranová:21.1.2017 13:33

Asi chyba v kódu (v textu je to napsáno správně)
Místo:

String slovo = databaze[(int)(Math.random()*databaze.length)];

by asi mělo být:

String slovo = databaze[(int)(Math.random()*(databaze.length-1))];

aby se nestalo, že vyjde v našem případě prvek 4., když tam máme jen prvky 0. až 3.

Nicméně pokud chápu přetypování na int správně, že např. z čísla 1,8547.. získáme 1, tzn. že se usekne část za desetinnou čárkou, tak např. zde:

int cislo = (int)(Math.random() * 3) // vrátí celé číslo mezi 0 a 3

je minimální pravděpodobnost, že císlo == 3. To nastane jen v případě že metoda random vygeneruje 1. Zatímco pravděpodobnost, že cislo == 0 nebo 1 nebo 2 je velmi vysoká, protože všechna desetinná čísla se na ně přetypují.

V tom přídadě je skutečně vhodné pracovat s celou délkou databaze nezmenšenou o 1 a jenom ošetřit případ, kdy nastane ta nepravděpodobná situace, že získáme číslo 4 (třeba to číslo zmenšíme o 1):

String[] databaze = {"auto", "pocitac", "internet", "skola"};
int cislo = (int)(Math.random()*databaze.length);
if (cislo == databaze.length){
        cislo--;
}
String slovo = databaze[cislo];

Nebo další možnost: vygenerované číslo nejdříve zaokrouhlit a pak až přetypovat.

Odpovědět
21.1.2017 13:33
Pro člověka, který je plný touhy, není nic nemožné.
Avatar
Mirka Baranová:21.1.2017 20:11

Právě jsem zjistila, že Math.random() generuje čísla v intervalu <0,1) a ne <0,1>, takže svůj komentář výše bych nejraději smazala. Škoda, že to nejde.

Odpovědět
21.1.2017 20:11
Pro člověka, který je plný touhy, není nic nemožné.
Avatar
Odpovídá na Mirka Baranová
JAN Černohous:22.2.2017 14:43

Ale mimo to ti tam chybí uvozovky. Pokud tam chceš psát text musíš tam psát uvozovky.

 
Odpovědět
22.2.2017 14:43
Avatar
Rozbita Zaluzie:1. května 13:42

Nepochopil jsem jak funguje random výběr slova podle toho jak je to napsané bych očekával že to vybere políčko které je násobkem počtu věcí v databázi a náhodného čísla což by mělo být více jak počet všech věcí v databázi takže jak to pak něco může vybrat když číslo bude vždycky větší než počet věcí v databázi jak to pak teda může něco vybrat

 
Odpovědět
1. května 13:42
Avatar
Odpovídá na Rozbita Zaluzie
Matúš Olejník:1. května 14:28

Ahoj, prečítaj si dokumentáciu k tej funkcii a pochopíš ;) V Intellij Ctrl + Q alebo Ctrl + klik ťa asi v každom IDE presmeruje priamo na tú funkciu alebo Google..

Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.

Odpovědět
1. května 14:28
/* I am not sure why this works but it fixes the problem */
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 10 zpráv z 13. Zobrazit vše