Rock, Paper, Scissors is 'n handspel wat deur twee mense gespeel word. Beide mense sou "rots, papier, skêr" sê en vorm dan gelyktydig een van drie voorwerpe (rots, papier of skêr) met 'n uitgestrekte hand. Die wenner word bepaal deur die handformasies. Skêr klop papier, papier klop klip, en klip klop skêr. As albei spelers dieselfde handformasie speel, word dit as gelykop beskou. Ons skryf 'n eenvoudige speletjie in Java om rots, papier, skêr te simuleer waar die een speler die gebruiker is en die ander speler die rekenaar.
Stappe
Stap 1. Skep die hoofklas en noem dit
RockPaperScissors
.
Dit is die klas waar ons die spel sal skryf. U kan kies om dit iets anders te noem, soos
Spel
of
Hoof
. Skryf metodeverklarings vir die konstruktor en die hoofmetode neer.
openbare klas RockPaperScissors {public RockPaperScissors () {} openbare statiese leemte hoof (String args) {}}
Stap 2. Maak 'n opsomming vir die handgebare (rots, papier of skêr)
Ons kan snare gebruik om rots, papier of skêr voor te stel, maar 'n opsomming stel ons in staat om ons konstantes vooraf te definieer, wat beteken dat die gebruik van die opsomming 'n beter ontwerp is. Ons noem ons enum tipe
Beweeg
met die waardes
ROTS
VRAESTEL
en
SKAAR
private enum Skuif {ROCK, PAPER, SCISSORS}
Stap 3. Skep twee privaat klasse
Gebruiker
en
Rekenaar
.
Hierdie klasse verteenwoordig ons spelers in die spel. U kan kies om hierdie klasse openbaar te maak. Die
Gebruiker
klas sal die klas wees wat die gebruiker om steen, papier of 'n skêr vra, sodat ons 'n
getMove ()
metode. Die
Rekenaar
klas sal ook 'n
getMove ()
metode sodat die rekenaar ook kan beweeg. Ons sal plekhouers in hierdie metodes plaas en dit later implementeer. Die
Gebruiker
klas benodig 'n konstruktor wat die
Skandeerder
voorwerp om die gebruikersinvoer in te neem. Ons sal die
Skandeerder
as 'n privaat veld vir die gebruiker en begin dit dan in die konstruktor. Aangesien ons die
Skandeerder
klas, moet ons 'n invoerverklaring daarvoor bo -aan ons kode skryf. Die
Rekenaar
klas benodig nie 'n konstruktor nie, dus hoef ons nie een te skryf nie; wanneer ons die
Rekenaar
voorwerp, sal ons net die standaardkonstrukteur noem. Hier is wat ons
RockPaperScissors
klas lyk nou:
invoer java.util. Scanner; openbare klas RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} privaat klas gebruiker {private Scanner inputScanner; openbare gebruiker () {inputScanner = nuwe skandeerder (System.in); } public Move getMove () {// TODO: Implementeer hierdie metode return null; }} privaat klas Rekenaar {public Move getMove () {// TODO: Implementeer hierdie metode return null; }} openbare RockPaperScissors () {} openbare statiese leemte hoof (String args) {}}
Stap 4. Skryf die
getMove ()
metode vir die
Rekenaar
klas.
Hierdie metode gee 'n ewekansige terugkeer
Beweeg
. Ons kan 'n verskeidenheid van
Beweeg
opsommings deur die
waardes ()
metode:
Move.values ()
. Om 'n ewekansige te kies
Beweeg
opsomming in hierdie waardeskikking, moet ons 'n ewekansige indeks genereer wat 'n heelgetal is tussen 0 en die lengte van ons waardeskikking. Om dit te kan doen, kan ons die
nextInt ()
metode van die
Willekeurig
klas waaruit ons moet invoer
java.util
. Nadat ons die ewekansige indeks gekry het, kan ons die
Beweeg
van die indeks uit ons waardeskikking.
public Move getMove () {Move moves = Move.values (); Random random = new Random (); int indeks = random.nextInt (moves.length); opbrengs beweeg [indeks]; }
Stap 5. Skryf die
getMove ()
metode vir die
Gebruiker
klas.
Hierdie metode sal 'n
Beweeg
wat ooreenstem met wat die gebruiker ingevoer het. Ons sal van die gebruiker verwag om 'rock', 'paper' of 'sciss' te skryf. Eerstens moet ons die gebruiker vra vir 'n insette:
System.out.print ("Rots, papier of skêr?")
. Gebruik dan die
nextLine ()
metode van die
Skandeerder
voorwerp om die gebruiker se invoer as 'n string te kry. Ons moet nou kyk of die gebruiker 'n geldige skuif ingedien het, maar ons kan sag wees as die gebruiker 'n woord verkeerd gespel het. Dus sal ons net kyk of die eerste letter van die gebruikersinvoer 'R' (vir rock), 'P' (vir papier) of 'S' (vir 'n skêr) is, en ons sal nie omgee vir die saak nie, want ons sal eers die
toUpperCase ()
metode van die
String
klas om die invoerstring van die gebruiker in hoofletters te maak. As die gebruiker nie 'n afstandkorrekte invoer ingevoer het nie, sal ons die gebruiker weer vra. Afhangende van wat die gebruiker ingesit het, stuur ons 'n ooreenstemmende skuif terug.
public Move getMove () {// Stel die gebruiker System.out.print ("rots, papier of skêr?"); // Kry die gebruikersinvoer String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Gebruiker het 'n geldige invoerskakelaar (firstLetter) {case 'R': terugkeer Move. ROCK; geval 'P': stuur Move. PAPER; geval 'S': terugkeer Move. SCISSORS; }}} // Gebruiker het nie 'n geldige invoer ingevoer nie. Weer vra. terugkeer getMove (); }
Stap 6. Skryf a
speel weer()
metode vir die
Gebruiker
klas.
Die gebruiker moet die spel oor en oor kan speel. Om te bepaal of die gebruiker weer wil speel, moet ons 'n
speel weer()
'n Metode wat 'n Booleaner teruggee, wat die spel vertel of die gebruiker besluit het om weer te speel of nie. In hierdie metode gebruik ons die
Skandeerder
wat ons voorheen in die konstruktor begin het om 'n "Ja" of "Nee" van die gebruiker te kry. Ons sal slegs kyk of die eerste letter 'Y' is om te bepaal of die gebruiker weer wil speel. Enige ander invoer beteken dat die gebruiker nie weer wil speel nie.
openbare boolean playAgain () {System.out.print ("Wil u weer speel?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); stuur userInput.charAt (0) == 'Y' terug; }
Stap 7. Koppel die
Gebruiker
en
Rekenaar
klasse saam in die
RockPaperScissors
klas.
Noudat ons die
Gebruiker
en
Rekenaar
klasse, kan ons fokus op die werk aan ons werklike spel. Skep privaat velde vir die
Gebruiker
en
Rekenaar
klasse in die
RockPaperScissors
klas. Ons sal toegang tot hierdie velde nodig hê om toegang tot die
getMove ()
metodes wanneer ons die spel speel. In die konstruktor vir die
RockPaperScissors
klas, begin hierdie velde. Ons sal ook die telling moet byhou
gebruikerscore
en
rekenaarScore
velde, wat ons as 0 in die konstruktor moet begin. Ons moet ook die aantal wedstryde byhou, wat ook 'n veld is wat as 0 begin word.
privaat gebruiker gebruiker; privaat Rekenaarrekenaar; privaat int userScore; private rekenaarrekenaar; private int numberOfGames; openbare RockPaperScissors () {user = new User (); rekenaar = nuwe Rekenaar (); userScore = 0; rekenaarScore = 0; numberOfGames = 0; }
Stap 8. Brei die
Beweeg
enum om 'n metode in te sluit wat ons vertel watter stap in elke geval wen.
Ons moet 'n skryf
vergelykMoves ()
metode wat 0 teruggee as die bewegings dieselfde is, 1 as die huidige beweging die ander beweging klop, en -1 as die huidige beweging na die ander beweging verloor. Dit sal handig wees om die wenner in die spel te bepaal. Om hierdie metode te implementeer, gee ons eers 0 terug as die bewegings dieselfde is en daarom het ons gelykop. Skryf dan 'n skakelverklaring vir die terugkeer van 1 of -1.
private enum Skuif {ROCK, PAPER, SCISSORS; /** * Vergelyk hierdie stap met 'n ander stap om die gelykop, 'n oorwinning of 'n verlies te bepaal. * * @param otherMove * skuif om te vergelyk met * @return 1 as hierdie skuif die ander skuif klop, -1 as hierdie skuif tot * die ander skuif verloor, 0 as hierdie bewegings * / public int comparMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; skakelaar (hierdie) {case ROCK: return (otherMove == SCISSORS? 1: -1); saak PAPIER: terugkeer (otherMove == ROCK? 1: -1); saak SKAARS: terugkeer (otherMove == PAPIER? 1: -1); } // Moet nooit hier kom nie, terugkeer 0; }}
Stap 9. Skep a
begin die spel()
metode in die
RockPaperScissors
klas.
Hierdie metode is om die spel te speel. Begin met 'n eenvoudige
System.out.println
in die metode.
openbare leegte startGame () {System.out.println ("ROTS, PAPIER, SKAAR!"); }
Stap 10. Kry bewegings van die gebruiker en die rekenaar
In die
begin die spel()
metode, gebruik die
getMove ()
metodes uit die
Gebruiker
klas en die
Rekenaar
klas om die gebruiker en die rekenaar se bewegings te kry.
Beweeg userMove = user.getMove (); Beweeg computerMove = computer.getMove (); System.out.println ("\ nJy het gespeel" + userMove + "."); System.out.println ("Rekenaar gespeel" + computerMove + ". / N");
Stap 11. Vergelyk die twee bewegings en bepaal of die gebruiker gewen het of die rekenaar gewen het
Gebruik die
vergelykMoves ()
metode uit die
Beweeg
om te bepaal of die gebruiker gewen het of nie. As die gebruiker gewen het, verhoog die gebruikers telling met 1. As die gebruiker verloor, verhoog die rekenaar telling met 1. As daar gelykop was, moet u nie een van die tellings verhoog nie. Verhoog dan die aantal speletjies wat deur een gespeel word.
int comparMoves = userMove.compareMoves (computerMove); skakelaar (vergelykMoves) {case 0: // Tie System.out.println ("Tie!"); breek; geval 1: // Gebruiker wen System.out.println (userMove + "beats" + computerMove + ". Jy het gewen!"); userScore ++; breek; case -1: // Computer wen System.out.println (computerMove + "beats" + userMove + ". You lost."); rekenaarScore ++; breek; } numberOfGames ++;
Stap 12. Vra of die gebruiker weer wil speel
As die gebruiker weer wil speel, bel
begin die spel()
weer. Andersins, bel
printGameStats ()
wat die statistieke van die spel sal uitdruk. Ons sal hierdie metode in die volgende stap skryf.
as (user.playAgain ()) {System.out.println (); begin die spel(); } anders {printGameStats (); }
Stap 13. Skryf die
printGameStats ()
metode.
Met hierdie metode word die spelstatistieke vertoon: aantal oorwinnings, aantal verliese, aantal gelykopstellings, aantal gespeelde wedstryde en persentasie wedstryde wat deur die gebruiker gewen is. Die persentasie gewen wedstryde word bereken deur die (# oorwinnings + (# gelykop/2))/(# gespeelde wedstryde). Hierdie metode gebruik
System.out.printf
om geformateerde teks uit te druk.
private leegte printGameStats () {int wins = userScore; int verliese = rekenaarScore; int ties = numberOfGames - userScore - computerScore; dubbele persentasie Wen = (wen + ((dubbel) bande) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Druk titels System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMES SPILLED", "PERCENTAGE WEN "); // 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 waardes System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", oorwinnings, verliese, bande, numberOfGames, percentageWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Stap 14. Begin die spel in die hoofklas
In die hoofklas, initialiseer 'n voorbeeld van die
RockPaperScissors
klas en bel die
begin die spel()
metode.
openbare statiese leegte hoof (String args) {RockPaperScissors game = nuwe RockPaperScissors (); game.startGame (); }
Stap 15. Toets jou spel
Noudat ons al die moeite gedoen het om die spel Rock, Paper, Scissors te skryf, is dit tyd om alles saam te stel en te toets!
Voorbeeldprogram
invoer java.util. Random; invoer java.util. Scanner; openbare klas RockPaperScissors {privaatgebruiker; privaat Rekenaarrekenaar; private int userScore; private rekenaarrekenaar; private int numberOfGames; private enum Skuif {ROCK, PAPER, SCISSORS; /** * Vergelyk hierdie stap met 'n ander stap om die gelykop, 'n oorwinning of 'n verlies te bepaal. * * @param otherMove * skuif om te vergelyk met * @return 1 as hierdie skuif die ander skuif klop, -1 as hierdie skuif tot * die ander skuif verloor, 0 as hierdie bewegings * / public int comparMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; skakelaar (hierdie) {case ROCK: return (otherMove == SCISSORS? 1: -1); saak PAPIER: terugkeer (otherMove == ROCK? 1: -1); saak SKAARS: terugkeer (otherMove == PAPIER? 1: -1); } // Moet nooit hier kom nie, terugkeer 0; }} privaat klasgebruiker {private Scanner inputScanner; openbare gebruiker () {inputScanner = nuwe skandeerder (System.in); } openbare skuif getMove () {// Stel die gebruiker System.out.print ("rots, papier of skêr?"); // Kry die gebruikersinvoer String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Gebruiker het 'n geldige invoerskakelaar (firstLetter) {case 'R': terugkeer Move. ROCK; geval 'P': stuur Move. PAPER; geval 'S': terugkeer Move. SCISSORS; }}} // Gebruiker het nie 'n geldige invoer ingevoer nie. Weer vra. terugkeer getMove (); } openbare booleaanse playAgain () {System.out.print ("Wil u weer speel?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); stuur userInput.charAt (0) == 'Y' terug; }} privaat klas rekenaar {public Move getMove () {Move moves = Move.values (); Random random = new Random (); int indeks = random.nextInt (moves.length); opbrengs beweeg [indeks]; }} openbare RockPaperScissors () {gebruiker = nuwe gebruiker (); rekenaar = nuwe Rekenaar (); userScore = 0; rekenaarScore = 0; numberOfGames = 0; } openbare leegte startGame () {System.out.println ("ROTS, PAPIER, SKAAR!"); // Kry bewegings Skuif userMove = user.getMove (); Beweeg computerMove = computer.getMove (); System.out.println ("\ nJy het gespeel" + userMove + "."); System.out.println ("Rekenaar gespeel" + computerMove + ". / N"); // Vergelyk bewegings en bepaal wenner int comparMoves = userMove.compareMoves (computerMove); skakelaar (vergelykMoves) {case 0: // Tie System.out.println ("Tie!"); breek; geval 1: // Gebruiker wen System.out.println (userMove + "beats" + computerMove + ". Jy het gewen!"); userScore ++; breek; case -1: // Computer wen System.out.println (computerMove + "beats" + userMove + ". You lost."); rekenaarScore ++; breek; } numberOfGames ++; // Vra die gebruiker om weer te speel as (user.playAgain ()) {System.out.println (); begin die spel(); } anders {printGameStats (); }} /*** Druk die statistieke van die spel uit. Bereken bande as 1/2 'n oorwinning in * persentasie gewen. */ private void printGameStats () {int wins = userScore; int verliese = rekenaarScore; int ties = numberOfGames - userScore - computerScore; dubbele persentasie Wen = (wen + ((dubbel) bande) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Druk titels System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMES SPILLED", "PERCENTAGE WEN "); // 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 waardes System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", oorwinnings, verliese, bande, numberOfGames, percentageWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); } private leegte printDashes (int numberOfDashes) {vir (int i = 0; i <numberOfDashes; i ++) {System.out.print ("-"); }} openbare statiese leemte hoof (String args) {RockPaperScissors game = nuwe RockPaperScissors (); game.startGame (); }}