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: ОШИБКИ В САНТЕХНИКЕ! | Как нельзя делать монтаж канализации своими руками 2024, Maj
Anonim

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

1585279 1 1
1585279 1 1

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

1585279 2 1
1585279 2 1

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}

1585279 3 1
1585279 3 1

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

1585279 4 1
1585279 4 1

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

1585279 5 1
1585279 5 1

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

1585279 6
1585279 6

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

1585279 7
1585279 7

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

1585279 8
1585279 8

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

1585279 9
1585279 9

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

1585279 10
1585279 10

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

1585279 11
1585279 11

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

1585279 12
1585279 12

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

1585279 13
1585279 13

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

1585279 14
1585279 14

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

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

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

Preporučuje se: