Kamen, papir, škare je ručna igra koju igraju dvije osobe. Obojica bi rekli "kamen, papir, škare", a zatim istodobno s jednom ispruženom rukom tvore 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 neriješenim. Napisat ćemo jednostavnu igru u Javi za simulaciju stijena, papira, škara gdje je jedan igrač korisnik, a drugi igrač računalo.
Koraci
Korak 1. Kreirajte glavnu klasu i pozovite je
Kamen papir škare
.
Ovo će biti razred u kojem ćemo pisati igru. Možete ga nazvati i drugim imenom, npr
igra
ili
Glavni
. Upišite deklaracije metoda za konstruktor i glavnu metodu.
javna klasa RockPaperScissors {javna RockPaperScissors () {} javna statička void glavna (String args) {}}
Korak 2. Napravite nabrajanje gesta rukama (kamen, papir ili škare)
Mogli bismo koristiti žice za predstavljanje stijene, papira ili škara, ali nabrajanje nam omogućuje da unaprijed definiramo naše konstante, što znači da je korištenje nabrajanja bolji dizajn. Nazvat ćemo naš tip enuma
Potez
sa vrijednostima
ROCK
PAPIR
i
ŠKARE
privatno popisivanje Premjesti {ROCK, PAPER, SCISSORS}
Korak 3. Izradite dvije privatne klase
Korisnik
i
Računalo
.
Ove klase će predstavljati naše igrače u igri. Možete izabrati da ove klase učinite javnim. The
Korisnik
class će biti klasa koja od korisnika traži kamen, papir ili škare, pa ćemo morati napisati
getMove ()
metoda. The
Računalo
razred će također morati imati a
getMove ()
metoda tako da računalo također može napraviti pomak. U ove metode stavit ćemo zamjenska mjesta i kasnije ih implementirati. The
Korisnik
klase će zahtijevati konstruktor koji postavlja
Skener
objekt za unos korisničkog unosa. Stavit ć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
Računalo
klasa ne zahtijeva konstruktor, pa je ne moramo pisati; kada pokrećemo
Računalo
objekt, samo ćemo pozvati zadani konstruktor. Evo što je naše
Kamen papir škare
razred izgleda ovako:
uvoz 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
Računalo
razred.
Ova metoda vraća slučajnu vrijednost
Potez
. Možemo dobiti niz
Potez
nabrajanja pozivom na
vrijednosti ()
metoda:
Move.values ()
. Za odabir slučajnog odabira
Potez
nabrajanje u ovom nizu vrijednosti, moramo generirati slučajni indeks koji je cijeli broj između 0 i duljine 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
Potez
tog indeksa iz našeg niza vrijednosti.
public Premjesti getMove () {Premjesti poteze = Premjesti.values (); Random random = new Random (); int index = random.nextInt (potezi.dužina); povratni potezi [indeks]; }
Korak 5. Napišite
getMove ()
metoda za
Korisnik
razred.
Ova metoda će vratiti a
Potez
odgovara onome što je korisnik unio. 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 kako bi korisnički unos dobio kao niz. Moramo sada 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 "R" (za kamen), "P" (za papir) ili "S" (za škare), a nećemo mariti za slučaj jer prvo ćemo koristiti
toUpperCase ()
metoda
Niz
klase kako bi korisnički niz unosa bio veliki. Ako korisnik nije unio daljinski ispravan unos, od njega ćemo ponovno zatražiti. Zatim ćemo, ovisno o tome što je korisnik stavio, vratiti odgovarajući potez.
public Premjesti getMove () {// Od korisnika zatražite System.out.print ("Kamen, papir ili škare?"); // Dohvaćanje 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 valjani ulazni prekidač (firstLetter) {slučaj 'R': return Move. ROCK; slučaj 'P': return Move. PAPER; slučaj 'S': povratak Premjesti. SKAČE; }} // Korisnik nije unio valjani unos. Ponovno pitaj. return getMove (); }
Korak 6. Napišite a
Igraj ponovno()
metoda za
Korisnik
razred.
Korisnik bi trebao biti u mogućnosti igrati igru uvijek iznova. Kako bismo utvrdili želi li korisnik ponovno igrati, moramo napisati a
Igraj ponovno()
metoda koja vraća boolean koji govori igri je li korisnik odlučio ponovno 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čit će da korisnik ne želi ponovno igrati.
public boolean playAgain () {System.out.print ("Želite li ponovno igrati?"); Niz userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }
Korak 7. Spojite
Korisnik
i
Računalo
razreda zajedno u
Kamen papir škare
razred.
Sada kada smo završili s pisanjem
Korisnik
i
Računalo
klase, možemo se usredotočiti na rad na našoj stvarnoj igri. Izradite privatna polja za
Korisnik
i
Računalo
klase u
Kamen papir škare
razred. Morat ćemo pristupiti ovim poljima za pristup
getMove ()
metode kada igramo igru. U konstruktoru za
Kamen papir škare
klase, inicirajte ova polja. Također ćemo morati pratiti rezultat u
userScore
i
computerScore
polja, koje moramo pokrenuti kao 0 u konstruktoru. Moramo pratiti i broj utakmica, što će također biti polje pokrenuto kao 0.
privatni korisnik korisnika; privatno računalo; private int userScore; privatni int computerScore; private int numberOfGames; javni RockPaperScissors () {korisnik = novi korisnik (); računalo = novo Računalo (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Korak 8. Produžite
Potez
enum za uključivanje metode 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 izgubi 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 naredbu switch za vraćanje 1 ili -1.
privatno nabrajanje Premjesti {ROCK, PAPIR, ŠKARE; /** * Uspoređuje ovaj potez s drugim potezom u određivanju izjednačenja, pobjede ili * poraza. * * @param otherMove * premjestiti 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); case PAPER: return (otherMove == ROCK? 1: -1); slučaj ŠKARE: return (otherMove == PAPIR? 1: -1); } // Ovdje nikada ne smijemo doći return 0; }}
Korak 9. Napravite a
početak igre()
metoda u
Kamen papir škare
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čunala
U
početak igre()
metodu, koristite
getMove ()
metode iz
Korisnik
klase i
Računalo
klase kako biste dobili poteze korisnika i računala.
Premjesti userMove = user.getMove (); Premjesti computerMove = computer.getMove (); System.out.println ("\ nIgrali ste" + userMove + "."); System.out.println ("Računalo je igralo" + computerMove + ". / N");
Korak 11. Usporedite dva poteza i utvrdite je li korisnik pobijedio ili je računalo pobijedilo
Koristiti
compareMoves ()
metoda iz
Potez
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čunala za 1. Ako je došlo do izjednačenja, nemojte povećavati bilo koji rezultat. Zatim povećajte broj igara koje igra jedna.
int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {slučaj 0: // Vezati System.out.println ("Vezati!"); pauza; slučaj 1: // Korisnik osvaja System.out.println (userMove + "bije" + computerMove + ". Pobijedili ste!"); userScore ++; pauza; slučaj -1: // Računalo pobjeđuje System.out.println (computerMove + "beats" + userMove + ". Izgubili ste."); computerScore ++; pauza; } numberOfGames ++;
Korak 12. Pitajte želi li korisnik ponovno igrati
Ako korisnik želi ponovno igrati, nazovite
početak igre()
opet. U suprotnom, nazovite
printGameStats ()
koji će ispisati statistiku igre. Ovu metodu ćemo napisati u sljedećem koraku.
if (user.playAgain ()) {System.out.println (); početak igre(); } else {printGameStats (); }
Korak 13. Napišite
printGameStats ()
metoda.
Ova metoda prikazuje 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 ispis formatiranog teksta.
private void printGameStats () {int wins = userScore; int gubici = computerScore; int veze = numberOfGames - korisnički rezultat - računalni rezultat; dvostruki procenat osvojenih = (pobjeda + ((dvostruki) neriješen rezultat) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Ispis naslova 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 ("|"); // Ispis vrijednosti System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", pobjede, gubici, izjednač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 škare
razreda i nazovite
početak igre()
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
uvoz java.util. Random; uvoz java.util. Scanner; javna klasa RockPaperScissors {private User user; privatno računalo; private int userScore; privatni int computerScore; private int numberOfGames; privatno nabrajanje Premjesti {ROCK, PAPIR, ŠKARE; /** * Uspoređuje ovaj potez s drugim potezom u određivanju izjednačenja, pobjede ili * poraza. * * @param otherMove * premjestiti 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); case PAPER: return (otherMove == ROCK? 1: -1); slučaj ŠKARE: return (otherMove == PAPIR? 1: -1); } // Ovdje nikada ne smijemo doći return 0; }} privatni korisnik klase {privatni skener inputScanner; javni korisnik () {inputScanner = novi skener (System.in); } public Move getMove () {// Od korisnika zatražite System.out.print ("Kamen, papir ili škare?"); // Dohvaćanje 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 valjani ulazni prekidač (firstLetter) {slučaj 'R': return Move. ROCK; slučaj 'P': return Move. PAPER; slučaj 'S': povratak Premjesti. ŠKARE; }} // Korisnik nije unio valjani unos. Ponovno pitaj. return getMove (); } public boolean playAgain () {System.out.print ("Želite li ponovno igrati?"); Niz userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} privatna klasa Računalo {javno Premjesti getMove () {Premjesti seli = Premjesti.values (); Random random = new Random (); int index = random.nextInt (potezi.dužina); povratni potezi [indeks]; }} javni RockPaperScissors () {korisnik = novi korisnik (); računalo = novo Računalo (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("STIJENA, PAPIR, ŠKARE!"); // Dobivanje poteza Premjesti userMove = user.getMove (); Premjesti computerMove = computer.getMove (); System.out.println ("\ nIgrali ste" + userMove + "."); System.out.println ("Računalo je igralo" + computerMove + ". / N"); // Usporedimo poteze i odredimo pobjednika int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {slučaj 0: // Vezati System.out.println ("Vezati!"); pauza; slučaj 1: // Korisnik osvaja System.out.println (userMove + "bije" + computerMove + ". Pobijedili ste!"); userScore ++; pauza; slučaj -1: // Računalo pobjeđuje System.out.println (computerMove + "beats" + userMove + ". Izgubili ste."); computerScore ++; pauza; } numberOfGames ++; // Zamolite korisnika da se ponovo igra ako (user.playAgain ()) {System.out.println (); početak igre(); } 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 - računalni rezultat; dvostruki postotak Osvojiti = (pobjeđuje + ((dvostruko) neriješeno) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Ispisi naslova System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "IGRE IGRAO", "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 ("|"); // Ispis vrijednosti System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", pobjede, gubici, izjednač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 ("-"); }} public static void main (String args) {RockPaperScissors igra = novi RockPaperScissors (); game.startGame (); }}