Hoe maak je een steen-, papier-, schaarspel in Java (met afbeeldingen)

Inhoudsopgave:

Hoe maak je een steen-, papier-, schaarspel in Java (met afbeeldingen)
Hoe maak je een steen-, papier-, schaarspel in Java (met afbeeldingen)

Video: Hoe maak je een steen-, papier-, schaarspel in Java (met afbeeldingen)

Video: Hoe maak je een steen-, papier-, schaarspel in Java (met afbeeldingen)
Video: Importing Images as Textures in Your SketchUp Model - SketchUp Quick Tips 2024, Mei
Anonim

Rock, Paper, Scissors is een handspel dat door twee personen wordt gespeeld. Beide mensen zeiden "steen, papier, schaar" en vormden dan tegelijkertijd een van de drie objecten (steen, papier of schaar) met een uitgestrekte hand. De winnaar wordt bepaald door de handopstellingen. Schaar verslaat papier, papier verslaat steen en steen verslaat schaar. Als beide spelers dezelfde handopstelling spelen, wordt dit als gelijkspel beschouwd. We zullen een eenvoudig Java-spel schrijven om Steen, Papier, Schaar te simuleren, waarbij de ene speler de gebruiker is en de andere speler de computer.

Stappen

1585279 1 1
1585279 1 1

Stap 1. Maak de hoofdklasse en noem deze

Steen Papier Schaar

.

Dit is de klas waar we het spel gaan schrijven. Je kunt ervoor kiezen om het iets anders te noemen, zoals:

Spel

of

Hoofd

. Schrijf methodedeclaraties in voor de constructor en de hoofdmethode.

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

1585279 2 1
1585279 2 1

Stap 2. Maak een opsomming voor de handgebaren (steen, papier of schaar)

We zouden strings kunnen gebruiken om steen, papier of schaar weer te geven, maar een opsomming stelt ons in staat om onze constanten vooraf te definiëren, wat betekent dat het gebruik van de opsomming een beter ontwerp is. We noemen ons enum-type

Beweging

met de waarden

STEEN

PAPIER

en

SCHAAR

privé-enum Verplaatsen { ROTS, PAPIER, SCHAAR }

1585279 3 1
1585279 3 1

Stap 3. Maak twee privélessen

Gebruiker

en

Computer

.

Deze klassen vertegenwoordigen onze spelers in het spel. U kunt ervoor kiezen om deze lessen openbaar te maken. De

Gebruiker

class zal de klasse zijn die de gebruiker vraagt om steen, papier of schaar, dus we zullen a. moeten schrijven

getMove()

methode. De

Computer

klasse moet ook een hebben

getMove()

methode zodat de computer ook een zet kan doen. We zullen tijdelijke aanduidingen in deze methoden plaatsen en ze later implementeren. De

Gebruiker

class vereist een constructor die de. instelt

Scanner

object om de gebruikersinvoer op te nemen. We zetten de

Scanner

als een privéveld voor de gebruiker en start het vervolgens in de constructor. Aangezien we de

Scanner

class, moeten we er een importstatement voor schrijven bovenaan onze code. De

Computer

class vereist geen constructor, dus we hoeven er geen te schrijven; wanneer we beginnen met de

Computer

object, zullen we alleen de standaardconstructor aanroepen. Dit is wat onze

Steen Papier Schaar

klasse ziet er nu als volgt uit:

java.util. Scanner importeren; openbare klasse RockPaperScissors {private enum Move {ROTS, PAPIER, SCHAAR} privéklasse Gebruiker {privé Scanner inputScanner; openbare gebruiker () { inputScanner = nieuwe scanner (System.in); } public Move getMove() { // TODO: Implementeer deze methode return null; } } private class Computer { public Move getMove () { // TODO: Implementeer deze methode return null; } } public RockPaperScissors() { } public static void main(String args) { } }

1585279 4 1
1585279 4 1

Stap 4. Schrijf de

getMove()

methode voor de

Computer

klas.

Deze methode retourneert een willekeurige

Beweging

. We kunnen een array krijgen van

Beweging

opsommingen door te bellen naar de

waarden()

methode:

Verplaats.waarden()

. Een willekeurig kiezen:

Beweging

opsomming in deze waardenreeks, moeten we een willekeurige index genereren die een geheel getal is tussen 0 en de lengte van onze waardenreeks. Om dit te doen, kunnen we de

volgendeInt()

methode van de

Willekeurig

klasse waaruit we moeten importeren

java.util

. Nadat we de willekeurige index hebben gekregen, kunnen we de. retourneren

Beweging

van die index uit onze waardenreeks.

public Move getMove() { Move moves = Move.values(); Willekeurig willekeurig = nieuw willekeurig(); int index = willekeurig.nextInt(bewegingen.lengte); zet zetten terug [index]; }

1585279 5 1
1585279 5 1

Stap 5. Schrijf de

getMove()

methode voor de

Gebruiker

klas.

Deze methode retourneert a

Beweging

overeenkomt met wat de gebruiker heeft ingevoerd. We verwachten dat de gebruiker "steen", "papier" of "schaar" schrijft. Eerst moeten we de gebruiker om invoer vragen:

System.out.print("Steen, papier of schaar?")

. Gebruik dan de

volgendeLijn()

methode van de

Scanner

object om de gebruikersinvoer als een tekenreeks te krijgen. We moeten nu controleren of de gebruiker een geldige zet heeft ingediend, maar we kunnen mild zijn als de gebruiker een woord verkeerd heeft gespeld. We zullen dus alleen controleren of de eerste letter van de gebruikersinvoer ofwel "R" (voor steen), "P" (voor papier) of "S" (voor schaar) is, en we zullen ons niet druk maken over de zaak omdat we zullen eerst de gebruiken

naarHoofdletter()

methode van de

Snaar

class om de gebruikersinvoerreeks in hoofdletters te maken. Als de gebruiker geen op afstand correcte invoer heeft ingevoerd, zullen we de gebruiker opnieuw vragen. Vervolgens zullen we, afhankelijk van wat de gebruiker heeft ingevoerd, een overeenkomstige zet retourneren.

public Move getMove() { // Vraag de gebruiker System.out.print ("Rots, papier of schaar?"); // Haal de gebruikersinvoer op String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Gebruiker heeft een geldige invoerschakelaar ingevoerd (firstLetter) { case 'R': return Move. ROCK; geval 'P': retour Move. PAPER; case 'S': return Move. SCHAAR; } } // Gebruiker heeft geen geldige invoer ingevoerd. Vraag opnieuw. retourneer getMove(); }

1585279 6
1585279 6

Stap 6. Schrijf een

speel opnieuw()

methode voor de

Gebruiker

klas.

De gebruiker moet het spel steeds opnieuw kunnen spelen. Om te bepalen of de gebruiker opnieuw wil spelen, moeten we a. schrijven

speel opnieuw()

methode die een boolean retourneert die het spel vertelt of de gebruiker heeft besloten om opnieuw te spelen of niet. In deze methode gebruiken we de

Scanner

die we eerder in de constructor hadden geïnitieerd om een "Ja" of een "Nee" van de gebruiker te krijgen. We zullen alleen controleren of de eerste letter 'Y' is om te bepalen of de gebruiker opnieuw wil spelen. Elke andere invoer betekent dat de gebruiker niet meer wil spelen.

public boolean playAgain() { System.out.print("Wilt u nog een keer spelen?"); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; }

1585279 7
1585279 7

Stap 7. Sluit de. aan

Gebruiker

en

Computer

samen lessen in de

Steen Papier Schaar

klas.

Nu we klaar zijn met het schrijven van de

Gebruiker

en

Computer

klassen, kunnen we ons concentreren op het werken aan ons eigenlijke spel. Maak privévelden voor de

Gebruiker

en

Computer

lessen in de

Steen Papier Schaar

klas. We hebben toegang tot deze velden nodig om toegang te krijgen tot de

getMove()

methoden wanneer we het spel spelen. In de constructor voor de

Steen Papier Schaar

class, start deze velden. We zullen ook de score moeten bijhouden in

gebruikersscore

en

computerscore

velden, die we moeten initiëren als 0 in de constructor. We moeten ook het aantal games bijhouden, wat ook een veld zal zijn dat als 0 wordt geïnitieerd.

privé gebruiker gebruiker; privé Computercomputer; privé int userScore; privé int computerScore; privé int-nummerOfGames; public RockPaperScissors() { gebruiker = nieuwe gebruiker(); computer = nieuwe computer(); gebruikersscore = 0; computerscore = 0; numberOfGames = 0; }

1585279 8
1585279 8

Stap 8. Verleng de

Beweging

enum om een methode op te nemen die ons vertelt welke zet in elk geval wint.

We moeten een schrijven

vergelijkMoves()

methode die 0 retourneert als de zetten hetzelfde zijn, 1 als de huidige zet de andere zet verslaat, en -1 als de huidige zet verliest van de andere zet. Dit is handig om de winnaar in het spel te bepalen. Om deze methode te implementeren, zullen we eerst 0 retourneren als de zetten hetzelfde zijn en we daarom een gelijkspel hebben. Schrijf vervolgens een switch-statement voor het retourneren van 1 of -1.

privé-enum Verplaatsen { ROTS, PAPIER, SCHAAR; /** * Vergelijkt deze zet met een andere zet om een gelijkspel, een overwinning of * een verlies te bepalen. * * @param otherMove * zet om te vergelijken met * @return 1 als deze zet de andere zet verslaat, -1 als deze zet verliest van * de andere zet, 0 als deze zetten gelijk zijn */ public int CompareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == SCISSORS ? 1: -1); case PAPIER: return (otherMove == ROCK ? 1: -1); case SCISSORS: return (otherMove == PAPIER ? 1: -1); } // Zou hier nooit return 0 moeten bereiken; } }

1585279 9
1585279 9

Stap 9. Maak een

start het spel()

methode in de

Steen Papier Schaar

klas.

Deze methode zal het spelen van het spel zijn. Begin met het plaatsen van een eenvoudige

Systeem.uit.println

in de methode.

public void startGame() { System.out.println("ROTS, PAPIER, SCHAAR!"); }

1585279 10
1585279 10

Stap 10. Haal zetten van de gebruiker en de computer

In de

start het spel()

methode, gebruik de

getMove()

methoden uit de

Gebruiker

klasse en de

Computer

class om de zetten van de gebruiker en de computer te krijgen.

Verplaats userMove = gebruiker.getMove(); Verplaats computerMove = computer.getMove(); System.out.println("\nJe speelde " + userMove + "."); System.out.println("Computer gespeeld" + computerMove + ".\n");

1585279 11
1585279 11

Stap 11. Vergelijk de twee zetten en bepaal of de gebruiker heeft gewonnen of de computer heeft gewonnen

Gebruik de

vergelijkMoves()

methode van de

Beweging

enum om te bepalen of de gebruiker heeft gewonnen of niet. Als de gebruiker heeft gewonnen, verhoogt u de gebruikersscore met 1. Als de gebruiker heeft verloren, verhoogt u de computerscore met 1. Als er een gelijkspel was, verhoogt u geen van de scores. Verhoog vervolgens het aantal gespeelde games met één.

int CompareMoves = userMove.compareMoves(computerMove); switch (vergelijkMoves) { case 0: // Tie System.out.println ("Tie!"); pauze; geval 1: // Gebruiker wint System.out.println (userMove + " beats " + computerMove + ". Jij hebt gewonnen!"); gebruikersscore++; pauze; case -1: // Computer wint System.out.println (computerMove + " beats " + userMove + ". Je hebt verloren."); computerScore++; pauze; } aantalOfGames++;

1585279 12
1585279 12

Stap 12. Vraag of de gebruiker opnieuw wil spelen

Als de gebruiker opnieuw wil spelen, bel

start het spel()

opnieuw. Bel anders

printGameStats()

die de statistieken van het spel zal afdrukken. We zullen deze methode in de volgende stap schrijven.

if (user.playAgain()) { System.out.println(); start het spel(); } else { printGameStats(); }

1585279 13
1585279 13

Stap 13. Schrijf de

printGameStats()

methode.

Deze methode geeft de statistieken van het spel weer: aantal overwinningen, aantal verliezen, aantal gelijke spelen, aantal gespeelde games en percentage gewonnen games door de gebruiker. Het percentage gewonnen games wordt berekend door de (# overwinningen + (# gelijkspel/2))/(# gespeelde games). Deze methode gebruikt

Systeem.uit.printf

om opgemaakte tekst af te drukken.

private void printGameStats() {int wins = userScore; int verliezen = computerScore; int ties = numberOfGames - userScore - computerScore; dubbel percentageWon = (wint + ((dubbel) gelijkspel) / 2) / numberOfGames; // Lijnsysteem.uit.print("+"); printDashes(68); Systeem.uit.println("+"); // Print titels System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "WINS", "VERLIES", "TIES", "GAMES PLAYED", "PERCENTAGE WON"); // Line System.out.print("|"); printDashes(10); Systeem.uit.print("+"); printDashes(10); Systeem.uit.print("+"); printDashes(10); Systeem.uit.print("+"); printDashes(16); Systeem.uit.print("+"); printDashes(18); Systeem.uit.println("|"); // Waarden afdrukken System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", overwinningen, verliezen, gelijkspel, numberOfGames, percentageWon * 100); // Lijnsysteem.uit.print("+"); printDashes(68); Systeem.uit.println("+"); }

1585279 14
1585279 14

Stap 14. Start het spel in de hoofdklasse

Initialiseer in de hoofdklasse een instantie van de

Steen Papier Schaar

klas en bel de

start het spel()

methode.

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

1585279 15
1585279 15

Stap 15. Test je spel

Nu we alle moeite hebben gedaan om het spel Steen, papier, schaar te schrijven, is het tijd om alles te compileren en uit te testen!

Voorbeeldprogramma

import java.util. Random; java.util. Scanner importeren; openbare klasse RockPaperScissors { privégebruiker; privé Computercomputer; privé int userScore; privé int computerScore; privé int-nummerOfGames; privé-enum Verplaatsen { ROTS, PAPIER, SCHAAR; /** * Vergelijkt deze zet met een andere zet om een gelijkspel, een overwinning of * een verlies te bepalen. * * @param otherMove * zet om te vergelijken met * @return 1 als deze zet de andere zet verslaat, -1 als deze zet verliest van * de andere zet, 0 als deze zetten gelijk zijn */ public int CompareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == SCISSORS ? 1: -1); case PAPIER: return (otherMove == ROCK ? 1: -1); case SCISSORS: return (otherMove == PAPIER ? 1: -1); } // Zou hier nooit retour 0 moeten bereiken; } } privéklasse Gebruiker { privé Scanner inputScanner; openbare gebruiker () { inputScanner = nieuwe scanner (System.in); } public Move getMove() { // Vraag de gebruiker System.out.print("Rots, papier of schaar? "); // Haal de gebruikersinvoer op String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Gebruiker heeft een geldige invoerschakelaar ingevoerd (firstLetter) { case 'R': return Move. ROCK; geval 'P': retour Move. PAPER; case 'S': return Move. SCHAAR; } } // Gebruiker heeft geen geldige invoer ingevoerd. Nogmaals vragen. retourneer getMove(); } public boolean playAgain() { System.out.print("Wilt u nog een keer spelen?"); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; } } private class Computer { public Move getMove() { Move moves = Move.values(); Willekeurig willekeurig = nieuw willekeurig(); int index = willekeurig.nextInt(bewegingen.lengte); zet zetten terug [index]; } } public RockPaperScissors() { gebruiker = nieuwe gebruiker(); computer = nieuwe computer(); gebruikersscore = 0; computerscore = 0; numberOfGames = 0; } public void startGame() { System.out.println("ROTS, PAPIER, SCHAAR!"); // Krijg zetten Move userMove = user.getMove(); Verplaats computerMove = computer.getMove(); System.out.println("\nJe speelde " + userMove + "."); System.out.println("Computer gespeeld" + computerMove + ".\n"); // Vergelijk zetten en bepaal winnaar int CompareMoves = userMove.compareMoves(computerMove); switch (vergelijkMoves) { case 0: // Tie System.out.println ("Tie!"); pauze; geval 1: // Gebruiker wint System.out.println (userMove + " beats " + computerMove + ". Jij hebt gewonnen!"); gebruikersscore++; pauze; case -1: // Computer wint System.out.println (computerMove + " beats " + userMove + ". Je hebt verloren."); computerScore++; pauze; } aantalOfGames++; // Vraag de gebruiker om opnieuw te spelen if (user.playAgain()) { System.out.println(); start het spel(); } else { printGameStats(); } } /** * Drukt de statistieken van het spel af. Berekent gelijkspel als 1/2 winst in * percentage gewonnen. */ private void printGameStats() {int wins = userScore; int verliezen = computerScore; int ties = numberOfGames - userScore - computerScore; dubbel percentageWon = (wint + ((dubbel) gelijkspel) / 2) / numberOfGames; // Lijnsysteem.uit.print("+"); printDashes(68); Systeem.uit.println("+"); // Print titels System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "WINS", "VERLIES", "TIES", "GAMES PLAYED", "PERCENTAGE WON"); // Line System.out.print("|"); printDashes(10); Systeem.uit.print("+"); printDashes(10); Systeem.uit.print("+"); printDashes(10); Systeem.uit.print("+"); printDashes(16); Systeem.uit.print("+"); printDashes(18); Systeem.uit.println("|"); // Waarden afdrukken System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", overwinningen, verliezen, gelijkspel, numberOfGames, percentageWon * 100); // Lijnsysteem.uit.print("+"); printDashes(68); Systeem.uit.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(); spel.startGame(); } }

Aanbevolen: