Rock, Paper, Scissors är ett handspel som spelas av två personer. Båda människorna skulle säga "sten, papper, sax" och sedan samtidigt bilda ett av tre föremål (sten, papper eller sax) med en utsträckt hand. Vinnaren bestäms av handformationerna. Sax slår papper, papper slår sten och sten slår sax. Om båda spelarna spelar samma handformation anses det vara oavgjort. Vi kommer att skriva ett enkelt spel i Java för att simulera rock, papper, sax där en spelare är användaren och den andra spelaren är datorn.
Steg
Steg 1. Skapa huvudklassen och kalla den
Sten sax påse
.
Det här är klassen där vi kommer att skriva spelet. Du kan välja att namnge det något annat som t.ex.
Spel
eller
Main
. Skriv in metoddeklarationer för konstruktorn och huvudmetoden.
public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Steg 2. Skapa en uppräkning för handgesterna (sten, papper eller sax)
Vi kan använda strängar för att representera sten, papper eller sax, men en uppräkning gör att vi kan fördefiniera våra konstanter vilket innebär att användningen av uppräkningen är en bättre design. Vi kommer att kalla vår enumtyp
Flytta
med värdena
STEN
PAPPER
och
SAX
private enum Flytta {ROCK, PAPER, SCISSORS}
Steg 3. Skapa två privata klasser
Användare
och
Dator
.
Dessa klasser kommer att representera våra spelare i spelet. Du kan välja att göra dessa klasser offentliga. De
Användare
class kommer att vara klassen som uppmanar användaren att antingen använda sten, papper eller sax, så vi måste skriva en
getMove ()
metod. De
Dator
klassen måste också ha en
getMove ()
metod så att datorn också kan göra ett drag. Vi kommer att sätta platshållare i dessa metoder och implementera dem senare. De
Användare
klass kommer att kräva en konstruktör som konfigurerar
Scanner
objekt att ta in användarinmatningen. Vi kommer att sätta
Scanner
som ett privat fält för användaren och sedan initiera det i konstruktorn. Eftersom vi använder
Scanner
klass, måste vi skriva ett importuttalande för det högst upp i vår kod. De
Dator
klass kräver inte en konstruktör, så vi behöver inte skriva en; när vi startar
Dator
objekt, kommer vi bara att kalla standardkonstruktorn. Här är vad vår
Sten sax påse
klassen ser ut nu:
importera java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; public User () {inputScanner = ny Scanner (System.in); } public Move getMove () {// TODO: Implementera denna metod return null; }} privatklassdator {public Move getMove () {// TODO: Implement this method return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Steg 4. Skriv
getMove ()
metod för
Dator
klass.
Denna metod returnerar en slumpmässig
Flytta
. Vi kan få en mängd
Flytta
uppräkningar genom att ringa till
värden ()
metod:
Move.values ()
. Att välja en slumpmässig
Flytta
uppräkning i denna värderingsmatris måste vi generera ett slumpmässigt index som är ett heltal mellan 0 och längden på vår värderingsmatris. För att göra detta kan vi använda
nextInt ()
metod för
Slumpmässig
klass som vi behöver importera från
java.util
. När vi har fått slumpmässigt index kan vi returnera
Flytta
av det indexet från vår värderegrupp.
public Move getMove () {Move moves = Move.values (); Random random = new Random (); int index = random.nextInt (moves.length); returrörelser [index]; }
Steg 5. Skriv
getMove ()
metod för
Användare
klass.
Denna metod returnerar a
Flytta
motsvarande vad användaren har matat in. Vi förväntar oss att användaren skriver antingen "sten", "papper" eller "sax". Först måste vi be användaren om inmatning:
System.out.print ("sten, papper eller sax?")
. Använd sedan
nextLine ()
metod för
Scanner
objekt för att få användarinmatningen som en sträng. Vi behöver nu kontrollera om användaren har skickat in ett giltigt drag, men vi kan vara lätta om användaren har felstavat ett ord. Så vi kommer bara att kontrollera om den första bokstaven i användarinmatningen antingen är "R" (för sten), "P" (för papper) eller "S" (för sax), och vi bryr oss inte om fallet eftersom vi kommer först att använda
toUpperCase ()
metod för
Sträng
klass för att göra användarinmatningssträngen versaler. Om användaren inte har angett en fjärrkorrigerad inmatning kommer vi att uppmana användaren igen. Beroende på vad användaren har lagt in kommer vi att returnera ett motsvarande drag.
public Move getMove () {// Fråga användaren System.out.print ("Rock, papper eller sax?"); // Hämta användarinmatningen String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Användaren har angett en giltig inmatningsbrytare (firstLetter) {case 'R': return Move. ROCK; fall 'P': returnera Move. PAPER; fall 'S': returnera Move. SCISSORS; }} // Användaren har inte angett en giltig inmatning. Fråga igen. return getMove (); }
Steg 6. Skriv en
spela igen()
metod för
Användare
klass.
Användaren ska kunna spela spelet om och om igen. För att avgöra om användaren vill spela igen måste vi skriva a
spela igen()
metod som returnerar en booleskt talande om spelet om användaren har bestämt sig för att spela igen eller inte. I denna metod använder vi
Scanner
som vi tidigare hade initierat i konstruktören för att få ett "Ja" eller ett "Nej" från användaren. Vi kontrollerar bara om den första bokstaven är "Y" för att avgöra om användaren vill spela igen. Alla andra ingångar innebär att användaren inte vill spela igen.
public boolean playAgain () {System.out.print ("Vill du spela igen?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }
Steg 7. Anslut
Användare
och
Dator
klasser tillsammans i
Sten sax påse
klass.
Nu när vi har skrivit klart
Användare
och
Dator
klasser, kan vi fokusera på att arbeta med vårt faktiska spel. Skapa privata fält för
Användare
och
Dator
klasser i
Sten sax påse
klass. Vi måste komma åt dessa fält för att komma åt
getMove ()
metoder när vi spelar spelet. I konstruktören för
Sten sax påse
klass, starta dessa fält. Vi kommer också att behöva hålla reda på poängen i
userScore
och
datorpoäng
fält, som vi måste initiera som 0 i konstruktorn. Vi måste också hålla koll på antalet spel, som också kommer att vara ett fält som inleds som 0.
privat användare; Privat dator; privat int userScore; privat int datorScore; privat int numberOfGames; public RockPaperScissors () {user = new User (); dator = ny dator (); userScore = 0; datorScore = 0; numberOfGames = 0; }
Steg 8. Förläng
Flytta
enum för att inkludera en metod som berättar vilket drag som vinner i varje fall.
Vi måste skriva a
jämförMoves ()
metod som returnerar 0 om drag är desamma, 1 om det aktuella draget slår det andra draget och -1 om det aktuella draget förlorar till det andra draget. Detta kommer att vara användbart för att bestämma vinnaren i spelet. För att implementera denna metod, kommer vi först att returnera 0 om drag är desamma och därför har vi ett oavgjort resultat. Skriv sedan en switch -sats för att returnera 1 eller -1.
private enum Flytta {ROCK, PAPER, SCISSORS; /** * Jämför detta drag med ett annat drag för att avgöra oavgjort, en vinst eller * en förlust. * * @param otherMove * flytta för att jämföra med * @return 1 om detta drag slår det andra draget, -1 om detta drag förlorar till * det andra draget, 0 om dessa drag stämmer * / public int comparMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (detta) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPPER: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPPER? 1: -1); } // Bör aldrig nå hit returnera 0; }}
Steg 9. Skapa en
starta spelet()
metod i
Sten sax påse
klass.
Denna metod är att spela spelet. Börja med att sätta en enkel
System.out.println
i metoden.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }
Steg 10. Få drag från användaren och datorn
I
starta spelet()
metod, använd
getMove ()
metoder från
Användare
klass och
Dator
klass för att få användaren och datorns drag.
Flytta userMove = user.getMove (); Flytta computerMove = computer.getMove (); System.out.println ("\ nDu spelade" + userMove + "."); System.out.println ("Dator spelad" + computerMove + ". / N");
Steg 11. Jämför de två rörelserna och avgör om användaren vann eller om datorn vann
Använd
jämförMoves ()
metod från
Flytta
enum för att avgöra om användaren vann eller inte. Om användaren vann, öka användarens poäng med 1. Om användaren förlorade, öka datorns poäng med 1. Om det blev oavgjort, öka inte någon av poängen. Öka sedan antalet spel som spelas med ett.
int jämförMoves = userMove.compareMoves (datorMove); switch (jämförMoves) {case 0: // Tie System.out.println ("Tie!"); ha sönder; fall 1: // Användaren vinner System.out.println (userMove + "beats" + computerMove + ". Du vann!"); userScore ++; ha sönder; case -1: // Computer vinner System.out.println (computerMove + "beats" + userMove + ". Du förlorade."); datorScore ++; ha sönder; } numberOfGames ++;
Steg 12. Fråga om användaren vill spela igen
Om användaren vill spela igen, ring
starta spelet()
på nytt. Annars ring
printGameStats ()
som kommer att skriva ut spelets statistik. Vi kommer att skriva denna metod i nästa steg.
if (user.playAgain ()) {System.out.println (); starta spelet(); } annat {printGameStats (); }
Steg 13. Skriv
printGameStats ()
metod.
Den här metoden visar spelets statistik: antal vinster, antal förluster, antal oavgjorda matcher, antal spelade spel och procentandel spel som användaren vunnit. Procentandelen vunna spel beräknas av (# vinster + (# oavgjort/2))/(# spelade spel). Denna metod använder
System.out.printf
för att skriva ut formaterad text.
private void printGameStats () {int wins = userScore; int förluster = computerScore; int ties = numberOfGames - userScore - computerScore; dubbel procentvinst = (vinner + ((dubbel))) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Skriv ut titlar System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "SPEL SPELADE", "PERCENTAGE VANN"); // Line System.out.print ("|"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (16); System.out.print ("+"); printDashes (18); System.out.println ("|"); // Utskriftsvärden System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", vinster, förluster, oavgjorda, numberOfGames, percentageWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Steg 14. Starta spelet i huvudklassen
I huvudklassen, initiera en instans av
Sten sax påse
klass och ring
starta spelet()
metod.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
Steg 15. Testa ditt spel
Nu när vi har gått igenom alla ansträngningar med att skriva spelet Rock, Paper, Sax, är det dags att sammanställa och testa allt!
Provprogram
importera java.util. Random; importera java.util. Scanner; public class RockPaperScissors {privatanvändare; Privat dator; privat int userScore; privat int datorScore; privat int numberOfGames; private enum Flytta {ROCK, PAPER, SCISSORS; /** * Jämför detta drag med ett annat drag för att avgöra oavgjort, en vinst eller * en förlust. * * @param otherMove * flytta för att jämföra med * @return 1 om detta drag slår det andra draget, -1 om detta drag förlorar till * det andra draget, 0 om dessa drag stämmer * / public int comparMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (detta) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPPER: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPPER? 1: -1); } // Bör aldrig nå hit returnera 0; }} privatklassanvändare {private Scanner inputScanner; public User () {inputScanner = ny Scanner (System.in); } public Move getMove () {// Fråga användaren System.out.print ("Rock, papper eller sax?"); // Hämta användarinmatningen String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Användaren har angett en giltig inmatningsbrytare (firstLetter) {case 'R': return Move. ROCK; fall 'P': returnera Move. PAPER; fall 'S': returnera Move. SCISSORS; }} // Användaren har inte angett en giltig inmatning. Fråga igen. return getMove (); } public boolean playAgain () {System.out.print ("Vill du spela igen?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} privatklassdator {public Move getMove () {Move moves = Move.values (); Random random = new Random (); int index = random.nextInt (moves.length); returrörelser [index]; }} offentliga RockPaperScissors () {user = new User (); dator = ny dator (); userScore = 0; datorScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Get moves Flytta userMove = user.getMove (); Flytta computerMove = computer.getMove (); System.out.println ("\ nDu spelade" + userMove + "."); System.out.println ("Dator spelad" + computerMove + ". / N"); // Jämför drag och bestäm vinnare int comparMoves = userMove.compareMoves (computerMove); switch (jämförMoves) {case 0: // Tie System.out.println ("Tie!"); ha sönder; fall 1: // Användaren vinner System.out.println (userMove + "beats" + computerMove + ". Du vann!"); userScore ++; ha sönder; case -1: // Computer vinner System.out.println (computerMove + "beats" + userMove + ". Du förlorade."); datorScore ++; ha sönder; } numberOfGames ++; // Be användaren att spela igen om (user.playAgain ()) {System.out.println (); starta spelet(); } annat {printGameStats (); }} /*** Skriver ut statistiken över spelet. Beräknar band som 1/2 vinst i * procentandel. */ private void printGameStats () {int wins = userScore; int förluster = computerScore; int ties = numberOfGames - userScore - computerScore; dubbel procentvinst = (vinner + ((dubbel))) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Skriv ut titlar System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "SPEL SPELADE", "PERCENTAGE VANN"); // Line System.out.print ("|"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (10); System.out.print ("+"); printDashes (16); System.out.print ("+"); printDashes (18); System.out.println ("|"); // Utskriftsvärden System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", vinster, förluster, oavgjorda, numberOfGames, percentageWon * 100); // Line System.out.print ("+"); printDashes (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 (); }}