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
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) {}}
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}
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) {}}
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]; }
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 (); }
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'; }
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; }
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; }}
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!"); }
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");
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 ++;
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 (); }
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 ("+"); }
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 (); }
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 (); }}