Hoe om 'n rots-, papier-, skêrspel in Java te maak (met foto's)

INHOUDSOPGAWE:

Hoe om 'n rots-, papier-, skêrspel in Java te maak (met foto's)
Hoe om 'n rots-, papier-, skêrspel in Java te maak (met foto's)

Video: Hoe om 'n rots-, papier-, skêrspel in Java te maak (met foto's)

Video: Hoe om 'n rots-, papier-, skêrspel in Java te maak (met foto's)
Video: Importing Images as Textures in Your SketchUp Model - SketchUp Quick Tips 2024, Mei
Anonim

Rock, Paper, Scissors is 'n handspel wat deur twee mense gespeel word. Beide mense sou "rots, papier, skêr" sê en vorm dan gelyktydig een van drie voorwerpe (rots, papier of skêr) met 'n uitgestrekte hand. Die wenner word bepaal deur die handformasies. Skêr klop papier, papier klop klip, en klip klop skêr. As albei spelers dieselfde handformasie speel, word dit as gelykop beskou. Ons skryf 'n eenvoudige speletjie in Java om rots, papier, skêr te simuleer waar die een speler die gebruiker is en die ander speler die rekenaar.

Stappe

1585279 1 1
1585279 1 1

Stap 1. Skep die hoofklas en noem dit

RockPaperScissors

.

Dit is die klas waar ons die spel sal skryf. U kan kies om dit iets anders te noem, soos

Spel

of

Hoof

. Skryf metodeverklarings vir die konstruktor en die hoofmetode neer.

openbare klas RockPaperScissors {public RockPaperScissors () {} openbare statiese leemte hoof (String args) {}}

1585279 2 1
1585279 2 1

Stap 2. Maak 'n opsomming vir die handgebare (rots, papier of skêr)

Ons kan snare gebruik om rots, papier of skêr voor te stel, maar 'n opsomming stel ons in staat om ons konstantes vooraf te definieer, wat beteken dat die gebruik van die opsomming 'n beter ontwerp is. Ons noem ons enum tipe

Beweeg

met die waardes

ROTS

VRAESTEL

en

SKAAR

private enum Skuif {ROCK, PAPER, SCISSORS}

1585279 3 1
1585279 3 1

Stap 3. Skep twee privaat klasse

Gebruiker

en

Rekenaar

.

Hierdie klasse verteenwoordig ons spelers in die spel. U kan kies om hierdie klasse openbaar te maak. Die

Gebruiker

klas sal die klas wees wat die gebruiker om steen, papier of 'n skêr vra, sodat ons 'n

getMove ()

metode. Die

Rekenaar

klas sal ook 'n

getMove ()

metode sodat die rekenaar ook kan beweeg. Ons sal plekhouers in hierdie metodes plaas en dit later implementeer. Die

Gebruiker

klas benodig 'n konstruktor wat die

Skandeerder

voorwerp om die gebruikersinvoer in te neem. Ons sal die

Skandeerder

as 'n privaat veld vir die gebruiker en begin dit dan in die konstruktor. Aangesien ons die

Skandeerder

klas, moet ons 'n invoerverklaring daarvoor bo -aan ons kode skryf. Die

Rekenaar

klas benodig nie 'n konstruktor nie, dus hoef ons nie een te skryf nie; wanneer ons die

Rekenaar

voorwerp, sal ons net die standaardkonstrukteur noem. Hier is wat ons

RockPaperScissors

klas lyk nou:

invoer java.util. Scanner; openbare klas RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} privaat klas gebruiker {private Scanner inputScanner; openbare gebruiker () {inputScanner = nuwe skandeerder (System.in); } public Move getMove () {// TODO: Implementeer hierdie metode return null; }} privaat klas Rekenaar {public Move getMove () {// TODO: Implementeer hierdie metode return null; }} openbare RockPaperScissors () {} openbare statiese leemte hoof (String args) {}}

1585279 4 1
1585279 4 1

Stap 4. Skryf die

getMove ()

metode vir die

Rekenaar

klas.

Hierdie metode gee 'n ewekansige terugkeer

Beweeg

. Ons kan 'n verskeidenheid van

Beweeg

opsommings deur die

waardes ()

metode:

Move.values ()

. Om 'n ewekansige te kies

Beweeg

opsomming in hierdie waardeskikking, moet ons 'n ewekansige indeks genereer wat 'n heelgetal is tussen 0 en die lengte van ons waardeskikking. Om dit te kan doen, kan ons die

nextInt ()

metode van die

Willekeurig

klas waaruit ons moet invoer

java.util

. Nadat ons die ewekansige indeks gekry het, kan ons die

Beweeg

van die indeks uit ons waardeskikking.

public Move getMove () {Move moves = Move.values (); Random random = new Random (); int indeks = random.nextInt (moves.length); opbrengs beweeg [indeks]; }

1585279 5 1
1585279 5 1

Stap 5. Skryf die

getMove ()

metode vir die

Gebruiker

klas.

Hierdie metode sal 'n

Beweeg

wat ooreenstem met wat die gebruiker ingevoer het. Ons sal van die gebruiker verwag om 'rock', 'paper' of 'sciss' te skryf. Eerstens moet ons die gebruiker vra vir 'n insette:

System.out.print ("Rots, papier of skêr?")

. Gebruik dan die

nextLine ()

metode van die

Skandeerder

voorwerp om die gebruiker se invoer as 'n string te kry. Ons moet nou kyk of die gebruiker 'n geldige skuif ingedien het, maar ons kan sag wees as die gebruiker 'n woord verkeerd gespel het. Dus sal ons net kyk of die eerste letter van die gebruikersinvoer 'R' (vir rock), 'P' (vir papier) of 'S' (vir 'n skêr) is, en ons sal nie omgee vir die saak nie, want ons sal eers die

toUpperCase ()

metode van die

String

klas om die invoerstring van die gebruiker in hoofletters te maak. As die gebruiker nie 'n afstandkorrekte invoer ingevoer het nie, sal ons die gebruiker weer vra. Afhangende van wat die gebruiker ingesit het, stuur ons 'n ooreenstemmende skuif terug.

public Move getMove () {// Stel die gebruiker System.out.print ("rots, papier of skêr?"); // Kry die gebruikersinvoer String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Gebruiker het 'n geldige invoerskakelaar (firstLetter) {case 'R': terugkeer Move. ROCK; geval 'P': stuur Move. PAPER; geval 'S': terugkeer Move. SCISSORS; }}} // Gebruiker het nie 'n geldige invoer ingevoer nie. Weer vra. terugkeer getMove (); }

1585279 6
1585279 6

Stap 6. Skryf a

speel weer()

metode vir die

Gebruiker

klas.

Die gebruiker moet die spel oor en oor kan speel. Om te bepaal of die gebruiker weer wil speel, moet ons 'n

speel weer()

'n Metode wat 'n Booleaner teruggee, wat die spel vertel of die gebruiker besluit het om weer te speel of nie. In hierdie metode gebruik ons die

Skandeerder

wat ons voorheen in die konstruktor begin het om 'n "Ja" of "Nee" van die gebruiker te kry. Ons sal slegs kyk of die eerste letter 'Y' is om te bepaal of die gebruiker weer wil speel. Enige ander invoer beteken dat die gebruiker nie weer wil speel nie.

openbare boolean playAgain () {System.out.print ("Wil u weer speel?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); stuur userInput.charAt (0) == 'Y' terug; }

1585279 7
1585279 7

Stap 7. Koppel die

Gebruiker

en

Rekenaar

klasse saam in die

RockPaperScissors

klas.

Noudat ons die

Gebruiker

en

Rekenaar

klasse, kan ons fokus op die werk aan ons werklike spel. Skep privaat velde vir die

Gebruiker

en

Rekenaar

klasse in die

RockPaperScissors

klas. Ons sal toegang tot hierdie velde nodig hê om toegang tot die

getMove ()

metodes wanneer ons die spel speel. In die konstruktor vir die

RockPaperScissors

klas, begin hierdie velde. Ons sal ook die telling moet byhou

gebruikerscore

en

rekenaarScore

velde, wat ons as 0 in die konstruktor moet begin. Ons moet ook die aantal wedstryde byhou, wat ook 'n veld is wat as 0 begin word.

privaat gebruiker gebruiker; privaat Rekenaarrekenaar; privaat int userScore; private rekenaarrekenaar; private int numberOfGames; openbare RockPaperScissors () {user = new User (); rekenaar = nuwe Rekenaar (); userScore = 0; rekenaarScore = 0; numberOfGames = 0; }

1585279 8
1585279 8

Stap 8. Brei die

Beweeg

enum om 'n metode in te sluit wat ons vertel watter stap in elke geval wen.

Ons moet 'n skryf

vergelykMoves ()

metode wat 0 teruggee as die bewegings dieselfde is, 1 as die huidige beweging die ander beweging klop, en -1 as die huidige beweging na die ander beweging verloor. Dit sal handig wees om die wenner in die spel te bepaal. Om hierdie metode te implementeer, gee ons eers 0 terug as die bewegings dieselfde is en daarom het ons gelykop. Skryf dan 'n skakelverklaring vir die terugkeer van 1 of -1.

private enum Skuif {ROCK, PAPER, SCISSORS; /** * Vergelyk hierdie stap met 'n ander stap om die gelykop, 'n oorwinning of 'n verlies te bepaal. * * @param otherMove * skuif om te vergelyk met * @return 1 as hierdie skuif die ander skuif klop, -1 as hierdie skuif tot * die ander skuif verloor, 0 as hierdie bewegings * / public int comparMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; skakelaar (hierdie) {case ROCK: return (otherMove == SCISSORS? 1: -1); saak PAPIER: terugkeer (otherMove == ROCK? 1: -1); saak SKAARS: terugkeer (otherMove == PAPIER? 1: -1); } // Moet nooit hier kom nie, terugkeer 0; }}

1585279 9
1585279 9

Stap 9. Skep a

begin die spel()

metode in die

RockPaperScissors

klas.

Hierdie metode is om die spel te speel. Begin met 'n eenvoudige

System.out.println

in die metode.

openbare leegte startGame () {System.out.println ("ROTS, PAPIER, SKAAR!"); }

1585279 10
1585279 10

Stap 10. Kry bewegings van die gebruiker en die rekenaar

In die

begin die spel()

metode, gebruik die

getMove ()

metodes uit die

Gebruiker

klas en die

Rekenaar

klas om die gebruiker en die rekenaar se bewegings te kry.

Beweeg userMove = user.getMove (); Beweeg computerMove = computer.getMove (); System.out.println ("\ nJy het gespeel" + userMove + "."); System.out.println ("Rekenaar gespeel" + computerMove + ". / N");

1585279 11
1585279 11

Stap 11. Vergelyk die twee bewegings en bepaal of die gebruiker gewen het of die rekenaar gewen het

Gebruik die

vergelykMoves ()

metode uit die

Beweeg

om te bepaal of die gebruiker gewen het of nie. As die gebruiker gewen het, verhoog die gebruikers telling met 1. As die gebruiker verloor, verhoog die rekenaar telling met 1. As daar gelykop was, moet u nie een van die tellings verhoog nie. Verhoog dan die aantal speletjies wat deur een gespeel word.

int comparMoves = userMove.compareMoves (computerMove); skakelaar (vergelykMoves) {case 0: // Tie System.out.println ("Tie!"); breek; geval 1: // Gebruiker wen System.out.println (userMove + "beats" + computerMove + ". Jy het gewen!"); userScore ++; breek; case -1: // Computer wen System.out.println (computerMove + "beats" + userMove + ". You lost."); rekenaarScore ++; breek; } numberOfGames ++;

1585279 12
1585279 12

Stap 12. Vra of die gebruiker weer wil speel

As die gebruiker weer wil speel, bel

begin die spel()

weer. Andersins, bel

printGameStats ()

wat die statistieke van die spel sal uitdruk. Ons sal hierdie metode in die volgende stap skryf.

as (user.playAgain ()) {System.out.println (); begin die spel(); } anders {printGameStats (); }

1585279 13
1585279 13

Stap 13. Skryf die

printGameStats ()

metode.

Met hierdie metode word die spelstatistieke vertoon: aantal oorwinnings, aantal verliese, aantal gelykopstellings, aantal gespeelde wedstryde en persentasie wedstryde wat deur die gebruiker gewen is. Die persentasie gewen wedstryde word bereken deur die (# oorwinnings + (# gelykop/2))/(# gespeelde wedstryde). Hierdie metode gebruik

System.out.printf

om geformateerde teks uit te druk.

private leegte printGameStats () {int wins = userScore; int verliese = rekenaarScore; int ties = numberOfGames - userScore - computerScore; dubbele persentasie Wen = (wen + ((dubbel) bande) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Druk titels System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMES SPILLED", "PERCENTAGE WEN "); // 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 ("|"); // Druk waardes System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", oorwinnings, verliese, bande, numberOfGames, percentageWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }

1585279 14
1585279 14

Stap 14. Begin die spel in die hoofklas

In die hoofklas, initialiseer 'n voorbeeld van die

RockPaperScissors

klas en bel die

begin die spel()

metode.

openbare statiese leegte hoof (String args) {RockPaperScissors game = nuwe RockPaperScissors (); game.startGame (); }

1585279 15
1585279 15

Stap 15. Toets jou spel

Noudat ons al die moeite gedoen het om die spel Rock, Paper, Scissors te skryf, is dit tyd om alles saam te stel en te toets!

Voorbeeldprogram

invoer java.util. Random; invoer java.util. Scanner; openbare klas RockPaperScissors {privaatgebruiker; privaat Rekenaarrekenaar; private int userScore; private rekenaarrekenaar; private int numberOfGames; private enum Skuif {ROCK, PAPER, SCISSORS; /** * Vergelyk hierdie stap met 'n ander stap om die gelykop, 'n oorwinning of 'n verlies te bepaal. * * @param otherMove * skuif om te vergelyk met * @return 1 as hierdie skuif die ander skuif klop, -1 as hierdie skuif tot * die ander skuif verloor, 0 as hierdie bewegings * / public int comparMoves (Move otherMove) { / / Tie if (this == otherMove) return 0; skakelaar (hierdie) {case ROCK: return (otherMove == SCISSORS? 1: -1); saak PAPIER: terugkeer (otherMove == ROCK? 1: -1); saak SKAARS: terugkeer (otherMove == PAPIER? 1: -1); } // Moet nooit hier kom nie, terugkeer 0; }} privaat klasgebruiker {private Scanner inputScanner; openbare gebruiker () {inputScanner = nuwe skandeerder (System.in); } openbare skuif getMove () {// Stel die gebruiker System.out.print ("rots, papier of skêr?"); // Kry die gebruikersinvoer String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Gebruiker het 'n geldige invoerskakelaar (firstLetter) {case 'R': terugkeer Move. ROCK; geval 'P': stuur Move. PAPER; geval 'S': terugkeer Move. SCISSORS; }}} // Gebruiker het nie 'n geldige invoer ingevoer nie. Weer vra. terugkeer getMove (); } openbare booleaanse playAgain () {System.out.print ("Wil u weer speel?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); stuur userInput.charAt (0) == 'Y' terug; }} privaat klas rekenaar {public Move getMove () {Move moves = Move.values (); Random random = new Random (); int indeks = random.nextInt (moves.length); opbrengs beweeg [indeks]; }} openbare RockPaperScissors () {gebruiker = nuwe gebruiker (); rekenaar = nuwe Rekenaar (); userScore = 0; rekenaarScore = 0; numberOfGames = 0; } openbare leegte startGame () {System.out.println ("ROTS, PAPIER, SKAAR!"); // Kry bewegings Skuif userMove = user.getMove (); Beweeg computerMove = computer.getMove (); System.out.println ("\ nJy het gespeel" + userMove + "."); System.out.println ("Rekenaar gespeel" + computerMove + ". / N"); // Vergelyk bewegings en bepaal wenner int comparMoves = userMove.compareMoves (computerMove); skakelaar (vergelykMoves) {case 0: // Tie System.out.println ("Tie!"); breek; geval 1: // Gebruiker wen System.out.println (userMove + "beats" + computerMove + ". Jy het gewen!"); userScore ++; breek; case -1: // Computer wen System.out.println (computerMove + "beats" + userMove + ". You lost."); rekenaarScore ++; breek; } numberOfGames ++; // Vra die gebruiker om weer te speel as (user.playAgain ()) {System.out.println (); begin die spel(); } anders {printGameStats (); }} /*** Druk die statistieke van die spel uit. Bereken bande as 1/2 'n oorwinning in * persentasie gewen. */ private void printGameStats () {int wins = userScore; int verliese = rekenaarScore; int ties = numberOfGames - userScore - computerScore; dubbele persentasie Wen = (wen + ((dubbel) bande) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Druk titels System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMES SPILLED", "PERCENTAGE WEN "); // 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 ("|"); // Druk waardes System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", oorwinnings, verliese, bande, numberOfGames, percentageWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); } private leegte printDashes (int numberOfDashes) {vir (int i = 0; i <numberOfDashes; i ++) {System.out.print ("-"); }} openbare statiese leemte hoof (String args) {RockPaperScissors game = nuwe RockPaperScissors (); game.startGame (); }}

Aanbeveel: