Rock, Paper, Scissors is een handspel dat door twee personen wordt gespeeld. Beide mensen zeiden "steen, papier, schaar" en vormden dan tegelijkertijd een van de drie objecten (steen, papier of schaar) met een uitgestrekte hand. De winnaar wordt bepaald door de handopstellingen. Schaar verslaat papier, papier verslaat steen en steen verslaat schaar. Als beide spelers dezelfde handopstelling spelen, wordt dit als gelijkspel beschouwd. We zullen een eenvoudig Java-spel schrijven om Steen, Papier, Schaar te simuleren, waarbij de ene speler de gebruiker is en de andere speler de computer.
Stappen
Stap 1. Maak de hoofdklasse en noem deze
Steen Papier Schaar
.
Dit is de klas waar we het spel gaan schrijven. Je kunt ervoor kiezen om het iets anders te noemen, zoals:
Spel
of
Hoofd
. Schrijf methodedeclaraties in voor de constructor en de hoofdmethode.
public class RockPaperScissors { public RockPaperScissors() {} public static void main(String args) {} }
Stap 2. Maak een opsomming voor de handgebaren (steen, papier of schaar)
We zouden strings kunnen gebruiken om steen, papier of schaar weer te geven, maar een opsomming stelt ons in staat om onze constanten vooraf te definiëren, wat betekent dat het gebruik van de opsomming een beter ontwerp is. We noemen ons enum-type
Beweging
met de waarden
STEEN
PAPIER
en
SCHAAR
privé-enum Verplaatsen { ROTS, PAPIER, SCHAAR }
Stap 3. Maak twee privélessen
Gebruiker
en
Computer
.
Deze klassen vertegenwoordigen onze spelers in het spel. U kunt ervoor kiezen om deze lessen openbaar te maken. De
Gebruiker
class zal de klasse zijn die de gebruiker vraagt om steen, papier of schaar, dus we zullen a. moeten schrijven
getMove()
methode. De
Computer
klasse moet ook een hebben
getMove()
methode zodat de computer ook een zet kan doen. We zullen tijdelijke aanduidingen in deze methoden plaatsen en ze later implementeren. De
Gebruiker
class vereist een constructor die de. instelt
Scanner
object om de gebruikersinvoer op te nemen. We zetten de
Scanner
als een privéveld voor de gebruiker en start het vervolgens in de constructor. Aangezien we de
Scanner
class, moeten we er een importstatement voor schrijven bovenaan onze code. De
Computer
class vereist geen constructor, dus we hoeven er geen te schrijven; wanneer we beginnen met de
Computer
object, zullen we alleen de standaardconstructor aanroepen. Dit is wat onze
Steen Papier Schaar
klasse ziet er nu als volgt uit:
java.util. Scanner importeren; openbare klasse RockPaperScissors {private enum Move {ROTS, PAPIER, SCHAAR} privéklasse Gebruiker {privé Scanner inputScanner; openbare gebruiker () { inputScanner = nieuwe scanner (System.in); } public Move getMove() { // TODO: Implementeer deze methode return null; } } private class Computer { public Move getMove () { // TODO: Implementeer deze methode return null; } } public RockPaperScissors() { } public static void main(String args) { } }
Stap 4. Schrijf de
getMove()
methode voor de
Computer
klas.
Deze methode retourneert een willekeurige
Beweging
. We kunnen een array krijgen van
Beweging
opsommingen door te bellen naar de
waarden()
methode:
Verplaats.waarden()
. Een willekeurig kiezen:
Beweging
opsomming in deze waardenreeks, moeten we een willekeurige index genereren die een geheel getal is tussen 0 en de lengte van onze waardenreeks. Om dit te doen, kunnen we de
volgendeInt()
methode van de
Willekeurig
klasse waaruit we moeten importeren
java.util
. Nadat we de willekeurige index hebben gekregen, kunnen we de. retourneren
Beweging
van die index uit onze waardenreeks.
public Move getMove() { Move moves = Move.values(); Willekeurig willekeurig = nieuw willekeurig(); int index = willekeurig.nextInt(bewegingen.lengte); zet zetten terug [index]; }
Stap 5. Schrijf de
getMove()
methode voor de
Gebruiker
klas.
Deze methode retourneert a
Beweging
overeenkomt met wat de gebruiker heeft ingevoerd. We verwachten dat de gebruiker "steen", "papier" of "schaar" schrijft. Eerst moeten we de gebruiker om invoer vragen:
System.out.print("Steen, papier of schaar?")
. Gebruik dan de
volgendeLijn()
methode van de
Scanner
object om de gebruikersinvoer als een tekenreeks te krijgen. We moeten nu controleren of de gebruiker een geldige zet heeft ingediend, maar we kunnen mild zijn als de gebruiker een woord verkeerd heeft gespeld. We zullen dus alleen controleren of de eerste letter van de gebruikersinvoer ofwel "R" (voor steen), "P" (voor papier) of "S" (voor schaar) is, en we zullen ons niet druk maken over de zaak omdat we zullen eerst de gebruiken
naarHoofdletter()
methode van de
Snaar
class om de gebruikersinvoerreeks in hoofdletters te maken. Als de gebruiker geen op afstand correcte invoer heeft ingevoerd, zullen we de gebruiker opnieuw vragen. Vervolgens zullen we, afhankelijk van wat de gebruiker heeft ingevoerd, een overeenkomstige zet retourneren.
public Move getMove() { // Vraag de gebruiker System.out.print ("Rots, papier of schaar?"); // Haal de gebruikersinvoer op String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Gebruiker heeft een geldige invoerschakelaar ingevoerd (firstLetter) { case 'R': return Move. ROCK; geval 'P': retour Move. PAPER; case 'S': return Move. SCHAAR; } } // Gebruiker heeft geen geldige invoer ingevoerd. Vraag opnieuw. retourneer getMove(); }
Stap 6. Schrijf een
speel opnieuw()
methode voor de
Gebruiker
klas.
De gebruiker moet het spel steeds opnieuw kunnen spelen. Om te bepalen of de gebruiker opnieuw wil spelen, moeten we a. schrijven
speel opnieuw()
methode die een boolean retourneert die het spel vertelt of de gebruiker heeft besloten om opnieuw te spelen of niet. In deze methode gebruiken we de
Scanner
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 meer wil spelen.
public boolean playAgain() { System.out.print("Wilt u nog een keer spelen?"); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; }
Stap 7. Sluit de. aan
Gebruiker
en
Computer
samen lessen in de
Steen Papier Schaar
klas.
Nu we klaar zijn met het schrijven van de
Gebruiker
en
Computer
klassen, kunnen we ons concentreren op het werken aan ons eigenlijke spel. Maak privévelden voor de
Gebruiker
en
Computer
lessen in de
Steen Papier Schaar
klas. We hebben toegang tot deze velden nodig om toegang te krijgen tot de
getMove()
methoden wanneer we het spel spelen. In de constructor voor de
Steen Papier Schaar
class, start deze velden. We zullen ook de score moeten bijhouden in
gebruikersscore
en
computerscore
velden, die we moeten initiëren als 0 in de constructor. We moeten ook het aantal games bijhouden, wat ook een veld zal zijn dat als 0 wordt geïnitieerd.
privé gebruiker gebruiker; privé Computercomputer; privé int userScore; privé int computerScore; privé int-nummerOfGames; public RockPaperScissors() { gebruiker = nieuwe gebruiker(); computer = nieuwe computer(); gebruikersscore = 0; computerscore = 0; numberOfGames = 0; }
Stap 8. Verleng de
Beweging
enum om een methode op te nemen die ons vertelt welke zet in elk geval wint.
We moeten een schrijven
vergelijkMoves()
methode die 0 retourneert als de zetten hetzelfde zijn, 1 als de huidige zet de andere zet verslaat, en -1 als de huidige zet verliest van de andere zet. Dit is handig om de winnaar in het spel te bepalen. Om deze methode te implementeren, zullen we eerst 0 retourneren als de zetten hetzelfde zijn en we daarom een gelijkspel hebben. Schrijf vervolgens een switch-statement voor het retourneren van 1 of -1.
privé-enum Verplaatsen { ROTS, PAPIER, SCHAAR; /** * Vergelijkt deze zet met een andere zet om een gelijkspel, een overwinning of * een verlies te bepalen. * * @param otherMove * zet om te vergelijken met * @return 1 als deze zet de andere zet verslaat, -1 als deze zet verliest van * de andere zet, 0 als deze zetten gelijk zijn */ public int CompareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == SCISSORS ? 1: -1); case PAPIER: return (otherMove == ROCK ? 1: -1); case SCISSORS: return (otherMove == PAPIER ? 1: -1); } // Zou hier nooit return 0 moeten bereiken; } }
Stap 9. Maak een
start het spel()
methode in de
Steen Papier Schaar
klas.
Deze methode zal het spelen van het spel zijn. Begin met het plaatsen van een eenvoudige
Systeem.uit.println
in de methode.
public void startGame() { System.out.println("ROTS, PAPIER, SCHAAR!"); }
Stap 10. Haal zetten van de gebruiker en de computer
In de
start het spel()
methode, gebruik de
getMove()
methoden uit de
Gebruiker
klasse en de
Computer
class om de zetten van de gebruiker en de computer te krijgen.
Verplaats userMove = gebruiker.getMove(); Verplaats computerMove = computer.getMove(); System.out.println("\nJe speelde " + userMove + "."); System.out.println("Computer gespeeld" + computerMove + ".\n");
Stap 11. Vergelijk de twee zetten en bepaal of de gebruiker heeft gewonnen of de computer heeft gewonnen
Gebruik de
vergelijkMoves()
methode van de
Beweging
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 heeft verloren, verhoogt u de computerscore met 1. Als er een gelijkspel was, verhoogt u geen van de scores. Verhoog vervolgens het aantal gespeelde games met één.
int CompareMoves = userMove.compareMoves(computerMove); switch (vergelijkMoves) { case 0: // Tie System.out.println ("Tie!"); pauze; geval 1: // Gebruiker wint System.out.println (userMove + " beats " + computerMove + ". Jij hebt gewonnen!"); gebruikersscore++; pauze; case -1: // Computer wint System.out.println (computerMove + " beats " + userMove + ". Je hebt verloren."); computerScore++; pauze; } aantalOfGames++;
Stap 12. Vraag of de gebruiker opnieuw wil spelen
Als de gebruiker opnieuw wil spelen, bel
start het spel()
opnieuw. Bel anders
printGameStats()
die de statistieken van het spel zal afdrukken. We zullen deze methode in de volgende stap schrijven.
if (user.playAgain()) { System.out.println(); start het spel(); } else { printGameStats(); }
Stap 13. Schrijf de
printGameStats()
methode.
Deze methode geeft de statistieken van het spel weer: aantal overwinningen, aantal verliezen, aantal gelijke spelen, aantal gespeelde games en percentage gewonnen games door de gebruiker. Het percentage gewonnen games wordt berekend door de (# overwinningen + (# gelijkspel/2))/(# gespeelde games). Deze methode gebruikt
Systeem.uit.printf
om opgemaakte tekst af te drukken.
private void printGameStats() {int wins = userScore; int verliezen = computerScore; int ties = numberOfGames - userScore - computerScore; dubbel percentageWon = (wint + ((dubbel) gelijkspel) / 2) / numberOfGames; // Lijnsysteem.uit.print("+"); printDashes(68); Systeem.uit.println("+"); // Print titels System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "WINS", "VERLIES", "TIES", "GAMES PLAYED", "PERCENTAGE WON"); // Line System.out.print("|"); printDashes(10); Systeem.uit.print("+"); printDashes(10); Systeem.uit.print("+"); printDashes(10); Systeem.uit.print("+"); printDashes(16); Systeem.uit.print("+"); printDashes(18); Systeem.uit.println("|"); // Waarden afdrukken System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", overwinningen, verliezen, gelijkspel, numberOfGames, percentageWon * 100); // Lijnsysteem.uit.print("+"); printDashes(68); Systeem.uit.println("+"); }
Stap 14. Start het spel in de hoofdklasse
Initialiseer in de hoofdklasse een instantie van de
Steen Papier Schaar
klas en bel de
start het spel()
methode.
public static void main(String args) { RockPaperScissors game = new RockPaperScissors(); spel.startGame(); }
Stap 15. Test je spel
Nu we alle moeite hebben gedaan om het spel Steen, papier, schaar te schrijven, is het tijd om alles te compileren en uit te testen!
Voorbeeldprogramma
import java.util. Random; java.util. Scanner importeren; openbare klasse RockPaperScissors { privégebruiker; privé Computercomputer; privé int userScore; privé int computerScore; privé int-nummerOfGames; privé-enum Verplaatsen { ROTS, PAPIER, SCHAAR; /** * Vergelijkt deze zet met een andere zet om een gelijkspel, een overwinning of * een verlies te bepalen. * * @param otherMove * zet om te vergelijken met * @return 1 als deze zet de andere zet verslaat, -1 als deze zet verliest van * de andere zet, 0 als deze zetten gelijk zijn */ public int CompareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == SCISSORS ? 1: -1); case PAPIER: return (otherMove == ROCK ? 1: -1); case SCISSORS: return (otherMove == PAPIER ? 1: -1); } // Zou hier nooit retour 0 moeten bereiken; } } privéklasse Gebruiker { privé Scanner inputScanner; openbare gebruiker () { inputScanner = nieuwe scanner (System.in); } public Move getMove() { // Vraag de gebruiker System.out.print("Rots, papier of schaar? "); // Haal de gebruikersinvoer op String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Gebruiker heeft een geldige invoerschakelaar ingevoerd (firstLetter) { case 'R': return Move. ROCK; geval 'P': retour Move. PAPER; case 'S': return Move. SCHAAR; } } // Gebruiker heeft geen geldige invoer ingevoerd. Nogmaals vragen. retourneer getMove(); } public boolean playAgain() { System.out.print("Wilt u nog een keer spelen?"); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; } } private class Computer { public Move getMove() { Move moves = Move.values(); Willekeurig willekeurig = nieuw willekeurig(); int index = willekeurig.nextInt(bewegingen.lengte); zet zetten terug [index]; } } public RockPaperScissors() { gebruiker = nieuwe gebruiker(); computer = nieuwe computer(); gebruikersscore = 0; computerscore = 0; numberOfGames = 0; } public void startGame() { System.out.println("ROTS, PAPIER, SCHAAR!"); // Krijg zetten Move userMove = user.getMove(); Verplaats computerMove = computer.getMove(); System.out.println("\nJe speelde " + userMove + "."); System.out.println("Computer gespeeld" + computerMove + ".\n"); // Vergelijk zetten en bepaal winnaar int CompareMoves = userMove.compareMoves(computerMove); switch (vergelijkMoves) { case 0: // Tie System.out.println ("Tie!"); pauze; geval 1: // Gebruiker wint System.out.println (userMove + " beats " + computerMove + ". Jij hebt gewonnen!"); gebruikersscore++; pauze; case -1: // Computer wint System.out.println (computerMove + " beats " + userMove + ". Je hebt verloren."); computerScore++; pauze; } aantalOfGames++; // Vraag de gebruiker om opnieuw te spelen if (user.playAgain()) { System.out.println(); start het spel(); } else { printGameStats(); } } /** * Drukt de statistieken van het spel af. Berekent gelijkspel als 1/2 winst in * percentage gewonnen. */ private void printGameStats() {int wins = userScore; int verliezen = computerScore; int ties = numberOfGames - userScore - computerScore; dubbel percentageWon = (wint + ((dubbel) gelijkspel) / 2) / numberOfGames; // Lijnsysteem.uit.print("+"); printDashes(68); Systeem.uit.println("+"); // Print titels System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "WINS", "VERLIES", "TIES", "GAMES PLAYED", "PERCENTAGE WON"); // Line System.out.print("|"); printDashes(10); Systeem.uit.print("+"); printDashes(10); Systeem.uit.print("+"); printDashes(10); Systeem.uit.print("+"); printDashes(16); Systeem.uit.print("+"); printDashes(18); Systeem.uit.println("|"); // Waarden afdrukken System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", overwinningen, verliezen, gelijkspel, numberOfGames, percentageWon * 100); // Lijnsysteem.uit.print("+"); printDashes(68); Systeem.uit.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(); spel.startGame(); } }