Rock, Paper, Scissors je ručná hra, ktorú hrajú dvaja ľudia. Obaja ľudia povedali „kameň, papier, nožnice“a potom súčasne natiahnutou rukou vytvorili jeden z troch predmetov (kameň, papier alebo nožnice). Víťaza určujú formácie rúk. Nožnice porazia papier, papier porazí kameň a kameň nožnice. Ak obaja hráči hrajú rovnakú formáciu rúk, považuje sa to za remízu. Napíšeme jednoduchú hru v Jave na simuláciu rocku, papiera, nožníc, kde jeden hráč je používateľ a druhý hráč je počítač.
Kroky
Krok 1. Vytvorte hlavnú triedu a zavolajte ju
Kameň Papier Nožnice
.
Toto bude trieda, kde budeme písať hru. Môžete sa rozhodnúť pomenovať to inak ako napr
Hra
alebo
Hlavná
. Zapíšte deklarácie metódy pre konštruktor a hlavnú metódu.
public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Krok 2. Vytvorte zoznam pre gestá rúk (kameň, papier alebo nožnice)
Na reprezentáciu kameňa, papiera alebo nožníc by sme mohli použiť reťazce, ale enumerácia nám umožňuje preddefinovať naše konštanty, čo znamená, že použitie enumerácie je lepším návrhom. Nazveme náš typ enum
Pohyb
s hodnotami
SKALA
PAPIER
a
Nožnice
private enum Move {ROCK, PAPER, SCISSORS}
Krok 3. Vytvorte dve súkromné triedy
Používateľ
a
Počítač
.
Tieto triedy budú v hre zastupovať našich hráčov. Môžete sa rozhodnúť tieto triedy zverejniť. The
Používateľ
trieda bude trieda, ktorá vyzve používateľa na kameň, papier alebo nožnice, takže budeme musieť napísať
getMove ()
metóda. The
Počítač
trieda bude tiež musieť mať a
getMove ()
metóda, aby počítač mohol vykonať aj ťah. Do týchto metód vložíme zástupné symboly a implementujeme ich neskôr. The
Používateľ
trieda bude vyžadovať konštruktor, ktorý nastaví
Skener
objekt na vloženie vstupu užívateľa. Položíme
Skener
ako súkromné pole pre používateľa a potom ho inicializujte v konštruktore. Keďže používame súbor
Skener
triedu, musíme naň napísať príkaz na import v hornej časti kódu. The
Počítač
trieda nevyžaduje konštruktor, takže ho nepotrebujeme písať; keď spustíme
Počítač
objekt, budeme iba volať predvolený konštruktor. Tu je to, čo náš
Kameň Papier Nožnice
trieda vyzerá takto:
import java.util. Scanner; verejná trieda RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; public User () {inputScanner = nový skener (System.in); } public Move getMove () {// TODO: Implementácia tejto metódy return null; }} súkromná trieda Počítač {public Move getMove () {// TODO: Implementácia tejto metódy return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Krok 4. Napíšte súbor
getMove ()
metóda pre
Počítač
trieda.
Táto metóda vráti náhodný výsledok
Pohyb
. Môžeme získať celý rad
Pohyb
enumerácie volaním
hodnoty ()
metóda:
Move.values ()
. Na výber náhodne
Pohyb
enumeráciu v tomto poli hodnôt, musíme vygenerovať náhodný index, ktorý je celé číslo medzi 0 a dĺžkou nášho poľa hodnôt. Na to môžeme použiť
nextInt ()
metóda
Náhodne
triedu, z ktorej musíme importovať
java.util
. Potom, čo sme získali náhodný index, môžeme vrátiť
Pohyb
tohto indexu z nášho poľa hodnôt.
public Move getMove () {Move move = Move.values (); Random random = new Random (); int index = random.nextInt (move.length); návratové pohyby [index]; }
Krok 5. Napíšte súbor
getMove ()
metóda pre
Používateľ
trieda.
Táto metóda vráti a
Pohyb
zodpovedajúce tomu, čo má užívateľ zadané. Očakávame, že používateľ napíše buď „rock“, „papier“alebo „nožnice“. Najprv musíme používateľa vyzvať na zadanie:
System.out.print („Kameň, papier alebo nožnice?“)
. Potom použite
nextLine ()
metóda
Skener
objekt, aby používateľ získal vstup ako reťazec. Teraz musíme skontrolovať, či používateľ odoslal platný ťah, ale môžeme byť zhovievaví, ak používateľ nesprávne zadá slovo. Skontrolujeme teda iba to, či je prvé písmeno používateľského vstupu buď „R“(pre rock), „P“(pre papier) alebo „S“(pre nožnice), a nebude nás to zaujímať, pretože najskôr použijeme
toUpperCase ()
metóda
Reťazec
triedy, aby bol vstupný reťazec používateľa celý veľký. Ak používateľ nezadal vzdialene správny vstup, vyzveme ho znova. Potom podľa toho, čo používateľ vložil, vrátime zodpovedajúci ťah.
public Move getMove () {// Vyzvať používateľa System.out.print („Kameň, papier alebo nožnice?“); // Získať vstup užívateľa Reťazec userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Užívateľ zadal platný vstupný prepínač (firstLetter) {prípad 'R': return Move. ROCK; prípad 'P': návrat Move. PAPER; prípad 'S': vrátiť Move. SCISSORS; }} // Používateľ nezadal platný vstup. Opäť výzva. vrátiť getMove (); }
Krok 6. Napíšte a
hrať znova()
metóda pre
Používateľ
trieda.
Užívateľ by mal mať možnosť hrať hru znova a znova. Aby sme zistili, či chce používateľ znova hrať, musíme napísať a
hrať znova()
metóda, ktorá vracia logickú hodnotu hry a hovorí, či sa používateľ rozhodol hrať znova alebo nie. V tejto metóde používame
Skener
ktoré sme predtým iniciovali v konštruktore, aby sme od používateľa dostali „áno“alebo „nie“. Skontrolujeme iba, či je prvé písmeno „Y“, aby sme zistili, či chce používateľ znova hrať. Akýkoľvek iný vstup bude znamenať, že používateľ už nebude chcieť hrať.
public boolean playAgain () {System.out.print („Chcete si znova zahrať?“); Reťazec userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); vrátiť userInput.charAt (0) == 'Y'; }
Krok 7. Pripojte
Používateľ
a
Počítač
triedy spoločne v
Kameň Papier Nožnice
trieda.
Teraz, keď sme skončili s písaním
Používateľ
a
Počítač
triedy sa môžeme zamerať na prácu na našej skutočnej hre. Vytvorte súkromné polia pre súbor
Používateľ
a
Počítač
triedy v
Kameň Papier Nožnice
trieda. Na prístup k týmto poliam budeme potrebovať prístup
getMove ()
metódy, keď hráme hru. V konštruktéri pre
Kameň Papier Nožnice
triedy, inicializujte tieto polia. Budeme tiež musieť sledovať skóre
userScore
a
computerScore
polia, ktoré musíme v konstruktéri inicializovať ako 0. Musíme tiež sledovať počet hier, čo bude tiež pole inicializované ako 0.
súkromný užívateľ; súkromný počítačový počítač; private int userScore; súkromný int computerScore; súkromné int čísloOfGames; public RockPaperScissors () {user = new User (); počítač = nový Počítač (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Krok 8. Predĺžte
Pohyb
enum zahrnúť metódu, ktorá nám hovorí, ktorý ťah v každom prípade vyhráva.
Musíme napísať a
compareMoves ()
metóda, ktorá vráti 0, ak sú ťahy rovnaké, 1, ak aktuálny ťah porazí druhý ťah, a -1, ak aktuálny ťah stratí na iný ťah. To bude užitočné pri určovaní víťaza v hre. Na implementáciu tejto metódy najskôr vrátime 0, ak sú pohyby rovnaké, a preto máme remízu. Potom napíšte príkaz switch pre vrátenie 1 alebo -1.
private enum Move {ROCK, PAPER, SCISSORS; /** * Porovnáva tento ťah s iným ťahom s určením remízy, výhry alebo * prehry. * * @param otherMove * ťah na porovnanie s * @return 1, ak tento ťah porazí druhý ťah, -1 ak tento ťah prehrá na * druhý ťah, 0, ak sa tieto ťahy zhodujú * / public int compareMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPER? 1: -1); } // Nikdy by ste sa sem nemali dostať, vráťte 0; }}
Krok 9. Vytvorte a
začať hru()
metóda v
Kameň Papier Nožnice
trieda.
Táto metóda bude hrať hru. Začnite tým, že uvediete jednoduchú vec
System.out.println
v metóde.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }
Krok 10. Získajte pohyby od používateľa a počítača
V
začať hru()
použite metódu
getMove ()
metódy z
Používateľ
trieda a
Počítač
triedy, aby získal pohyby používateľa a počítača.
Move userMove = user.getMove (); Move computerMove = computer.getMove (); System.out.println ("\ nHrali ste" + userMove + "."); System.out.println ("Počítač hraný" + computerMove + ". / N");
Krok 11. Porovnajte tieto dva ťahy a určte, či vyhral používateľ alebo počítač
Použi
compareMoves ()
metóda z
Pohyb
enum na určenie, či používateľ vyhral alebo nie. Ak používateľ vyhral, zvýšte skóre používateľa o 1. Ak používateľ prehral, zvýšte skóre počítača o 1. Ak došlo k nerozhodnému výsledku, nezvyšujte žiadne zo skóre. Potom zvýšte počet hier hraných o jednu.
int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); prestávka; prípad 1: // Používateľ vyhráva System.out.println (userMove + „bije“+ computerMove + „. Vyhrali ste!“); userScore ++; prestávka; prípad -1: // Počítač vyhráva System.out.println (computerMove + "bije" + userMove + ". Prehrali ste."); computerScore ++; prestávka; } numberOfGames ++;
Krok 12. Opýtajte sa, či chce používateľ znova hrať
Ak chce používateľ znova hrať, zavolajte
začať hru()
znova. V opačnom prípade zavolajte
printGameStats ()
ktorý vytlačí štatistiky hry. Túto metódu napíšeme v nasledujúcom kroku.
if (user.playAgain ()) {System.out.println (); začať hru(); } else {printGameStats (); }
Krok 13. Napíšte súbor
printGameStats ()
metóda.
Táto metóda zobrazí štatistiky hry: počet víťazstiev, počet prehier, počet remíz, počet odohratých hier a percento hier, ktoré používateľ vyhral. Percento vyhratých hier sa vypočíta podľa (# víťazstiev + (# remízy/2))/(# odohraných hier). Táto metóda používa
System.out.printf
vytlačiť formátovaný text.
private void printGameStats () {int wins = userScore; int straty = computerScore; int ties = numberOfGames - userScore - computerScore; dvojnásobné percento výhry = (výhry + ((dvojité) remízy) / 2) / numberOfGames; // Riadok System.out.print ("+"); printDashes (68); System.out.println ("+"); // Tlač názvov System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMES PLAYED", "PERCENTAGE VYHRAŤ “); // Riadok System.out.print ("|"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (16); System.out.print ("+"); printDashes (18); System.out.println ("|"); // Tlač hodnôt System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", výhry, prehry, remízy, numberOfGames, percentuálna výhra * 100); // Riadok System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Krok 14. Začnite hru v hlavnej triede
V hlavnej triede inicializujte inštanciu súboru
Kameň Papier Nožnice
triedu a zavolajte na
začať hru()
metóda.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
Krok 15. Vyskúšajte si svoju hru
Teraz, keď sme prešli všetkou snahou o napísanie hry Rock, Paper, Scissors, je čas všetko skompilovať a otestovať!
Ukážkový program
import java.util. Random; import java.util. Scanner; verejná trieda RockPaperScissors {súkromný používateľ; súkromný počítačový počítač; private int userScore; súkromný int computerScore; súkromné int čísloOfGames; private enum Move {ROCK, PAPER, SCISSORS; /** * Porovnáva tento ťah s iným ťahom s určením remízy, výhry alebo * prehry. * * @param otherMove * ťah na porovnanie s * @return 1, ak tento ťah porazí druhý ťah, -1 ak tento ťah stratí na * druhý ťah, 0, ak sa tieto ťahy zhodujú * / public int compareMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPER? 1: -1); } // Nikdy by ste sa sem nemali dostať, vráťte 0; }} užívateľ súkromnej triedy {private Scanner inputScanner; public User () {inputScanner = nový skener (System.in); } public Move getMove () {// Vyzvať používateľa System.out.print („Kameň, papier alebo nožnice?“); // Získať vstup užívateľa Reťazec userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Užívateľ zadal platný vstupný prepínač (firstLetter) {prípad 'R': return Move. ROCK; prípad 'P': návrat Move. PAPER; prípad 'S': vrátiť Move. SCISSORS; }} // Používateľ nezadal platný vstup. Opäť výzva. vrátiť getMove (); } public boolean playAgain () {System.out.print („Chcete znova hrať?“); Reťazec userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); vrátiť userInput.charAt (0) == 'Y'; }} súkromná trieda Počítač {public Move getMove () {Move move = Move.values (); Random random = new Random (); int index = random.nextInt (move.length); návratové pohyby [index]; }} public RockPaperScissors () {user = new User (); počítač = nový Počítač (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Získať ťahy Presunúť userMove = user.getMove (); Move computerMove = computer.getMove (); System.out.println ("\ nHrali ste" + userMove + "."); System.out.println ("Počítač hraný" + computerMove + ". / N"); // Porovnajte ťahy a určte víťaza int porovnaťMovie = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); prestávka; prípad 1: // Používateľ vyhráva System.out.println (userMove + „bije“+ computerMove + „. Vyhrali ste!“); userScore ++; prestávka; prípad -1: // Počítač vyhráva System.out.println (computerMove + "bije" + userMove + ". Prehrali ste."); computerScore ++; prestávka; } numberOfGames ++; // Požiadajte používateľa, aby znova hral, ak (user.playAgain ()) {System.out.println (); začať hru(); } else {printGameStats (); }} /*** Vytlačí štatistiky hry. Vypočíta remízy ako 1/2 výhry v * percentuálnom podiele výhier. */ private void printGameStats () {int wins = userScore; int straty = computerScore; int ties = numberOfGames - userScore - computerScore; dvojnásobné percento výhry = (výhry + ((dvojité) remízy) / 2) / numberOfGames; // Riadok System.out.print ("+"); printDashes (68); System.out.println ("+"); // Tlač názvov System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMES PLAYED", "PERCENTAGE VYHRAŤ “); // Riadok System.out.print ("|"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (16); System.out.print ("+"); printDashes (18); System.out.println ("|"); // Vytlačenie hodnôt System.out.printf ("| %6d | %6d | %6d | %12d | %13,2f %% | / n", výhry, prehry, remízy, numberOfGames, percentuálna výhra * 100); // Riadok System.out.print ("+"); printDashes (68); System.out.println ("+"); } private void printDashes (int numberOfDashes) {for (int i = 0; i <numberOfDashes; i ++) {System.out.print ("-"); }} public static void main (String args) {hra RockPaperScissors = nová RockPaperScissors (); game.startGame (); }}