Rock, Paper, Scissors on käemäng, mida mängivad kaks inimest. Mõlemad inimesed ütleksid "kivi, paber, käärid" ja moodustaksid samal ajal väljasirutatud käega ühe kolmest objektist (kivi, paber või käärid). Võitja selgitatakse välja koosseisude järgi. Käärid löövad paberit, paber lööb kivimit ja kivi lööb käärid. Kui mõlemad mängijad mängivad sama käega, loetakse see viigiks. Kirjutame Java -s lihtsa mängu, et simuleerida kivi, paberit, käärid, kus üks mängija on kasutaja ja teine mängija on arvuti.
Sammud
Samm 1. Looge põhiklass ja helistage sellele
Kivi paber käärid
.
See on klass, kus me mängu kirjutame. Võite selle nimetada millekski muuks, näiteks
Mäng
või
Peamine
. Kirjutage konstruktori ja põhimeetodi meetodideklaratsioonid.
avalik klass RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Samm 2. Looge käeliigutuste (kivim, paber või käärid) loend
Me võiksime kasutada stringe kivi, paberi või kääride tähistamiseks, kuid loend võimaldab meil oma konstandid eelnevalt määratleda, mis tähendab, et loenduse kasutamine on parem disain. Me nimetame oma enum tüüpi
Liiguta
väärtustega
ROCK
PABER
ja
KÄÄRID
private enum Teisalda {ROCK, PAPER, SCISSORS}
Samm 3. Looge kaks eraklassi
Kasutaja
ja
Arvuti
.
Need klassid esindavad mängus meie mängijaid. Võite need klassid avalikustada. The
Kasutaja
klass on klass, mis palub kasutajal kas kivi, paberit või käärid, seega peame kirjutama
getMove ()
meetod. The
Arvuti
klassil peab olema ka a
getMove ()
meetodit, et arvuti saaks ka käigu teha. Lisame nendesse meetoditesse kohatäitjad ja rakendame need hiljem. The
Kasutaja
klass vajab konstruktorit, mis seadistab
Skanner
objekti kasutaja sisendisse kaasamiseks. Me paneme
Skanner
kasutaja privaatväljana ja seejärel käivitage see konstruktoris. Kuna me kasutame
Skanner
klassi, peame selle koodi ülaossa kirjutama impordiaruande. The
Arvuti
klass ei vaja konstruktorit, seega ei pea me seda kirjutama; kui algatame
Arvuti
objekti, helistame lihtsalt vaikekonstruktorile. Siin on see, mis meie
Kivi paber käärid
klass näeb praegu välja selline:
importige java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} eraklass Kasutaja {private Scanner inputScanner; avalik kasutaja () {inputScanner = uus skanner (System.in); } public Liiguta getMove () {// TODO: Selle meetodi rakendamine return null; }} eraklass Arvuti {public Move getMove () {// TODO: Selle meetodi rakendamine return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Samm 4. Kirjutage
getMove ()
meetod
Arvuti
klassi.
See meetod tagastab juhusliku
Liiguta
. Me saame massiivi
Liiguta
loendid helistades
väärtused()
meetod:
Move.values ()
. Juhusliku valimiseks
Liiguta
Selle väärtuste massiivi loendamisel peame looma juhusliku indeksi, mis on täisarv vahemikus 0 kuni meie väärtuste massiivi pikkus. Selleks saame kasutada
nextInt ()
meetod
Juhuslik
klassi, millest peame importima
java.util
. Pärast juhusliku indeksi saamist saame selle tagasi saata
Liiguta
selle väärtuse massiivist.
public Liiguta getMove () {Liiguta liigub = Liiguta.väärtused (); Juhuslik juhuslik = uus Juhuslik (); int indeks = juhuslik.nextInt (liigub.pikkus); tagasikäigud [indeks]; }
Samm 5. Kirjutage
getMove ()
meetod
Kasutaja
klassi.
See meetod tagastab a
Liiguta
mis vastavad kasutaja sisestatud andmetele. Ootame, et kasutaja kirjutaks kas "kivi", "paber" või "käärid". Esiteks peame kasutajat sisestama:
System.out.print ("Kivim, paber või käärid?")
. Seejärel kasutage
nextLine ()
meetod
Skanner
objekti, 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" (kivimite jaoks), "P" (paberi jaoks) või "S" (kääride jaoks), ja me ei hooli juhtumist, sest kasutame kõigepealt
toVarpCase ()
meetod
String
klassi, et muuta kasutaja sisestatud string suurtähtedeks. Kui kasutaja pole sisestanud kaugelt korrektset sisendit, küsime kasutajat uuesti. Seejärel, sõltuvalt sellest, mida kasutaja on sisestanud, tagastame vastava käigu.
public Move getMove () {// Küsi kasutajalt System.out.print ("Kivi, paber või käärid?"); // Kasutaja sisendi hankimine 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; juhtum 'P': tagasta Move. PAPER; juhtum 'S': tagasta Move. SCISSORS; }} // Kasutaja pole sisestanud kehtivat sisendit. Küsi uuesti. return getMove (); }
Samm 6. Kirjutage a
mängi uuesti()
meetod
Kasutaja
klassi.
Kasutajal peaks olema võimalus mängu uuesti ja uuesti mängida. Selleks, et teha kindlaks, kas kasutaja soovib uuesti mängida, peame kirjutama a
mängi uuesti()
meetod, mis tagastab tõeväärtuse, öeldes mängule, kas kasutaja on otsustanud uuesti mängida või mitte. Selle meetodi puhul kasutame
Skanner
mille olime eelnevalt konstruktoris algatanud, 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'; }
Samm 7. Ühendage
Kasutaja
ja
Arvuti
klassid koos
Kivi paber käärid
klassi.
Nüüd, kui oleme kirjutamise lõpetanud
Kasutaja
ja
Arvuti
klassides, saame keskenduda oma tegeliku mängu kallale. Looge privaatväljad
Kasutaja
ja
Arvuti
klassides
Kivi paber käärid
klassi. Meil on vaja nendele väljadele juurde pääseda
getMove ()
meetodeid, kui me mängu mängime. Konstruktoris
Kivi paber käärid
klassi, käivitage need väljad. Samuti peame jälgima tulemust
userScore
ja
computerScore
väljad, mille peame konstruktoris käivitama kui 0. Peame jälgima ka mängude arvu, mis on samuti 0 algatatud väli.
erakasutaja; eraarvuti; private int userScore; private int computerScore; privaatne int numberOfGames; public RockPaperScissors () {kasutaja = uus kasutaja (); arvuti = uus Arvuti (); kasutajatulemus = 0; arvutiSkoor = 0; numberOfGames = 0; }
Samm 8. Laiendage
Liiguta
enum lisada meetod, mis ütleb meile, milline käik võidab igal juhul.
Peame kirjutama a
võrrelda liigub ()
meetod, 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 võrdne. Seejärel kirjutage lüliti avaldus 1 või -1 tagastamiseks.
private enum Move {ROCK, PAPER, SCISSORS; /** * Võrdleb seda sammu teise käiguga viigi, võidu või * kaotuse määramisega. * * @param otherMove * liiguta võrdluseks * @return 1 -ga, kui see käik võidab teise käigu, -1, kui see käik kaotab * teise käigu, 0, kui need käigud viigistavad * / public int compaMoves (Teisalda teisaldage) { / / Tie kui (see == muuMove) tagastab 0; lüliti (see) {case ROCK: return (otherMove == KÄÄRID? 1: -1); juhtum PAPER: return (otherMove == ROCK? 1: -1); juhtum KÄÄRID: return (otherMove == PAPER? 1: -1); } // Ei peaks kunagi siia jõudma return 0; }}
Samm 9. Looge a
Alusta mängu()
meetodit
Kivi paber käärid
klassi.
See meetod on mängu mängimine. Alustage lihtsa panemisega
System.out.println
meetodis.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }
Samm 10. Hankige käigud kasutajalt ja arvutilt
Aastal
Alusta mängu()
meetodit, kasutage
getMove ()
meetodid alates
Kasutaja
klass ja
Arvuti
klassi, et saada kasutaja ja arvuti käigud.
Liiguta userMove = user.getMove (); Liiguta arvutiMove = computer.getMove (); System.out.println ("\ nSa mängisid" + userMove + "."); System.out.println ("Arvuti mängis" + computerMove + ". / N");
Samm 11. Võrrelge kahte käiku ja tehke kindlaks, kas kasutaja võitis või arvuti võitis
Kasuta
võrrelda liigub ()
meetod alates
Liiguta
enum, et teha kindlaks, kas kasutaja võitis või mitte. Kui kasutaja võitis, suurendage kasutaja skoori 1 võrra. Kui kasutaja kaotas, suurendage arvuti skoori 1 võrra. Seejärel suurendage mängude arvu ühe võrra.
int compaMoves = userMove.compareMoves (computerMove); switch (võrreldaMoves) {case 0: // Tie System.out.println ("Tie!"); murda; juhtum 1: // Kasutaja võidab System.out.println (userMove + "lööb" + computerMove + ". Sa võitsid!"); userScore ++; murda; juhtum -1: // Arvuti võidab System.out.println (computerMove + "lööb" + userMove + ". Sa kaotasid."); computerScore ++; murda; } numberOfGames ++;
Samm 12. Küsige, kas kasutaja soovib uuesti mängida
Kui kasutaja soovib uuesti mängida, helistage
Alusta mängu()
uuesti. Muidu helistage
printGameStats ()
mis prindib välja mängu statistika. Kirjutame selle meetodi järgmises etapis.
if (user.playAgain ()) {System.out.println (); Alusta mängu(); } else {printGameStats (); }
Samm 13. Kirjutage
printGameStats ()
meetod.
Selle meetodiga kuvatakse mängu statistika: võitude arv, kaotuste arv, seoste arv, mängitud mängude arv ja kasutaja võidetud mängude protsent. Võidetud mängude protsent arvutatakse (# võitu + (# viiki/2))/(# mängitud mängu) järgi. See meetod kasutab
System.out.printf
vormindatud teksti printimiseks.
private void printGameStats () {int võidab = userScore; int kahjud = computerScore; int lips = numberOfGames - userScore - computerScore; topeltprotsentvõit = (võidab + ((topelt)) viigist) / 2) / numberOfGames; // Line System.out.print ("+"); printKriipsud (68); System.out.println ("+"); // Pealkirjade printimine System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "MÄNGUD MÄNGUD", "PERCENTAGE VÕITIS "); // Line System.out.print ("|"); printKriipsud (10); System.out.print ("+"); printKriipsud (10); System.out.print ("+"); printKriipsud (10); System.out.print ("+"); printKriipsud (16); System.out.print ("+"); printKriipsud (18); System.out.println ("|"); // Väärtuste printimine System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", võidud, kaotused, viigid, numberOfGames, protsentvõit * 100); // Line System.out.print ("+"); printKriipsud (68); System.out.println ("+"); }
Samm 14. Alustage mängu põhiklassis
Initsialiseerige põhiklassis eksemplar
Kivi paber käärid
klassi ja helistage
Alusta mängu()
meetod.
public static void main (String args) {RockPaperScissors mäng = new RockPaperScissors (); game.startGame (); }
Samm 15. Testige oma mängu
Nüüd, kui oleme teinud kõik jõupingutused, kirjutades mängu Rock, Paper, Scissors, on aeg kõik kokku panna ja katsetada!
Näidisprogramm
import java.util. Random; importige java.util. Scanner; public class RockPaperScissors {erakasutaja; eraarvuti; private int userScore; private int computerScore; privaatne int numberOfGames; private enum Move {ROCK, PAPER, SCISSORS; /** * Võrdleb seda sammu teise käiguga viigi, võidu või * kaotuse määramisega. * * @param otherMove * liiguta võrdluseks * @return 1 -ga, kui see käik võidab teise käigu, -1, kui see käik kaotab * teise käigu, 0, kui need käigud viigistavad * / public int compaMoves (Move otherMove) { / / Tie kui (see == muuMove) tagastab 0; lüliti (see) {case ROCK: return (otherMove == KÄÄRID? 1: -1); juhtum PAPER: return (otherMove == ROCK? 1: -1); juhtum KÄÄRID: return (otherMove == PAPER? 1: -1); } // Ei peaks kunagi siia jõudma return 0; }} eraklass Kasutaja {privaatne skanner inputScanner; avalik kasutaja () {inputScanner = uus skanner (System.in); } public Liiguta getMove () {// Küsi kasutajalt System.out.print ("Kivi, paber või käärid?"); // Kasutaja sisendi hankimine 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; juhtum 'P': tagasta Move. PAPER; juhtum 'S': tagasta Move. SCISSORS; }} // Kasutaja pole sisestanud kehtivat sisendit. Küsi uuesti. return getMove (); } public boolean playAgain () {System.out.print ("Kas soovite uuesti mängida?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} eraklass Arvuti {avalik Liiguta getMove () {Liiguta liigub = Liiguta.väärtused (); Juhuslik juhuslik = uus Juhuslik (); int indeks = juhuslik.nextInt (liigub.pikkus); tagasikäigud [indeks]; }} public RockPaperScissors () {user = new User (); arvuti = uus Arvuti (); kasutajatulemus = 0; arvutiSkoor = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Hangi käigud Liiguta userMove = user.getMove (); Liiguta arvutiMove = computer.getMove (); System.out.println ("\ nSa mängisid" + userMove + "."); System.out.println ("Arvuti mängis" + computerMove + ". / N"); // Võrrelge käike ja määrake võitja int compaMoves = userMove.compareMoves (computerMove); switch (võrreldaMoves) {case 0: // Tie System.out.println ("Tie!"); murda; juhtum 1: // Kasutaja võidab System.out.println (userMove + "lööb" + computerMove + ". Sa võitsid!"); userScore ++; murda; juhtum -1: // Arvuti võidab System.out.println (computerMove + "lööb" + userMove + ". Sa kaotasid."); computerScore ++; murda; } numberOfGames ++; // Paluge kasutajal uuesti mängida, kui (user.playAgain ()) {System.out.println (); Alusta mängu(); } else {printGameStats (); }} /*** Prindib välja mängu statistika. Arvutab seosed 1/2 võiduna * võidetud protsendi kohta. */ private void printGameStats () {int võidab = userScore; int kahjud = computerScore; int lips = numberOfGames - userScore - computerScore; topeltprotsentvõit = (võidab + ((topelt)) viigist) / 2) / numberOfGames; // Line System.out.print ("+"); printKriipsud (68); System.out.println ("+"); // Pealkirjade printimine System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "MÄNGUD MÄNGUD", "PERCENTAGE VÕITIS "); // Line System.out.print ("|"); printKriipsud (10); System.out.print ("+"); printKriipsud (10); System.out.print ("+"); printKriipsud (10); System.out.print ("+"); printKriipsud (16); System.out.print ("+"); printKriipsud (18); System.out.println ("|"); // Väärtuste printimine System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", võidud, kaotused, viigiseisud, numberOfGames, protsentvõit * 100); // Line System.out.print ("+"); printKriipsud (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) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }}