Rock, Paper, Scissors is een handspel dat door twee mensen wordt gespeeld. Beide mensen zeiden "rock, paper, scissors" en vormden tegelijkertijd een van de drie objecten (steen, papier of schaar) met een uitgestoken hand. De winnaar wordt bepaald door de handformaties. Schaar verslaat papier, papier slaat rock en rock beats schaar. Als beide spelers dezelfde handvorming spelen, wordt het beschouwd als een gelijkspel. We zullen een eenvoudig spel schrijven in Java om Rock, Paper, Scissors te simuleren, waarbij één speler de gebruiker is en de andere speler de computer.
Stappen
-
1 Maak de hoofdklasse en noem hem
Steen Papier Schaar
. Dit zal de klas zijn waar we het spel zullen schrijven. U kunt ervoor kiezen om het iets anders te noemen, zoalsSpel
ofHoofd
. Schrijf in methodeaangiften voor de constructor en de hoofdmethode.openbaar klasse Steen Papier Schaar openbaar Steen Papier Schaar() openbaar statisch leegte hoofd(Draad[] args)
-
2 Maak een opsomming voor de handgebaren (steen, papier of schaar). We kunnen tekenreeksen gebruiken om steen, papier of schaar te vertegenwoordigen, maar een opsomming stelt ons in staat onze constanten vooraf te definiëren, wat betekent dat het gebruik van de opsomming een beter ontwerp is. We zullen ons type enum noemen
verhuizing
met de waardenROTS
,PAPIER
, enSCHAAR
.privaat enum verhuizing STEEN PAPIER SCHAAR
-
3 Maak twee privélessen
Gebruiker
enComputer
. Deze klassen vertegenwoordigen onze spelers in het spel. Je kunt ervoor kiezen om deze klassen openbaar te maken. DeGebruiker
klasse is de klasse die de gebruiker vraagt om een steen, papier of schaar, dus we moeten een schrijvengetMove ()
methode. DeComputer
klas zal ook eengetMove ()
methode zodat de computer ook een zet kan doen. We plaatsen tijdelijke aanduidingen in deze methoden en implementeren deze later. DeGebruiker
klasse vereist een constructor die deScanner
object om de gebruikersinvoer op te nemen. We zullen deScanner
als een privéveld voor de gebruiker en start het vervolgens in de constructor. Omdat we de gebruikenScanner
klasse, we moeten er een importinstructie voor schrijven bovenaan onze code. DeComputer
klasse vereist geen constructor, dus we hoeven er geen te schrijven; wanneer we deComputer
object, dan bellen we gewoon de standaardconstructor. Dit is wat onzeSteen Papier Schaar
klasse ziet er nu uit:importeren java.util.Scanner; openbaar klasse Steen Papier Schaar privaat enum verhuizing STEEN PAPIER SCHAAR privaat klasse Gebruiker privaat Scanner invoer scanner; openbaar Gebruiker() inputScanner = nieuwe Scanner(Systeem.in); openbaar Verplaats getMove() // TODO: Implementeer deze methode terugkeer nul; privaat klasse Computer openbaar Verplaats getMove() // TODO: Implementeer deze methode terugkeer nul; openbaar Steen Papier Schaar() openbaar statisch leegte hoofd(Draad[] args)
-
4 Schrijf de
getMove ()
methode voor deComputer
klasse. Deze methode retourneert een willekeurigeverhuizing
. We kunnen een reeks krijgenverhuizing
opsommingen door hetwaarden ()
methode:Move.values ()
. Om een willekeurige te kiezenverhuizing
opsomming in deze waardenreeks, moeten we een willekeurige index genereren die een geheel getal tussen 0 en de lengte van onze waardenreeks is. Om dit te doen, kunnen we denextInt ()
methode van deWillekeurig
klasse die we moeten importerenjava.util
. Nadat we de willekeurige index hebben gekregen, kunnen we deverhuizing
van die index uit onze waardenreeks.openbaar Verplaats getMove() verhuizing[] moves = Move.waarden(); Willekeurig willekeurig = nieuwe Willekeurig(); int inhoudsopgave = willekeurig.nextInt(moves.lengte); terugkeer moves[inhoudsopgave];
-
5 Schrijf de
getMove ()
methode voor deGebruiker
klasse. Deze methode retourneert averhuizing
overeenkomend met wat de gebruiker heeft ingevoerd. We verwachten van de gebruiker dat hij "rock", "paper" of "scissors" schrijft. Eerst moeten we de gebruiker om een invoer vragen:System.out.print ("Rots, papier of schaar?")
. Gebruik dan denextLine ()
methode van deScanner
object om de gebruikersinvoer als een tekenreeks te krijgen. We moeten nu controleren of de gebruiker een geldige zet heeft ingediend, maar we kunnen inschikkelijk zijn als de gebruiker een woord verkeerd heeft gespeld. Dus we zullen alleen controleren of de eerste letter van de gebruikersinvoer "R" (voor rock), "P" (voor papier) of "S" (voor een schaar) is en we geven niet om de zaak omdat we zullen eerst detoUpperCase ()
methode van deDraad
klasse om de gebruikersinvoertekenreeks allemaal in hoofdletters te maken. Als de gebruiker geen op afstand correcte invoer heeft ingevoerd, zullen we de gebruiker opnieuw vragen. Afhankelijk van wat de gebruiker heeft ingevoerd, retourneren we vervolgens een bijbehorende beweging.openbaar Verplaats getMove() // Prompt de gebruiker Systeem.uit.afdrukken("Rots, papier of schaar?"); // Krijg de gebruikersinvoer Draad gebruikers invoer = inputScanner.nextLine(); gebruikers invoer = gebruikers invoer.toUpperCase(); verkolen eerste brief = gebruikers invoer.charAt(0); als (eerste brief == 'R' || eerste brief == 'P' || eerste brief == 'S') // Gebruiker heeft een geldige invoer ingevoerd schakelaar (eerste brief) geval 'R': terugkeer Move.ROTS; geval 'P': terugkeer Move.PAPIER; geval 'S': terugkeer Move.SCHAAR; // Gebruiker heeft geen geldige invoer ingevoerd. Opnieuw vragen. terugkeer getMove();
-
6 Schrijf een
speel opnieuw()
methode voor deGebruiker
klasse. De gebruiker moet het spel steeds opnieuw kunnen spelen. Om te bepalen of de gebruiker opnieuw wil spelen, moeten we eenspeel opnieuw()
methode die een booleaans resultaat oplevert dat de game vertelt of de gebruiker heeft besloten om opnieuw te spelen of niet. In deze methode gebruiken we deScanner
die we eerder in de constructor hadden geïnitieerd om een "Ja" of een "Nee" van de gebruiker te krijgen. We zullen alleen controleren of de eerste letter 'Y' is om te bepalen of de gebruiker opnieuw wil spelen. Elke andere invoer betekent dat de gebruiker niet opnieuw wil spelen.openbaar boolean speel opnieuw() Systeem.uit.afdrukken("Wil je nog een keer spelen?"); Draad gebruikers invoer = inputScanner.nextLine(); gebruikers invoer = gebruikers invoer.toUpperCase(); terugkeer gebruikers invoer.charAt(0) == 'Y';
-
7 Verbind de
Gebruiker
enComputer
klassen samen in deSteen Papier Schaar
klasse. Nu we klaar zijn met het schrijven van deGebruiker
enComputer
klassen, kunnen we ons concentreren op het werken aan onze eigenlijke game. Maak privévelden voor deGebruiker
enComputer
klassen in deSteen Papier Schaar
klasse. We hebben toegang nodig tot deze velden om toegang te krijgen tot degetMove ()
methoden wanneer we het spel spelen. In de constructor voor deSteen Papier Schaar
klasse, start deze velden. We zullen ook de score in moeten bijhoudenuserScore
encomputerScore
velden, die we moeten initiëren als 0 in de constructor. We moeten ook het aantal games bijhouden, wat ook een veld is dat wordt gestart als 0.privaat Gebruiker gebruiker; privaat Computer computer; privaat int userScore; privaat int computerScore; privaat int aantal spellen; openbaar Steen Papier Schaar() gebruiker = nieuwe Gebruiker(); computer = nieuwe Computer(); userScore = 0; computerScore = 0; aantal spellen = 0;
-
8 Verleng de
verhuizing
enum om een methode op te nemen die ons vertelt welke zet wint in elk geval. We moeten een schrijvencompareMoves ()
methode die 0 retourneert als de zetten hetzelfde zijn, 1 als de huidige beweging de andere beweging verslaat en -1 als de huidige beweging verliest bij de andere beweging. Dit is handig voor het bepalen van de winnaar in het spel. Om deze methode te implementeren, zullen we eerst 0 retourneren als de zetten hetzelfde zijn en daarom hebben we een gelijkspel. Schrijf vervolgens een switchinstructie voor het retourneren van 1 of -1.privaat enum verhuizing STEEN PAPIER SCHAAR; / ** * Vergelijkt deze beweging met een andere zet om een gelijkspel, een overwinning of * een verlies te bepalen. * * @param otherMove * verplaatsen om te vergelijken met * @return 1 als deze beweging de andere zet verslaat, -1 als deze beweging verliest tot * de andere zet, 0 als deze zetten gelijkspel * / openbaar int compareMoves(Verplaats otherMove) // Binden als (deze == otherMove) terugkeer 0; schakelaar (deze) geval ROTS: terugkeer (otherMove == SCHAAR ? 1 : -1); geval PAPIER: terugkeer (otherMove == ROTS ? 1 : -1); geval SCHAAR: terugkeer (otherMove == PAPIER ? 1 : -1); // Zou hier nooit moeten komen terugkeer 0;
-
9 Maak een
start het spel()
methode in deSteen Papier Schaar
klasse. Deze methode is het spelen van het spel. Begin met een simpeleSystem.out.println
in de methode.openbaar leegte start het spel() Systeem.uit.println("STEEN PAPIER SCHAAR!");
-
10 Krijg verplaatsingen van de gebruiker en de computer. In de
start het spel()
methode, gebruik degetMove ()
methoden van deGebruiker
klasse en deComputer
klasse om de gebruiker en de bewegingen van de computer te krijgen.Verplaats userMove = gebruiker.getMove(); Verplaats computer Verplaats = computer.getMove(); Systeem.uit.println("\ nJe speelde " + userMove + "."); Systeem.uit.println("Computer gespeeld" + computerMove + ".\ n");
-
11 Vergelijk de twee zetten en bepaal of de gebruiker heeft gewonnen of de computer heeft gewonnen. Gebruik de
compareMoves ()
methode van deverhuizing
enum om te bepalen of de gebruiker heeft gewonnen of niet. Als de gebruiker heeft gewonnen, verhoogt u de gebruikersscore met 1. Als de gebruiker is verloren, verhoogt u de computerscore met 1. Als er een gelijkspel is, verhoogt u de scores niet. Verhoog vervolgens het aantal gespeelde spellen met één.int compareMoves = userMove.compareMoves(computerMove); schakelaar (compareMoves) geval 0: // Binden Systeem.uit.println("Binden!"); breken; geval 1: // Gebruiker wint Systeem.uit.println(userMove + "beats" + computerMove + ". Jij hebt gewonnen!"); userScore++; breken; geval -1: // Computer wint Systeem.uit.println(computerMove + "beats" + userMove + "Je bent verloren."); computerScore++; breken; aantal spellen++;
-
12 Vraag of de gebruiker opnieuw wil spelen. Als de gebruiker opnieuw wil spelen, bel je
start het spel()
nog een keer. Anders belt uprintGameStats ()
die de statistieken van het spel zal afdrukken. We zullen deze methode in de volgende stap schrijven.als (gebruiker.speel opnieuw()) Systeem.uit.println(); start het spel(); anders printGameStats();
-
13 Schrijf de
printGameStats ()
methode. Deze methode toont de statistieken van het spel: het aantal overwinningen, het aantal verliezen, het aantal stropdassen, het aantal gespeelde wedstrijden en het percentage spellen dat de gebruiker heeft gewonnen. Het percentage gewonnen spellen wordt berekend door (# wins + (# ties / 2)) / (# gespeelde spellen). Deze methode gebruiktSystem.out.printf
om opgemaakte tekst af te drukken.privaat leegte printGameStats() int wint = userScore; int verliezen = computerScore; int banden = aantal spellen - userScore - computerScore; dubbele percentageWon = (wint + ((dubbele) banden) / 2) / aantal spellen; // Lijn Systeem.uit.afdrukken("+"); printDashes(68); Systeem.uit.println("+"); // Titels afdrukken Systeem.uit.printf("|% 6s |% 6s |% 6s |% 12s |% 14s |\ n", "WINS", "VERLIEZEN", "TIES", "SPELLEN GESPEELD", "PERCENTAGE WON"); // Lijn Systeem.uit.afdrukken("|"); printDashes(10); Systeem.uit.afdrukken("+"); printDashes(10); Systeem.uit.afdrukken("+"); printDashes(10); Systeem.uit.afdrukken("+"); printDashes(16); Systeem.uit.afdrukken("+"); printDashes(18); Systeem.uit.println("|"); // Druk waarden af Systeem.uit.printf("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% |\ n", overwinningen, verliezen, banden, numberOfGames, percentageWon * 100); // Lijn Systeem.uit.afdrukken("+"); printDashes(68); Systeem.uit.println("+");
-
14 Start het spel in de hoofdklasse. In de hoofdklasse initialiseert u een exemplaar van de
Steen Papier Schaar
klasse en bel destart het spel()
methode.openbaar statisch leegte hoofd(Draad[] args) RockPaperScissors-spel = nieuwe Steen Papier Schaar(); spel.start het spel();
-
15 Test je spel. Nu we alle moeite hebben gedaan om het spel Rock, Paper, Scissors te schrijven, is het tijd om alles te compileren en te testen!
Facebook
Twitter
Google+