Kako narediti igro s skalo, papirjem, škarjami na Javi (s slikami)

Kazalo:

Kako narediti igro s skalo, papirjem, škarjami na Javi (s slikami)
Kako narediti igro s skalo, papirjem, škarjami na Javi (s slikami)

Video: Kako narediti igro s skalo, papirjem, škarjami na Javi (s slikami)

Video: Kako narediti igro s skalo, papirjem, škarjami na Javi (s slikami)
Video: Электрика в квартире своими руками. Финал. Переделка хрущевки от А до Я. #11 2024, Maj
Anonim

Rock, Paper, Scissors je ročna igra, ki jo igrata dve osebi. Oba bi rekla "kamen, papir, škarje" in nato z iztegnjeno roko hkrati tvorila enega od treh predmetov (kamen, papir ali škarje). Zmagovalca določijo ročne sestave. Škarje premagajo papir, papir premaga kamen in kamen premaga škarje. Če oba igralca igrata isto kombinacijo rok, se to šteje za neodločeno. V Javi bomo napisali preprosto igro za simulacijo skale, papirja, škarij, kjer je en igralec uporabnik, drugi pa računalnik.

Koraki

1585279 1 1
1585279 1 1

Korak 1. Ustvarite glavni razred in ga pokličite

Kamen papir Škarje

.

To bo razred, kjer bomo pisali igro. Lahko se odločite, da ga poimenujete drugače, na primer

Igra

ali

Glavni

. Vnesite deklaracije metod za konstruktor in glavno metodo.

javni razred RockPaperScissors {javni RockPaperScissors () {} javni statični void main (String args) {}}

1585279 2 1
1585279 2 1

Korak 2. Ustvarite naštevanje kretenj rok (kamen, papir ali škarje)

Za predstavitev kamna, papirja ali škarij bi lahko uporabili nize, vendar nam naštevanje omogoča, da vnaprej določimo naše konstante, kar pomeni, da je uporaba naštevanja boljša zasnova. Poklicali bomo naš tip enuma

Premakni se

z vrednotami

ROCK

PAPIR

in

ŠKARJE

zasebno naštevanje Premakni {ROCK, PAPER, SCISSORS}

1585279 3 1
1585279 3 1

Korak 3. Ustvarite dva zasebna razreda

Uporabnik

in

Računalnik

.

Ti razredi bodo predstavljali naše igralce v igri. Lahko se odločite, da boste te razrede objavili. The

Uporabnik

razred bo razred, ki uporabnika pozove, naj uporabi kamen, papir ali škarje, zato bomo morali napisati

getMove ()

metoda. The

Računalnik

razred bo moral imeti tudi

getMove ()

način, da se lahko računalnik tudi premakne. V te metode bomo postavili nadomestke in jih pozneje uveljavili. The

Uporabnik

razred bo zahteval konstruktor, ki nastavi datoteko

Optični bralnik

predmet za vnos uporabniškega vnosa. Postavili bomo

Optični bralnik

kot zasebno polje za uporabnika in ga nato sproži v konstruktorju. Ker uporabljamo

Optični bralnik

razred, zanj moramo napisati izjavo o uvozu na vrh kode. The

Računalnik

razred ne potrebuje konstruktorja, zato nam ga ni treba pisati; ko začnemo

Računalnik

objekt, poklicali bomo samo privzeti konstruktor. Tukaj je tisto, kar imamo

Kamen papir Škarje

razred izgleda takole:

uvoz java.util. Scanner; javni razred RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} zasebni uporabnik razreda {private Scanner inputScanner; javni uporabnik () {inputScanner = nov skener (System.in); } public Move getMove () {// TODO: Izvedite to metodo return null; }} zasebni razred Računalnik {public Move getMove () {// TODO: Izvedite to metodo return null; }} javna RockPaperScissors () {} javna statična void main (String args) {}}

1585279 4 1
1585279 4 1

Korak 4. Napišite

getMove ()

metoda za

Računalnik

razred.

Ta metoda bo vrnila naključno

Premakni se

. Lahko dobimo vrsto

Premakni se

naštevanja s klicem

vrednote()

metoda:

Move.values ()

. Če želite izbrati naključno

Premakni se

pri naštevanju v tem nizu vrednosti moramo ustvariti naključni indeks, ki je celo število med 0 in dolžino našega niza vrednosti. Če želite to narediti, lahko uporabite

nextInt ()

metoda

Naključen

razreda, iz katerega moramo uvoziti

java.util

. Ko dobimo naključni indeks, ga lahko vrnemo

Premakni se

tega indeksa iz našega niza vrednosti.

javno Premakni getMove () {Premakni poteze = Premakni.vrednosti (); Naključno naključno = novo Naključno (); int index = random.nextInt (move.length); povratne poteze [indeks]; }

1585279 5 1
1585279 5 1

Korak 5. Napišite datoteko

getMove ()

metoda za

Uporabnik

razred.

Ta metoda bo vrnila a

Premakni se

ustreza tistemu, kar je uporabnik vnesel. Pričakovali bomo, da bo uporabnik napisal "kamen", "papir" ali "škarje". Najprej moramo uporabnika pozvati k vnosu:

System.out.print ("Kamen, papir ali škarje?")

. Nato uporabite

nextLine ()

metoda

Optični bralnik

object, da uporabniški vnos dobi kot niz. Zdaj moramo preveriti, ali je uporabnik predložil veljavno potezo, vendar smo lahko popustljivi, če je uporabnik napačno črkoval besedo. Tako bomo preverili le, ali je prva črka uporabnikovega vnosa bodisi "R" (za kamen), "P" (za papir) ali "S" (za škarje), za primer pa nam ne bo mar, ker najprej bomo uporabili

toUpperCase ()

metoda

Vrvica

class, da uporabniški vnosni niz naredi vse velike. Če uporabnik ni vnesel daljinsko pravilnega vnosa, ga bomo znova pozvali. Nato bomo glede na to, kaj je uporabnik vložil, vrnili ustrezno potezo.

public Premakni getMove () {// Pozovi uporabnika System.out.print ("Kamen, papir ali škarje?"); // Pridobimo uporabniški vnos String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Uporabnik je vnesel veljavno vhodno stikalo (firstLetter) {primer 'R': return Move. ROCK; primer 'P': vrni Move. PAPER; primer 'S': vrnitev Premakni. SKISORJI; }} // Uporabnik ni vnesel veljavnega vnosa. Spet poziv. vrni getMove (); }

1585279 6
1585279 6

Korak 6. Napišite a

Igraj ponovno()

metoda za

Uporabnik

razred.

Uporabnik bi moral imeti možnost igrati igro znova in znova. Če želimo ugotoviti, ali se uporabnik želi znova igrati, moramo napisati a

Igraj ponovno()

metoda, ki vrne logično igro, ki pove igri, ali se je uporabnik odločil, da bo igral znova ali ne. Pri tej metodi uporabljamo

Optični bralnik

ki smo ga prej v konstruktorju sprožili, da smo od uporabnika dobili "da" ali "ne". Preverili bomo le, če je prva črka "Y", da ugotovimo, ali želi uporabnik znova igrati. Vsak drug vnos pomeni, da uporabnik ne želi več igrati.

public boolean playAgain () {System.out.print ("Ali se želite znova igrati?"); Niz userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }

1585279 7
1585279 7

Korak 7. Povežite

Uporabnik

in

Računalnik

razredov skupaj v

Kamen papir Škarje

razred.

Zdaj, ko smo končali s pisanjem

Uporabnik

in

Računalnik

razredov, se lahko osredotočimo na delo na svoji dejanski igri. Ustvarite zasebna polja za

Uporabnik

in

Računalnik

razrede v

Kamen papir Škarje

razred. Za dostop do teh polj bomo morali dostopati

getMove ()

metode, ko igramo igro. V konstruktorju za

Kamen papir Škarje

razred, zaženite ta polja. Prav tako bomo morali spremljati rezultat v

userScore

in

computerScore

polja, ki jih moramo v konstruktorju sprožiti kot 0. Spremljati moramo tudi število iger, kar bo tudi polje, ki se začne z 0.

zasebni uporabnik; osebni računalnik; zasebni int userScore; zasebni int računalnikScore; private int numberOfGames; javni RockPaperScissors () {uporabnik = nov uporabnik (); računalnik = nov računalnik (); userScore = 0; računalniški rezultat = 0; numberOfGames = 0; }

1585279 8
1585279 8

Korak 8. Podaljšajte

Premakni se

enum za vključitev metode, ki nam pove, katera poteza v vsakem primeru zmaga.

Moramo napisati a

compareMoves ()

metoda, ki vrne 0, če so poteze enake, 1, če trenutna poteza premaga drugo potezo, in -1, če trenutna poteza izgubi pri drugi potezi. To bo koristno za določitev zmagovalca v igri. Za izvajanje te metode bomo najprej vrnili 0, če so poteze enake in imamo zato neodločeno. Nato napišite izjavo o zamenjavi za vrnitev 1 ali -1.

zasebno naštevanje Premakni {ROCK, PAPIR, ŠKARE; /** * Primerja to potezo z drugo potezo pri določanju neodločenega rezultata, zmage ali * poraza. * * @param otherMove * premakni za primerjavo z * @return 1, če ta premaga drugo potezo, -1, če ta poteza izgubi proti * drugi potezi, 0, če te poteze tie * / public int compareMoves (premakni drugo premikanje) { / / Vezati, če (this == otherMove) vrne 0; switch (this) {case ROCK: return (otherMove == ŠKARE? 1: -1); primer PAPIR: return (otherMove == ROCK? 1: -1); primer Škarje: return (otherMove == PAPIR? 1: -1); } // Nikoli ne smete doseči sem return 0; }}

1585279 9
1585279 9

Korak 9. Ustvarite datoteko a

začni igro()

metodo v

Kamen papir Škarje

razred.

Ta metoda bo igranje igre. Začnite tako, da postavite preprosto

System.out.println

v metodi.

public void startGame () {System.out.println ("ZDRAVILO, PAPIR, ŠKARE!"); }

1585279 10
1585279 10

Korak 10. Pridobite premike od uporabnika in računalnika

V

začni igro()

metodo, uporabite

getMove ()

metode iz

Uporabnik

razred in

Računalnik

razred, da pridobite poteze uporabnika in računalnika.

Premakni userMove = user.getMove (); Premakni computerMove = computer.getMove (); System.out.println ("\ nIgrali ste" + userMove + "."); System.out.println ("Igral računalnik" + computerMove + ". / N");

1585279 11
1585279 11

Korak 11. Primerjajte dve potezi in ugotovite, ali je zmagal uporabnik ali računalnik

Uporabi

compareMoves ()

metoda iz

Premakni se

enum, da ugotovi, ali je uporabnik zmagal ali ne. Če je uporabnik zmagal, povečajte uporabniški rezultat za 1. Če je uporabnik izgubil, povečajte računalniški rezultat za 1. Če je prišlo do neodločenega rezultata, ne povečujte nobenega od rezultatov. Nato povečajte število iger, ki jih igra ena.

int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {primer 0: // Vezati System.out.println ("Kravata!"); prekiniti; primer 1: // Uporabnik zmaga System.out.println (userMove + "beats" + computerMove + ". Zmagal si!"); userScore ++; prekiniti; primer -1: // Računalnik zmaga System.out.println (computerMove + "beats" + userMove + ". Izgubili ste."); računalnikScore ++; prekiniti; } numberOfGames ++;

1585279 12
1585279 12

Korak 12. Vprašajte, ali želi uporabnik znova igrati

Če želi uporabnik znova igrati, pokličite

začni igro()

ponovno. V nasprotnem primeru pokličite

printGameStats ()

ki bo natisnil statistiko igre. To metodo bomo zapisali v naslednjem koraku.

if (user.playAgain ()) {System.out.println (); začni igro(); } else {printGameStats (); }

1585279 13
1585279 13

Korak 13. Napišite

printGameStats ()

metoda.

Ta metoda bo prikazala statistiko igre: število zmag, število izgub, število neodločenih izidov, število odigranih iger in odstotek zmag uporabnikov. Odstotek dobljenih iger se izračuna na podlagi (# zmag + (# neodločenih izidov/2))/(# odigranih iger). Ta metoda uporablja

System.out.printf

za tiskanje oblikovanega besedila.

private void printGameStats () {int wins = userScore; int izgube = computerScore; int tie = numberOfGames - uporabniško oceno - računalniško oceno; dvojni odstotekWon = (zmaga + ((dvojna) vezava) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Natisni naslove System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "IGRANE IGRE", "PERCENTAGE" ZMAGALO "); // 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 ("|"); // Natisni vrednosti System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", zmage, porazi, neodločene številke, številoOfGames, odstotek zmag * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }

1585279 14
1585279 14

Korak 14. Začnite igro v glavnem razredu

V glavnem razredu inicializirajte primerek datoteke

Kamen papir Škarje

razreda in pokličite

začni igro()

metoda.

javna statična void main (String args) {RockPaperScissors igra = novi RockPaperScissors (); game.startGame (); }

1585279 15
1585279 15

Korak 15. Preizkusite svojo igro

Zdaj, ko smo vložili ves trud pri pisanju igre Rock, Paper, Scissors, je čas, da vse sestavimo in preizkusimo!

Vzorec programa

uvoz java.util. Random; uvoz java.util. Scanner; javni razred RockPaperScissors {private User user; osebni računalnik; zasebni int userScore; zasebni int računalnikScore; private int numberOfGames; zasebno naštevanje Premakni {ROCK, PAPIR, ŠKARE; /** * Primerja to potezo z drugo potezo pri določanju neodločenega rezultata, zmage ali * poraza. * * @param otherMove * premakni za primerjavo z * @return 1, če ta premaga drugo potezo, -1, če ta poteza izgubi proti * drugi potezi, 0, če te poteze tie * / public int compareMoves (premakni drugo premikanje) { / / Vezati, če (this == otherMove) vrne 0; switch (this) {case ROCK: return (otherMove == ŠKARE? 1: -1); primer PAPIR: return (otherMove == ROCK? 1: -1); primer Škarje: return (otherMove == PAPIR? 1: -1); } // Nikoli ne smete doseči sem return 0; }} uporabnik zasebnega razreda {zasebni bralnik inputScanner; javni uporabnik () {inputScanner = nov skener (System.in); } javno Premakni getMove () {// Pozovi uporabnika System.out.print ("Kamen, papir ali škarje?"); // Pridobimo uporabniški vnos String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Uporabnik je vnesel veljavno vhodno stikalo (firstLetter) {primer 'R': return Move. ROCK; primer 'P': vrni Move. PAPER; primer 'S': vrnitev Premakni. SKISORJI; }} // Uporabnik ni vnesel veljavnega vnosa. Spet poziv. vrni getMove (); } public boolean playAgain () {System.out.print ("Ali se želite znova igrati?"); Niz userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} zasebni razred Računalnik {javno Premakni getMove () {Premakni premakni = Premakni.values (); Naključno naključno = novo Naključno (); int index = random.nextInt (move.length); povratne poteze [indeks]; }} javni RockPaperScissors () {uporabnik = nov uporabnik (); računalnik = nov računalnik (); userScore = 0; računalniški rezultat = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPIR, ŠKARE!"); // Pridobi poteze Premakni userMove = user.getMove (); Premakni computerMove = computer.getMove (); System.out.println ("\ nIgrali ste" + userMove + "."); System.out.println ("Igral računalnik" + computerMove + ". / N"); // Primerjaj poteze in določi zmagovalca int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {primer 0: // Vezati System.out.println ("Kravata!"); prekiniti; primer 1: // Uporabnik zmaga System.out.println (userMove + "beats" + computerMove + ". Zmagal si!"); userScore ++; prekiniti; primer -1: // Računalnik zmaga System.out.println (computerMove + "beats" + userMove + ". Izgubili ste."); računalnikScore ++; prekiniti; } numberOfGames ++; // Prosimo uporabnika, naj znova predvaja if (user.playAgain ()) {System.out.println (); začni igro(); } else {printGameStats (); }} /*** Natisne statistiko igre. Izračuna neodločene izide kot 1/2 zmage v * odstotkih zmag. */ private void printGameStats () {int wins = userScore; int izgube = computerScore; int tie = numberOfGames - uporabniško oceno - računalniško oceno; dvojni odstotekWon = (zmaga + ((dvojna) vezava) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Natisni naslove System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "IGRANE IGRE", "PERCENTAGE" ZMAGALO "); // 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 ("|"); // Natisni vrednosti System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", zmage, porazi, neodločene številke, številoOfGames, odstotek zmag * 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čna void main (String args) {RockPaperScissors igra = nova RockPaperScissors (); game.startGame (); }}

Priporočena: