Kako napraviti igru kamenja, papira, škara na Javi (sa slikama)

Sadržaj:

Kako napraviti igru kamenja, papira, škara na Javi (sa slikama)
Kako napraviti igru kamenja, papira, škara na Javi (sa slikama)

Video: Kako napraviti igru kamenja, papira, škara na Javi (sa slikama)

Video: Kako napraviti igru kamenja, papira, škara na Javi (sa slikama)
Video: Kako napraviti ogradu za stepenište - Deo I , uzimanje mera 2024, Svibanj
Anonim

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

1585279 1 1
1585279 1 1

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) {}}

1585279 2 1
1585279 2 1

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}

1585279 3 1
1585279 3 1

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) {}}

1585279 4 1
1585279 4 1

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]; }

1585279 5 1
1585279 5 1

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 (); }

1585279 6
1585279 6

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'; }

1585279 7
1585279 7

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; }

1585279 8
1585279 8

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; }}

1585279 9
1585279 9

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!"); }

1585279 10
1585279 10

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");

1585279 11
1585279 11

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 ++;

1585279 12
1585279 12

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 (); }

1585279 13
1585279 13

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 ("+"); }

1585279 14
1585279 14

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 (); }

1585279 15
1585279 15

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 (); }}

Preporučeni: