Rock, Paper, Scissors ist ein Handspiel, das von zwei Personen gespielt wird. Beide Menschen würden sagen "Stein, Papier, Schere" und dann gleichzeitig mit einer ausgestreckten Hand eines von drei Objekten (Stein, Papier oder Schere) bilden. Der Gewinner wird durch die Handformationen bestimmt. Schere schlägt Papier, Papier schlägt Rock und Rock schlägt Schere. Wenn beide Spieler die gleiche Handformation spielen, gilt dies als unentschieden. Wir werden ein einfaches Spiel in Java schreiben, um Rock, Paper, Scissors zu simulieren, wobei ein Spieler der Benutzer und der andere der Computer ist.

Schritte

  1. 1 Erstelle die Hauptklasse und rufe sie an Schere, Stein, Papier. Dies wird die Klasse sein, in der wir das Spiel schreiben werden. Sie können wählen, etwas anderes wie zu nennen Spiel oder Main. Schreiben Sie in Methodendeklarationen für den Konstruktor und die Hauptmethode.
     Öffentlichkeit Klasse Schere, Stein, Papier  Öffentlichkeit Schere, Stein, Papier()   Öffentlichkeit statisch Leere Main(Zeichenfolge[] Argumente)    
  2. 2 Erstellen Sie eine Aufzählung für die Handgesten (Stein, Papier oder Schere). Wir könnten Strings verwenden, um Stein, Papier oder Schere darzustellen, aber eine Aufzählung erlaubt uns, unsere Konstanten vorzugeben, was bedeutet, dass die Verwendung der Aufzählung ein besseres Design ist. Wir werden unseren Enum-Typ nennen Bewegung mit den Werten ROCK, PAPIER, und SCHERE.
     Privatgelände enum Bewegung  SCHERE, STEIN, PAPIER  
  3. 3 Erstellen Sie zwei private Klassen Benutzer und Computer. Diese Klassen repräsentieren unsere Spieler im Spiel. Sie können diese Klassen veröffentlichen. Das Benutzer Die Klasse wird die Klasse sein, die den Benutzer entweder zu Stein, Papier oder Schere auffordert, also müssen wir eine schreiben getMove () Methode. Das Computer Klasse muss auch eine haben getMove () Methode, damit der Computer auch einen Zug ausführen kann. Wir werden Platzhalter in diese Methoden einfügen und sie später implementieren. Das Benutzer Die Klasse benötigt einen Konstruktor, der die Scanner Objekt, um die Benutzereingabe aufzunehmen. Wir werden die Scanner als privates Feld für den Benutzer und dann im Konstruktor initiieren. Da wir das verwenden Scanner Klasse, wir müssen eine Importanweisung dafür oben in unserem Code schreiben. Das Computer Für die Klasse ist kein Konstruktor erforderlich. Daher müssen wir keinen Konstruktor erstellen. wenn wir das initiieren Computer Objekt, wir werden nur den Standardkonstruktor aufrufen. Hier ist was unser Schere, Stein, Papier Klasse sieht jetzt so aus:
     einführen java.util.Scanner; Öffentlichkeit Klasse Schere, Stein, Papier  Privatgelände enum Bewegung  SCHERE, STEIN, PAPIER  Privatgelände Klasse Benutzer  Privatgelände Scanner-EingabeScanner; Öffentlichkeit Benutzer()  EingabeScanner = Neu Scanner(System.im);  Öffentlichkeit Bewege getMove()  // TODO: Implementiere diese Methode Rückkehr Null;   Privatgelände Klasse Computer  Öffentlichkeit Bewege getMove()  // TODO: Implementiere diese Methode Rückkehr Null;   Öffentlichkeit Schere, Stein, Papier()   Öffentlichkeit statisch Leere Main(Zeichenfolge[] Argumente)    
  4. 4 Schreiben Sie die getMove () Methode für die Computer Klasse. Diese Methode wird eine zufällige zurückgegeben Bewegung. Wir können eine Reihe von bekommen Bewegung Aufzählungen durch Aufruf der Werte() Methode: Move.values ​​(). Um einen Zufall zu wählen Bewegung Aufzählung in diesem Werte-Array müssen wir einen zufälligen Index erzeugen, der eine Ganzzahl zwischen 0 und der Länge unseres Werte-Arrays ist. Um dies zu tun, können wir das verwenden nextInt () Methode der Zufällig Klasse, aus der wir importieren müssen java.util. Nachdem wir den Zufallsindex erhalten haben, können wir den Bewegung dieses Index von unserem Werte-Array.
     Öffentlichkeit Bewege getMove()  Bewegung[] bewegt sich = Bewegung.Werte(); Zufällig zufällig = Neu Zufällig(); int Index = zufällig.nextInt(bewegt sich.Länge); Rückkehr bewegt sich[Index];  
  5. 5 Schreiben Sie die getMove () Methode für die Benutzer Klasse. Diese Methode gibt a zurück Bewegung entsprechend was der Benutzer eingegeben hat. Wir werden erwarten, dass der Benutzer entweder "Rock", "Papier" oder "Schere" schreibt. Zuerst müssen wir den Benutzer zur Eingabe auffordern: System.out.print ("Stein, Papier oder Schere?"). Dann benutze die nächste Zeile() Methode der Scanner Objekt, um die Benutzereingabe als Zeichenfolge zu erhalten. Wir müssen nun überprüfen, ob der Benutzer einen gültigen Zug eingereicht hat, aber wir können nachsichtig sein, wenn der Benutzer ein Wort falsch geschrieben hat. Wir werden also nur prüfen, ob der erste Buchstabe der Benutzereingabe entweder "R" (für Rock), "P" (für Papier) oder "S" (für Schere) ist, und wir kümmern uns nicht um den Fall, weil Wir werden zuerst die toUpperCase () Methode der Zeichenfolge Klasse, um die Benutzereingabestring in Großbuchstaben zu schreiben. Wenn der Benutzer keine remote korrekte Eingabe eingegeben hat, werden wir den Benutzer erneut auffordern. Dann werden wir, je nachdem, was der Benutzer eingegeben hat, einen entsprechenden Zug zurückgeben.
     Öffentlichkeit Bewege getMove()  // Fordern Sie den Benutzer auf System.aus.drucken("Rock, Papier oder Schere?"); // Erhalte die Benutzereingabe Zeichenfolge Benutzereingabe = EingabeScanner.nächste Zeile(); Benutzereingabe = Benutzereingabe.toUpperCase(); verkohlen erster Brief = Benutzereingabe.charAt(0); ob (erster Brief == "R" || erster Brief == 'P' || erster Brief == "S")  // Benutzer hat eine gültige Eingabe eingegeben Schalter (erster Brief)  Fall "R": Rückkehr Bewegung.ROCK; Fall 'P': Rückkehr Bewegung.PAPIER; Fall "S": Rückkehr Bewegung.SCHERE;   // Benutzer hat keine gültige Eingabe eingegeben. Aufforderung erneut. Rückkehr getMove();  
  6. 6 Schreib ein Spiel nochmal() Methode für die Benutzer Klasse. Der Benutzer sollte das Spiel immer und immer wieder spielen können. Um zu bestimmen, ob der Benutzer erneut spielen möchte, müssen wir einen schreiben Spiel nochmal() Methode, die einen booleschen Wert zurückgibt, der dem Spiel mitteilt, ob der Benutzer bestimmt hat, ob er erneut spielen möchte oder nicht. Bei dieser Methode verwenden wir die Scanner die wir zuvor im Konstruktor initiiert hatten, um ein "Ja" oder ein "Nein" vom Benutzer zu erhalten. Wir werden nur prüfen, ob der erste Buchstabe "Y" ist, um zu bestimmen, ob der Benutzer erneut spielen möchte. Jede andere Eingabe bedeutet, dass der Benutzer nicht erneut spielen möchte.
     Öffentlichkeit boolesch Spiel nochmal()  System.aus.drucken("Willst du wieder spielen?"); Zeichenfolge Benutzereingabe = EingabeScanner.nächste Zeile(); Benutzereingabe = Benutzereingabe.toUpperCase(); Rückkehr Benutzereingabe.charAt(0) == 'Y';  
  7. 7 Verbinde die Benutzer und Computer Klassen zusammen in der Schere, Stein, Papier Klasse. Jetzt, wo wir mit dem Schreiben fertig sind Benutzer und Computer Klassen können wir uns darauf konzentrieren, an unserem eigentlichen Spiel zu arbeiten. Erstellen Sie private Felder für die Benutzer und Computer Klassen in der Schere, Stein, Papier Klasse. Wir müssen auf diese Felder zugreifen, um auf die getMove () Methoden, wenn wir das Spiel spielen. Im Konstruktor für die Schere, Stein, Papier Klasse, initiiere diese Felder. Wir müssen auch den Punktestand im Auge behalten BenutzerScore und ComputerScore Felder, die wir im Konstruktor als 0 initiieren müssen. Wir müssen auch die Anzahl der Spiele im Auge behalten, was auch ein Feld ist, das als 0 initialisiert wird.
     Privatgelände Benutzer Benutzer; Privatgelände Computercomputer; Privatgelände int BenutzerScore; Privatgelände int ComputerScore; Privatgelände int Anzahl von Spielen; Öffentlichkeit Schere, Stein, Papier()  Benutzer = Neu Benutzer(); Computer = Neu Computer(); BenutzerScore = 0; ComputerScore = 0; Anzahl von Spielen = 0;  
  8. 8 Erweitere Bewegung enum, um eine Methode einzufügen, die uns sagt, welche Bewegung in jedem Fall gewinnt. Wir müssen ein schreiben vergleicheMoves () Methode, die 0 zurückgibt, wenn die Züge gleich sind, 1, wenn die aktuelle Bewegung die andere bewegt, und -1, wenn die aktuelle Bewegung die andere Bewegung verliert. Dies wird nützlich sein, um den Gewinner im Spiel zu bestimmen. Um diese Methode zu implementieren, geben wir zuerst 0 zurück, wenn die Züge gleich sind und daher haben wir ein Unentschieden. Dann schreibe eine switch-Anweisung für die Rückgabe von 1 oder -1.
     Privatgelände enum Bewegung  SCHERE, STEIN, PAPIER; / ** * Vergleicht diesen Zug mit einem anderen Zug, um einen Gleichstand, einen Sieg oder einen Verlust zu bestimmen. * * @param othersMove * bewegt sich zum Vergleich mit * @return 1, wenn dieser Zug den anderen Zug schlägt, -1 wenn dieser Zug gegen * den anderen Zug verliert, 0 wenn diese Züge gleich sind * / Öffentlichkeit int vergleicheMoves(Verschieben Sie anderenMove)  // Krawatte ob (Dies == SonstigesMove) Rückkehr 0; Schalter (Dies)  Fall ROCK: Rückkehr (SonstigesMove == SCHERE ? 1 : -1); Fall PAPIER: Rückkehr (SonstigesMove == ROCK ? 1 : -1); Fall SCHERE: Rückkehr (SonstigesMove == PAPIER ? 1 : -1);  // Sollte niemals hier ankommen Rückkehr 0;   
  9. 9 Ein ... kreieren Spiel beginnen() Methode in der Schere, Stein, Papier Klasse. Diese Methode wird das Spiel des Spiels sein. Beginnen Sie mit einem einfachen System.out.println in der Methode.
     Öffentlichkeit Leere Spiel beginnen()  System.aus.drucken("SCHERE, STEIN, PAPIER!");  
  10. 10 Bekommen Sie Bewegungen vom Benutzer und vom Computer. In dem Spiel beginnen() Methode, benutze die getMove () Methoden aus der Benutzer Klasse und die Computer Klasse, um den Benutzer und die Bewegungen des Computers zu erhalten.
     Verschieben Sie userMove = Benutzer.getMove(); Bewegen Sie computerMove = Computer.getMove(); System.aus.drucken("\ nDu spieltest " + BenutzerMove + "."); System.aus.drucken("Computer gespielt" + ComputerMove + ".\ n"); 
  11. 11 Vergleichen Sie die beiden Züge und ermitteln Sie, ob der Benutzer gewonnen oder der Computer gewonnen hat. Benutze die vergleicheMoves () Methode von der Bewegung enum um festzustellen, ob der Benutzer gewonnen hat oder nicht. Wenn der Benutzer gewonnen hat, erhöhen Sie die Benutzerpunktzahl um 1. Wenn der Benutzer verloren hat, erhöhen Sie die Computerpunktzahl um 1. Wenn es einen Gleichstand gab, erhöhen Sie keine Punktzahlen. Erhöhen Sie dann die Anzahl der gespielten Spiele um eins.
     int vergleicheMoves = BenutzerMove.vergleicheMoves(ComputerMove); Schalter (vergleicheMoves)  Fall 0: // Krawatte System.aus.drucken("Krawatte!"); Unterbrechung; Fall 1: // Benutzer gewinnt System.aus.drucken(BenutzerMove + "schlägt" + ComputerMove + ". Du hast gewonnen!"); BenutzerScore++; Unterbrechung; Fall -1: // Computer gewinnt System.aus.drucken(ComputerMove + "schlägt" + BenutzerMove + ". Du hast verloren."); ComputerScore++; Unterbrechung;  Anzahl von Spielen++; 
  12. 12 Fragen Sie, ob der Benutzer erneut spielen möchte. Wenn der Benutzer erneut spielen möchte, rufen Sie an Spiel beginnen() nochmal. Ansonsten, ruf an printGameStats () welches die Statistik des Spiels ausdruckt. Wir werden diese Methode im nächsten Schritt schreiben.
     ob (Benutzer.Spiel nochmal())  System.aus.drucken(); Spiel beginnen();  sonst  printGameStats();  
  13. 13 Schreiben Sie die printGameStats () Methode. Diese Methode zeigt die Statistiken des Spiels an: Anzahl der Gewinne, Anzahl der Verluste, Anzahl der Gleichstände, Anzahl der gespielten Spiele und Prozentsatz der Spiele, die der Benutzer gewonnen hat. Der Prozentsatz der gewonnenen Spiele wird berechnet durch (# wins + (# ties / 2)) / (# gespielte Spiele). Diese Methode verwendet System.out.printf um formatierten Text auszudrucken.
     Privatgelände Leere printGameStats()  int Gewinnt = BenutzerScore; int Verluste = ComputerScore; int Bindungen = Anzahl von Spielen - BenutzerScore - ComputerScore; doppelt Prozentwert = (Gewinnt + ((doppelt) Bindungen) / 2) / Anzahl von Spielen; // Linie System.aus.drucken("+"); printDashes(68); System.aus.drucken("+"); // Titel drucken System.aus.drucken("|% 6s |% 6s |% 6s |% 12s |% 14s |\ n", "GEWINNT", "VERLUSTE", "KRAWATTEN", "SPIELE GESPIELT", "PERCENTAGE GEWONNEN"); // Linie System.aus.drucken("|"); printDashes(10); System.aus.drucken("+"); printDashes(10); System.aus.drucken("+"); printDashes(10); System.aus.drucken("+"); printDashes(16); System.aus.drucken("+"); printDashes(18); System.aus.drucken("|"); // Drucke Werte System.aus.drucken("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% |\ n", gewinnt, Verluste, Bindungen, numberOfGames, prozentualWon * 100); // Linie System.aus.drucken("+"); printDashes(68); System.aus.drucken("+");  
  14. 14 Starte das Spiel in der Hauptklasse. Initialisieren Sie in der Hauptklasse eine Instanz von Schere, Stein, Papier Klasse und rufe die Spiel beginnen() Methode.
     Öffentlichkeit statisch Leere Main(Zeichenfolge[] Argumente)  RockPaperScheren Spiel = Neu Schere, Stein, Papier(); Spiel.Spiel beginnen();  
  15. 15 Testen Sie Ihr Spiel. Jetzt, da wir alle Anstrengungen unternommen haben, das Spiel "Rock, Paper, Scissors" zu schreiben, ist es an der Zeit, alles zu kompilieren und zu testen!