Sådan laver du et sten-, papir-, saksespil i Java (med billeder)

Indholdsfortegnelse:

Sådan laver du et sten-, papir-, saksespil i Java (med billeder)
Sådan laver du et sten-, papir-, saksespil i Java (med billeder)

Video: Sådan laver du et sten-, papir-, saksespil i Java (med billeder)

Video: Sådan laver du et sten-, papir-, saksespil i Java (med billeder)
Video: Importing Images as Textures in Your SketchUp Model - SketchUp Quick Tips 2024, Kan
Anonim

Rock, Paper, Scissors er et håndspil, der spilles af to personer. Begge mennesker ville sige "sten, papir, saks" og derefter samtidig danne et af tre objekter (sten, papir eller saks) med en udstrakt hånd. Vinderen bestemmes af håndformationer. Saks slår papir, papir slår sten, og sten slår saks. Hvis begge spillere spiller den samme håndformation, betragtes det som uafgjort. Vi vil skrive et simpelt spil i Java for at simulere rock, papir, saks, hvor den ene spiller er brugeren og den anden spiller er computeren.

Trin

1585279 1 1
1585279 1 1

Trin 1. Opret hovedklassen, og kald den

Sten saks papir

.

Dette vil være klassen, hvor vi vil skrive spillet. Du kan vælge at navngive det noget andet som f.eks

Spil

eller

Main

. Skriv i metodeerklæringer for konstruktøren og hovedmetoden.

public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}

1585279 2 1
1585279 2 1

Trin 2. Opret en optælling for håndbevægelserne (sten, papir eller saks)

Vi kunne bruge strenge til at repræsentere sten, papir eller saks, men en optælling giver os mulighed for på forhånd at definere vores konstanter, hvilket betyder, at brug af opregningen er et bedre design. Vi kalder vores enum type

Bevæge sig

med værdierne

KLIPPE

PAPIR

og

SAKS

private enum Flyt {ROCK, PAPER, SCISSORS}

1585279 3 1
1585279 3 1

Trin 3. Opret to private klasser

Bruger

og

Computer

.

Disse klasser repræsenterer vores spillere i spillet. Du kan vælge at offentliggøre disse klasser. Det

Bruger

klasse vil være den klasse, der beder brugeren om enten sten, papir eller saks, så vi bliver nødt til at skrive en

getMove ()

metode. Det

Computer

klasse skal også have en

getMove ()

metode, så computeren også kan foretage et træk. Vi vil sætte pladsholdere i disse metoder og implementere dem senere. Det

Bruger

klasse vil kræve en konstruktør, der opsætter

Scanner

objekt til at tage brugerinput. Vi vil sætte

Scanner

som et privat felt for brugeren og derefter starte det i konstruktøren. Da vi bruger

Scanner

klasse, skal vi skrive en importopgørelse for det øverst i vores kode. Det

Computer

klasse kræver ikke en konstruktør, så vi behøver ikke at skrive en; når vi starter

Computer

objekt, kalder vi bare standardkonstruktøren. Her er hvad vores

Sten saks papir

klasse ser sådan ud nu:

import java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; offentlig bruger () {inputScanner = ny scanner (System.in); } public Move getMove () {// TODO: Gennemfør denne metode return null; }} privat klasse Computer {public Move getMove () {// TODO: Gennemfør denne metode return null; }} offentlige RockPaperScissors () {} offentlig statisk tomrums main (String args) {}}

1585279 4 1
1585279 4 1

Trin 4. Skriv

getMove ()

metode til

Computer

klasse.

Denne metode returnerer en tilfældig

Bevæge sig

. Vi kan få en vifte af

Bevæge sig

optællinger ved at ringe til

værdier ()

metode:

Move.values ()

. At vælge en tilfældig

Bevæge sig

optælling i denne værdimatrix, skal vi generere et tilfældigt indeks, der er et helt tal mellem 0 og længden af vores værdimateriale. For at gøre dette kan vi bruge

nextInt ()

metode til

Tilfældig

klasse, som vi skal importere fra

java.util

. Når vi har fået tilfældigt indeks, kan vi returnere

Bevæge sig

af dette indeks fra vores værdimateriale.

public Move getMove () {Move moves = Move.values (); Tilfældig tilfældig = ny Tilfældig (); int index = random.nextInt (moves.length); returbevægelser [indeks]; }

1585279 5 1
1585279 5 1

Trin 5. Skriv

getMove ()

metode til

Bruger

klasse.

Denne metode returnerer en

Bevæge sig

svarende til hvad brugeren har indtastet. Vi forventer, at brugeren skriver enten "sten", "papir" eller "saks". Først skal vi bede brugeren om et input:

System.out.print ("sten, papir eller saks?")

. Brug derefter

nextLine ()

metode til

Scanner

objekt for at få brugerinput som en streng. Vi skal nu kontrollere, om brugeren har indsendt et gyldigt træk, men vi kan være lette, hvis brugeren har stavet et ord forkert. Så vi vil kun kontrollere, om det første bogstav i brugerinput er enten "R" (for sten), "P" (for papir) eller "S" (for saks), og vi er ligeglade med sagen, fordi vi vil først bruge

toUpperCase ()

metode til

Snor

klasse for at gøre brugerinputstrengen helt store. Hvis brugeren ikke har indtastet et eksternt korrekt input, beder vi brugeren igen. Afhængigt af hvad brugeren har lagt i, returnerer vi derefter et tilsvarende træk.

public Move getMove () {// Spørg brugeren System.out.print ("Rock, papir eller saks?"); // Hent brugerinput String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); hvis (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Bruger har indtastet en gyldig input switch (firstLetter) {case 'R': return Move. ROCK; case 'P': returner Move. PAPER; case 'S': returner Move. SCISSORS; }}} // Bruger har ikke indtastet et gyldigt input. Spørg igen. return getMove (); }

1585279 6
1585279 6

Trin 6. Skriv en

spil igen()

metode til

Bruger

klasse.

Brugeren skal være i stand til at spille spillet igen og igen. For at afgøre, om brugeren vil spille igen, skal vi skrive en

spil igen()

metode, der returnerer en booleaner, der fortæller spillet, om brugeren har besluttet sig for at spille igen eller ej. I denne metode bruger vi

Scanner

som vi tidligere havde igangsat i konstruktøren for at få et "Ja" eller et "Nej" fra brugeren. Vi kontrollerer kun, om det første bogstav er 'Y' for at afgøre, om brugeren vil afspille igen. Ethvert andet input vil betyde, at brugeren ikke vil afspille igen.

offentlig boolsk playAgain () {System.out.print ("Vil du afspille igen?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); returner userInput.charAt (0) == 'Y'; }

1585279 7
1585279 7

Trin 7. Tilslut

Bruger

og

Computer

klasser sammen i

Sten saks papir

klasse.

Nu hvor vi er færdige med at skrive

Bruger

og

Computer

klasser, kan vi fokusere på at arbejde på vores egentlige spil. Opret private felter til

Bruger

og

Computer

klasser i

Sten saks papir

klasse. Vi bliver nødt til at få adgang til disse felter for at få adgang til

getMove ()

metoder, når vi spiller spillet. I konstruktøren til

Sten saks papir

klasse, start disse felter. Vi bliver også nødt til at holde styr på scoren i

userScore

og

computerScore

felter, som vi skal starte som 0 i konstruktøren. Vi skal også holde styr på antallet af kampe, som også vil være et felt, der startes som 0.

privat bruger bruger; private computere; private int userScore; privat int computerScore; private int numberOfGames; offentlig RockPaperScissors () {bruger = ny bruger (); computer = ny Computer (); userScore = 0; computerScore = 0; numberOfGames = 0; }

1585279 8
1585279 8

Trin 8. Forlæng

Bevæge sig

enum til at inkludere en metode, der fortæller os, hvilket træk der vinder i hvert tilfælde.

Vi skal skrive a

sammenlignMoves ()

metode, der returnerer 0, hvis bevægelserne er de samme, 1 hvis det aktuelle træk slår det andet træk, og -1 hvis det aktuelle træk taber til det andet træk. Dette vil være nyttigt til at bestemme vinderen i spillet. For at implementere denne metode returnerer vi først 0, hvis trækkene er de samme, og derfor har vi et uafgjort resultat. Skriv derefter en switch -erklæring for at returnere 1 eller -1.

private enum Flyt {ROCK, PAPER, SAXSORS; /** * Sammenligner dette træk med et andet træk for at bestemme uafgjort, en sejr eller * et tab. * * @param otherMove * flytte for at sammenligne med * @return 1 hvis dette træk slår det andet træk, -1 hvis dette træk taber til * det andet træk, 0 hvis disse træk hænger sammen * / public int comparemoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (dette) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPIR: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPIR? 1: -1); } // Bør aldrig nå her returnere 0; }}

1585279 9
1585279 9

Trin 9. Opret en

Start Spil()

metode i

Sten saks papir

klasse.

Denne metode vil blive spillet af spillet. Start med at lægge en simpel

System.out.println

i metoden.

public void startGame () {System.out.println ("ROCK, PAPIR, SAX!"); }

1585279 10
1585279 10

Trin 10. Få træk fra brugeren og computeren

I

Start Spil()

metode, brug

getMove ()

metoder fra

Bruger

klasse og

Computer

klasse for at få brugeren og computerens træk.

Flyt userMove = user.getMove (); Flyt computerMove = computer.getMove (); System.out.println ("\ nDu spillede" + userMove + "."); System.out.println ("Computer afspillet" + computerMove + ". / N");

1585279 11
1585279 11

Trin 11. Sammenlign de to træk, og afgør, om brugeren vandt eller computeren vandt

Brug

sammenlignMoves ()

metode fra

Bevæge sig

enum til at afgøre, om brugeren vandt eller ej. Hvis brugeren vandt, skal du øge brugerens score med 1. Hvis brugeren tabte, skal du øge computerens score med 1. Hvis der var uafgjort, skal du ikke øge nogen af scoringerne. Forøg derefter antallet af spil, der spilles af en.

int comparMoves = userMove.compareMoves (computerMove); switch (sammenlignMoves) {case 0: // Tie System.out.println ("Slips!"); pause; sag 1: // Bruger vinder System.out.println (userMove + "beats" + computerMove + ". Du vandt!"); userScore ++; pause; case -1: // Computer vinder System.out.println (computerMove + "beats" + userMove + ". Du tabte."); computerScore ++; pause; } numberOfGames ++;

1585279 12
1585279 12

Trin 12. Spørg, om brugeren vil spille igen

Hvis brugeren vil afspille igen, skal du ringe

Start Spil()

igen. Ellers ring

printGameStats ()

som vil udskrive statistikken over spillet. Vi vil skrive denne metode i det næste trin.

hvis (user.playAgain ()) {System.out.println (); Start Spil(); } ellers {printGameStats (); }

1585279 13
1585279 13

Trin 13. Skriv

printGameStats ()

metode.

Denne metode viser statistikken over spillet: antal sejre, antal tab, antal uafgjort, antal spil, og procentdel af spil, der er vundet af brugeren. Procentdelen af vundne spil beregnes af (# sejre + (# uafgjort/2))/(# spil spillet). Denne metode bruger

System.out.printf

for at udskrive formateret tekst.

private void printGameStats () {int wins = userScore; int tab = computerScore; int ties = numberOfGames - userScore - computerScore; dobbelt procentvundet = (vinder + ((dobbelt) uafgjort) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Udskriv titler System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "TAB", "TIES", "SPILLET SPIL", "PERCENTAGE VANDT"); // 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 ("|"); // Udskriv værdier System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", sejre, tab, uafgjort, numberOfGames, percentageWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }

1585279 14
1585279 14

Trin 14. Start spillet i hovedklassen

I hovedklassen skal du initialisere en forekomst af

Sten saks papir

klasse og ring til

Start Spil()

metode.

public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }

1585279 15
1585279 15

Trin 15. Test dit spil

Nu hvor vi har gennemgået alle bestræbelserne på at skrive spillet Rock, Paper, Scissors, er det tid til at kompilere og teste alt!

Prøveprogram

import java.util. Random; import java.util. Scanner; public class RockPaperScissors {privatbrugerbruger; private computere; private int userScore; privat int computerScore; private int numberOfGames; private enum Flyt {ROCK, PAPER, SAXSORS; /** * Sammenligner dette træk med et andet træk for at bestemme uafgjort, en sejr eller * et tab. * * @param otherMove * flytte for at sammenligne med * @return 1 hvis dette træk slår det andet træk, -1 hvis dette træk taber til * det andet træk, 0 hvis disse træk hænger sammen * / public int comparemoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (dette) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPIR: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPIR? 1: -1); } // Bør aldrig nå her returnere 0; }} privat klasse bruger {private Scanner inputScanner; offentlig bruger () {inputScanner = ny scanner (System.in); } public Move getMove () {// Spørg brugeren System.out.print ("sten, papir eller saks?"); // Hent brugerinput String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); hvis (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Bruger har indtastet en gyldig input switch (firstLetter) {case 'R': return Move. ROCK; case 'P': returner Move. PAPER; case 'S': returner Move. SCISSORS; }}} // Bruger har ikke indtastet et gyldigt input. Spørg igen. return getMove (); } offentlig boolsk playAgain () {System.out.print ("Vil du afspille igen?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); returner userInput.charAt (0) == 'Y'; }} privat klasse Computer {public Move getMove () {Move moves = Move.values (); Tilfældig tilfældig = ny Tilfældig (); int index = random.nextInt (moves.length); returbevægelser [indeks]; }} offentlige RockPaperScissors () {user = new User (); computer = ny Computer (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SAX!"); // Få træk Flyt userMove = user.getMove (); Flyt computerMove = computer.getMove (); System.out.println ("\ nDu spillede" + userMove + "."); System.out.println ("Computer afspillet" + computerMove + ". / N"); // Sammenlign træk og bestem vinder int comparMoves = userMove.compareMoves (computerMove); switch (sammenlignMoves) {case 0: // Tie System.out.println ("Slips!"); pause; sag 1: // Bruger vinder System.out.println (userMove + "beats" + computerMove + ". Du vandt!"); userScore ++; pause; case -1: // Computer vinder System.out.println (computerMove + "beats" + userMove + ". Du tabte."); computerScore ++; pause; } numberOfGames ++; // Bed brugeren om at afspille igen, hvis (user.playAgain ()) {System.out.println (); Start Spil(); } ellers {printGameStats (); }} /*** Udskriver statistikken over spillet. Beregner bånd som 1/2 en gevinst i * vandt procent. */ private void printGameStats () {int wins = userScore; int tab = computerScore; int ties = numberOfGames - userScore - computerScore; dobbelt procentvundet = (vinder + ((dobbelt) uafgjort) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Udskriv titler System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "TAB", "TIES", "SPILLET SPIL", "PERCENTAGE VANDT"); // 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 ("|"); // Udskriv værdier System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", sejre, tab, uafgjort, 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 ("-"); }} offentligt statisk tomrum main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }}

Anbefalede: