Hur man gör ett sten-, papper-, saxspel i Java (med bilder)

Innehållsförteckning:

Hur man gör ett sten-, papper-, saxspel i Java (med bilder)
Hur man gör ett sten-, papper-, saxspel i Java (med bilder)

Video: Hur man gör ett sten-, papper-, saxspel i Java (med bilder)

Video: Hur man gör ett sten-, papper-, saxspel i Java (med bilder)
Video: Importing Images as Textures in Your SketchUp Model - SketchUp Quick Tips 2024, Maj
Anonim

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

1585279 1 1
1585279 1 1

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) {}}

1585279 2 1
1585279 2 1

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}

1585279 3 1
1585279 3 1

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) {}}

1585279 4 1
1585279 4 1

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]; }

1585279 5 1
1585279 5 1

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 (); }

1585279 6
1585279 6

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'; }

1585279 7
1585279 7

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; }

1585279 8
1585279 8

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; }}

1585279 9
1585279 9

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!"); }

1585279 10
1585279 10

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");

1585279 11
1585279 11

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 ++;

1585279 12
1585279 12

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 (); }

1585279 13
1585279 13

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 ("+"); }

1585279 14
1585279 14

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 (); }

1585279 15
1585279 15

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 (); }}

Rekommenderad: