Come creare un gioco di sassi, carta e forbici in Java (con immagini)

Sommario:

Come creare un gioco di sassi, carta e forbici in Java (con immagini)
Come creare un gioco di sassi, carta e forbici in Java (con immagini)

Video: Come creare un gioco di sassi, carta e forbici in Java (con immagini)

Video: Come creare un gioco di sassi, carta e forbici in Java (con immagini)
Video: 5 Tecniche: sfondi nel rendering con V-Ray?!? 2024, Maggio
Anonim

Sasso, carta, forbici è un gioco di mani giocato da due persone. Entrambe le persone direbbero "sasso, carta, forbici" e poi formeranno contemporaneamente uno dei tre oggetti (sasso, carta o forbici) con una mano tesa. Il vincitore è determinato dalle formazioni della mano. Le forbici battono la carta, la carta batte il sasso e il sasso batte le forbici. Se entrambi i giocatori giocano la stessa formazione di mano, è considerato un pareggio. Scriveremo un semplice gioco in Java per simulare Sasso, Carta, Forbici in cui un giocatore è l'utente e l'altro giocatore è il computer.

Passi

1585279 1 1
1585279 1 1

Passaggio 1. Crea la classe principale e chiamala

Sasso carta forbici

.

Questa sarà la classe in cui scriveremo il gioco. Puoi scegliere di chiamarlo qualcos'altro come

Gioco

o

Principale

. Scrivere nelle dichiarazioni di metodo per il costruttore e il metodo principale.

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

1585279 2 1
1585279 2 1

Passaggio 2. Creare un'enumerazione per i gesti delle mani (sasso, carta o forbici)

Potremmo usare le stringhe per rappresentare sasso, carta o forbici, ma un'enumerazione ci consente di predefinire le nostre costanti, il che significa che l'uso dell'enumerazione è un design migliore. Chiameremo il nostro tipo enum

Spostare

con i valori

MUSICA ROCK

CARTA

e

FORBICI

enum privato Move { ROCCIA, CARTA, FORBICI }

1585279 3 1
1585279 3 1

Passaggio 3. Crea due lezioni private

Utente

e

Computer

.

Queste classi rappresenteranno i nostri giocatori nel gioco. Puoi scegliere di rendere pubbliche queste classi. Il

Utente

class sarà la classe che richiede all'utente sasso, carta o forbici, quindi dovremo scrivere a

getMove()

metodo. Il

Computer

la classe dovrà anche avere un

getMove()

metodo in modo che anche il computer possa fare una mossa. Metteremo dei segnaposto in questi metodi e li implementeremo in seguito. Il

Utente

la classe richiederà un costruttore che configuri il

Scanner

oggetto per accettare l'input dell'utente. Metteremo il

Scanner

come campo privato per l'utente e quindi avviarlo nel costruttore. Dal momento che stiamo usando il

Scanner

class, dobbiamo scrivere un'istruzione di importazione per esso all'inizio del nostro codice. Il

Computer

la classe non richiede un costruttore, quindi non è necessario scriverne uno; quando iniziamo il

Computer

oggetto, chiameremo semplicemente il costruttore predefinito. Ecco cosa è il nostro

Sasso carta forbici

la classe si presenta come ora:

import java.util. Scanner; public class RockPaperScissors { private enum Move { ROCK, PAPER, SCISSORS } private class User { private Scanner inputScanner; public User() { inputScanner = new Scanner(System.in); } public Move getMove() { // DA FARE: implementare questo metodo return null; } } private class Computer { public Move getMove() { // DA FARE: implementare questo metodo return null; } } public RockPaperScissors() { } public static void main(String args) { } }

1585279 4 1
1585279 4 1

Passaggio 4. Scrivi il

getMove()

metodo per il

Computer

classe.

Questo metodo restituirà un random

Spostare

. Possiamo ottenere una serie di

Spostare

enumerazioni chiamando il

valori()

metodo:

Sposta.valori()

. Per scegliere un casuale

Spostare

enumerazione in questo array di valori, dobbiamo generare un indice casuale che sia un numero intero compreso tra 0 e la lunghezza del nostro array di valori. Per fare questo, possiamo usare il

nextInt()

metodo del

A caso

classe da cui dobbiamo importare

java.util

. Dopo aver ottenuto l'indice casuale, possiamo restituire il

Spostare

di quell'indice dal nostro array di valori.

public Move getMove() { Move move = Move.values(); Casuale casuale = nuovo Casuale(); int indice = random.nextInt(moves.length); return mosse[indice]; }

1585279 5 1
1585279 5 1

Passaggio 5. Scrivi il

getMove()

metodo per il

Utente

classe.

Questo metodo restituirà a

Spostare

corrispondente a ciò che l'utente ha inserito. Ci aspetteremo che l'utente scriva "sasso", "carta" o "forbici". Per prima cosa, dobbiamo richiedere all'utente un input:

System.out.print("Roccia, carta o forbici?")

. Quindi usa il

nextLine()

metodo del

Scanner

oggetto per ottenere l'input dell'utente come stringa. Ora dobbiamo controllare se l'utente ha inviato una mossa valida, ma possiamo essere clementi se l'utente ha sbagliato a scrivere una parola. Quindi controlleremo solo se la prima lettera dell'input dell'utente è "R" (per sasso), "P" (per carta) o "S" (per forbici), e non ci preoccuperemo del caso perché useremo prima il

in maiuscolo()

metodo del

Corda

class per rendere la stringa di input dell'utente tutta maiuscola. Se l'utente non ha inserito un input remoto corretto, chiederemo nuovamente all'utente. Quindi, a seconda di ciò che l'utente ha inserito, restituiremo una mossa corrispondente.

public Move getMove() { // Richiede all'utente System.out.print("Rock, paper, or forbici? "); // Ottieni l'input dell'utente String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // L'utente ha inserito uno switch di input valido (firstLetter) { case 'R': return Move. ROCK; caso 'P': return Move. PAPER; caso 'S': return Move. FORBICI; } } // L'utente non ha inserito un input valido. Chiedi di nuovo. return getMove(); }

1585279 6
1585279 6

Passaggio 6. Scrivi a

Gioca di nuovo()

metodo per il

Utente

classe.

L'utente dovrebbe essere in grado di giocare più e più volte. Per determinare se l'utente vuole giocare di nuovo, dobbiamo scrivere a

Gioca di nuovo()

metodo che restituisce un booleano che dice al gioco se l'utente ha deciso di giocare di nuovo o meno. In questo metodo, stiamo usando il

Scanner

che avevamo precedentemente avviato nel costruttore per ottenere un "Sì" o un "No" dall'utente. Controlleremo solo se la prima lettera è "Y" per determinare se l'utente vuole giocare di nuovo. Qualsiasi altro input significherà che l'utente non vuole più giocare.

public boolean playAgain() { System.out.print("Vuoi giocare di nuovo? "); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'S'; }

1585279 7
1585279 7

Passaggio 7. Collegare il

Utente

e

Computer

classi insieme nel

Sasso carta forbici

classe.

Ora che abbiamo finito di scrivere il

Utente

e

Computer

classi, possiamo concentrarci sul lavoro sul nostro gioco reale. Crea campi privati per il

Utente

e

Computer

classi nel

Sasso carta forbici

classe. Avremo bisogno di accedere a questi campi per accedere al

getMove()

metodi quando stiamo giocando. Nel costruttore per il

Sasso carta forbici

classe, avviare questi campi. Dovremo anche tenere traccia del punteggio in

punteggio utente

e

punteggio del computer

field, che dobbiamo avviare come 0 nel costruttore. Dobbiamo anche tenere traccia del numero di partite, che sarà anche un campo iniziato come 0.

utente Utente privato; computer privato; punteggio utente int privato; punteggio computer int privato; private int numberOfGames; public RockPaperScissors() { utente = nuovo utente(); computer = nuovo Computer(); punteggio utente = 0; computerScore = 0; numeroGiochi = 0; }

1585279 8
1585279 8

Passaggio 8. Estendi il

Spostare

enum per includere un metodo che ci dice quale mossa vince in ogni caso.

Dobbiamo scrivere a

confrontaMosse()

metodo che restituisce 0 se le mosse sono le stesse, 1 se la mossa corrente batte l'altra mossa e -1 se la mossa corrente perde contro l'altra mossa. Questo sarà utile per determinare il vincitore nel gioco. Per implementare questo metodo, restituiremo prima 0 se le mosse sono le stesse e quindi abbiamo un pareggio. Quindi scrivi un'istruzione switch per restituire 1 o -1.

enum privato Move { ROCCIA, CARTA, FORBICI; /** * Confronta questa mossa con un'altra mossa per determinare un pareggio, una vittoria o * una perdita. * * @param otherMove * sposta per confrontare * @return 1 se questa mossa batte l'altra mossa, -1 se questa mossa perde * l'altra mossa, 0 se queste mosse pareggiano */ public int compareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == FORBICI ? 1: -1); case PAPER: return (otherMove == ROCK ? 1: -1); case FORBICI: return (otherMove == PAPER ? 1: -1); } // Non dovrebbe mai arrivare qui return 0; } }

1585279 9
1585279 9

Passaggio 9. Crea un

inizia il gioco()

metodo nel

Sasso carta forbici

classe.

Questo metodo sarà il gioco. Inizia mettendo un semplice

System.out.println

nel metodo.

public void startGame() { System.out.println("ROCCIA, CARTA, FORBICI!"); }

1585279 10
1585279 10

Passaggio 10. Ottieni mosse dall'utente e dal computer

Nel

inizia il gioco()

metodo, usa il

getMove()

metodi dal

Utente

classe e il

Computer

classe per ottenere le mosse dell'utente e del computer.

Sposta userMove = user.getMove(); Sposta computerMove = computer.getMove(); System.out.println("\nHai giocato " + userMove + "."); System.out.println("Il computer ha riprodotto " + computerMove + ".\n");

1585279 11
1585279 11

Passaggio 11. Confronta le due mosse e determina se ha vinto l'utente o se ha vinto il computer

Utilizzare il

confrontaMosse()

metodo dal

Spostare

enum per determinare se l'utente ha vinto o meno. Se l'utente ha vinto, incrementa il punteggio dell'utente di 1. Se l'utente ha perso, incrementa il punteggio del computer di 1. Se c'è stato un pareggio, non incrementare nessuno dei punteggi. Quindi incrementa di uno il numero di partite giocate.

int compareMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Tie System.out.println("Tie!"); rottura; caso 1: // L'utente vince System.out.println(userMove + " batte " + computerMove + ". Hai vinto!"); punteggio utente++; rottura; case -1: // Il computer vince System.out.println(computerMove + " batte " + userMove + ". Hai perso."); computerScore++; rottura; } numeroDiGiochi++;

1585279 12
1585279 12

Passaggio 12. Chiedi se l'utente desidera giocare di nuovo

Se l'utente vuole giocare di nuovo, chiama

inizia il gioco()

ancora. Altrimenti chiama

printGameStats()

che stamperà le statistiche del gioco. Scriveremo questo metodo nel passaggio successivo.

if (user.playAgain()) { System.out.println(); inizia il gioco(); } else { printGameStats(); }

1585279 13
1585279 13

Passaggio 13. Scrivi il

printGameStats()

metodo.

Questo metodo mostrerà le statistiche del gioco: numero di vittorie, numero di sconfitte, numero di pareggi, numero di partite giocate e percentuale di partite vinte dall'utente. La percentuale di partite vinte è calcolata da (# vittorie + (# pareggi/2))/(# partite giocate). Questo metodo utilizza

System.out.printf

per stampare il testo formattato.

private void printGameStats() { int vince = userScore; int perdite = computerScore; int ties = numberOfGames - userScore - computerScore; doppia percentuale vinta = (vince + ((doppio) pareggi) / 2) / numberOfGames; // Riga System.out.print("+"); printDash(68); System.out.println("+"); // Stampa i titoli System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "VITTORIE", "PERDITE", "PARAGI", "GIOCATE GIOCATE", "PERCENTUALE HA VINTO"); // Riga System.out.print("|"); printDash(10); System.out.print("+"); printDash(10); System.out.print("+"); printDash(10); System.out.print("+"); printDash(16); System.out.print("+"); printDash(18); System.out.println("|"); // Stampa i valori System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", vittorie, sconfitte, pareggi, numberOfGames, percentWon * 100); // Riga System.out.print("+"); printDash(68); System.out.println("+"); }

1585279 14
1585279 14

Passaggio 14. Avvia il gioco nella classe principale

Nella classe principale, inizializza un'istanza di

Sasso carta forbici

classe e chiama il

inizia il gioco()

metodo.

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

1585279 15
1585279 15

Passaggio 15. Prova il tuo gioco

Ora che abbiamo passato tutto lo sforzo di scrivere il gioco Sasso, Carta, Forbici, è tempo di compilare e testare tutto!

Programma di esempio

import java.util. Random; import java.util. Scanner; public class RockPaperScissors { utente utente privato; computer privato; punteggio utente int privato; punteggio computer int privato; private int numberOfGames; enum privato Move { ROCCIA, CARTA, FORBICI; /** * Confronta questa mossa con un'altra mossa per determinare un pareggio, una vittoria o * una perdita. * * @param otherMove * sposta per confrontare * @return 1 se questa mossa batte l'altra mossa, -1 se questa mossa perde * l'altra mossa, 0 se queste mosse pareggiano */ public int compareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == FORBICI ? 1: -1); case PAPER: return (otherMove == ROCK ? 1: -1); case FORBICI: return (otherMove == PAPER ? 1: -1); } // Non dovrebbe mai arrivare qui return 0; } } private class Utente { private Scanner inputScanner; public User() { inputScanner = new Scanner(System.in); } public Move getMove() { // Richiede all'utente System.out.print("Rock, paper, or forbici? "); // Ottieni l'input dell'utente String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // L'utente ha inserito uno switch di input valido (firstLetter) { case 'R': return Move. ROCK; caso 'P': return Move. PAPER; caso 'S': return Move. FORBICI; } } // L'utente non ha inserito un input valido. Chiedi di nuovo. return getMove(); } public boolean playAgain() { System.out.print("Vuoi giocare di nuovo? "); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'S'; } } classe privata Computer { public Move getMove() { Move move = Move.values(); Casuale casuale = nuovo Casuale(); int indice = random.nextInt(moves.length); return mosse[indice]; } } pubblico RockPaperScissors() { utente = nuovo utente (); computer = nuovo Computer(); punteggio utente = 0; computerScore = 0; numeroGiochi = 0; } public void startGame() { System.out.println("ROCCIA, CARTA, FORBICI!"); // Ottieni le mosse Move userMove = user.getMove(); Sposta computerMove = computer.getMove(); System.out.println("\nHai giocato " + userMove + "."); System.out.println("Il computer ha riprodotto " + computerMove + ".\n"); // Confronta le mosse e determina il vincitore int compareMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Tie System.out.println("Tie!"); rottura; caso 1: // L'utente vince System.out.println(userMove + " batte " + computerMove + ". Hai vinto!"); punteggio utente++; rottura; case -1: // Il computer vince System.out.println(computerMove + " batte " + userMove + ". Hai perso."); computerScore++; rottura; } numeroDiGiochi++; // Chiedi all'utente di giocare di nuovo if (user.playAgain()) { System.out.println(); inizia il gioco(); } else { printGameStats(); } } /** * Stampa le statistiche del gioco. Calcola i pareggi come 1/2 vittoria in * percentuale vinta. */ private void printGameStats() { int vince = userScore; int perdite = computerScore; int ties = numberOfGames - userScore - computerScore; doppia percentuale vinta = (vince + ((doppio) pareggi) / 2) / numberOfGames; // Riga System.out.print("+"); printDash(68); System.out.println("+"); // Stampa i titoli System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "VITTORIE", "PERDITE", "PARAGI", "GIOCATE GIOCATE", "PERCENTUALE HA VINTO"); // Riga System.out.print("|"); printDash(10); System.out.print("+"); printDash(10); System.out.print("+"); printDash(10); System.out.print("+"); printDash(16); System.out.print("+"); printDash(18); System.out.println("|"); // Stampa i valori System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", vittorie, sconfitte, pareggi, numberOfGames, percentWon * 100); // Riga System.out.print("+"); printDash(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(); } }

Consigliato: