Kuidas teha Javas kivi, paberi ja kääride mängu

Rock, Paper, Scissors on kätemäng, mida mängivad kaks inimest. Mõlemad inimesed ütleksid “kivi, paber, käärid” ja moodustaksid seejärel väljasirutatud käega ühe kolmest objektist (kivi, paber või käärid). Võitja selgitatakse käteformatsioonide järgi. Käärid võidab paberit, paber võidab kivi ja kivi võidab käärid. Kui mõlemad mängijad mängivad sama käeformatsiooni, loetakse see viigiks. Kirjutame Java keeles lihtsa mängu, mis simuleerib kivi, paberit, kääre, kus üks mängija on kasutaja ja teine ​​mängija on arvuti.

1
Looge põhiklass ja nimetage see RockPaperScissorsiks. See on klass, kus me mängu kirjutame. Võite anda sellele mõne muu nime, näiteks Mäng või Põhi. Kirjutage konstruktori ja põhimeetodi meetodi deklaratsioonid. public class RockPaperScissors { public RockPaperScissors() { } public static void main(String[] args) { }}

2
Looge käeliigutuste loend (kivi, paber või käärid). Võiksime kasutada stringe kivi, paberi või kääride tähistamiseks, kuid loendus võimaldab meil oma konstandid eeldefineerida, mis tähendab, et loenduse kasutamine on parem kujundus. Nimetame oma enum-tüüpi Liigu väärtustega ROCK, PAPER ja SCISSORS.private enum Move { ROCK, PAPER, SCISSORS}

3
Looge kaks privaatklassi Kasutaja ja arvuti. Need klassid esindavad meie mängijaid mängus. Võite need klassid avalikustada. Kasutajaklass on klass, mis küsib kasutajalt kas kivi, paberit või kääre, seega peame kirjutama meetodi getMove(). Arvutiklassis peab olema ka meetod getMove(), et arvuti saaks ka liigutusi teha. Me paneme nendesse meetoditesse kohahoidjad ja rakendame need hiljem. Kasutajaklass nõuab konstruktorit, mis seadistab skanneriobjekti kasutaja sisendi vastuvõtmiseks. Paneme skanneri kasutaja privaatseks väljaks ja seejärel käivitame selle konstruktoris. Kuna me kasutame klassi Scanner, peame selle jaoks oma koodi ülaossa kirjutama impordilause. Arvutiklass ei vaja konstruktorit, seega pole meil vaja seda ka kirjutada; kui käivitame arvutiobjekti, kutsume lihtsalt vaikekonstruktorit. Meie RockPaperScissorsi klass näeb praegu välja järgmine: import java.util.Scanner;public class RockPaperScissors { private enum Move { ROCK, PAPER, SCISSORS } private class User { private Scanner inputScanner; public User() { inputScanner = new Skanner(System.in); } public Move getMove() { // ÜLESANNE: Rakenda see meetod return null; } } privaatklass Arvuti { public Move getMove() { // ÜLESANNE: Rakenda see meetod return null; } } public RockPaperScissors() { } public static void main(String[] args) { }}

4
Kirjutage arvutiklassi meetod getMove(). See meetod tagastab juhusliku käigu. Liiguta loendite massiivi saame, kutsudes väärtuste() meetodi: Move.values(). Selles väärtuste massiivi juhusliku teisaldamise loendi valimiseks peame genereerima juhusliku indeksi, mis on täisarv vahemikus 0 kuni meie väärtuste massiivi pikkuseni. Selleks saame kasutada Random klassi meetodit nextInt(), mille peame importima saidilt java.util. Kui oleme juhusliku indeksi hankinud, saame oma väärtustest tagastada selle indeksi liigutuse array.public Move getMove() { Move[] moves = Move.values(); Juhuslik juhuslik = new Juhuslik(); int indeks = juhuslik.nextInt(liigub.pikkus); tagasikäigud[indeks];}

5
Kirjutage kasutajaklassi meetod getMove(). See meetod tagastab kasutaja sisestatud teabele vastava käigu. Eeldame, et kasutaja kirjutab kas “kivi”, “paber” või “käärid”. Esiteks peame kasutajalt küsima sisendit: System.out.print(“Kivi, paber või käärid? “). Seejärel kasutage skanneri objekti meetodit nextLine(), et saada kasutaja sisend stringina. Peame nüüd kontrollima, kas kasutaja on esitanud kehtiva käigu, kuid võime olla leebed, kui kasutaja on sõna valesti kirjutanud. Seega kontrollime ainult seda, kas kasutaja sisendi esimene täht on kas “R” (kivi puhul), “P” (paberi puhul) või “S” (kääride puhul), ja me ei hooli sellest, kuna me kasutame esmalt klassi String meetodit toUpperCase(), et muuta kasutaja sisestatud string suureks. Kui kasutaja pole kaugjuhtimisega õiget sisendit sisestanud, küsime kasutajalt uuesti. Seejärel, olenevalt sellest, mida kasutaja on sisestanud, tagastame vastava move.public Move getMove() { // Küsi kasutajalt System.out.print(“Kivi, paber või käärid? “); // Hankige kasutaja sisend String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == ‘R’ || firstLetter == ‘P’ || firstLetter == ‘S’) { // Kasutaja on sisestanud kehtiva sisendlüliti (firstLetter) { case ‘R’: return Move.ROCK; case ‘P’: tagasi Move.PAPER; juhtum ‘S’: tagasi Liiguta.KÄÄRID; } } // Kasutaja ei ole sisestanud kehtivat sisendit. Küsi uuesti. tagasta getMove();}

6
Kirjutage kasutajaklassi jaoks meetod playAgain(). Kasutaja peaks saama mängu ikka ja jälle mängida. Selleks, et teha kindlaks, kas kasutaja soovib uuesti mängida, peame kirjutama meetodi playAgain(), mis tagastab tõeväärtuse, mis annab mängule teada, kas kasutaja on otsustanud uuesti mängida või mitte. Selle meetodi puhul kasutame skannerit, mille olime varem konstruktoris käivitanud, et saada kasutajalt “Jah” või “Ei”. Kontrollime ainult seda, kas esimene täht on “Y”, et teha kindlaks, kas kasutaja soovib uuesti mängida. Mis tahes muu sisend tähendab, et kasutaja ei soovi uuesti mängida.public Boolean playAgain() { System.out.print(“Kas soovite uuesti mängida? “); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == ‘Y’;}

7
Ühendage kasutaja- ja arvutiklassid klassis RockPaperScissors kokku. Nüüd, kui oleme kasutaja- ja arvutiklasside kirjutamise lõpetanud, saame keskenduda oma tegeliku mängu kallale. Looge klassi RockPaperScissors privaatsed väljad kasutaja- ja arvutiklasside jaoks. Peame neile väljadele juurde pääsema, et pääseda ligi meetoditele getMove() mängu ajal. Initsieerige need väljad klassi RockPaperScissors konstruktoris. Samuti peame jälgima tulemust väljadel userScore ja computerScore, mille peame konstruktoris käivitama 0-na. Peame jälgima ka mängude arvu, mis on samuti väli, mis käivitatakse kui 0.private User user;private Computer computer;private int userScore;private int computerScore;private int numberOfGames;public RockPaperScissors() { user = uus kasutaja(); arvuti = uus Arvuti(); userScore = 0; ComputerScore = 0; mängude arv = 0;}

8
Laiendage Liikumise loendit, et hõlmata meetod, mis ütleb meile, milline käik igal juhul võidab. Peame kirjutama meetodi võrdlusMoves(), mis tagastab 0, kui käigud on samad, 1, kui praegune käik võidab teist käiku, ja -1, kui praegune käik kaotab teisele käigule. See on kasulik mängu võitja väljaselgitamiseks. Selle meetodi rakendamiseks tagastame esmalt 0, kui käigud on samad ja seetõttu on meil viik. Seejärel kirjuta 1 või -1 tagastamiseks lüliti käsk.private enum Move { ROCK, PAPER, SCISSORS; /** * Võrdleb seda käiku teise käiguga viigi, võidu või * kaotuse määramisel. * * @param otherMove * liiguta võrdluseks * @return 1, kui see käik ületab teist käiku, -1 kui see käik kaotab * teisele käigule, 0 kui need käigud viivad */ public int võrdleMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == KÄÄRID ? 1 : -1); case PAPER: return (otherMove == ROCK ? 1 : -1); case Käärid: tagasi (muuLiiguta == PABER ? 1 : -1); } // Siia ei tohiks kunagi jõuda return 0; }}

9
Looge klassis RockPaperScissors meetod startGame(). See meetod on mängu mängimine. Alustuseks lisage lihtsa faili System.out.println faili method.public void startGame() { System.out.println(“KIVI, PABER, käärid!”);}

10
Hankige käike kasutajalt ja arvutilt. Meetodis startGame() kasuta kasutaja ja arvuti käikude saamiseks getMove() meetodeid klassist User ja Arvuti.Move userMove = user.getMove();Move computerMove = arvuti.getMove();System. out.println(“nSa mängisid ” + userMove + “.”);System.out.println(“Arvuti mängis ” + computerMove + “.n”);

11
Võrrelge kahte käiku ja tehke kindlaks, kas võitis kasutaja või arvuti. Kasutage loendis Move meetodit võrdlusMoves(), et määrata, kas kasutaja võitis või mitte. Kui kasutaja võitis, suurendage kasutaja skoori 1 võrra. Kui kasutaja kaotas, suurendage arvutiskoori 1 võrra. Võrdse tulemuse korral ärge suurendage ühtegi punkti. Seejärel suurendage ühe poolt mängitud mängude arvu.int võrdlusMoves = userMove.compareMoves(computerMove);switch (compareMoves) {case 0: // Tie System.out.println(“Tie!”); break;case 1: // Kasutaja võidab System.out.println(userMove + ” võidab ” + computerMove + “. Sa võitsid!”); userScore++; break;case -1: // Arvuti võidab System.out.println(computerMove + ” võidab ” + userMove + “. Sa kaotasid.”); computerScore++; break;}numberOfGames++;

12
Küsige, kas kasutaja soovib uuesti mängida. Kui kasutaja soovib uuesti mängida, helistage uuesti startGame(). Vastasel juhul kutsuge välja printGameStats(), mis prindib välja mängu statistika. Kirjutame selle meetodi järgmises sammus.if (user.playAgain()) { System.out.println(); startGame();} else { printGameStats();}

13
Kirjutage printGameStats() meetod. See meetod kuvab mängu statistikat: võitude arv, kaotuste arv, viigide arv, mängitud mängude arv ja kasutaja võidetud mängude protsent. Võidetud mängude protsent arvutatakse (# võitu + (# viigi/2))/(# mängitud mängu). See meetod kasutab vormindatud teksti printimiseks faili System.out.printf.private void printGameStats() { int wins = userScore; int losses = computerScore; int ties = mängude arv – userScore – computerScore; topeltprotsentVõit = (võidud + ((kahe)viigid) / 2) / mängude arv; // Rida System.out.print(“+”); printDashes(68); System.out.println(“+”); // Trüki pealkirjad System.out.printf(“| %6s | %6s | %6s | %12s | %14s |n”, “WINS”, “LOSSES”, “TIES”, “GAMES PLAYED”, “PROCENTAGE VÕITS”); // Rida 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(“|”); // Väärtuste printimine System.out.printf(“| %6d | %6d | %6d | %12d | %13.2f%% |n”, võidud, kaotused, viigid, mängude arv, võiduprotsent * 100); // Rida System.out.print(“+”); printDashes(68); System.out.println(“+”);}

14
Alustage mängu põhiklassis. Põhiklassis initsialiseerige RockPaperScissors klassi eksemplar ja kutsuge meetod startGame() välja.public static void main(String[] args) { RockPaperScissors mäng = new RockPaperScissors(); game.startGame();}

15
Testige oma mängu. Nüüd, kui oleme mängu Kivi, paber, käärid kirjutamisel kõik vaeva näinud, on aeg kõike koostada ja testida!