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. 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, zoals Spel of Hoofd. 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. 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 waarden ROTS, PAPIER, en SCHAAR.
     privaat enum verhuizing  STEEN PAPIER SCHAAR  
  3. 3 Maak twee privélessen Gebruiker en Computer. Deze klassen vertegenwoordigen onze spelers in het spel. Je kunt ervoor kiezen om deze klassen openbaar te maken. De Gebruiker klasse is de klasse die de gebruiker vraagt ​​om een ​​steen, papier of schaar, dus we moeten een schrijven getMove () methode. De Computer klas zal ook een getMove () methode zodat de computer ook een zet kan doen. We plaatsen tijdelijke aanduidingen in deze methoden en implementeren deze later. De Gebruiker klasse vereist een constructor die de Scanner object om de gebruikersinvoer op te nemen. We zullen de Scanner als een privéveld voor de gebruiker en start het vervolgens in de constructor. Omdat we de gebruiken Scanner klasse, we moeten er een importinstructie voor schrijven bovenaan onze code. De Computer klasse vereist geen constructor, dus we hoeven er geen te schrijven; wanneer we de Computer object, dan bellen we gewoon de standaardconstructor. Dit is wat onze Steen 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. 4 Schrijf de getMove () methode voor de Computer klasse. Deze methode retourneert een willekeurige verhuizing. We kunnen een reeks krijgen verhuizing opsommingen door het waarden () methode: Move.values ​​(). Om een ​​willekeurige te kiezen verhuizing 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 de nextInt () methode van de Willekeurig klasse die we moeten importeren java.util. Nadat we de willekeurige index hebben gekregen, kunnen we de verhuizing 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. 5 Schrijf de getMove () methode voor de Gebruiker klasse. Deze methode retourneert a verhuizing 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 de nextLine () 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 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 de toUpperCase () methode van de Draad 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. 6 Schrijf een speel opnieuw() methode voor de Gebruiker klasse. De gebruiker moet het spel steeds opnieuw kunnen spelen. Om te bepalen of de gebruiker opnieuw wil spelen, moeten we een speel 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 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 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. 7 Verbind de Gebruiker en Computer klassen samen in de Steen Papier Schaar klasse. Nu we klaar zijn met het schrijven van de Gebruiker en Computer klassen, kunnen we ons concentreren op het werken aan onze eigenlijke game. Maak privévelden voor de Gebruiker en Computer klassen in de Steen Papier Schaar klasse. We hebben toegang nodig tot deze velden om toegang te krijgen tot de getMove () methoden wanneer we het spel spelen. In de constructor voor de Steen Papier Schaar klasse, start deze velden. We zullen ook de score in moeten bijhouden userScore en computerScore 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. 8 Verleng de verhuizing enum om een ​​methode op te nemen die ons vertelt welke zet wint in elk geval. We moeten een schrijven compareMoves () 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. 9 Maak een start het spel() methode in de Steen Papier Schaar klasse. Deze methode is het spelen van het spel. Begin met een simpele System.out.println in de methode.
     openbaar leegte start het spel()  Systeem.uit.println("STEEN PAPIER SCHAAR!");  
  10. 10 Krijg verplaatsingen van de gebruiker en de computer. In de start het spel() methode, gebruik de getMove () methoden van de Gebruiker klasse en de Computer 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. 11 Vergelijk de twee zetten en bepaal of de gebruiker heeft gewonnen of de computer heeft gewonnen. Gebruik de compareMoves () methode van de verhuizing 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. 12 Vraag of de gebruiker opnieuw wil spelen. Als de gebruiker opnieuw wil spelen, bel je start het spel() nog een keer. Anders belt u printGameStats () 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. 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 gebruikt System.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. 14 Start het spel in de hoofdklasse. In de hoofdklasse initialiseert u een exemplaar van de Steen Papier Schaar klasse en bel de start het spel() methode.
     openbaar statisch leegte hoofd(Draad[] args)  RockPaperScissors-spel = nieuwe Steen Papier Schaar(); spel.start het spel();  
  15. 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!