Rokas, popierius, žirklės yra rankų žaidimas, kurį žaidžia du žmonės. Abu žmonės sakytų „uola, popierius, žirklės“, o tada ištiesta ranka vienu metu sudarytų vieną iš trijų objektų (uolieną, popierių ar žirkles). Laimėtojas nustatomas rankiniu būdu. Žirklės muša popierių, popierius muša uolą, o uolos - žirkles. Jei abu žaidėjai žaidžia tą pačią ranką, tai laikoma lygiosiomis. Mes parašysime paprastą žaidimą „Java“, kad imituotume akmenį, popierių, žirkles, kur vienas žaidėjas yra vartotojas, o kitas žaidėjas yra kompiuteris.
Žingsniai
Žingsnis 1. Sukurkite pagrindinę klasę ir ją pavadinkite
Akmuo popierius žirklės
.
Tai bus klasė, kurioje rašysime žaidimą. Galite pasirinkti pavadinti jį kitu, pvz
Žaidimas
arba
Pagrindinis
. Įrašykite konstruktoriaus metodo deklaracijas ir pagrindinį metodą.
public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Žingsnis 2. Sukurkite rankų gestų (uolienų, popieriaus ar žirklių) sąrašą
Stygas galėtume panaudoti akmeniui, popieriui ar žirklėms pavaizduoti, tačiau išvardijimas leidžia iš anksto apibrėžti savo konstantas, o tai reiškia, kad išvardijimas yra geresnis dizainas. Mes vadinsime savo enumo tipą
Perkelti
su vertybėmis
ROKAS
POPIERIS
ir
ŽIRKLĖS
private enum Perkelti {ROCK, PAPER, SCISSORS}
Žingsnis 3. Sukurkite dvi privačias klases
Vartotojas
ir
Kompiuteris
.
Šios klasės atstovaus mūsų žaidėjus žaidime. Galite pasirinkti viešinti šias klases. The
Vartotojas
klasė bus klasė, raginanti vartotoją pasirinkti akmenį, popierių ar žirkles, todėl turėsime parašyti
getMove ()
metodas. The
Kompiuteris
klasėje taip pat reikės turėti
getMove ()
metodas, kad kompiuteris taip pat galėtų judėti. Į šiuos metodus įdėsime vietos rezervavimo ženklų ir juos įgyvendinsime vėliau. The
Vartotojas
klasei reikės konstruktoriaus, kuris nustatys
Skaitytuvas
objektą, kad įvestumėte vartotojo įvestį. Mes įdėsime
Skaitytuvas
kaip privatų lauką vartotojui ir tada inicijuokite jį konstruktoriuje. Kadangi mes naudojame
Skaitytuvas
klasę, mes turime parašyti importo pareiškimą jo kodo viršuje. The
Kompiuteris
klasė nereikalauja konstruktoriaus, todėl mums nereikia jo rašyti; kai mes inicijuojame
Kompiuteris
objektą, mes tiesiog skambinsime numatytuoju konstruktoriumi. Štai ką mūsų
Akmuo popierius žirklės
klasė atrodo taip:
importuoti java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} privati klasė Vartotojas {private Scanner inputScanner; viešas vartotojas () {inputScanner = naujas skaitytuvas (System.in); } public Move getMove () {// TODO: Įdiekite šį metodą return null; }} privačios klasės kompiuteris {public Move getMove () {// TODO: Įdiekite šį metodą return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Žingsnis 4. Parašykite
getMove ()
metodas, skirtas
Kompiuteris
klasė.
Šis metodas grąžins atsitiktinį
Perkelti
. Galime gauti masyvą
Perkelti
išvardijimai skambinant
vertės ()
metodas:
Perkelti.values ()
. Norėdami pasirinkti atsitiktinį
Perkelti
suskaičiavus šį reikšmių masyvą, turime sugeneruoti atsitiktinį indeksą, kuris yra sveikasis skaičius nuo 0 iki mūsų reikšmių masyvo ilgio. Norėdami tai padaryti, galime naudoti
nextInt ()
metodas
Atsitiktinis
klasę, iš kurios turime importuoti
java.util
. Gavę atsitiktinį indeksą, galime grąžinti
Perkelti
to indekso iš mūsų verčių masyvo.
public Perkelti getMove () {Perkelti juda = Perkelti.values (); Atsitiktinis atsitiktinis = naujas Atsitiktinis (); int indeksas = atsitiktinis.nextInt (juda.ilgis); grįžimo judesiai [indeksas]; }
Žingsnis 5. Parašykite
getMove ()
metodas, skirtas
Vartotojas
klasė.
Šis metodas grąžins a
Perkelti
atitinka tai, ką vartotojas įvedė. Tikimės, kad vartotojas parašys „uolą“, „popierių“arba „žirkles“. Pirmiausia turime paprašyti vartotojo įvesti:
System.out.print („Uola, popierius ar žirklės?“)
. Tada naudokite
nextLine ()
metodas
Skaitytuvas
objektą, kad gautumėte vartotojo įvestį kaip eilutę. Dabar turime patikrinti, ar vartotojas pateikė teisingą žingsnį, tačiau galime būti atlaidūs, jei vartotojas neteisingai parašė žodį. Taigi mes tikriname, ar pirmoji vartotojo įvesties raidė yra „R“(akmeniui), „P“(popieriui) ar „S“(žirklėms), ir mums nerūpi atvejis, nes pirmiausia naudosime
iki didžiųjų raidžių ()
metodas
Styginė
klasę, kad vartotojo įvesties eilutė būtų didžioji. Jei vartotojas neįvedė nuotoliniu būdu teisingos įvesties, mes dar kartą paraginsime vartotoją. Tada, priklausomai nuo to, ką vartotojas įdėjo, mes grąžinsime atitinkamą žingsnį.
public Move getMove () {// Paraginti vartotoją System.out.print ("Uola, popierius ar žirklės?"); // Gauti vartotojo įvestį String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Vartotojas įvedė tinkamą įvesties jungiklį (firstLetter) {case 'R': return Move. ROCK; atvejis „P“: grįžti Move. PAPER; atvejis „S“: grįžti Perkelti. ŽIRŽLĖS; }} // Vartotojas neįvedė tinkamos įvesties. Vėl paraginkite. return getMove (); }
Žingsnis 6. Parašykite a
žaisti vėl()
metodas, skirtas
Vartotojas
klasė.
Vartotojas turėtų sugebėti žaisti žaidimą vėl ir vėl. Norėdami nustatyti, ar vartotojas nori žaisti dar kartą, turime parašyti a
žaisti vėl()
metodas, kuris grąžina loginę vertę, nurodančią žaidimui, ar vartotojas nusprendė vėl žaisti, ar ne. Šiuo metodu mes naudojame
Skaitytuvas
kad mes anksčiau konstruktoriuje inicijavome iš vartotojo gauti „taip“arba „ne“. Tikrinsime, ar pirmoji raidė yra „Y“, kad nustatytume, ar vartotojas nori žaisti dar kartą. Bet koks kitas įvestis reiškia, kad vartotojas nenori žaisti dar kartą.
public boolean playAgain () {System.out.print ("Ar norite žaisti dar kartą?"); Eilutė userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }
Žingsnis 7. Prijunkite
Vartotojas
ir
Kompiuteris
klasės kartu
Akmuo popierius žirklės
klasė.
Dabar, kai baigėme rašyti
Vartotojas
ir
Kompiuteris
klasėse, galime sutelkti dėmesį į savo tikrojo žaidimo darbą. Sukurkite privačius laukus
Vartotojas
ir
Kompiuteris
klasėse
Akmuo popierius žirklės
klasė. Norėdami pasiekti, turėsime pasiekti šiuos laukus
getMove ()
metodus, kai žaidžiame žaidimą. Konstruktoriuje
Akmuo popierius žirklės
klasė, inicijuokite šiuos laukus. Taip pat turėsime sekti rezultatą
userScore
ir
computerScore
laukus, kuriuos turime inicijuoti kaip 0 konstruktoriuje. Turime sekti ir žaidimų skaičių, kuris taip pat bus laukas, inicijuotas kaip 0.
privatus vartotojas; asmeninis kompiuteris; private int userScore; privatus int computerScore; privatus int numerisOfGames; public RockPaperScissors () {user = new User (); kompiuteris = naujas Kompiuteris (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Žingsnis 8. Išplėskite
Perkelti
enum įtraukti metodą, kuris mums nurodo, kuris žingsnis kiekvienu atveju laimi.
Turime parašyti a
palygintiMove ()
metodas, kuris grąžina 0, jei judesiai yra vienodi, 1, jei dabartinis ėjimas pranoksta kitą ėjimą, ir -1, jei dabartinis žingsnis praranda kitą ėjimą. Tai bus naudinga nustatant žaidimo nugalėtoją. Norėdami įgyvendinti šį metodą, pirmiausia grąžinsime 0, jei judesiai yra vienodi, todėl turime lygiąsias. Tada parašykite jungiklio teiginį, kad grąžintumėte 1 arba -1.
private enum Perkelti {ROCK, PAPER, SCISSORS; /** * Palygina šį žingsnį su kitu žingsniu, kai nustatomas lygus rezultatas, pergalė arba * pralaimėjimas. * * @param otherMove * perkelkite, kad palygintumėte su * @return 1, jei šis žingsnis įveikia kitą ėjimą, -1, jei šis žingsnis pralaimi * kitam ėjimui, 0, jei šie judesiai yra lygus * / public int palygintiMoves (Move otherMove) { / / Kaklaraištis if (this == otherMove) return 0; jungiklis (šis) {atvejis ROCK: return (otherMove == SCISSORS? 1: -1); atvejis POPIERIS: return (otherMove == ROCK? 1: -1); atvejis ŽIRKLIAI: return (otherMove == PAPER? 1: -1); } // Niekada neturėtumėte čia grįžti 0; }}
Žingsnis 9. Sukurkite a
pradėti žaidimą()
metodas
Akmuo popierius žirklės
klasė.
Šis metodas bus žaidimo žaidimas. Pradėkite dėdami paprastą
System.out.println
metodu.
public void startGame () {System.out.println ("ROKAS, POPIERIS, ŽIRKLĖS!"); }
10. Žingsnis iš vartotojo ir kompiuterio
Viduje konors
pradėti žaidimą()
metodas, naudokite
getMove ()
metodai iš
Vartotojas
klasė ir
Kompiuteris
klasę, kad gautumėte vartotojo ir kompiuterio judesius.
Perkelti userMove = user.getMove (); Perkelti kompiuterįMove = computer.getMove (); System.out.println ("\ nŽaidėte" + userMove + "."); System.out.println ("Kompiuteris paleistas" + computerMove + ". / N");
Žingsnis 11. Palyginkite du veiksmus ir nustatykite, ar laimėjo vartotojas, ar laimėjo kompiuteris
Naudoti
palygintiMove ()
metodas iš
Perkelti
enum, siekiant nustatyti, ar vartotojas laimėjo, ar ne. Jei vartotojas laimėjo, padidinkite naudotojo balą 1. Jei vartotojas pralaimėjo, padidinkite kompiuterio rezultatą 1. Jei rezultatas buvo lygus, nedidinkite nė vieno balo. Tada padidinkite žaidimų skaičių vienu.
int palygintiMoves = userMove.compareMoves (computerMove); switch (palygintiMoves) {case 0: // Tie System.out.println ("Tie!"); pertrauka; 1 atvejis: // Vartotojas laimi System.out.println (userMove + "muša" + computerMove + ". Jūs laimėjote!"); userScore ++; pertrauka; atvejis -1: // Kompiuteris laimi System.out.println (computerMove + "muša" + userMove + ". Jūs pralaimėjote."); computerScore ++; pertrauka; } numberOfGames ++;
Žingsnis 12. Paklauskite, ar vartotojas nori žaisti dar kartą
Jei vartotojas nori žaisti dar kartą, skambinkite
pradėti žaidimą()
vėl. Priešingu atveju skambinkite
printGameStats ()
kuris išspausdins žaidimo statistiką. Mes parašysime šį metodą kitame žingsnyje.
if (user.playAgain ()) {System.out.println (); pradėti žaidimą(); } else {printGameStats (); }
Žingsnis 13. Parašykite
printGameStats ()
metodas.
Šis metodas parodys žaidimo statistiką: laimėjimų, pralaimėjimų, lygiosios, žaidžiamų žaidimų skaičius ir žaidėjo laimėtų žaidimų procentas. Laimėtų žaidimų procentas apskaičiuojamas pagal (# laimėjimų + (# lygiosios/2))/(# sužaistų žaidimų). Šis metodas naudojamas
System.out.printf
spausdinti suformatuotą tekstą.
private void printGameStats () {int win = userScore; int nuostoliai = computerScore; int tie = numberOfGames - userScore - computerScore; dvigubas procentas Laimėtas = (laimi + ((dvigubas)) ryšys) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Spausdinti pavadinimus System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "ŽAIDIMAI", "PERCENTAGE LAIMĖJO"); // 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 ("|"); // Spausdinti reikšmes System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", laimėjimai, pralaimėjimai, kaklaraiščiai, skaičiusOfGames, procentasWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Žingsnis 14. Pradėkite žaidimą pagrindinėje klasėje
Pagrindinėje klasėje inicijuokite
Akmuo popierius žirklės
klasę ir paskambinkite
pradėti žaidimą()
metodas.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
Žingsnis 15. Išbandykite savo žaidimą
Dabar, kai mes įdėjome visas pastangas rašydami žaidimą „Rokas, popierius, žirklės“, atėjo laikas viską surinkti ir išbandyti!
Pavyzdinė programa
importuoti java.util. Random; importuoti java.util. Scanner; public class RockPaperScissors {privatus vartotojas; asmeninis kompiuteris; private int userScore; privatus int computerScore; privatus int numerisOfGames; private enum Perkelti {ROCK, PAPER, SCISSORS; /** * Palygina šį žingsnį su kitu žingsniu nustatant lygiąsias, pergalę arba * pralaimėjimą. * * @param otherMove * perkelkite, kad palygintumėte su * @return 1, jei šis žingsnis įveikia kitą ėjimą, -1, jei šis žingsnis pralaimi * kitam ėjimui, 0, jei šie ėjimai lygus * / public int palygintiMoves (Move otherMove) { / / Kaklaraištis if (this == otherMove) return 0; jungiklis (šis) {atvejis ROCK: return (otherMove == SCISSORS? 1: -1); atvejis POPIERIS: return (otherMove == ROCK? 1: -1); atvejis ŽIRKLIAI: return (otherMove == PAPER? 1: -1); } // Niekada neturėtumėte čia grįžti 0; }} privačios klasės vartotojas {privatus skaitytuvas inputScanner; viešas vartotojas () {inputScanner = naujas skaitytuvas (System.in); } public Perkelti getMove () {// Paraginti vartotoją System.out.print ("Uola, popierius ar žirklės?"); // Gauti vartotojo įvestį String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Vartotojas įvedė tinkamą įvesties jungiklį (firstLetter) {case 'R': return Move. ROCK; atvejis „P“: grįžti Move. PAPER; atvejis „S“: grįžti Perkelti. ŽIRŽLĖS; }} // Vartotojas neįvedė tinkamos įvesties. Vėl paraginkite. return getMove (); } public boolean playAgain () {System.out.print ("Ar norite žaisti dar kartą?"); Eilutė userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} privačios klasės kompiuteris {public Move getMove () {Perkelti juda = Perkelti.values (); Atsitiktinis atsitiktinis = naujas Atsitiktinis (); int indeksas = atsitiktinis.nextInt (juda.ilgis); grįžimo judesiai [indeksas]; }} public RockPaperScissors () {user = new User (); kompiuteris = naujas Kompiuteris (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROKAS, POPIERIS, ŽIRKLĖS!"); // Gauti judesius Perkelti userMove = user.getMove (); Perkelti kompiuterįMove = computer.getMove (); System.out.println ("\ nŽaidėte" + userMove + "."); System.out.println ("Kompiuteris paleistas" + computerMove + ". / N"); // Palyginti judesius ir nustatyti nugalėtoją int compaMoves = userMove.compareMoves (computerMove); switch (palygintiMoves) {case 0: // Tie System.out.println ("Tie!"); pertrauka; 1 atvejis: // Vartotojas laimi System.out.println (userMove + "muša" + computerMove + ". Jūs laimėjote!"); userScore ++; pertrauka; atvejis -1: // Kompiuteris laimi System.out.println (computerMove + "muša" + userMove + ". Jūs pralaimėjote."); computerScore ++; pertrauka; } numberOfGames ++; // Paprašykite vartotojo vėl žaisti, jei (user.playAgain ()) {System.out.println (); pradėti žaidimą(); } else {printGameStats (); }} /*** Spausdina žaidimo statistiką. Skaičiuoja lygiąsias 1/2 pergalės * laimėtų procentų. */ private void printGameStats () {int win = userScore; int nuostoliai = computerScore; int tie = numberOfGames - userScore - computerScore; dvigubas procentas laimėtas = (laimi + ((dvigubas)) ryšys) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Spausdinti pavadinimus System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "ŽAIDIMAI", "PERCENTAGE LAIMĖJO"); // 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 ("|"); // Spausdinti reikšmes System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", laimėjimai, pralaimėjimai, kaklaraiščiai, skaičiusOfGames, procentasWon * 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 game = new RockPaperScissors (); game.startGame (); }}