Programujeme jednoduchou hru v Javě: Šibenice

Java Základní konstrukce 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] = '-';

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 448x (22.04 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

  Aktivity (1)

Č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 (16 hlasů) :
4.437514.437514.437514.43751 4.43751


 



 

 

Komentáře

Avatar
mnauik
Člen
Avatar
mnauik:

Myslím, že nejlepší by bylo to udělat objektově. (i pro čtenáře začátečníka). 4*

Odpovědět 6.11.2014 14:01
minusuj mě, ale zdůvodni to ;)
Avatar
Neaktivní uživatel:

Určite by to bolo krajšie objektovo naprogramované a taká pozn. používaš príliš často spojovanie reťazcov pomocou "+", kedže sú reťazce v Jave immutable(neme­niteľné), tak sa vytvára dosť veľa zvytočných objektov a vytváranie objektov je dosť náročné a dosť to spomaluje program... Preto máme v Jave tzv. builder (StringBuilder), ktorý je mutable(meniteľný) a je vhodnejšie používať ten, keď potrebuješ často meniť alebo spájať nejaký reťazec. Možno by nebol zlý nápad v tomto prípade použiť napríklad textový súbor na tie šibenice.

Odpovědět  ±0 6.11.2014 14:13
Neaktivní uživatelský účet
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Je to tutoriál pro začátečníky, jak je uvedeno v úvodu. Napsal to geniálně tak, aby si to mohl zkusit každý. Řešit zde OOP nemá vůbec smysl, to je stejné jako bys někomu vytýkal že jeho Hello World není objektový. K OOP se musíš dostat.

Odpovědět  +13 6.11.2014 14:20
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Contrix
Redaktor
Avatar
Contrix:

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  +3 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
Odpovídá na Neaktivní uživatel
hanpari:

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  +2 6.11.2014 20:07
Avatar
Roman Duchoň:

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. září 22:45
RD
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 6 zpráv z 6.