Kamen, papir, škare je ručna igra koju igraju dvije osobe. Obojica bi rekli "kamen, papir, škare", a zatim istovremeno ispruženom rukom formirali jedan od tri predmeta (kamen, papir ili škare). Pobjednika određuju ručne formacije. Škare pobjeđuju papir, papir pobjeđuje kamen, a kamen bije škare. Ako oba igrača igraju istu ručnu formaciju, smatra se nerešenim. Napisat ćemo jednostavnu igru u Javi za simulaciju stijena, papira, škara gdje je jedan igrač korisnik, a drugi igrač računar.
Koraci
Korak 1. Kreirajte glavnu klasu i pozovite je
Kamen papir makaze
.
Ovo će biti razred na kojem ćemo pisati igru. Možete izabrati da ga nazovete drugim imenom, npr
Igra
ili
Main
. Upišite deklaracije metoda za konstruktor i glavnu metodu.
javna klasa RockPaperScissors {public RockPaperScissors () {} javna statička void main (String args) {}}
Korak 2. Kreirajte nabrajanje gesta rukama (kamen, papir ili škare)
Mogli bismo koristiti žice za predstavljanje stijene, papira ili škara, ali nabrajanje nam omogućava da unaprijed definiramo naše konstante, što znači da je korištenje nabrajanja bolji dizajn. Pozvat ćemo naš tip enuma
Makni se
sa vrednostima
ROCK
PAPIR
i
Škare
privatno popisivanje Premjesti {ROCK, PAPER, SCISSORS}
Korak 3. Kreirajte dvije privatne klase
Korisnik
i
Computer
.
Ove klase će predstavljati naše igrače u igri. Možete izabrati da ove klase učinite javnim. The
Korisnik
klasa će biti klasa koja od korisnika traži kamen, papir ili škare, pa ćemo morati napisati
getMove ()
metoda. The
Computer
razred će također morati imati a
getMove ()
metodom tako da računar takođe može da se kreće. U ove metode stavit ćemo zamjenska mjesta i kasnije ih implementirati. The
Korisnik
class će zahtijevati konstruktor koji postavlja
Skener
objekt za unos korisničkog unosa. Stavićemo
Skener
kao privatno polje za korisnika, a zatim ga pokrenuti u konstruktoru. Budući da koristimo
Skener
klase, za nju moramo napisati izjavu o uvozu na vrhu koda. The
Computer
za klasu nije potreban konstruktor, pa je ne moramo pisati; kada započinjemo
Computer
objekt, samo ćemo pozvati zadani konstruktor. Evo šta je naše
Kamen papir makaze
razred izgleda ovako:
import java.util. Scanner; javna klasa RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class Korisnik {private Scanner inputScanner; javni korisnik () {inputScanner = novi skener (System.in); } public Move getMove () {// TODO: Implementirajte ovu metodu return null; }} privatna klasa Računalo {public Move getMove () {// TODO: Implementirajte ovu metodu return null; }} javni RockPaperScissors () {} javni statički void main (String args) {}}
Korak 4. Napišite
getMove ()
metoda za
Computer
razred.
Ova metoda će vratiti slučajnu vrijednost
Makni se
. Možemo dobiti niz
Makni se
nabrajanja pozivanjem
vrijednosti ()
metoda:
Move.values ()
. Za odabir slučajnog odabira
Makni se
nabrajanje u ovom nizu vrijednosti, moramo generirati slučajni indeks koji je cijeli broj između 0 i dužine našeg niza vrijednosti. Da bismo to učinili, možemo koristiti
nextInt ()
metoda
Slučajno
klase iz koje moramo uvesti
java.util
. Nakon što smo dobili slučajni indeks, možemo vratiti
Makni se
tog indeksa iz našeg niza vrijednosti.
public Premjesti getMove () {Premjesti potezi = Premjesti.values (); Random random = new Random (); int index = random.nextInt (move.length); povratni potezi [indeks]; }
Korak 5. Napišite
getMove ()
metoda za
Korisnik
razred.
Ova metoda će vratiti a
Makni se
odgovara onome što je korisnik uneo. Očekivat ćemo da će korisnik napisati "kamen", "papir" ili "škare". Prvo moramo zatražiti od korisnika da unese:
System.out.print ("Kamen, papir ili škare?")
. Zatim upotrijebite
nextLine ()
metoda
Skener
objekt da bi korisnički unos dobio kao niz. Sada moramo provjeriti je li korisnik podnio valjani potez, ali možemo biti popustljivi ako je korisnik pogrešno napisao riječ. Stoga ćemo samo provjeriti je li prvo slovo korisničkog unosa ili "R" (za kamen), "P" (za papir) ili "S" (za škare), i nećemo mariti za slučaj jer prvo ćemo koristiti
toUpperCase ()
metoda
String
class kako bi korisnički niz unosa bio veliki. Ako korisnik nije uneo daljinski ispravan unos, od njega ćemo ponovo zatražiti. Zatim ćemo, ovisno o tome što je korisnik stavio, vratiti odgovarajući potez.
public Move getMove () {// Zatražite od korisnika System.out.print ("Kamen, papir ili škare?"); // Dobivanje korisničkog unosa String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Korisnik je unio važeći ulazni prekidač (firstLetter) {slučaj 'R': return Move. ROCK; slučaj 'P': povratak Move. PAPER; slučaj 'S': vrati Move. SCISSORS; }} // Korisnik nije unio ispravan unos. Ponovo pitaj. return getMove (); }
Korak 6. Napišite a
igraj ponovo()
metoda za
Korisnik
razred.
Korisnik bi trebao biti u mogućnosti igrati igru iznova i iznova. Da bismo utvrdili želi li korisnik igrati ponovo, moramo napisati a
igraj ponovo()
metoda koja vraća boolean koji govori igri je li korisnik odlučio ponovo igrati ili ne. U ovoj metodi koristimo
Skener
koje smo prethodno pokrenuli u konstruktoru da bismo dobili "Da" ili "Ne" od korisnika. Provjerit ćemo samo je li prvo slovo 'Y' kako bismo utvrdili želi li korisnik ponovno igrati. Bilo koji drugi unos znači da korisnik ne želi ponovo igrati.
public boolean playAgain () {System.out.print ("Želite li ponovo igrati?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }
Korak 7. Povežite
Korisnik
i
Computer
klase zajedno u
Kamen papir makaze
razred.
Sada kada smo završili sa pisanjem
Korisnik
i
Computer
klase, možemo se usredotočiti na rad na našoj stvarnoj igri. Kreirajte privatna polja za
Korisnik
i
Computer
klase u
Kamen papir makaze
razred. Morat ćemo pristupiti ovim poljima za pristup
getMove ()
metode kada igramo igru. U konstruktoru za
Kamen papir makaze
class, pokrenite ova polja. Također ćemo morati pratiti rezultat u
userScore
i
computerScore
polja, koje moramo pokrenuti kao 0 u konstruktoru. Moramo pratiti i broj igara, što će također biti polje započeto kao 0.
privatni korisnik korisnika; privatno računalo; private int userScore; private int computerScore; private int numberOfGames; javni RockPaperScissors () {korisnik = novi korisnik (); computer = new Computer (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Korak 8. Produžite
Makni se
enum da uključi metodu koja nam govori koji potez pobjeđuje u svakom slučaju.
Moramo napisati a
CompareMoves ()
metoda koja vraća 0 ako su potezi isti, 1 ako je trenutni potez bolji od drugog poteza i -1 ako trenutni potez gubi u drugom potezu. Ovo će biti korisno za određivanje pobjednika u igri. Da bismo implementirali ovu metodu, prvo ćemo vratiti 0 ako su potezi isti i stoga imamo neriješeno. Zatim napišite switch naredbu za vraćanje 1 ili -1.
privatno nabrajanje Premjesti {ROCK, PAPIR, ŠKARE; /** * Upoređuje ovaj potez sa drugim potezom u određivanju izjednačenja, pobede ili * poraza. * * @param otherMove * premjesti za usporedbu sa * @return 1 ako ovaj potez nadmaši drugi potez, -1 ako ovaj potez izgubi na * drugi potez, 0 ako se ti potezi povežu * / public int compareMoves (Premjesti otherMove) { / / Vezati if (this == otherMove) vratiti 0; switch (this) {case ROCK: return (otherMove == ŠKARE? 1: -1); slučaj PAPIR: return (otherMove == ROCK? 1: -1); slučaj ŠKARE: return (otherMove == PAPIR? 1: -1); } // Ovdje nikada ne treba doći return 0; }}
Korak 9. Kreirajte a
započni igru()
metoda u
Kamen papir makaze
razred.
Ova metoda će biti igranje igre. Započnite postavljanjem jednostavnog
System.out.println
u metodi.
public void startGame () {System.out.println ("STIJENA, PAPIR, ŠKARE!"); }
Korak 10. Dobijte poteze od korisnika i računara
U
započni igru()
metodu, koristite
getMove ()
metode iz
Korisnik
klase i
Computer
klase da biste dobili poteze korisnika i računara.
Premjesti userMove = user.getMove (); Premjesti computerMove = computer.getMove (); System.out.println ("\ nIgrali ste" + userMove + "."); System.out.println ("Računar je igrao" + computerMove + ". / N");
Korak 11. Uporedite dva poteza i utvrdite je li korisnik pobijedio ili je računalo pobijedilo
Koristiti
CompareMoves ()
metoda iz
Makni se
enum kako bi se utvrdilo je li korisnik pobijedio ili ne. Ako je korisnik pobijedio, povećajte rezultat korisnika za 1. Ako je korisnik izgubio, povećajte rezultat računara za 1. Ako je došlo do izjednačenja, nemojte povećavati nijedan rezultat. Zatim povećajte broj igara koje igra jedna.
int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Vezati System.out.println ("Vezati!"); break; slučaj 1: // Korisnik osvaja System.out.println (userMove + "beats" + computerMove + ". Pobijedili ste!"); userScore ++; break; slučaj -1: // Računar dobija System.out.println (computerMove + "beats" + userMove + ". Izgubili ste."); computerScore ++; break; } numberOfGames ++;
Korak 12. Pitajte želi li korisnik ponovo igrati
Ako korisnik želi ponovo igrati, nazovite
započni igru()
opet. U suprotnom, pozovite
printGameStats ()
koji će odštampati statistiku igre. Ovu metodu ćemo napisati u sljedećem koraku.
if (user.playAgain ()) {System.out.println (); započni igru(); } else {printGameStats (); }
Korak 13. Napišite
printGameStats ()
metoda.
Ova metoda će prikazati statistiku igre: broj pobjeda, broj poraza, broj neriješenih utakmica, broj odigranih utakmica i postotak igara koje je korisnik osvojio. Postotak osvojenih igara izračunava se prema (# pobjeda + (# veza/2))/(# odigranih utakmica). Ova metoda koristi
System.out.printf
za štampanje formatiranog teksta.
private void printGameStats () {int wins = userScore; int gubici = computerScore; int veze = numberOfGames - korisnički rezultat - computerScore; dvostruki procenat osvojenih = (pobjeđuje + ((dvostruke) neriješene utakmice) / 2) / brojOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Štampa naslove System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "IGRANE IGRE", "PERCENTAGE" OSVOJILO "); // Line 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 ("|"); // Ispisuje vrijednosti System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", pobjede, porazi, neriješeni rezultati, numberOfGames, percentWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Korak 14. Pokrenite igru u glavnoj klasi
U glavnoj klasi inicijalizirajte instancu datoteke
Kamen papir makaze
razreda i pozovite
započni igru()
metoda.
public static void main (String args) {RockPaperScissors igra = novi RockPaperScissors (); game.startGame (); }
Korak 15. Isprobajte svoju igru
Sada kada smo prošli sav trud u pisanju igre Rock, Paper, Scissors, vrijeme je da sve sastavimo i isprobamo!
Uzorak programa
import java.util. Random; import java.util. Scanner; javna klasa RockPaperScissors {private User user; privatno računalo; private int userScore; private int computerScore; private int numberOfGames; privatno nabrajanje Premjesti {ROCK, PAPIR, ŠKARE; /** * Upoređuje ovaj potez sa drugim potezom u određivanju izjednačenja, pobede ili * poraza. * * @param otherMove * premjesti za usporedbu sa * @return 1 ako ovaj potez nadmaši drugi potez, -1 ako ovaj potez izgubi na * drugi potez, 0 ako se ti potezi povežu * / public int compareMoves (Premjesti otherMove) { / / Vezati if (this == otherMove) vratiti 0; switch (this) {case ROCK: return (otherMove == ŠKARE? 1: -1); slučaj PAPIR: return (otherMove == ROCK? 1: -1); slučaj ŠKARE: return (otherMove == PAPIR? 1: -1); } // Ovdje nikada ne treba doći return 0; }} privatna klasa Korisnik {privatni skener inputScanner; javni korisnik () {inputScanner = novi skener (System.in); } public Move getMove () {// Zatražite od korisnika System.out.print ("Kamen, papir ili škare?"); // Dobivanje korisničkog unosa String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Korisnik je unio važeći ulazni prekidač (firstLetter) {slučaj 'R': return Move. ROCK; slučaj 'P': povratak Move. PAPER; slučaj 'S': vrati Move. SCISSORS; }} // Korisnik nije unio ispravan unos. Ponovo pitaj. return getMove (); } public boolean playAgain () {System.out.print ("Želite li ponovo igrati?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} privatna klasa Računalo {public Move getMove () {Move move = Move.values (); Random random = new Random (); int index = random.nextInt (move.length); povratni potezi [indeks]; }} javni RockPaperScissors () {korisnik = novi korisnik (); computer = new Computer (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("STIJENA, PAPIR, ŠKARE!"); // Premještanje poteza Premještanje userMove = user.getMove (); Premjesti computerMove = computer.getMove (); System.out.println ("\ nIgrali ste" + userMove + "."); System.out.println ("Računar je igrao" + computerMove + ". / N"); // Uporedite poteze i odredite pobjednika int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Vezati System.out.println ("Vezati!"); break; slučaj 1: // Korisnik osvaja System.out.println (userMove + "beats" + computerMove + ". Pobijedili ste!"); userScore ++; break; slučaj -1: // Računar dobija System.out.println (computerMove + "beats" + userMove + ". Izgubili ste."); computerScore ++; break; } numberOfGames ++; // Zamolite korisnika da se ponovo igra ako (user.playAgain ()) {System.out.println (); započni igru(); } else {printGameStats (); }} /*** Ispisuje statistiku igre. Izračunava neriješene rezultate kao 1/2 pobjede u * postotku osvojenih. */ private void printGameStats () {int wins = userScore; int gubici = computerScore; int veze = numberOfGames - korisnički rezultat - computerScore; dvostruki procenat osvojenih = (pobjeđuje + ((dvostruke) neriješene utakmice) / 2) / brojOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Štampa naslove System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "IGRE IGRANE", "PERCENTAGE" OSVOJILO "); // Line 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 ("|"); // Ispisuje vrijednosti System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", pobjede, porazi, neriješeni rezultati, numberOfGames, percentWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); } private void printDashes (int numberOfDashes) {for (int i = 0; i <numberOfDashes; i ++) {System.out.print ("-"); }} javna statička void main (String args) {RockPaperScissors igra = novi RockPaperScissors (); game.startGame (); }}