Rock, Paper, Scissors ist ein Handspiel, das von zwei Personen gespielt wird. Beide würden "Stein, Papier, Schere" sagen und dann gleichzeitig mit ausgestreckter Hand eines von drei Objekten (Stein, Papier oder Schere) formen. Der Gewinner wird durch die Handformationen ermittelt. Schere schlägt Papier, Papier schlägt Stein und Stein schlägt Schere. Wenn beide Spieler die gleiche Handformation spielen, gilt dies als Unentschieden. Wir werden ein einfaches Spiel in Java schreiben, um Stein, Papier und Schere zu simulieren, wobei ein Spieler der Benutzer und der andere der Computer ist.
Schritte
Schritt 1. Erstellen Sie die Hauptklasse und rufen Sie sie auf
Schere, Stein, Papier
.
Dies wird die Klasse sein, in der wir das Spiel schreiben werden. Sie können es anders benennen, wie z
Spiel
oder
Hauptsächlich
. Schreiben Sie Methodendeklarationen für den Konstruktor und die Hauptmethode ein.
public class RockPaperScissors { public RockPaperScissors() { } public static void main(String args) {} }
Schritt 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 ermöglicht es uns, unsere Konstanten vorzudefinieren, was bedeutet, dass die Verwendung der Aufzählung ein besseres Design ist. Wir nennen unseren Enum-Typ
Bewegung
mit den Werten
FELSEN
PAPIER
und
SCHERE
private enum Verschieben { FELSEN, PAPIER, SCHERE }
Schritt 3. Erstellen Sie zwei private Klassen
Benutzer
und
Rechner
.
Diese Klassen werden unsere Spieler im Spiel repräsentieren. Sie können diese Kurse öffentlich machen. Die
Benutzer
class ist die Klasse, die den Benutzer auffordert, entweder Stein, Papier oder Schere einzugeben, also müssen wir a. schreiben
getMove()
Methode. Die
Rechner
Klasse muss auch a. haben
getMove()
Methode, damit der Computer auch einen Zug machen kann. Wir werden Platzhalter in diese Methoden einfügen und sie später implementieren. Die
Benutzer
-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 initiieren es dann im Konstruktor. Da wir die
Scanner
-Klasse müssen wir eine Import-Anweisung dafür am Anfang unseres Codes schreiben. Die
Rechner
class benötigt keinen Konstruktor, also brauchen wir keinen zu schreiben; wenn wir das initiieren
Rechner
-Objekt rufen wir nur den Standardkonstruktor auf. Hier ist, was unsere
Schere, Stein, Papier
Klasse sieht jetzt so aus:
java.util. Scanner importieren; öffentliche Klasse RockPaperScissors { private Aufzählung Move { ROCK, PAPER, SCISSORS } private Klasse Benutzer { private Scanner inputScanner; public User () { inputScanner = neuer Scanner (System.in); } public Move getMove() { // TODO: Implementieren Sie diese Methode return null; } } private Klasse Computer { public Move getMove() { // TODO: Implementieren Sie diese Methode return null; } } public RockPaperScissors() { } public static void main(String args) { } }
Schritt 4. Schreiben Sie die
getMove()
Methode für die
Rechner
Klasse.
Diese Methode gibt ein zufälliges. zurück
Bewegung
. Wir können eine Reihe von
Bewegung
Aufzählungen durch Aufruf der
Werte()
Methode:
Move.values()
. Um eine zufällige zu wählen
Bewegung
Aufzählung in diesem Werte-Array müssen wir einen zufälligen Index generieren, der eine ganze Zahl zwischen 0 und der Länge unseres Werte-Arrays ist. Dazu können wir die
nextInt()
Methode der
Willkürlich
Klasse, aus der wir importieren müssen
java.util
. Nachdem wir den Zufallsindex erhalten haben, können wir den
Bewegung
dieses Index aus unserem Werte-Array.
public Move getMove() { Move bewegt = Move.values(); Zufällig zufällig = neu Zufällig (); int index = random.nextInt(moves.length); Rückkehr bewegt[index]; }
Schritt 5. Schreiben Sie die
getMove()
Methode für die
Benutzer
Klasse.
Diese Methode gibt a. zurück
Bewegung
entsprechend der Eingabe des Benutzers. Wir erwarten, dass der Benutzer entweder "Stein", "Papier" oder "Schere" schreibt. Zuerst müssen wir den Benutzer zu einer Eingabe auffordern:
System.out.print("Stein, Papier oder Schere?")
. Dann nutze die
nächste Zeile()
Methode der
Scanner
-Objekt, um die Benutzereingabe als Zeichenfolge abzurufen. Wir müssen jetzt ü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 prüfen also nur, ob der erste Buchstabe der Benutzereingabe entweder "R" (für Stein), "P" (für Papier) oder "S" (für Schere) ist, und kümmern uns nicht um die Groß-/Kleinschreibung, weil Wir werden zuerst die verwenden
toUpperCase()
Methode der
Zeichenfolge
-Klasse, um die Benutzereingabezeichenfolge in Großbuchstaben zu ändern. Wenn der Benutzer keine entfernt korrekte Eingabe gemacht hat, werden wir den Benutzer erneut auffordern. Dann geben wir, je nachdem, was der Benutzer eingegeben hat, einen entsprechenden Zug zurück.
public Move getMove() { // Den Benutzer auffordern System.out.print("Stein, Papier oder Schere? "); // Holen Sie sich die Benutzereingabe String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Benutzer hat einen gültigen Eingabeschalter eingegeben (firstLetter) { case 'R': return Move. ROCK; Fall 'P': Rückgabe Move. PAPER; Fall 'S': return Move. SCISSORS; } } // Der Benutzer hat keine gültige Eingabe eingegeben. Aufforderung erneut. getMove() zurückgeben; }
Schritt 6. Schreiben Sie a
nochmal abspielen()
Methode für die
Benutzer
Klasse.
Der Benutzer soll das Spiel immer wieder spielen können. Um festzustellen, ob der Benutzer erneut spielen möchte, müssen wir a. schreiben
nochmal abspielen()
-Methode, die einen booleschen Wert zurückgibt, der dem Spiel mitteilt, ob der Benutzer entschieden hat, erneut zu spielen oder nicht. Bei dieser Methode verwenden wir die
Scanner
die wir zuvor im Konstruktor initiiert hatten, um vom Benutzer ein "Ja" oder ein "Nein" zu erhalten. Wir prüfen nur, ob der erste Buchstabe 'Y' ist, um festzustellen, ob der Benutzer erneut spielen möchte. Jede andere Eingabe bedeutet, dass der Benutzer nicht mehr spielen möchte.
public boolean playAgain() { System.out.print("Möchten Sie wieder spielen? "); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; }
Schritt 7. Verbinden Sie die
Benutzer
und
Rechner
Klassen zusammen in der
Schere, Stein, Papier
Klasse.
Nun, da wir mit dem Schreiben fertig sind
Benutzer
und
Rechner
Klassen können wir uns auf die Arbeit an unserem eigentlichen Spiel konzentrieren. Erstellen Sie private Felder für die
Benutzer
und
Rechner
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, initiieren Sie diese Felder. Wir müssen auch die Punktzahl in
userScore
und
computerScore
Felder, die wir im Konstruktor als 0 initiieren müssen. Wir müssen auch die Anzahl der Spiele im Auge behalten, die ebenfalls ein Feld sein wird, das als 0 gestartet wird.
privater Benutzerbenutzer; private Computer-Computer; private int userScore; private int computerScore; private int numberOfGames; public RockPaperScissors() { user = new user(); computer = neuer Computer(); Benutzerbewertung = 0; Computerbewertung = 0; numberOfGames = 0; }
Schritt 8. Erweitern Sie die
Bewegung
enum, um eine Methode einzuschließen, die uns sagt, welcher Zug in jedem Fall gewinnt.
Wir müssen a. schreiben
vergleichenMoves()
Methode, die 0 zurückgibt, wenn die Züge gleich sind, 1, wenn der aktuelle Zug den anderen Zug schlägt, und -1, wenn der aktuelle Zug gegen den anderen Zug verliert. Dies ist nützlich, 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 wir daher ein Unentschieden haben. Schreiben Sie dann eine switch-Anweisung, um 1 oder -1 zurückzugeben.
private Aufzählung Move { FELSEN, PAPIER, SCHERE; /** * Vergleicht diesen Zug mit einem anderen Zug, um ein Unentschieden, einen Gewinn oder * eine Niederlage zu bestimmen. * * @param otherMove * Zug 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 */ public int CompareMoves(Move otherMove) { / / Tie if (dies == otherMove) return 0; switch (this) { case ROCK: return (otherMove == SCISSORS ? 1: -1); case PAPER: return (otherMove == ROCK ? 1: -1); case SCISSORS: return (otherMove == PAPER ? 1: -1); } // Sollte niemals hierher kommen return 0; } }
Schritt 9. Erstellen Sie eine
Spiel starten()
Methode in der
Schere, Stein, Papier
Klasse.
Diese Methode wird das Spielen des Spiels sein. Beginnen Sie mit einem einfachen
System.out.println
bei der Methode.
public void startGame() { System.out.println("FELSEN, PAPIER, SCHERE!"); }
Schritt 10. Holen Sie sich Bewegungen vom Benutzer und vom Computer
In dem
Spiel starten()
Methode, verwenden Sie die
getMove()
Methoden aus der
Benutzer
Klasse und die
Rechner
Klasse, um die Bewegungen des Benutzers und des Computers zu erhalten.
Verschieben userMove = user.getMove(); ComputerMove verschieben = computer.getMove(); System.out.println("\nDu hast gespielt " + userMove + "."); System.out.println("Computer abgespielt" + computerMove + ".\n");
Schritt 11. Vergleichen Sie die beiden Züge und bestimmen Sie, ob der Benutzer oder der Computer gewonnen hat
Verwenden Sie die
vergleichenMoves()
Methode aus 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 ein Unentschieden gab, erhöhen Sie keine der Punkte. Erhöhen Sie dann die Anzahl der gespielten Spiele um eins.
int CompareMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Tie System.out.println("Tie!"); brechen; Fall 1: // Benutzer gewinnt System.out.println(userMove + "beats" + computerMove + ". Du hast gewonnen!"); userScore++; brechen; case -1: // Computer gewinnt System.out.println(computerMove + " schlägt " + userMove + ". Du hast verloren."); computerScore++; brechen; } numberOfGames++;
Schritt 12. Fragen Sie, ob der Benutzer erneut spielen möchte
Wenn der Benutzer wieder spielen möchte, rufen Sie an
Spiel starten()
wieder. Ansonsten ruf an
printGameStats()
die die Statistik des Spiels ausdruckt. Wir werden diese Methode im nächsten Schritt schreiben.
if (user.playAgain()) { System.out.println(); Spiel starten(); aufrechtzuerhalten. sonst { printGameStats(); }
Schritt 13. Schreiben Sie die
printGameStats()
Methode.
Diese Methode zeigt die Statistik des Spiels an: Anzahl der Siege, Anzahl der Verluste, Anzahl der Unentschieden, Anzahl der gespielten Spiele und Prozentsatz der vom Benutzer gewonnenen Spiele. Der Prozentsatz der gewonnenen Spiele wird durch (# Siege + (# Unentschieden/2))/(# gespielte Spiele) berechnet. Diese Methode verwendet
System.out.printf
um formatierten Text auszudrucken.
privat void printGameStats() { int wins = userScore; int-Verluste = ComputerScore; int ties = numberOfGames - userScore - computerScore; doppelter ProzentsatzWon = (Siege + ((Doppel-) Unentschieden) / 2) / numberOfGames; // Zeile System.out.print("+"); printGestriche(68); System.out.println("+"); // Titel drucken System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "WINS", "LOSSES", "TIES", "GAMES PLAYED", "PERCENTAGE GEWONNEN"); // Zeile System.out.print("|"); printGestriche(10); System.out.print("+"); printGestriche(10); System.out.print("+"); printGestriche(10); System.out.print("+"); printGestriche(16); System.out.print("+"); printGestriche(18); System.out.println("|"); // Werte ausgeben System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", Siege, Niederlagen, Unentschieden, numberOfGames, ProzentsatzWon * 100); // Zeile System.out.print("+"); printGestriche(68); System.out.println("+"); }
Schritt 14. Starten Sie das Spiel in der Hauptklasse
Initialisieren Sie in der Hauptklasse eine Instanz des
Schere, Stein, Papier
Klasse und ruf an
Spiel starten()
Methode.
public static void main(String args) { RockPaperScissors game = new RockPaperScissors(); game.startGame(); }
Schritt 15. Testen Sie Ihr Spiel
Nachdem wir uns nun alle Mühe gegeben haben, das Spiel „Stein, Papier, Schere“zu schreiben, ist es an der Zeit, alles zu kompilieren und auszuprobieren!
Beispielprogramm
java.util. Random importieren; java.util. Scanner importieren; öffentliche Klasse RockPaperScissors { privater Benutzer Benutzer; private Computer-Computer; private int userScore; private int computerScore; private int numberOfGames; private Aufzählung Move { FELSEN, PAPIER, SCHERE; /** * Vergleicht diesen Zug mit einem anderen Zug, um ein Unentschieden, einen Gewinn oder * eine Niederlage zu bestimmen. * * @param otherMove * Zug 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 */ public int CompareMoves(Move otherMove) { / / Tie if (dies == otherMove) return 0; switch (this) { case ROCK: return (otherMove == SCISSORS ? 1: -1); case PAPER: return (otherMove == ROCK ? 1: -1); case SCISSORS: return (otherMove == PAPER ? 1: -1); } // Sollte niemals hierher kommen return 0; } } private Klasse Benutzer { privater Scanner inputScanner; public User () { inputScanner = neuer Scanner (System.in); } public Move getMove() { // Den Benutzer auffordern System.out.print("Stein, Papier oder Schere? "); // Holen Sie sich die Benutzereingabe String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Benutzer hat einen gültigen Eingabeschalter eingegeben (firstLetter) { case 'R': return Move. ROCK; Fall 'P': Rückgabe Move. PAPER; Fall 'S': return Move. SCISSORS; } } // Der Benutzer hat keine gültige Eingabe eingegeben. Aufforderung erneut. getMove() zurückgeben; } public boolean playAgain() { System.out.print("Möchten Sie noch einmal spielen? "); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; } } private Klasse Computer { public Move getMove() { Move bewegt = Move.values(); Zufällig zufällig = neu Zufällig (); int index = random.nextInt(moves.length); Rückkehr bewegt[index]; } } public RockPaperScissors() { user = new User(); computer = neuer Computer(); Benutzerbewertung = 0; Computerbewertung = 0; numberOfGames = 0; } public void startGame() { System.out.println("FELSEN, PAPIER, SCHERE!"); // Moves abrufen Move userMove = user.getMove(); ComputerMove verschieben = computer.getMove(); System.out.println("\nDu hast gespielt " + userMove + "."); System.out.println("Computer abgespielt" + computerMove + ".\n"); // Züge vergleichen und Gewinner ermitteln int CompareMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Tie System.out.println("Tie!"); brechen; Fall 1: // Benutzer gewinnt System.out.println(userMove + "beats" + computerMove + ". Du hast gewonnen!"); userScore++; brechen; case -1: // Computer gewinnt System.out.println(computerMove + " schlägt " + userMove + ". Du hast verloren."); computerScore++; brechen; } numberOfGames++; // Bitten Sie den Benutzer, erneut zu spielen if (user.playAgain()) { System.out.println(); Spiel starten(); aufrechtzuerhalten. sonst { printGameStats(); } } /** * Gibt die Statistik des Spiels aus. Berechnet Unentschieden als 1/2 Gewinn in * gewonnenem Prozentsatz. */ private void printGameStats() { int wins = userScore; int-Verluste = ComputerScore; int ties = numberOfGames - userScore - computerScore; doppelter ProzentsatzWon = (Siege + ((Doppel-) Unentschieden) / 2) / numberOfGames; // Zeile System.out.print("+"); printGestriche(68); System.out.println("+"); // Titel drucken System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "WINS", "LOSSES", "TIES", "GAMES PLAYED", "PERCENTAGE GEWONNEN"); // Zeile System.out.print("|"); printGestriche(10); System.out.print("+"); printGestriche(10); System.out.print("+"); printGestriche(10); System.out.print("+"); printGestriche(16); System.out.print("+"); printGestriche(18); System.out.println("|"); // Werte ausgeben System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", Siege, Niederlagen, Unentschieden, numberOfGames, ProzentsatzWon * 100); // Zeile System.out.print("+"); printGestriche(68); System.out.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(); game.startGame(); } }