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