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
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) {}}
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}
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) {}}
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]; }
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 (); }
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'; }
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; }
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; }}
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!"); }
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");
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 ++;
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 (); }
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 ("+"); }
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 (); }
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 (); }}