Rock, Paper, Scissors est un jeu de main joué par deux personnes. Les deux personnes diraient "pierre, papier, ciseaux", puis formeraient simultanément l'un des trois objets (pierre, papier ou ciseaux) avec une main tendue. Le gagnant est déterminé par les formations des mains. Les ciseaux battent le papier, le papier bat la pierre et la pierre bat les ciseaux. Si les deux joueurs jouent la même formation de main, cela est considéré comme une égalité. Nous allons écrire un jeu simple en Java pour simuler Roche, Papier, Ciseaux où un joueur est l'utilisateur et l'autre joueur est l'ordinateur.
Pas
Étape 1. Créez la classe principale et appelez-la
Pierre papier ciseaux
.
Ce sera la classe où nous écrirons le jeu. Vous pouvez choisir de le nommer autrement, par exemple
Jeu
ou
Principale
. Écrivez des déclarations de méthode pour le constructeur et la méthode principale.
public class RockPaperScissors { public RockPaperScissors() { } public static void main(String args) { } }
Étape 2. Créez une énumération pour les gestes de la main (pierre, papier ou ciseaux)
Nous pourrions utiliser des chaînes pour représenter la pierre, le papier ou les ciseaux, mais une énumération nous permet de prédéfinir nos constantes, ce qui signifie que l'utilisation de l'énumération est une meilleure conception. Nous appellerons notre type enum
Se déplacer
avec les valeurs
ROCHE
PAPIER
et
LES CISEAUX
private enum Move { ROCHE, PAPIER, CISEAUX }
Étape 3. Créez deux cours privés
Utilisateur
et
Ordinateur
.
Ces classes représenteront nos joueurs dans le jeu. Vous pouvez choisir de rendre ces classes publiques. Les
Utilisateur
classe sera la classe qui invite l'utilisateur à utiliser une pierre, du papier ou des ciseaux, nous devrons donc écrire un
getMove()
méthode. Les
Ordinateur
la classe devra également avoir un
getMove()
méthode pour que l'ordinateur puisse également faire un mouvement. Nous mettrons des espaces réservés dans ces méthodes et les implémenterons plus tard. Les
Utilisateur
La classe nécessitera un constructeur qui configure le
Scanner
objet à prendre dans l'entrée de l'utilisateur. Nous mettrons le
Scanner
en tant que champ privé pour l'utilisateur, puis l'initier dans le constructeur. Puisque nous utilisons le
Scanner
class, nous devons écrire une instruction d'importation pour elle en haut de notre code. Les
Ordinateur
class ne nécessite pas de constructeur, nous n'avons donc pas besoin d'en écrire un; quand on lance le
Ordinateur
objet, nous appellerons simplement le constructeur par défaut. Voici ce que notre
Pierre papier ciseaux
la classe ressemble à maintenant:
importer java.util. Scanner; public class RockPaperScissors { private enum Move { ROCK, PAPER, CISEAUX } private class User { private Scanner inputScanner; public User() { inputScanner = new Scanner(System.in); } public Move getMove() { // TODO: Implémenter cette méthode return null; } } private class Computer { public Move getMove() { // TODO: Implémenter cette méthode return null; } } public RockPaperScissors() { } public static void main(String args) { } }
Étape 4. Écrivez le
getMove()
méthode pour le
Ordinateur
classer.
Cette méthode renverra un aléatoire
Se déplacer
. Nous pouvons obtenir un tableau de
Se déplacer
énumérations en appelant le
valeurs()
méthode:
Déplacer.values()
. Pour choisir au hasard
Se déplacer
énumération dans ce tableau de valeurs, nous devons générer un index aléatoire qui est un entier compris entre 0 et la longueur de notre tableau de valeurs. Pour ce faire, nous pouvons utiliser le
suivantEntier()
méthode de la
Aléatoire
classe à partir de laquelle nous devons importer
java.util
. Après avoir obtenu l'index aléatoire, nous pouvons retourner le
Se déplacer
de cet index de notre tableau de valeurs.
public Move getMove() { Move moves = Move.values(); Aléatoire aléatoire = nouveau Aléatoire(); int index = random.nextInt(moves.length); retour mouvements[index]; }
Étape 5. Écrivez le
getMove()
méthode pour le
Utilisateur
classer.
Cette méthode retournera un
Se déplacer
correspondant à ce que l'utilisateur a entré. Nous nous attendons à ce que l'utilisateur écrive soit "pierre", "papier" ou "ciseaux". Tout d'abord, nous devons demander à l'utilisateur une entrée:
System.out.print("Pierre, papier ou ciseaux ? ")
. Utilisez ensuite le
nextLine()
méthode de la
Scanner
objet pour obtenir l'entrée de l'utilisateur sous forme de chaîne. Nous devons maintenant vérifier si l'utilisateur a soumis un coup valide, mais nous pouvons être indulgents si l'utilisateur a mal orthographié un mot. Nous vérifierons donc uniquement si la première lettre de l'entrée utilisateur est soit "R" (pour pierre), "P" (pour papier) ou "S" (pour ciseaux), et nous ne nous soucierons pas de l'affaire car nous utiliserons d'abord le
en majuscule()
méthode de la
Chaîne de caractères
class pour que la chaîne de saisie de l'utilisateur soit entièrement en majuscules. Si l'utilisateur n'a pas saisi une entrée correcte à distance, nous l'inviterons à nouveau. Ensuite, en fonction de ce que l'utilisateur a mis, nous renverrons un coup correspondant.
public Move getMove() { // Invite l'utilisateur System.out.print("Pierre, papier ou ciseaux ? "); // Récupère l'entrée utilisateur String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // L'utilisateur a entré un commutateur d'entrée valide (firstLetter) { case 'R': return Move. ROCK; case 'P': return Move. PAPER; case 'S': return Move. SCISSORS; } } // L'utilisateur n'a pas entré une entrée valide. Demander à nouveau. return getMove(); }
Étape 6. Écrivez un
rejouer()
méthode pour le
Utilisateur
classer.
L'utilisateur doit pouvoir jouer au jeu encore et encore. Afin de déterminer si l'utilisateur veut rejouer, nous devons écrire un
rejouer()
méthode qui renvoie un booléen indiquant au jeu si l'utilisateur a décidé de rejouer ou non. Dans cette méthode, nous utilisons le
Scanner
que nous avions précédemment initié dans le constructeur pour obtenir un "Oui" ou un "Non" de l'utilisateur. Nous vérifierons uniquement si la première lettre est « Y » pour déterminer si l'utilisateur souhaite rejouer. Toute autre entrée signifie que l'utilisateur ne veut plus jouer.
public boolean playAgain() { System.out.print("Voulez-vous rejouer ? "); Chaîne userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; }
Étape 7. Connectez le
Utilisateur
et
Ordinateur
cours ensemble dans le
Pierre papier ciseaux
classer.
Maintenant que nous avons fini d'écrire le
Utilisateur
et
Ordinateur
classes, nous pouvons nous concentrer sur le travail sur notre jeu réel. Créer des champs privés pour le
Utilisateur
et
Ordinateur
cours dans le
Pierre papier ciseaux
classer. Nous aurons besoin d'accéder à ces champs pour accéder au
getMove()
méthodes lorsque nous jouons au jeu. Dans le constructeur du
Pierre papier ciseaux
classe, initiez ces champs. Nous devrons également garder une trace du score dans
userScore
et
ordinateurScore
champs, que nous devons lancer en tant que 0 dans le constructeur. Nous devons également garder une trace du nombre de jeux, qui sera également un champ initié en tant que 0.
Utilisateur privé utilisateur; ordinateur privé; private int userScore; private int computerScore; private int numberOfGames; public RockPaperScissors() { utilisateur = nouvel utilisateur(); ordinateur = nouvel ordinateur(); scoreutilisateur = 0; ordinateurScore = 0; nombreDeJeux = 0; }
Étape 8. Étendre le
Se déplacer
enum pour inclure une méthode qui nous indique quel mouvement gagne dans chaque cas.
Nous devons écrire un
comparerMoves()
méthode qui renvoie 0 si les coups sont les mêmes, 1 si le coup courant bat l'autre coup, et -1 si le coup courant perd face à l'autre coup. Cela sera utile pour déterminer le gagnant du jeu. Pour implémenter cette méthode, nous renverrons d'abord 0 si les coups sont les mêmes et donc nous avons une égalité. Ensuite, écrivez une instruction switch pour renvoyer 1 ou -1.
private enum Move { ROCHE, PAPIER, CISEAUX; /** * Compare ce coup avec un autre coup pour déterminer une égalité, une victoire ou * une défaite. * * @param otherMove * mouvement à comparer à * @return 1 si ce mouvement bat l'autre mouvement, -1 si ce mouvement perd contre * l'autre mouvement, 0 si ces mouvements sont à égalité */ public int compareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == CISEAUX ? 1: -1); case PAPIER: return (otherMove == ROCK ? 1: -1); case CISEAUX: return (otherMove == PAPER ? 1: -1); } // Ne devrait jamais atteindre ici return 0; } }
Étape 9. Créez un
démarrer jeu()
méthode dans le
Pierre papier ciseaux
classer.
Cette méthode sera le jeu du jeu. Commencez par mettre un simple
System.out.println
dans la méthode.
public void startGame() { System.out.println("ROCK, PAPER, CISEAUX!"); }
Étape 10. Obtenez des mouvements de l'utilisateur et de l'ordinateur
Dans le
démarrer jeu()
méthode, utilisez la
getMove()
méthodes de la
Utilisateur
classe et le
Ordinateur
classe pour obtenir les mouvements de l'utilisateur et de l'ordinateur.
Déplacer userMove = user.getMove(); Déplacer ordinateurMove = ordinateur.getMove(); System.out.println("\nVous avez joué à " + userMove + "."); System.out.println("Ordinateur lu " + computerMove + ".\n");
Étape 11. Comparez les deux mouvements et déterminez si l'utilisateur a gagné ou l'ordinateur a gagné
Utilisez le
comparerMoves()
méthode de la
Se déplacer
enum pour déterminer si l'utilisateur a gagné ou non. Si l'utilisateur a gagné, augmentez le score de l'utilisateur de 1. Si l'utilisateur a perdu, augmentez le score de l'ordinateur de 1. En cas d'égalité, n'incrémentez aucun des scores. Augmentez ensuite le nombre de parties jouées d'une unité.
int compareMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Attache System.out.println(" Attache !"); Pause; case 1: // L'utilisateur gagne System.out.println(userMove + " bat " + computerMove + ". Vous avez gagné !"); userScore++; Pause; case -1: // L'ordinateur gagne System.out.println(computerMove + " bat " + userMove + ". Vous avez perdu."); ordinateurScore++; Pause; } nombreDeJeux++;
Étape 12. Demandez si l'utilisateur souhaite rejouer
Si l'utilisateur souhaite rejouer, appelez
démarrer jeu()
de nouveau. Sinon, appelez
printGameStats()
qui imprimera les statistiques du jeu. Nous écrirons cette méthode dans la prochaine étape.
if (user.playAgain()) { System.out.println(); démarrer jeu(); } else { printGameStats(); }
Étape 13. Écrivez le
printGameStats()
méthode.
Cette méthode affichera les statistiques du jeu: nombre de victoires, nombre de défaites, nombre d'égalités, nombre de parties jouées et pourcentage de parties gagnées par l'utilisateur. Le pourcentage de parties gagnées est calculé par le (# victoires + (# égalités/2))/(# parties jouées). Cette méthode utilise
System.out.printf
pour imprimer du texte formaté.
private void printGameStats() { int wins = userScore; int pertes = computerScore; int ties = numberOfGames - userScore - computerScore; double pourcentageWon = (gagne + ((double) égalité) / 2) / numberOfGames; // Ligne System.out.print("+"); printtirets(68); System.out.println("+"); // Titres imprimés System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "GAGNANTS", "PERDUS", "ÉGALITÉS", "JEUX JOUÉS", "POURCENTAGE A GAGNÉ"); // Ligne System.out.print("|"); printtirets(10); System.out.print("+"); printtirets(10); System.out.print("+"); printtirets(10); System.out.print("+"); printtirets(16); System.out.print("+"); printtirets(18); System.out.println("|"); // Affiche les valeurs System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", victoires, défaites, égalités, numberOfGames, pourcentageWon * 100); // Ligne System.out.print("+"); printtirets(68); System.out.println("+"); }
Étape 14. Démarrez le jeu dans la classe principale
Dans la classe principale, initialisez une instance de la
Pierre papier ciseaux
classe et appelez le
démarrer jeu()
méthode.
public static void main(String args) { RockPaperScissors game = new RockPaperScissors(); game.startGame(); }
Étape 15. Testez votre jeu
Maintenant que nous avons fait tous les efforts pour écrire le jeu Roche, Papier, Ciseaux, il est temps de compiler et de tout tester !
Exemple de programme
importer java.util. Random; importer java.util. Scanner; public class RockPaperScissors { privé User user; ordinateur privé; private int userScore; private int computerScore; private int numberOfGames; private enum Move { ROCHE, PAPIER, CISEAUX; /** * Compare ce coup avec un autre coup pour déterminer une égalité, une victoire ou * une défaite. * * @param otherMove * mouvement à comparer à * @return 1 si ce mouvement bat l'autre mouvement, -1 si ce mouvement perd contre * l'autre mouvement, 0 si ces mouvements sont à égalité */ public int compareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == CISEAUX ? 1: -1); case PAPIER: return (otherMove == ROCK ? 1: -1); case CISEAUX: return (otherMove == PAPER ? 1: -1); } // Ne devrait jamais atteindre ici return 0; } } classe privée User { private Scanner inputScanner; public User() { inputScanner = new Scanner(System.in); } public Move getMove() { // Invite l'utilisateur System.out.print("Pierre, papier ou ciseaux ? "); // Récupère l'entrée utilisateur String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // L'utilisateur a entré un commutateur d'entrée valide (firstLetter) { case 'R': return Move. ROCK; case 'P': return Move. PAPER; case 'S': return Move. SCISSORS; } } // L'utilisateur n'a pas entré une entrée valide. Demander à nouveau. return getMove(); } public boolean playAgain() { System.out.print("Voulez-vous rejouer ? "); Chaîne userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; } } classe privée Ordinateur { public Move getMove() { Move moves = Move.values(); Aléatoire aléatoire = nouveau Aléatoire(); int index = random.nextInt(moves.length); retour mouvements[index]; } } public RockPaperScissors() { user = new User(); ordinateur = nouvel ordinateur(); scoreutilisateur = 0; ordinateurScore = 0; nombreDeJeux = 0; } public void startGame() { System.out.println("ROCK, PAPER, CISEAUX!"); // Obtenir les déplacements Déplacer userMove = user.getMove(); Déplacer ordinateurMove = ordinateur.getMove(); System.out.println("\nVous avez joué à " + userMove + "."); System.out.println("Ordinateur lu " + computerMove + ".\n"); // Comparez les mouvements et déterminez le gagnant int compareMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Attache System.out.println(" Attache !"); Pause; case 1: // L'utilisateur gagne System.out.println(userMove + " bat " + computerMove + ". Vous avez gagné !"); userScore++; Pause; case -1: // L'ordinateur gagne System.out.println(computerMove + " bat " + userMove + ". Vous avez perdu."); ordinateurScore++; Pause; } nombreDeJeux++; // Demande à l'utilisateur de rejouer if (user.playAgain()) { System.out.println(); démarrer jeu(); } else { printGameStats(); } } /** * Imprime les statistiques du jeu. Calcule les égalités comme 1/2 victoire en * pourcentage gagné. */ private void printGameStats() { int wins = userScore; int pertes = computerScore; liens int = numberOfGames - userScore - computerScore; double pourcentageWon = (gagne + ((double) égalité) / 2) / numberOfGames; // Ligne System.out.print("+"); printtirets(68); System.out.println("+"); // Titres imprimés System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "GAGNANTS", "PERDUS", "ÉGALITÉS", "JEUX JOUÉS", "POURCENTAGE A GAGNÉ"); // Ligne System.out.print("|"); printtirets(10); System.out.print("+"); printtirets(10); System.out.print("+"); printtirets(10); System.out.print("+"); printtirets(16); System.out.print("+"); printtirets(18); System.out.println("|"); // Affiche les valeurs System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", victoires, défaites, égalités, numberOfGames, pourcentageWon * 100); // Ligne System.out.print("+"); printtirets(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(); } }