How.com.vn è una "wiki"; questo significa che molti dei nostri articoli sono il risultato della collaborazione di più autori. Per creare questo articolo, 13 persone, alcune in forma anonima, hanno collaborato apportando nel tempo delle modifiche per migliorarlo.
Questo articolo è stato visualizzato 7 788 volte
Sasso, carta, forbici è un gioco che si esegue fra due persone utilizzando le mani. Entrambi i giocatori dovranno pronunciare la formula “Sasso, carta, forbici”, dopodiché simultaneamente sceglieranno e faranno con una mano uno dei tre oggetti disponibili nel gioco (appunto sasso, carta o forbici). Il vincitore verrà determinato in base alla combinazione di oggetti risultante. Le forbici battono la carta, il sasso batte le forbici, e la carta batte il sasso. Se entrambi i giocatori hanno scelto lo stesso oggetto, il turno di gioco viene considerato in parità. Questo tutorial mostra come scrivere un programma in Java che replichi le dinamiche di questo gioco. Un giocatore sarà rappresentato dall'utente, mentre il secondo verrà controllato dal computer.
Passaggi
- 1Crea la classe principale del programma e chiamala
RockPaperScissors
. Questa sarà la classe principale dove inseriremo il codice dell'intero programma. Puoi scegliere un nome diverso per questa classe, come ad esempioGame
oMain
. Scrivi al suo interno la dichiarazione dei metodi relativi al costruttore e al metodo principale “main”.public class RockPaperScissors { public RockPaperScissors() { } public static void main(String[] args) { }}
- 2Crea un'enumerazione che descriva i tre oggetti presenti nel gioco (sasso, carta, forbici). Potremmo usare tre semplici stringhe per rappresentare il sasso, la carta e le forbici, ma un'enumerazione ci permette di definire le nostre costanti; utilizzare un'enumerazione è dunque una scelta migliore a livello di progettazione del codice. La nostra enumerazione chiamata
Move
avrà i seguenti valori:ROCK
(sasso),PAPER
(carta) eSCISSORS
(forbici).private enum Move { ROCK, PAPER, SCISSORS}
- 3Crea due classi di tipo “private”, una chiamata
User
e l'altraComputer
. Queste classi rappresentano i giocatori che si affrontano nel gioco reale. Se lo desideri puoi scegliere di dichiarare queste classi come “public”. La classeUser
è quella che chiederà all'utente di scegliere l'oggetto della sua mossa fra sasso, carta o forbici, quindi avremo la necessità di scrivere il metodogetMove()
per eseguire la nostra mossa. Anche la classeComputer
avrà la necessità di avere un metodogetMove()
, perché anche il computer dovrà eseguire la sua mossa. Il codice di questi due metodi lo implementeremo in seguito, per il momento ci limiteremo alla loro dichiarazione. La classeUser
richiede un costruttore che crei l'oggettoScanner
adibito a leggere l'input dell'utente. Il campoScanner
verrà dichiarato come privato per la classe “User” e verrà inizializzato all'interno del costruttore della classe. Dato che stiamo utilizzando la classe predefinita di Java,Scanner
, avremo la necessità di importarla nel nostro programma inserendo la relativa linea di “import” all'inizio del nostro codice. La classeComputer
non richiede l'uso di un costruttore, quindi non dovremo scrivere codice per questo elemento. Quando inizializzeremo l'oggettoComputer
, Java utilizzerà il costruttore predefinito. Di seguito trovi il codice della nostra classeRockPaperScissors
scritto fino ad 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() { // Codice del metodo da implementare in seguito return null; } } private class Computer { public Move getMove() { // Codice del metodo da implementare in seguito return null; } } public RockPaperScissors() { } public static void main(String[] args) { }}
- 4Crea il metodo
getMove()
relativo alla classeComputer
. Questo metodo restituirà il valore di una mossa casuale scelta all'interno dell'enumerazioneMove
. Possiamo creare un “array” di enumerazioniMove
richiamando il metodovalues()
in questo modo:Move.values()
. Per scegliere un'enumerazioneMove
casuale fra quelle presenti nel nostro “array” abbiamo la necessità di generare un indice casuale, che sarà rappresentato da un intero compreso fra 0 e il numero di tutti gli elementi contenuti nel nostro “array”. Per fare questo possiamo utilizzare il metodonextInt()
della classeRandom
che possiamo importare dal packagejava.util
. Dopo aver ottenuto l'indice casuale, possiamo restituire il valore dell'enumerazioneMove
corrispondente, presente all'interno del nostro “array”.public Move getMove() { Move[] moves = Move.values(); Random random = new Random(); int index = random.nextInt(moves.length); return moves[index];}
- 5Scrivi il codice del metodo
getMove()
per la classeUser
. Questo metodo dovrà restituire il valore corrispondente alla mossa inserita dall'utente. Ci aspettiamo che l'utente scriva uno dei seguenti valori: “sasso”, “carta” o “forbici”. Il primo passo consiste nel chiedere all'utente di inserire un valore. Per farlo utilizziamo il seguente codice:System.out.print("Sasso, carta o forbici?")
. Dopodiché utilizziamo il metodonextLine()
dell'oggettoScanner
per leggere l'input dell'utente e memorizzarlo in un oggetto di tipo “string”. Adesso dobbiamo controllare se l'utente ha inserito una mossa valida, pur rimanendo indulgenti nel caso di un errore di battitura. Quindi ci limiteremo a verificare che la prima lettera digitata corrisponda a “S” (nel caso del “sasso”), “C” (nel caso della “carta”) o “F” (nel caso delle “forbici”). Non ci preoccupiamo che l'utente abbia digitato una lettera maiuscola o minuscola, dato che utilizzeremo il metodotoUpperCase()
della classeString
per rendere maiuscoli tutti i caratteri inseriti dell'utente. Se l'utente non ha inserito una mossa valida, gli chiederemo nuovamente di eseguire la sua mossa. Dopodiché, in base all'input dell'utente, restituiremo il valore corrispondente alla mossa scelta.public Move getMove() { // Chiediamo l'input all'utente System.out.print("Sasso, carta o forbici? "); // Leggiamo l'input inserito dall'utente String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'S' || firstLetter == 'C' || firstLetter == 'F') { // Validiamo l'input inserito dall'utente switch (firstLetter) { case 'S': return Move.ROCK; case 'C': return Move.PAPER; case 'F': return Move.SCISSORS; } } // L'utente non ha inserito una mossa valida, chiediamo nuovamente di inserire una mossa return getMove();}
- 6Scrivi il metodo
playAgain()
per la classeUser
. L'utente dovrà essere in grado di giocare all'infinito. Per poter determinare se l'utente desidera giocare ancora, abbiamo la necessità di scrivere il metodoplayAgain()
che dovrà restituire un valore booleano in grado di rivelarci se l'utente vuole proseguire nel gioco oppure no. All'interno di questo metodo, utilizzeremo l'oggettoScanner
che abbiamo precedentemente creato nel costruttore della classe “User” per ottenere dall'utente un “Sì” o un “No”. Anche in questo caso controlleremo solo se la prima lettera inserita è una “Y”, per determinare se l'utente desidera giocare ancora. Qualsiasi altro carattere, numero o simbolo inserito corrisponderà alla volontà del giocatore di interrompere il gioco.public boolean playAgain() { System.out.print("Desideri giocare ancora? "); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y';}
- 7Collega insieme le classi
User
eComputer
all'interno della classeRockPaperScissors
. Adesso che abbiamo terminato di scrivere il codice delle classiUser
eComputer
, possiamo focalizzarci sul codice del gioco vero e proprio. All'interno della classeRockPaperScissors
, dichiara due oggetti privati, uno di tipoUser
e uno di tipoComputer
. Durante l'esecuzione del gioco, avremo la necessità di accedere ai due metodigetMove()
delle rispettive classi “User” e “Computer”. Questi due oggetti verranno inizializzati all'interno del costruttore della classeRockPaperScissors
. Avremo anche la necessità di tenere traccia del punteggio. Per farlo utilizzeremo i campiuserScore
ecomputerScore
che inizializzeremo a 0 all'interno del costruttore della classe. Infine, avremo l'ulteriore necessità di tenere traccia del numero di partite il cui camponumberOfGames
verrà inizializzato a 0 all'interno del costruttore della classe.private User user;private Computer computer;private int userScore;private int computerScore;private int numberOfGames;public RockPaperScissors() { user = new User(); computer = new Computer(); userScore = 0; computerScore = 0; numberOfGames = 0;}
- 8Estendi l'enumerazione
Move
in modo che includa il metodo che ci dica quale sia la mossa vincente di ogni turno di gioco. Per farlo dobbiamo scrivere il metodocompareMoves()
che restituisce il valore 0 se le mosse sono uguali, 1 se la mossa attuale batte la precedente e -1 se la mossa precedente batte l'attuale. Questo schema ci è utile per determinare chi sarà il vincitore del gioco. Nell'implementazione di questo metodo, per prima cosa, restituiremo il valore 0 se le mosse sono uguali e ci troviamo quindi in una situazione di parità. Dopodiché scriveremo il blocco di codice relativo alla restituzione dei valori 1 e -1.private enum Move { ROCK, PAPER, SCISSORS; /** * Confrontiamo la mossa corrente con la mossa precedente per determinare se è un pareggio, se * vince o se perde * * @parametro otherMove * per eseguire il confronto * @return 1 se questa mossa batte l'altra, -1 se questa mossa viene battuta dall'altra * 0 se si tratta di un pareggio */ public int compareMoves(Move otherMove) { // Caso di parità if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == SCISSORS ? 1 : -1); case PAPER: return (otherMove == ROCK ? 1 : -1); case SCISSORS: return (otherMove == PAPER ? 1 : -1); } // Il programma non dovrebbe mai raggiungere questo punto return 0; }}
- 9All'interno della classe
RockPaperScissors
, crea il metodostartGame()
. Questo è il metodo che permette di giocare al nostro gioco. Inizia il codice del metodo semplicemente inserendo la seguente lineaSystem.out.println
.public void startGame() { System.out.println("Sasso, Carta, Forbici!");}
- 10Leggi le mosse eseguite dall'utente e dal computer. All'interno del metodo
startGame()
, richiama il metodogetMove()
delle classiUser
eComputer
. In questo modo farai eseguire una mossa all'utente e una al computer.Move userMove = user.getMove();Move computerMove = computer.getMove();System.out.println("\nHai giocato " + userMove + ".");System.out.println("Il computer ha giocato " + computerMove + ".\n");
- 11Confronta le due mosse scelte per determinare chi ha vinto il turno fra l'utente e il computer. Per farlo utilizza il metodo
compareMoves()
dell'enumerazioneMove
. Se è l'utente a vincere, incrementa di 1 il suo punteggio. Se l'utente ha perso, incrementa di 1 il punteggio del computer. Se si tratta di un pareggio, non modificare i punteggi dei giocatori. Al termine del confronto incrementa di 1 il numero di partite giocate.int compareMoves = userMove.compareMoves(computerMove);switch (compareMoves) {case 0: // Pareggio System.out.println("Pareggio!"); break;case 1: // Vince l'utente System.out.println(userMove + " batte " + computerMove + ". Hai vinto!"); userScore++; break;case -1: // Vince il computer System.out.println(computerMove + " batte " + userMove + ". Hai perso."); computerScore++; break;}numberOfGames++;
- 12Chiedi all'utente se desidera giocare ancora. In caso affermativo, richiama nuovamente il metodo
startGame()
. In caso negativo richiama il metodoprintGameStats()
per stampare a video le statistiche della partita. Creeremo questo metodo nel prossimo passaggio.if (user.playAgain()) { System.out.println(); startGame();} else { printGameStats();}
- 13Scrivi il codice del metodo
printGameStats()
. Questo metodo deve stampare a video le statistiche della partita: numero di vittorie, numero di sconfitte, numero di pareggi, numero di turni giocati e percentuale di turni vinti dall'utente. La percentuale di vittorie viene calcolato in questo modo (# di vittorie + (# numero di pareggi / 2)) / (# di turni giocati). Questo metodo utilizza il codiceSystem.out.printf
per visualizzare a video il testo formattato.private void printGameStats() { int wins = userScore; int losses = computerScore; int ties = numberOfGames - userScore - computerScore; double percentageWon = (wins + ((double) ties) / 2) / numberOfGames; // Stampa le linee System.out.print("+"); printDashes(68); System.out.println("+"); // Stampa i titoli System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "VITTORIE", "SCONFITTE", "PAREGGI", "PARTITE GIOCATE", "PERCENTUALE DI VITTORIE"); // Stampa le linee 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("|"); // Stampa i valori delle statistiche System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", wins, losses, ties, numberOfGames, percentageWon * 100); // Stampa la linea di chiusura System.out.print("+"); printDashes(68); System.out.println("+");}
- 14All'interno della classe “main” scrivi il codice per dare inizio al gioco. All'interno della classe “main” verrà inizializzata un'istanza della classe
RockPaperScissors
e verrà richiamato il metodostartGame()
.public static void main(String[] args) { RockPaperScissors game = new RockPaperScissors(); game.startGame();}
- 15Esegui un test del tuo programma. Adesso abbiamo terminato di scrivere tutto il codice relativo al nostro programma che replica il gioco “Sasso, carta, forbici”. È tempo di compilare e verificare che tutto funzioni correttamente.Pubblicità
Programma di Esempio
import java.util.Random;import java.util.Scanner;public class RockPaperScissors { private User user; private Computer computer; private int userScore; private int computerScore; private int numberOfGames; private enum Move { ROCK, PAPER, SCISSORS; /** * Confrontiamo la mossa corrente con la mossa precedente per determinare se è un pareggio, se * vince o se perde * * @parametro otherMove * per eseguire il confronto * @return 1 se questa mossa batte l'altra, -1 se questa mossa viene battuta dall'altra * 0 se si tratta di un pareggio */ public int compareMoves(Move otherMove) { // Pareggio if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == SCISSORS ? 1 : -1); case PAPER: return (otherMove == ROCK ? 1 : -1); case SCISSORS: return (otherMove == PAPER ? 1 : -1); } // Il programma non dovrebbe mai raggiungere questo punto return 0; } } private class User { private Scanner inputScanner; public User() { inputScanner = new Scanner(System.in); } public Move getMove() { // Chiedi all'utente di eseguire una mossa System.out.print("Sasso, carta o forbici? "); // Leggi l'input dell'utente String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'S' || firstLetter == 'C' || firstLetter == 'F') { // User has entered a valid input switch (firstLetter) { case 'S': return Move.ROCK; case 'C': return Move.PAPER; case 'F': return Move.SCISSORS; } } // L'utente non ha inserito una mossa valida. Richiedi l'inserimento di una nuova mossa. return getMove(); } public boolean playAgain() { System.out.print("Vuoi giocare ancora? "); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; } } private class Computer { public Move getMove() { Move[] moves = Move.values(); Random random = new Random(); int index = random.nextInt(moves.length); return moves[index]; } } public RockPaperScissors() { user = new User(); computer = new Computer(); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame() { System.out.println("SASSO, CARTA, FORBICI!"); // Esegui le mosse Move userMove = user.getMove(); Move computerMove = computer.getMove(); System.out.println("\nHai giocato " + userMove + "."); System.out.println("Il Computer ha giocato " + computerMove + ".\n"); // Confronta le mosse fatte per determinare il vincitore int compareMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Pareggio System.out.println("Pareggio!"); break; case 1: // Vince l'utente System.out.println(userMove + " batte " + computerMove + ". Hai vinto!"); userScore++; break; case -1: // Vince il Computer System.out.println(computerMove + " batte " + userMove + ". Hai perso."); computerScore++; break; } numberOfGames++; // Chiedi all'utente se vuole giocare ancora if (user.playAgain()) { System.out.println(); startGame(); } else { printGameStats(); } } /** * Stampa le statistiche della partita. La percentuale di vittorie tiene conto dei pareggi come * fossero 1/2 punto. */ private void printGameStats() { int wins = userScore; int losses = computerScore; int ties = numberOfGames - userScore - computerScore; double percentageWon = (wins + ((double) ties) / 2) / numberOfGames; // Stampa una linea System.out.print("+"); printDashes(68); System.out.println("+"); // Stampa le intestazioni System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "VITTORIE", "SCONFITTE", "PAREGGI", "PARTITE GIOCATE", "PERCENTUALE DI VITTORIE"); // Stampa le linee di separazione 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("|"); // stampa i valori System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", wins, losses, ties, numberOfGames, percentageWon * 100); // stampa la linea di chiusura 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(); }}
Informazioni su questo How.com.vn
Hai trovato utile questo articolo?
⚠️ Disclaimer:
Content from Wiki How Italiano language website. Text is available under the Creative Commons Attribution-Share Alike License; additional terms may apply.
Wiki How does not encourage the violation of any laws, and cannot be responsible for any violations of such laws, should you link to this domain, or use, reproduce, or republish the information contained herein.
- - A few of these subjects are frequently censored by educational, governmental, corporate, parental and other filtering schemes.
- - Some articles may contain names, images, artworks or descriptions of events that some cultures restrict access to
- - Please note: Wiki How does not give you opinion about the law, or advice about medical. If you need specific advice (for example, medical, legal, financial or risk management), please seek a professional who is licensed or knowledgeable in that area.
- - Readers should not judge the importance of topics based on their coverage on Wiki How, nor think a topic is important just because it is the subject of a Wiki article.