Roks, papīrs, šķēres ir roku spēle, ko spēlē divi cilvēki. Abi cilvēki teiktu "akmens, papīrs, šķēres" un pēc tam ar izstieptu roku vienlaikus veidotu vienu no trim objektiem (iežu, papīru vai šķēres). Uzvarētāju nosaka roku veidojumi. Šķēres pārspēj papīru, papīrs - klinšu, bet akmens - šķēres. Ja abi spēlētāji spēlē vienu un to pašu kombināciju, tas tiek uzskatīts par neizšķirtu. Mēs rakstīsim vienkāršu spēli Java, lai simulētu iežu, papīru, šķēres, kur viens spēlētājs ir lietotājs, bet otrs - dators.
Soļi
Solis 1. Izveidojiet galveno klasi un izsauciet to
Akmens Šķēres Papīrīts
.
Šī būs klase, kurā mēs rakstīsim spēli. Jūs varat izvēlēties to nosaukt citādi, piemēram,
Spēle
vai
Galvenais
. Ierakstiet konstruktoru metožu deklarācijas un galveno metodi.
publiskas klases RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
2. solis. Izveidojiet roku žestu uzskaitījumu (akmens, papīrs vai šķēres)
Mēs varētu izmantot stīgas, lai attēlotu akmeni, papīru vai šķēres, taču uzskaitījums ļauj mums iepriekš noteikt mūsu konstantes, kas nozīmē, ka uzskaites izmantošana ir labāks dizains. Mēs sauksim savu enuma tipu
Pārvietot
ar vērtībām
AKMENS
PAPĪRS
un
ŠĶĒRES
private enum Pārvietot {ROCK, PAPER, SCISSORS}
3. Izveidojiet divas privātas nodarbības
Lietotājs
un
Dators
.
Šīs klases pārstāvēs mūsu spēlētājus spēlē. Jūs varat izvēlēties publiskot šīs nodarbības. The
Lietotājs
klase būs tā klase, kas liek lietotājam izvēlēties akmeni, papīru vai šķēres, tāpēc mums būs jāraksta
getMove ()
metode. The
Dators
klasei būs jābūt arī
getMove ()
metode, lai dators varētu arī pārvietoties. Šajās metodēs mēs ievietosim vietturus un vēlāk tos ieviesīsim. The
Lietotājs
klasei būs nepieciešams konstruktors, kas izveido
Skeneris
objekts, ko izmantot lietotāja ievadē. Mēs ieliksim
Skeneris
kā privātu lauku lietotājam un pēc tam iniciējiet to konstruktorā. Tā kā mēs izmantojam
Skeneris
klasē, mums ir jāraksta importa paziņojums par to mūsu koda augšpusē. The
Dators
klasei nav nepieciešams konstruktors, tāpēc mums tas nav jāraksta; kad mēs uzsākam
Dators
objektu, mēs vienkārši izsauksim noklusējuma konstruktoru. Lūk, kas ir mūsu
Akmens Šķēres Papīrīts
klase izskatās tagad:
importēt java.util. Scanner; publiskās klases RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} privātā klase User {private Scanner inputScanner; publisks lietotājs () {inputScanner = jauns skeneris (System.in); } public Pārvietot getMove () {// TODO: Īstenot šo metodi return null; }} privātas klases dators {public Move getMove () {// TODO: Ieviest šo metodi return null; }} public RockPaperScissors () {} public static void main (String args) {}}
4. solis. Uzrakstiet
getMove ()
metode
Dators
klase.
Šī metode atgriezīs nejauši
Pārvietot
. Mēs varam iegūt masīvu
Pārvietot
uzskaitījumus, zvanot uz
vērtības ()
metode:
Move.values ()
. Lai izvēlētos nejauši
Pārvietot
uzskaitot šajā vērtību masīvā, mums jāģenerē nejaušs indekss, kas ir vesels skaitlis no 0 līdz mūsu vērtību masīva garumam. Lai to izdarītu, mēs varam izmantot
nextInt ()
metode
Nejauši
klase, no kuras mums jāimportē
java.util
. Kad esam ieguvuši izlases indeksu, mēs varam atgriezt
Pārvietot
no šī indeksa no mūsu vērtību masīva.
public Pārvietot getMove () {Pārvietot gājienus = Pārvietot.vērtības (); Random random = new Random (); int indekss = random.nextInt (pārvietojas.garums); atgriešanās gājieni [indekss]; }
Solis 5. Uzrakstiet
getMove ()
metode
Lietotājs
klase.
Šī metode atgriezīs a
Pārvietot
kas atbilst lietotāja ievadītajam. Mēs sagaidīsim, ka lietotājs rakstīs vai nu "klinšu", "papīra" vai "šķēres". Pirmkārt, mums ir jālūdz lietotājam ievadīt:
System.out.print ("Akmens, papīrs vai šķēres?")
. Pēc tam izmantojiet
nextLine ()
metode
Skeneris
objektu, lai iegūtu lietotāja ievadi kā virkni. Tagad mums jāpārbauda, vai lietotājs ir iesniedzis derīgu soli, taču varam būt iecietīgi, ja lietotājs ir uzrakstījis vārdu nepareizi. Tāpēc mēs pārbaudīsim tikai to, vai lietotāja ievadītās ievades pirmais burts ir vai nu "R" (akmens), "P" (papīrs) vai "S" (šķērēm), un mēs nerūpēsimies par lietu, jo vispirms izmantosim
līdz lielajiem burtiem ()
metode
Stīga
klasi, lai lietotāja ievades virkne būtu liela. Ja lietotājs nav ievadījis attālināti pareizu ievadi, mēs to vēlreiz pieprasīsim. Pēc tam, atkarībā no lietotāja ieliktā, mēs atgriezīsim atbilstošu gājienu.
public Move getMove () {// Lūgt lietotājam System.out.print ("Akmens, papīrs vai šķēres?"); // Iegūt lietotāja ievadi String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Lietotājs ir ievadījis derīgu ievades slēdzi (firstLetter) {case 'R': return Move. ROCK; gadījums 'P': atgriezties Move. PAPER; gadījums 'S': atgriezties Move. SCISSORS; }} // Lietotājs nav ievadījis derīgu ievadi. Atkal jautājiet. atgriezties getMove (); }
6. solis. Uzrakstiet a
spēlēt vēlreiz()
metode
Lietotājs
klase.
Lietotājam vajadzētu būt iespējai spēlēt spēli atkal un atkal. Lai noteiktu, vai lietotājs vēlas spēlēt vēlreiz, mums jāraksta a
spēlēt vēlreiz()
metode, kas atgriež Būla vērtību, norādot spēlei, vai lietotājs ir nolēmis spēlēt vēlreiz vai nē. Šajā metodē mēs izmantojam
Skeneris
ko mēs iepriekš konstruktorā bijām uzsākuši, lai no lietotāja saņemtu “jā” vai “nē”. Mēs pārbaudīsim tikai to, vai pirmais burts ir “Y”, lai noteiktu, vai lietotājs vēlas spēlēt vēlreiz. Jebkura cita ievade nozīmē, ka lietotājs nevēlas atskaņot vēlreiz.
public boolean playAgain () {System.out.print ("Vai vēlaties spēlēt vēlreiz?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); atgriezt userInput.charAt (0) == 'Y'; }
7. solis. Pievienojiet
Lietotājs
un
Dators
klases kopā
Akmens Šķēres Papīrīts
klase.
Tagad, kad esam pabeiguši rakstīt
Lietotājs
un
Dators
klasēs, mēs varam koncentrēties uz savu faktisko spēli. Izveidojiet privātus laukus
Lietotājs
un
Dators
klasēs
Akmens Šķēres Papīrīts
klase. Mums būs jāpiekļūst šiem laukiem, lai piekļūtu
getMove ()
metodes, kad mēs spēlējam spēli. Konstruktorā
Akmens Šķēres Papīrīts
klasē, iniciējiet šos laukus. Mums būs arī jāseko līdzi rezultātam
userScore
un
computerScore
lauki, kas mums konstruktorā jāuzsāk kā 0. Mums ir jāseko arī spēļu skaitam, kas arī būs lauks, kas uzsākts kā 0.
privāts lietotājs; privāts datoru dators; private int userScore; privāts int computerScore; privāts int numursOfGames; public RockPaperScissors () {lietotājs = jauns lietotājs (); dators = jauns Dators (); userScore = 0; computerScore = 0; numberOfGames = 0; }
8. solis. Paplašiniet
Pārvietot
enum, lai iekļautu metodi, kas mums norāda, kurš gājiens uzvar katrā gadījumā.
Mums jāraksta a
compaMoves ()
metode, kas atgriež 0, ja gājieni ir vienādi, 1, ja pašreizējais gājiens pārspēj otru gājienu, un -1, ja pašreizējais gājiens zaudē otrai kustībai. Tas būs noderīgi, lai noteiktu uzvarētāju spēlē. Lai ieviestu šo metodi, mēs vispirms atgriezīsim 0, ja gājieni ir vienādi un tāpēc mums ir neizšķirts. Pēc tam uzrakstiet slēdzi, lai atgrieztos 1 vai -1.
private enum Pārvietot {ROCK, PAPER, SCISSORS; /** * Salīdzina šo gājienu ar citu gājienu, nosakot neizšķirtu, uzvaru vai * zaudējumu. * * @param otherMove * pārvietot, lai salīdzinātu ar * @return 1, ja šis gājiens pārspēj otru gājienu, -1, ja šis gājiens zaudē * otram gājienam, 0, ja šie gājieni ir neizšķirti * / public int compaMove (Move otherMove) { / / Tie, ja (šis == citsPārvietot) atgriežas 0; slēdzis (šis) {case ROCK: return (otherMove == SCISSORS? 1: -1); gadījums PAPER: return (otherMove == ROCK? 1: -1); gadījums šķēres: atgriešanās (otherMove == PAPER? 1: -1); } // Nekad nevajadzētu sasniegt šeit atgriezties 0; }}
9. solis. Izveidojiet a
sākt spēli()
metode sadaļā
Akmens Šķēres Papīrīts
klase.
Šī metode būs spēles spēlēšana. Sāciet, ievietojot vienkāršu
System.out.println
metodē.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }
10. solis. Saņemiet kustības no lietotāja un datora
Iekš
sākt spēli()
metodi, izmantojiet
getMove ()
metodes no
Lietotājs
klase un
Dators
klasē, lai iegūtu lietotāja un datora kustības.
Pārvietot userMove = user.getMove (); Pārvietot datoruMove = computer.getMove (); System.out.println ("\ nJūs spēlējāt" + userMove + "."); System.out.println ("Dators spēlēja" + computerMove + ". / N");
11. solis. Salīdziniet abus gājienus un nosakiet, vai uzvarēja lietotājs vai uzvarēja dators
Izmantojiet
compaMoves ()
metode no
Pārvietot
enum, lai noteiktu, vai lietotājs uzvarēja vai nē. Ja lietotājs uzvarēja, palieliniet lietotāja rezultātu par 1. Ja lietotājs zaudēja, palieliniet datora rezultātu par 1. Ja rezultāts bija neizšķirts, nevienu no punktiem nepalieliniet. Pēc tam palieliniet izspēlēto spēļu skaitu par vienu.
int compaMoves = userMove.compareMoves (computerMove); switch (salīdzinātMoves) {case 0: // Tie System.out.println ("Tie!"); pārtraukums; 1. gadījums: // Lietotājs uzvar System.out.println (userMove + "sitieni" + computerMove + ". Jūs uzvarējāt!"); userScore ++; pārtraukums; gadījums -1: // Dators uzvar System.out.println (computerMove + "sitieni" + userMove + ". Jūs zaudējāt."); computerScore ++; pārtraukums; } numberOfGames ++;
12. solis. Jautājiet, vai lietotājs vēlas spēlēt vēlreiz
Ja lietotājs vēlas spēlēt vēlreiz, zvaniet
sākt spēli()
vēlreiz. Pretējā gadījumā zvaniet
printGameStats ()
kas izdrukās spēles statistiku. Mēs uzrakstīsim šo metodi nākamajā solī.
ja (user.playAgain ()) {System.out.println (); sākt spēli(); } cits {printGameStats (); }
Solis 13. Uzrakstiet
printGameStats ()
metode.
Šī metode parādīs spēles statistiku: uzvaru skaitu, zaudējumu skaitu, neizšķirtu skaitu, aizvadīto spēļu skaitu un lietotāja uzvarēto spēļu procentuālo daļu. Uzvarēto spēļu procentu aprēķina pēc (# uzvaras + (# neizšķirti/2))/(# izspēlētās spēles). Šī metode izmanto
System.out.printf
lai izdrukātu formatētu tekstu.
private void printGameStats () {int uzvar = userScore; int zaudējumi = computerScore; int saites = numberOfGames - userScore - computerScore; dubultprocentsVinnēts = (uzvar + ((dubultā)) neizšķirts) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Drukāt nosaukumus System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "SPĒLĒTĀS SPĒLES", "PERCENTAGE UZVARĒTS "); // 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 ("|"); // Drukāt vērtības System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", uzvaras, zaudējumi, neizšķirti, skaitsOfGames, procentiVinnēts * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Solis 14. Sāciet spēli galvenajā klasē
Galvenajā klasē inicializējiet
Akmens Šķēres Papīrīts
klasē un zvaniet uz
sākt spēli()
metode.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
Solis 15. Pārbaudiet savu spēli
Tagad, kad esam spējuši uzrakstīt spēli Rock, Paper, Scissors, ir pienācis laiks visu apkopot un pārbaudīt!
Programmas paraugs
importēt java.util. Random; importēt java.util. Scanner; publiskās klases RockPaperScissors {privāts lietotājs; privāts datoru dators; private int userScore; privāts int computerScore; privāts int numursOfGames; private enum Pārvietot {ROCK, PAPER, SCISSORS; /** * Salīdzina šo gājienu ar citu gājienu, nosakot neizšķirtu, uzvaru vai * zaudējumu. * * @param otherMove * pārvietot, lai salīdzinātu ar * @return 1, ja šis gājiens pārspēj otru gājienu, -1, ja šis gājiens zaudē * otram gājienam, 0, ja šie gājieni ir neizšķirti * / public int compaMove (Move otherMove) { / / Tie, ja (šis == citsPārvietot) atgriežas 0; slēdzis (šis) {case ROCK: return (otherMove == SCISSORS? 1: -1); gadījums PAPER: return (otherMove == ROCK? 1: -1); gadījums šķēres: atgriešanās (otherMove == PAPER? 1: -1); } // Nekad nevajadzētu sasniegt šeit atgriezties 0; }} privātas klases lietotājs {privāts skeneris inputScanner; publisks lietotājs () {inputScanner = jauns skeneris (System.in); } public Pārvietot getMove () {// Lūgt lietotājam System.out.print ("Akmens, papīrs vai šķēres?"); // Iegūt lietotāja ievadi String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Lietotājs ir ievadījis derīgu ievades slēdzi (firstLetter) {case 'R': return Move. ROCK; gadījums 'P': atgriezties Move. PAPER; gadījums 'S': atgriezties Move. SCISSORS; }} // Lietotājs nav ievadījis derīgu ievadi. Atkal jautājiet. atgriezties getMove (); } public boolean playAgain () {System.out.print ("Vai vēlaties spēlēt vēlreiz?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); atgriezt userInput.charAt (0) == 'Y'; }} privāta klase Dators {public Move getMove () {Pārvietot pārceļas = Pārvietot.vērtības (); Random random = new Random (); int indekss = random.nextInt (pārvietojas.garums); atgriešanās gājieni [indekss]; }} publiskie RockPaperScissors () {user = new User (); dators = jauns Dators (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Saņemt gājienus Pārvietot userMove = user.getMove (); Pārvietot datoruMove = computer.getMove (); System.out.println ("\ nJūs spēlējāt" + userMove + "."); System.out.println ("Dators spēlēja" + computerMove + ". / N"); // Salīdzināt gājienus un noteikt uzvarētāju int compaMoves = userMove.compareMoves (computerMove); switch (salīdzinātMoves) {case 0: // Tie System.out.println ("Tie!"); pārtraukums; 1. gadījums: // Lietotājs uzvar System.out.println (userMove + "sitieni" + computerMove + ". Jūs uzvarējāt!"); userScore ++; pārtraukums; gadījums -1: // Dators uzvar System.out.println (computerMove + "sitieni" + userMove + ". Jūs zaudējāt."); computerScore ++; pārtraukums; } numberOfGames ++; // Palūdziet lietotājam spēlēt vēlreiz, ja (user.playAgain ()) {System.out.println (); sākt spēli(); } cits {printGameStats (); }} /*** Izdrukā spēles statistiku. Saiknes tiek aprēķinātas kā 1/2 uzvara * uzvarēto procentu apmērā. */ private void printGameStats () {int uzvar = userScore; int zaudējumi = computerScore; int saites = numberOfGames - userScore - computerScore; dubultprocentsVinnēts = (uzvar + ((dubultā)) neizšķirts) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Drukāt nosaukumus System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "SPĒLĒTĀS SPĒLES", "PERCENTAGE UZVARĒTS "); // 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 ("|"); // Drukāt vērtības System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", uzvaras, zaudējumi, neizšķirti, skaitsOfGames, procentiVinnēts * 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 (); }}