Hvordan lage et stein-, papir-, saks -spill i Java (med bilder)

Innholdsfortegnelse:

Hvordan lage et stein-, papir-, saks -spill i Java (med bilder)
Hvordan lage et stein-, papir-, saks -spill i Java (med bilder)

Video: Hvordan lage et stein-, papir-, saks -spill i Java (med bilder)

Video: Hvordan lage et stein-, papir-, saks -spill i Java (med bilder)
Video: Importing Images as Textures in Your SketchUp Model - SketchUp Quick Tips 2024, April
Anonim

Rock, Paper, Scissors er et håndspill som spilles av to personer. Begge menneskene ville si "stein, papir, saks" og deretter samtidig danne ett av tre objekter (stein, papir eller saks) med en utstrakt hånd. Vinneren bestemmes av håndformasjonene. Saks slår papir, papir slår stein, og stein slår saks. Hvis begge spillerne spiller samme håndformasjon, regnes det som uavgjort. Vi skal skrive et enkelt spill i Java for å simulere stein, papir, saks der den ene spilleren er brukeren og den andre spilleren er datamaskinen.

Trinn

1585279 1 1
1585279 1 1

Trinn 1. Lag hovedklassen og kall den

Stein saks papir

.

Dette vil være klassen der vi skal skrive spillet. Du kan velge å kalle det noe annet, for eksempel

Spill

eller

Hoved

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

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

1585279 2 1
1585279 2 1

Trinn 2. Lag en opptelling for håndbevegelsene (stein, papir eller saks)

Vi kan bruke strenger for å representere stein, papir eller saks, men en oppregning lar oss forhåndsdefinere våre konstanter, noe som betyr at bruk av oppregningen er en bedre design. Vi vil kalle enumtypen vår

Bevege seg

med verdiene

STEIN

PAPIR

og

SAKS

private enum Flytt {ROCK, PAPER, SCISSORS}

1585279 3 1
1585279 3 1

Trinn 3. Opprett to private klasser

Bruker

og

Datamaskin

.

Disse klassene vil representere våre spillere i spillet. Du kan velge å gjøre disse klassene offentlige. De

Bruker

class vil være klassen som ber brukeren om enten stein, papir eller saks, så vi må skrive en

getMove ()

metode. De

Datamaskin

klassen må også ha en

getMove ()

metode slik at datamaskinen også kan gjøre et trekk. Vi vil sette plassholdere i disse metodene og implementere dem senere. De

Bruker

klasse vil kreve en konstruktør som setter opp

Skanner

objekt for å ta inn brukerinngangen. Vi vil sette

Skanner

som et privat felt for brukeren og deretter starte det i konstruktøren. Siden vi bruker

Skanner

klasse, må vi skrive en importerklæring øverst i koden. De

Datamaskin

klasse krever ikke en konstruktør, så vi trenger ikke å skrive en; når vi starter

Datamaskin

objekt, vil vi bare kalle standardkonstruktøren. Her er hva vår

Stein saks papir

klassen ser slik ut nå:

importer java.util. Scanner; offentlig klasse RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; offentlig bruker () {inputScanner = ny skanner (System.in); } public Move getMove () {// TODO: Gjennomfør denne metoden return null; }} privat klasse datamaskin {public Move getMove () {// TODO: Implement this method return null; }} offentlige RockPaperScissors () {} offentlig statisk tomrom (String args) {}}

1585279 4 1
1585279 4 1

Trinn 4. Skriv

getMove ()

metode for

Datamaskin

klasse.

Denne metoden vil returnere en tilfeldig

Bevege seg

. Vi kan få en rekke

Bevege seg

oppregninger ved å ringe til

verdier ()

metode:

Move.values ()

. Å velge en tilfeldig

Bevege seg

oppregning i denne verdimatrisen, må vi generere en tilfeldig indeks som er et heltall mellom 0 og lengden på verdigrunnlaget. For å gjøre dette kan vi bruke

nextInt ()

metoden for

Tilfeldig

klasse som vi trenger å importere fra

java.util

. Etter at vi har fått tilfeldig indeks, kan vi returnere

Bevege seg

av den indeksen fra vårt verdimateriale.

public Move getMove () {Move moves = Move.values (); Tilfeldig tilfeldig = ny Tilfeldig (); int index = random.nextInt (moves.length); returbevegelser [indeks]; }

1585279 5 1
1585279 5 1

Trinn 5. Skriv

getMove ()

metode for

Bruker

klasse.

Denne metoden vil returnere a

Bevege seg

tilsvarer det brukeren har lagt inn. Vi forventer at brukeren skriver enten "stein", "papir" eller "saks". Først må vi be brukeren om innspill:

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

. Bruk deretter

nextLine ()

metoden for

Skanner

objekt for å få brukerinngangen som en streng. Vi trenger nå å sjekke om brukeren har sendt inn et gyldig trekk, men vi kan være milde hvis brukeren har stavet et ord feil. Så vi vil bare sjekke om den første bokstaven i brukerinngangen enten er "R" (for stein), "P" (for papir) eller "S" (for saks), og vi vil ikke bry oss om saken fordi vi vil først bruke

toUpperCase ()

metoden for

String

klasse for å gjøre brukerens inndatastreng store. Hvis brukeren ikke har angitt en ekstern korrekt inngang, vil vi be brukeren om det igjen. Avhengig av hva brukeren har lagt inn, returnerer vi deretter et tilsvarende trekk.

public Move getMove () {// Be brukeren System.out.print ("stein, papir eller saks?"); // Få brukerinndata String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Bruker har angitt en gyldig inndatabryter (firstLetter) {case 'R': return Move. ROCK; tilfelle 'P': returner Move. PAPER; tilfelle 'S': returner Move. SCISSORS; }}} // Brukeren har ikke angitt en gyldig inndata. Spør igjen. return getMove (); }

1585279 6
1585279 6

Trinn 6. Skriv en

spill igjen()

metode for

Bruker

klasse.

Brukeren skal kunne spille spillet igjen og igjen. For å avgjøre om brukeren vil spille igjen, må vi skrive a

spill igjen()

metode som returnerer en boolsk som forteller spillet om brukeren har bestemt seg for å spille igjen eller ikke. I denne metoden bruker vi

Skanner

som vi tidligere hadde initiert i konstruktøren for å få et "Ja" eller et "Nei" fra brukeren. Vi vil bare sjekke om den første bokstaven er "Y" for å avgjøre om brukeren vil spille igjen. Enhver annen inngang vil bety at brukeren ikke vil spille igjen.

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

1585279 7
1585279 7

Trinn 7. Koble til

Bruker

og

Datamaskin

klasser sammen i

Stein saks papir

klasse.

Nå som vi er ferdig med å skrive

Bruker

og

Datamaskin

klasser, kan vi fokusere på å jobbe med vårt faktiske spill. Opprett private felt for

Bruker

og

Datamaskin

klasser i

Stein saks papir

klasse. Vi må få tilgang til disse feltene for å få tilgang til

getMove ()

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

Stein saks papir

klasse, start disse feltene. Vi må også holde oversikt over poengsummen

userScore

og

datamaskinScore

felt, som vi må starte som 0 i konstruktøren. Vi må også holde oversikt over antall kamper, som også vil være et felt som starter med 0.

privat bruker bruker; privat datamaskin; private int userScore; private int computerScore; private int numberOfGames; offentlig RockPaperScissors () {user = new User (); datamaskin = ny datamaskin (); userScore = 0; computerScore = 0; numberOfGames = 0; }

1585279 8
1585279 8

Trinn 8. Forleng

Bevege seg

enum for å inkludere en metode som forteller oss hvilket trekk som vinner i hvert tilfelle.

Vi må skrive a

comparMoves ()

metode som returnerer 0 hvis trekkene er de samme, 1 hvis gjeldende trekk slår det andre trekket, og -1 hvis det aktuelle trekket taper til det andre trekket. Dette vil være nyttig for å bestemme vinneren i spillet. For å implementere denne metoden, vil vi først returnere 0 hvis trekkene er de samme, og derfor har vi uavgjort. Skriv deretter en switch -setning for å returnere 1 eller -1.

private enum Flytt {ROCK, PAPER, SCISSORS; /** * Sammenligner dette trekket med et annet trekk for å bestemme uavgjort, seier eller * tap. * * @param otherMove * flytte for å sammenligne med * @return 1 hvis dette trekket slår det andre trekket, -1 hvis dette trekket taper til * det andre trekket, 0 hvis disse trekkene knytter * / public int comparMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); sak SAKS: retur (otherMove == PAPIR? 1: -1); } // Bør aldri nå hit returnere 0; }}

1585279 9
1585279 9

Trinn 9. Opprett en

start spill()

metoden i

Stein saks papir

klasse.

Denne metoden vil være spillet av spillet. Start med å sette en enkel

System.out.println

i metoden.

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

1585279 10
1585279 10

Trinn 10. Få trekk fra brukeren og datamaskinen

I

start spill()

metode, bruk

getMove ()

metoder fra

Bruker

klassen og

Datamaskin

klasse for å få brukeren og datamaskinens trekk.

Flytt userMove = user.getMove (); Flytt computerMove = computer.getMove (); System.out.println ("\ nDu spilte" + userMove + "."); System.out.println ("Datamaskin spilt" + computerMove + ". / N");

1585279 11
1585279 11

Trinn 11. Sammenlign de to trekkene og avgjør om brukeren vant eller datamaskinen vant

Bruke

comparMoves ()

metode fra

Bevege seg

enum for å avgjøre om brukeren vant eller ikke. Hvis brukeren vant, øker du brukerpoengene med 1. Hvis brukeren taper, øker du datamaskinens poengsum med 1. Hvis det var uavgjort, må du ikke øke noen av poengsummene. Øk deretter antall kamper som spilles av en.

int comparMoves = userMove.compareMoves (computerMove); bytte (sammenligneMoves) {sak 0: // Slips System.out.println ("Slips!"); gå i stykker; sak 1: // Bruker vinner System.out.println (userMove + "beats" + computerMove + ". Du vant!"); userScore ++; gå i stykker; case -1: // Computer vinner System.out.println (computerMove + "beats" + userMove + ". Du tapte."); computerScore ++; gå i stykker; } numberOfGames ++;

1585279 12
1585279 12

Trinn 12. Spør om brukeren vil spille igjen

Hvis brukeren ønsker å spille igjen, ring

start spill()

en gang til. Ellers ring

printGameStats ()

som vil skrive ut statistikken over spillet. Vi vil skrive denne metoden i neste trinn.

if (user.playAgain ()) {System.out.println (); start spill(); } annet {printGameStats (); }

1585279 13
1585279 13

Trinn 13. Skriv

printGameStats ()

metode.

Denne metoden vil vise statistikken over spillet: antall gevinster, antall tap, antall uavgjort, antall spill som spilles og prosentandel av spill som er vunnet av brukeren. Prosentandelen av vunnet spill beregnes av (# seier + (# uavgjort/2))/(# spill spilt). Denne metoden bruker

System.out.printf

for å skrive ut formatert tekst.

private void printGameStats () {int vinner = userScore; int tap = computerScore; int ties = numberOfGames - userScore - computerScore; dobbelt prosent Vunnet = (vinner + ((doble) uavgjort) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Skriv ut titler System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "TAP", "TIES", "SPILL SPILLET", "PERCENTAGE VANT"); // 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 ("|"); // Skriv ut verdier System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", gevinster, tap, uavgjort, numberOfGames, percentageWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }

1585279 14
1585279 14

Trinn 14. Start spillet i hovedklassen

I hovedklassen initialiserer du en forekomst av

Stein saks papir

klasse og ring

start spill()

metode.

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

1585279 15
1585279 15

Trinn 15. Test spillet ditt

Nå som vi har gått igjennom hele innsatsen med å skrive spillet Rock, Paper, Scissors, er det på tide å kompilere og teste alt!

Eksempelprogram

import java.util. Random; importer java.util. Scanner; offentlig klasse RockPaperScissors {privat bruker bruker; privat datamaskin; private int userScore; private int computerScore; private int numberOfGames; private enum Flytt {ROCK, PAPER, SCISSORS; /** * Sammenligner dette trekket med et annet trekk for å bestemme uavgjort, seier eller * tap. * * @param otherMove * flytte for å sammenligne med * @return 1 hvis dette trekket slår det andre trekket, -1 hvis dette trekket taper til * det andre trekket, 0 hvis disse trekkene knytter * / public int comparMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); sak SAKS: retur (otherMove == PAPIR? 1: -1); } // Bør aldri nå hit returnere 0; }} privat klasse bruker {private Scanner inputScanner; offentlig bruker () {inputScanner = ny skanner (System.in); } offentlig Move getMove () {// Be brukeren System.out.print ("stein, papir eller saks?"); // Få brukerinndata String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Brukeren har angitt en gyldig inndatabryter (firstLetter) {case 'R': return Move. ROCK; tilfelle 'P': returner Move. PAPER; tilfelle 'S': returner Move. SCISSORS; }}} // Brukeren har ikke angitt en gyldig inndata. Spør igjen. return getMove (); } offentlig boolsk playAgain () {System.out.print ("Vil du spille igjen?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} privat klasse datamaskin {public Move getMove () {Move moves = Move.values (); Tilfeldig tilfeldig = ny Tilfeldig (); int index = random.nextInt (moves.length); returbevegelser [indeks]; }} offentlige RockPaperScissors () {user = new User (); datamaskin = ny datamaskin (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Få trekk Flytt userMove = user.getMove (); Flytt computerMove = computer.getMove (); System.out.println ("\ nDu spilte" + userMove + "."); System.out.println ("Datamaskin spilt" + computerMove + ". / N"); // Sammenlign trekk og finn vinner int comparMoves = userMove.compareMoves (computerMove); bytte (sammenligneMoves) {sak 0: // Slips System.out.println ("Slips!"); gå i stykker; sak 1: // Bruker vinner System.out.println (userMove + "beats" + computerMove + ". Du vant!"); userScore ++; gå i stykker; case -1: // Computer vinner System.out.println (computerMove + "beats" + userMove + ". Du tapte."); computerScore ++; gå i stykker; } numberOfGames ++; // Be brukeren om å spille igjen hvis (user.playAgain ()) {System.out.println (); start spill(); } annet {printGameStats (); }} /*** Skriver ut statistikken over spillet. Beregner bånd som 1/2 seier i * prosent prosent. */ private void printGameStats () {int vinner = userScore; int tap = computerScore; int ties = numberOfGames - userScore - computerScore; dobbelt prosent Vunnet = (vinner + ((doble) uavgjort) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Skriv ut titler System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "TAP", "TIES", "SPILL SPILLET", "PERCENTAGE VANT"); // 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 ("|"); // Skriv ut verdier System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", gevinster, tap, uavgjort, 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 (); }}

Anbefalt: