Rock, Paper, Scissors je ruční hra, kterou hrají dva lidé. Oba lidé by řekli „kámen, papír, nůžky“a poté současně natáhli ruku a vytvořili jeden ze tří objektů (kámen, papír nebo nůžky). Vítěz je určen formacemi rukou. Nůžky poráží papír, papír poráží kámen a kámen poráží nůžky. Pokud oba hráči hrají stejnou formaci ruky, je to považováno za remízu. Napíšeme jednoduchou hru v Javě pro simulaci Rock, Paper, Scissors, kde jeden hráč je uživatel a druhý hráč je počítač.
Kroky
Krok 1. Vytvořte hlavní třídu a zavolejte ji
Kámen, nůžky, papír
.
Toto bude třída, kde budeme psát hru. Můžete se rozhodnout pojmenovat to jinak, například
Hra
nebo
Hlavní
. Zapište deklarace metody pro konstruktor a hlavní metodu.
veřejná třída RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Krok 2. Vytvořte výčet pro gesta rukou (kámen, papír nebo nůžky)
Mohli bychom použít řetězce k reprezentaci kamene, papíru nebo nůžek, ale výčet nám umožňuje předdefinovat naše konstanty, což znamená, že použití výčtu je lepší design. Zavoláme náš typ výčtu
Přestěhovat se
s hodnotami
SKÁLA
PAPÍR
a
NŮŽKY
private enum Move {ROCK, PAPER, SCISSORS}
Krok 3. Vytvořte dvě soukromé třídy
Uživatel
a
Počítač
.
Tyto třídy budou ve hře zastupovat naše hráče. Můžete se rozhodnout tyto třídy zveřejnit. The
Uživatel
třída bude třída, která uživatele vyzve k použití kamene, papíru nebo nůžek, takže budeme muset napsat
getMove ()
metoda. The
Počítač
třída bude také muset mít a
getMove ()
aby počítač mohl také provést tah. Do těchto metod vložíme zástupné symboly a implementujeme je později. The
Uživatel
třída bude vyžadovat konstruktor, který nastaví
Skener
objekt, který má převzít vstup uživatele. Vložíme
Skener
jako soukromé pole pro uživatele a poté jej inicializujte v konstruktoru. Jelikož používáme
Skener
třídu, musíme pro něj napsat příkaz importu v horní části našeho kódu. The
Počítač
třída nevyžaduje konstruktor, takže jej nepotřebujeme psát; když zahájíme
Počítač
objekt, budeme pouze volat výchozí konstruktor. Zde je to, co naše
Kámen, nůžky, papír
třída vypadá nyní:
import java.util. Scanner; veřejná třída RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} soukromá třída Uživatel {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// TODO: Implementujte tuto metodu return null; }} soukromá třída Počítač {public Move getMove () {// TODO: Implementujte tuto metodu return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Krok 4. Napište
getMove ()
metoda pro
Počítač
třída.
Tato metoda vrátí náhodný
Přestěhovat se
. Můžeme získat řadu
Přestěhovat se
výčty voláním
hodnoty ()
metoda:
Move.values ()
. Chcete -li vybrat náhodného
Přestěhovat se
výčtu v tomto poli hodnot, musíme vygenerovat náhodný index, který je celé číslo mezi 0 a délkou našeho pole hodnot. K tomu můžeme použít
nextInt ()
metoda
Náhodný
třídu, ze které musíme importovat
java.util
. Poté, co jsme získali náhodný index, můžeme vrátit
Přestěhovat se
tohoto indexu z našeho pole hodnot.
public Move getMove () {Move move = Move.values (); Random random = new Random (); int index = random.nextInt (move.length); návrat tahů [index]; }
Krok 5. Napište
getMove ()
metoda pro
Uživatel
třída.
Tato metoda vrátí a
Přestěhovat se
odpovídající tomu, co má uživatel zadáno. Očekáváme, že uživatel napíše buď „rock“, „papír“nebo „nůžky“. Nejprve musíme uživatele vyzvat k zadání:
System.out.print („Kámen, papír nebo nůžky?“)
. Poté použijte
nextLine ()
metoda
Skener
objekt, aby uživatel získal vstup jako řetězec. Nyní musíme zkontrolovat, zda uživatel odeslal platný tah, ale můžeme být shovívaví, pokud uživatel chybně zadal slovo. Zkontrolujeme tedy pouze to, zda je první písmeno uživatelského vstupu buď „R“(pro kámen), „P“(pro papír) nebo „S“(pro nůžky), a o případ se nebudeme starat, protože nejprve použijeme
toUpperCase ()
metoda
Tětiva
class, aby byl vstupní řetězec uživatele celý velkými písmeny. Pokud uživatel nezadal vzdáleně správný vstup, vyzveme uživatele znovu. Poté podle toho, co uživatel vložil, vrátíme odpovídající tah.
public Move getMove () {// Vyzvat uživatele System.out.print („Kámen, papír nebo nůžky?“); // Získání vstupu uživatele Řetězec userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Uživatel zadal platný vstupní přepínač (firstLetter) {case 'R': return Move. ROCK; případ 'P': návrat Move. PAPER; případ 'S': návrat Move. SCISSORS; }} // Uživatel nezadal platný vstup. Znovu výzva. vrátit getMove (); }
Krok 6. Napište a
hrát znovu()
metoda pro
Uživatel
třída.
Uživatel by měl mít možnost hrát hru znovu a znovu. Abychom zjistili, zda chce uživatel znovu hrát, musíme napsat a
hrát znovu()
metoda, která vrací logickou hodnotu sdělující hře, zda se uživatel rozhodl hrát znovu nebo ne. V této metodě používáme
Skener
které jsme předtím iniciovali v konstruktoru, abychom od uživatele dostali „Ano“nebo „Ne“. Zkontrolujeme pouze, zda je první písmeno „Y“, abychom zjistili, zda chce uživatel znovu hrát. Jakýkoli jiný vstup bude znamenat, že uživatel nebude chtít znovu hrát.
public boolean playAgain () {System.out.print („Chcete znovu hrát?“); Řetězec userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); vrátit userInput.charAt (0) == 'Y'; }
Krok 7. Připojte
Uživatel
a
Počítač
třídy společně v
Kámen, nůžky, papír
třída.
Nyní, když jsme dokončili psaní
Uživatel
a
Počítač
třídy se můžeme soustředit na práci na naší skutečné hře. Vytvořte soukromá pole pro
Uživatel
a
Počítač
třídy v
Kámen, nůžky, papír
třída. Do těchto polí budeme potřebovat přístup
getMove ()
metody, když hrajeme hru. V konstruktoru pro
Kámen, nůžky, papír
třídy, inicializujte tato pole. Budeme také muset sledovat skóre v
userScore
a
computerScore
pole, která musíme v konstruktoru inicializovat jako 0. Musíme také sledovat počet her, což bude také pole inicializované jako 0.
soukromý uživatel; soukromý počítač; private int userScore; soukromé int computerScore; soukromé int čísloOfGames; public RockPaperScissors () {user = new User (); počítač = nový Počítač (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Krok 8. Rozšiřte soubor
Přestěhovat se
enum zahrnout metodu, která nám říká, který tah v každém případě vyhrává.
Musíme napsat a
porovnat Pohyby ()
metoda, která vrací 0, pokud jsou tahy stejné, 1, pokud aktuální tah poráží druhý tah, a -1, pokud aktuální tah ztrácí na jiný tah. To bude užitečné pro určení vítěze ve hře. K implementaci této metody nejprve vrátíme 0, pokud jsou pohyby stejné, a proto máme remízu. Poté napište příkaz switch pro vrácení 1 nebo -1.
private enum Move {ROCK, PAPER, SCISSORS; /** * Porovná tento tah s jiným tahem k určení nerozhodného výsledku, výhry nebo * ztráty. * * @param otherMove * tah pro srovnání s * @return 1, pokud tento tah porazí druhý tah, -1 pokud tento tah prohraje s * druhým tahem, 0, pokud se tyto tahy shodují * / 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 se sem neměl dostat vrátit 0; }}
Krok 9. Vytvořte a
začít hru()
metoda v
Kámen, nůžky, papír
třída.
Tato metoda bude hrát hru. Začněte jednoduchým
System.out.println
v metodě.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }
Krok 10. Získejte pohyby od uživatele a počítače
V
začít hru()
použijte metodu
getMove ()
metody z
Uživatel
třída a
Počítač
třídy, aby si uživatel a pohyby počítače.
Přesunout userMove = user.getMove (); Přesunout computerMove = computer.getMove (); System.out.println ("\ nHrál jste" + userMove + "."); System.out.println ("Počítač přehráván" + computerMove + ". / N");
Krok 11. Porovnejte dva tahy a určete, zda vyhrál uživatel nebo počítač
Použijte
porovnat Pohyby ()
metoda z
Přestěhovat se
enum k určení, zda uživatel vyhrál nebo ne. Pokud uživatel vyhrál, zvyšte skóre uživatele o 1. Pokud uživatel prohrál, zvyšte skóre počítače o 1. Pokud došlo k nerozhodnému výsledku, nezvyšujte žádné ze skóre. Poté zvyšte počet odehraných her o jednu.
int porovnatMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); přestávka; případ 1: // Uživatel vyhrává System.out.println (userMove + "bije" + computerMove + ". Vyhráli jste!"); userScore ++; přestávka; případ -1: // Počítač vyhrává System.out.println (computerMove + "bije" + userMove + ". Prohráli jste."); computerScore ++; přestávka; } numberOfGames ++;
Krok 12. Zeptejte se, zda chce uživatel znovu hrát
Pokud chce uživatel znovu hrát, zavolejte
začít hru()
znovu. Jinak volejte
printGameStats ()
který vytiskne statistiky hry. Tuto metodu napíšeme v dalším kroku.
if (user.playAgain ()) {System.out.println (); začít hru(); } else {printGameStats (); }
Krok 13. Napište
printGameStats ()
metoda.
Tato metoda zobrazí statistiky hry: počet výher, počet proher, počet remíz, počet odehraných her a procento her, které uživatel vyhrál. Procento vyhraných her se vypočítá podle (# výher + (# remíza/2))/(# odehraných her). Tato metoda používá
System.out.printf
k vytištění formátovaného textu.
private void printGameStats () {int wins = userScore; int ztráty = computerScore; int ties = numberOfGames - userScore - computerScore; dvojnásobné procento výhry = (vyhrává + ((dvojité) remízy) / 2) / numberOfGames; // Řádek System.out.print ("+"); printDashes (68); System.out.println ("+"); // Tisk titulů System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMES PLAYED", "PERCENTAGE VYHRÁL"); // Řádek 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 ("|"); // Tisk hodnot System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", výhry, prohry, remízy, numberOfGames, percentuální výhra * 100); // Řádek System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Krok 14. Spusťte hru v hlavní třídě
V hlavní třídě inicializujte instanci souboru
Kámen, nůžky, papír
třídu a zavolejte
začít hru()
metoda.
public static void main (String args) {hra RockPaperScissors = nová RockPaperScissors (); game.startGame (); }
Krok 15. Vyzkoušejte svou hru
Nyní, když jsme prošli veškerou snahou o napsání hry Rock, Paper, Scissors, je čas vše zkompilovat a vyzkoušet!
Ukázkový program
import java.util. Random; import java.util. Scanner; veřejná třída RockPaperScissors {soukromý uživatel; soukromý počítač; private int userScore; soukromé int computerScore; soukromé int čísloOfGames; private enum Move {ROCK, PAPER, SCISSORS; /** * Porovná tento tah s jiným tahem k určení nerozhodného výsledku, výhry nebo * ztráty. * * @param otherMove * tah pro srovnání s * @return 1, pokud tento tah porazí druhý tah, -1 pokud tento tah prohraje s * druhým tahem, 0, pokud se tyto tahy shodují * / 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 se sem neměl dostat vrátit 0; }} Uživatel soukromé třídy {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// Vyzvat uživatele System.out.print („Kámen, papír nebo nůžky?“); // Získání vstupu uživatele Řetězec userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Uživatel zadal platný vstupní přepínač (firstLetter) {case 'R': return Move. ROCK; případ 'P': návrat Move. PAPER; případ 'S': návrat Move. SCISSORS; }} // Uživatel nezadal platný vstup. Znovu výzva. vrátit getMove (); } public boolean playAgain () {System.out.print („Chcete znovu hrát?“); Řetězec userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); vrátit userInput.charAt (0) == 'Y'; }} soukromá třída Počítač {public Move getMove () {Move move = Move.values (); Random random = new Random (); int index = random.nextInt (move.length); návrat tahů [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ískejte pohyby Move userMove = user.getMove (); Přesunout computerMove = computer.getMove (); System.out.println ("\ nHrál jste" + userMove + "."); System.out.println ("Počítač přehráván" + computerMove + ". / N"); // Porovnání tahů a určení vítěze int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); přestávka; případ 1: // Uživatel vyhrává System.out.println (userMove + "bije" + computerMove + ". Vyhráli jste!"); userScore ++; přestávka; případ -1: // Počítač vyhrává System.out.println (computerMove + "bije" + userMove + ". Prohráli jste."); computerScore ++; přestávka; } numberOfGames ++; // Požádejte uživatele, aby znovu hrál, pokud (user.playAgain ()) {System.out.println (); začít hru(); } else {printGameStats (); }} /*** Vytiskne statistiky hry. Vypočítává remízy jako 1/2 výhry v * procentech vyhraných. */ private void printGameStats () {int wins = userScore; int ztráty = computerScore; int ties = numberOfGames - userScore - computerScore; dvojnásobné procento výhry = (vyhrává + ((dvojité) remízy) / 2) / numberOfGames; // Řádek System.out.print ("+"); printDashes (68); System.out.println ("+"); // Tisk titulů System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMES PLAYED", "PERCENTAGE VYHRÁL"); // Řádek 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 ("|"); // Tisk hodnot System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", výhry, prohry, remízy, numberOfGames, percentuální výhra * 100); // Řádek 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 (); }}