Rock, Paper, Scissors er et håndspil, der spilles af to personer. Begge mennesker ville sige "sten, papir, saks" og derefter samtidig danne et af tre objekter (sten, papir eller saks) med en udstrakt hånd. Vinderen bestemmes af håndformationer. Saks slår papir, papir slår sten, og sten slår saks. Hvis begge spillere spiller den samme håndformation, betragtes det som uafgjort. Vi vil skrive et simpelt spil i Java for at simulere rock, papir, saks, hvor den ene spiller er brugeren og den anden spiller er computeren.
Trin
Trin 1. Opret hovedklassen, og kald den
Sten saks papir
.
Dette vil være klassen, hvor vi vil skrive spillet. Du kan vælge at navngive det noget andet som f.eks
Spil
eller
Main
. Skriv i metodeerklæringer for konstruktøren og hovedmetoden.
public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Trin 2. Opret en optælling for håndbevægelserne (sten, papir eller saks)
Vi kunne bruge strenge til at repræsentere sten, papir eller saks, men en optælling giver os mulighed for på forhånd at definere vores konstanter, hvilket betyder, at brug af opregningen er et bedre design. Vi kalder vores enum type
Bevæge sig
med værdierne
KLIPPE
PAPIR
og
SAKS
private enum Flyt {ROCK, PAPER, SCISSORS}
Trin 3. Opret to private klasser
Bruger
og
Computer
.
Disse klasser repræsenterer vores spillere i spillet. Du kan vælge at offentliggøre disse klasser. Det
Bruger
klasse vil være den klasse, der beder brugeren om enten sten, papir eller saks, så vi bliver nødt til at skrive en
getMove ()
metode. Det
Computer
klasse skal også have en
getMove ()
metode, så computeren også kan foretage et træk. Vi vil sætte pladsholdere i disse metoder og implementere dem senere. Det
Bruger
klasse vil kræve en konstruktør, der opsætter
Scanner
objekt til at tage brugerinput. Vi vil sætte
Scanner
som et privat felt for brugeren og derefter starte det i konstruktøren. Da vi bruger
Scanner
klasse, skal vi skrive en importopgørelse for det øverst i vores kode. Det
Computer
klasse kræver ikke en konstruktør, så vi behøver ikke at skrive en; når vi starter
Computer
objekt, kalder vi bare standardkonstruktøren. Her er hvad vores
Sten saks papir
klasse ser sådan ud nu:
import java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; offentlig bruger () {inputScanner = ny scanner (System.in); } public Move getMove () {// TODO: Gennemfør denne metode return null; }} privat klasse Computer {public Move getMove () {// TODO: Gennemfør denne metode return null; }} offentlige RockPaperScissors () {} offentlig statisk tomrums main (String args) {}}
Trin 4. Skriv
getMove ()
metode til
Computer
klasse.
Denne metode returnerer en tilfældig
Bevæge sig
. Vi kan få en vifte af
Bevæge sig
optællinger ved at ringe til
værdier ()
metode:
Move.values ()
. At vælge en tilfældig
Bevæge sig
optælling i denne værdimatrix, skal vi generere et tilfældigt indeks, der er et helt tal mellem 0 og længden af vores værdimateriale. For at gøre dette kan vi bruge
nextInt ()
metode til
Tilfældig
klasse, som vi skal importere fra
java.util
. Når vi har fået tilfældigt indeks, kan vi returnere
Bevæge sig
af dette indeks fra vores værdimateriale.
public Move getMove () {Move moves = Move.values (); Tilfældig tilfældig = ny Tilfældig (); int index = random.nextInt (moves.length); returbevægelser [indeks]; }
Trin 5. Skriv
getMove ()
metode til
Bruger
klasse.
Denne metode returnerer en
Bevæge sig
svarende til hvad brugeren har indtastet. Vi forventer, at brugeren skriver enten "sten", "papir" eller "saks". Først skal vi bede brugeren om et input:
System.out.print ("sten, papir eller saks?")
. Brug derefter
nextLine ()
metode til
Scanner
objekt for at få brugerinput som en streng. Vi skal nu kontrollere, om brugeren har indsendt et gyldigt træk, men vi kan være lette, hvis brugeren har stavet et ord forkert. Så vi vil kun kontrollere, om det første bogstav i brugerinput er enten "R" (for sten), "P" (for papir) eller "S" (for saks), og vi er ligeglade med sagen, fordi vi vil først bruge
toUpperCase ()
metode til
Snor
klasse for at gøre brugerinputstrengen helt store. Hvis brugeren ikke har indtastet et eksternt korrekt input, beder vi brugeren igen. Afhængigt af hvad brugeren har lagt i, returnerer vi derefter et tilsvarende træk.
public Move getMove () {// Spørg brugeren System.out.print ("Rock, papir eller saks?"); // Hent brugerinput String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); hvis (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Bruger har indtastet en gyldig input switch (firstLetter) {case 'R': return Move. ROCK; case 'P': returner Move. PAPER; case 'S': returner Move. SCISSORS; }}} // Bruger har ikke indtastet et gyldigt input. Spørg igen. return getMove (); }
Trin 6. Skriv en
spil igen()
metode til
Bruger
klasse.
Brugeren skal være i stand til at spille spillet igen og igen. For at afgøre, om brugeren vil spille igen, skal vi skrive en
spil igen()
metode, der returnerer en booleaner, der fortæller spillet, om brugeren har besluttet sig for at spille igen eller ej. I denne metode bruger vi
Scanner
som vi tidligere havde igangsat i konstruktøren for at få et "Ja" eller et "Nej" fra brugeren. Vi kontrollerer kun, om det første bogstav er 'Y' for at afgøre, om brugeren vil afspille igen. Ethvert andet input vil betyde, at brugeren ikke vil afspille igen.
offentlig boolsk playAgain () {System.out.print ("Vil du afspille igen?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); returner userInput.charAt (0) == 'Y'; }
Trin 7. Tilslut
Bruger
og
Computer
klasser sammen i
Sten saks papir
klasse.
Nu hvor vi er færdige med at skrive
Bruger
og
Computer
klasser, kan vi fokusere på at arbejde på vores egentlige spil. Opret private felter til
Bruger
og
Computer
klasser i
Sten saks papir
klasse. Vi bliver nødt til at få adgang til disse felter for at få adgang til
getMove ()
metoder, når vi spiller spillet. I konstruktøren til
Sten saks papir
klasse, start disse felter. Vi bliver også nødt til at holde styr på scoren i
userScore
og
computerScore
felter, som vi skal starte som 0 i konstruktøren. Vi skal også holde styr på antallet af kampe, som også vil være et felt, der startes som 0.
privat bruger bruger; private computere; private int userScore; privat int computerScore; private int numberOfGames; offentlig RockPaperScissors () {bruger = ny bruger (); computer = ny Computer (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Trin 8. Forlæng
Bevæge sig
enum til at inkludere en metode, der fortæller os, hvilket træk der vinder i hvert tilfælde.
Vi skal skrive a
sammenlignMoves ()
metode, der returnerer 0, hvis bevægelserne er de samme, 1 hvis det aktuelle træk slår det andet træk, og -1 hvis det aktuelle træk taber til det andet træk. Dette vil være nyttigt til at bestemme vinderen i spillet. For at implementere denne metode returnerer vi først 0, hvis trækkene er de samme, og derfor har vi et uafgjort resultat. Skriv derefter en switch -erklæring for at returnere 1 eller -1.
private enum Flyt {ROCK, PAPER, SAXSORS; /** * Sammenligner dette træk med et andet træk for at bestemme uafgjort, en sejr eller * et tab. * * @param otherMove * flytte for at sammenligne med * @return 1 hvis dette træk slår det andet træk, -1 hvis dette træk taber til * det andet træk, 0 hvis disse træk hænger sammen * / public int comparemoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (dette) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPIR: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPIR? 1: -1); } // Bør aldrig nå her returnere 0; }}
Trin 9. Opret en
Start Spil()
metode i
Sten saks papir
klasse.
Denne metode vil blive spillet af spillet. Start med at lægge en simpel
System.out.println
i metoden.
public void startGame () {System.out.println ("ROCK, PAPIR, SAX!"); }
Trin 10. Få træk fra brugeren og computeren
I
Start Spil()
metode, brug
getMove ()
metoder fra
Bruger
klasse og
Computer
klasse for at få brugeren og computerens træk.
Flyt userMove = user.getMove (); Flyt computerMove = computer.getMove (); System.out.println ("\ nDu spillede" + userMove + "."); System.out.println ("Computer afspillet" + computerMove + ". / N");
Trin 11. Sammenlign de to træk, og afgør, om brugeren vandt eller computeren vandt
Brug
sammenlignMoves ()
metode fra
Bevæge sig
enum til at afgøre, om brugeren vandt eller ej. Hvis brugeren vandt, skal du øge brugerens score med 1. Hvis brugeren tabte, skal du øge computerens score med 1. Hvis der var uafgjort, skal du ikke øge nogen af scoringerne. Forøg derefter antallet af spil, der spilles af en.
int comparMoves = userMove.compareMoves (computerMove); switch (sammenlignMoves) {case 0: // Tie System.out.println ("Slips!"); pause; sag 1: // Bruger vinder System.out.println (userMove + "beats" + computerMove + ". Du vandt!"); userScore ++; pause; case -1: // Computer vinder System.out.println (computerMove + "beats" + userMove + ". Du tabte."); computerScore ++; pause; } numberOfGames ++;
Trin 12. Spørg, om brugeren vil spille igen
Hvis brugeren vil afspille igen, skal du ringe
Start Spil()
igen. Ellers ring
printGameStats ()
som vil udskrive statistikken over spillet. Vi vil skrive denne metode i det næste trin.
hvis (user.playAgain ()) {System.out.println (); Start Spil(); } ellers {printGameStats (); }
Trin 13. Skriv
printGameStats ()
metode.
Denne metode viser statistikken over spillet: antal sejre, antal tab, antal uafgjort, antal spil, og procentdel af spil, der er vundet af brugeren. Procentdelen af vundne spil beregnes af (# sejre + (# uafgjort/2))/(# spil spillet). Denne metode bruger
System.out.printf
for at udskrive formateret tekst.
private void printGameStats () {int wins = userScore; int tab = computerScore; int ties = numberOfGames - userScore - computerScore; dobbelt procentvundet = (vinder + ((dobbelt) uafgjort) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Udskriv titler System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "TAB", "TIES", "SPILLET SPIL", "PERCENTAGE VANDT"); // 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 ("|"); // Udskriv værdier System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", sejre, tab, uafgjort, numberOfGames, percentageWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Trin 14. Start spillet i hovedklassen
I hovedklassen skal du initialisere en forekomst af
Sten saks papir
klasse og ring til
Start Spil()
metode.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
Trin 15. Test dit spil
Nu hvor vi har gennemgået alle bestræbelserne på at skrive spillet Rock, Paper, Scissors, er det tid til at kompilere og teste alt!
Prøveprogram
import java.util. Random; import java.util. Scanner; public class RockPaperScissors {privatbrugerbruger; private computere; private int userScore; privat int computerScore; private int numberOfGames; private enum Flyt {ROCK, PAPER, SAXSORS; /** * Sammenligner dette træk med et andet træk for at bestemme uafgjort, en sejr eller * et tab. * * @param otherMove * flytte for at sammenligne med * @return 1 hvis dette træk slår det andet træk, -1 hvis dette træk taber til * det andet træk, 0 hvis disse træk hænger sammen * / public int comparemoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (dette) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPIR: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPIR? 1: -1); } // Bør aldrig nå her returnere 0; }} privat klasse bruger {private Scanner inputScanner; offentlig bruger () {inputScanner = ny scanner (System.in); } public Move getMove () {// Spørg brugeren System.out.print ("sten, papir eller saks?"); // Hent brugerinput String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); hvis (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Bruger har indtastet en gyldig input switch (firstLetter) {case 'R': return Move. ROCK; case 'P': returner Move. PAPER; case 'S': returner Move. SCISSORS; }}} // Bruger har ikke indtastet et gyldigt input. Spørg igen. return getMove (); } offentlig boolsk playAgain () {System.out.print ("Vil du afspille igen?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); returner userInput.charAt (0) == 'Y'; }} privat klasse Computer {public Move getMove () {Move moves = Move.values (); Tilfældig tilfældig = ny Tilfældig (); int index = random.nextInt (moves.length); returbevægelser [indeks]; }} offentlige RockPaperScissors () {user = new User (); computer = ny Computer (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SAX!"); // Få træk Flyt userMove = user.getMove (); Flyt computerMove = computer.getMove (); System.out.println ("\ nDu spillede" + userMove + "."); System.out.println ("Computer afspillet" + computerMove + ". / N"); // Sammenlign træk og bestem vinder int comparMoves = userMove.compareMoves (computerMove); switch (sammenlignMoves) {case 0: // Tie System.out.println ("Slips!"); pause; sag 1: // Bruger vinder System.out.println (userMove + "beats" + computerMove + ". Du vandt!"); userScore ++; pause; case -1: // Computer vinder System.out.println (computerMove + "beats" + userMove + ". Du tabte."); computerScore ++; pause; } numberOfGames ++; // Bed brugeren om at afspille igen, hvis (user.playAgain ()) {System.out.println (); Start Spil(); } ellers {printGameStats (); }} /*** Udskriver statistikken over spillet. Beregner bånd som 1/2 en gevinst i * vandt procent. */ private void printGameStats () {int wins = userScore; int tab = computerScore; int ties = numberOfGames - userScore - computerScore; dobbelt procentvundet = (vinder + ((dobbelt) uafgjort) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Udskriv titler System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "TAB", "TIES", "SPILLET SPIL", "PERCENTAGE VANDT"); // 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 ("|"); // Udskriv værdier System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", sejre, tab, uafgjort, numberOfGames, percentageWon * 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 ("-"); }} offentligt statisk tomrum main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }}