Rock, Paper, Scissors és un joc de mans jugat per dues persones. Totes dues persones dirien "roca, paper, tisores" i després formarien simultàniament un dels tres objectes (roca, paper o tisores) amb la mà estesa. El guanyador està determinat per les formacions de mans. Les tisores vencen el paper, el paper a la roca i la roca a les tisores. Si els dos jugadors juguen la mateixa formació de mans, es considera un empat. Escriurem un joc senzill en Java per simular Rock, Paper, Scissors on un jugador és l’usuari i l’altre jugador l’ordinador.
Passos
Pas 1. Creeu la classe principal i anomeneu-la
Pedra paper tisores
.
Aquesta serà la classe on escriurem el joc. Podeu optar per anomenar-lo a una altra cosa com ara
Joc
o bé
Principal
. Escriviu en declaracions de mètodes per al constructor i el mètode principal.
classe pública RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Pas 2. Creeu una enumeració per als gestos amb les mans (roca, paper o tisores)
Podríem fer servir cordes per representar roca, paper o tisores, però una enumeració ens permet predefinir les nostres constants, cosa que significa que l’ús de l’enumeració és un millor disseny. Anomenarem al nostre tipus enum
Mou
amb els valors
ROCK
PAPER
i
TISORES
privat privat Move {ROCK, PAPER, SCISSORS}
Pas 3. Creeu dues classes privades
Usuari
i
Ordinador
.
Aquestes classes representaran els nostres jugadors en el joc. Podeu fer públiques aquestes classes. El
Usuari
class serà la classe que demana a l'usuari roca, paper o tisores, de manera que haurem d'escriure un
getMove ()
mètode. El
Ordinador
la classe també haurà de tenir un
getMove ()
mètode perquè l'ordinador també pugui fer un moviment. Posarem espais reservats en aquests mètodes i els implementarem més endavant. El
Usuari
La classe requerirà un constructor que configure el fitxer
Escàner
objecte per introduir l'entrada de l'usuari. Posarem el
Escàner
com a camp privat per a l'usuari i després iniciar-lo al constructor. Ja que estem utilitzant el fitxer
Escàner
class, hem d’escriure una declaració d’importació a la part superior del nostre codi. El
Ordinador
class no requereix un constructor, de manera que no cal escriure'n cap; quan iniciem el
Ordinador
objecte, només anomenarem el constructor per defecte. Això és el que el nostre
Pedra paper tisores
la classe es veu ara:
importar java.util. Scanner; classe pública RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} classe privada Usuari {private Scanner inputScanner; Usuari públic () {inputScanner = nou escàner (System.in); } public Move getMove () {// TODO: implementa aquest mètode return null; }} classe privada Computer {public Move getMove () {// TODO: implementa aquest mètode return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Pas 4. Escriviu el
getMove ()
mètode per al
Ordinador
classe.
Aquest mètode retornarà aleatòriament
Mou
. Podem obtenir un ventall de
Mou
enumeracions trucant al
values ()
mètode:
Move.values ()
. Per triar un aleatori
Mou
Enumeració en aquesta matriu de valors, hem de generar un índex aleatori que sigui un enter entre 0 i la longitud de la nostra matriu de valors. Per fer-ho, podem utilitzar el fitxer
nextInt ()
mètode de la
Aleatori
classe que hem d'importar
java.util
. Després d’haver obtingut l’índex aleatori, podem retornar el fitxer
Mou
d'aquest índex de la nostra matriu de valors.
public Move getMove () {Move moves = Move.values (); Random random = new Random (); int index = random.nextInt (moves.length); retorn es mou [índex]; }
Pas 5. Escriviu el
getMove ()
mètode per al
Usuari
classe.
Aquest mètode retornarà un fitxer
Mou
corresponent al que ha introduït l’usuari. Esperarem que l'usuari escrigui "roca", "paper" o "tisores". En primer lloc, hem de demanar a l'usuari una entrada:
System.out.print ("Roca, paper o tisores?")
. A continuació, utilitzeu el fitxer
nextLine ()
mètode de la
Escàner
objecte per obtenir l'entrada de l'usuari com una cadena. Ara hem de comprovar si l'usuari ha enviat un moviment vàlid, però podem ser indulgents si l'usuari ha escrit malament una paraula. Per tant, només comprovarem si la primera lletra de l'entrada de l'usuari és "R" (per a roca), "P" (per a paper) o "S" (per a tisores), i no ens importarà el cas perquè primer utilitzarem el
toUpperCase ()
mètode de la
Corda
class per fer que la cadena d'entrada de l'usuari sigui majúscula. Si l’usuari no ha introduït cap entrada remota correcta, tornarem a sol·licitar-lo. Després, en funció del que hagi introduït l’usuari, tornarem el moviment corresponent.
public Move getMove () {// Sol·licita a l'usuari System.out.print ("Roca, paper o tisores?"); // Obtén l'entrada d'usuari String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// L'usuari ha introduït un commutador d'entrada vàlid (firstLetter) {case 'R': return Move. ROCK; cas 'P': torna Move. PAPER; cas 'S': torna Move. SCISSORS; }} // L'usuari no ha introduït cap entrada vàlida. Pregunteu de nou. retorn getMove (); }
Pas 6. Escriviu un
juga un altre cop()
mètode per al
Usuari
classe.
L'usuari hauria de poder jugar el joc una i altra vegada. Per determinar si l’usuari vol reproduir-lo, hem d’escriure un
juga un altre cop()
mètode que retorna un booleà que indica al joc si l'usuari ha decidit tornar a jugar o no. En aquest mètode, fem servir el fitxer
Escàner
que prèviament havíem iniciat al constructor per obtenir un "Sí" o un "No" de l'usuari. Només comprovarem si la primera lletra és "Y" per determinar si l'usuari vol tornar a jugar. Qualsevol altra entrada significa que l'usuari no vol tornar a jugar.
public boolean playAgain () {System.out.print ("Voleu tornar a jugar?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }
Pas 7. Connecteu el
Usuari
i
Ordinador
classes junts al
Pedra paper tisores
classe.
Ara que hem acabat d’escriure el
Usuari
i
Ordinador
classes, ens podem centrar a treballar en el nostre joc real. Creeu camps privats per a
Usuari
i
Ordinador
classes a la
Pedra paper tisores
classe. Haurem d’accedir a aquests camps per accedir al
getMove ()
mètodes quan estem jugant al joc. Al constructor per al
Pedra paper tisores
classe, inicieu aquests camps. També haurem de fer un seguiment de la puntuació
userScore
i
computerScore
camps, que hem d’iniciar com a 0 al constructor. També hem de fer un seguiment del nombre de jocs, que també serà un camp iniciat com a 0.
usuari d'usuari privat; ordinador privat; private int userScore; private int computerScore; private int numberOfGames; RockPaperScissors públic () {usuari = nou usuari (); computer = new Computer (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Pas 8. Amplieu el fitxer
Mou
enum per incloure un mètode que ens indiqui quin moviment guanya en cada cas.
Hem d’escriure un
compareMoves ()
mètode que retorna 0 si els moviments són els mateixos, 1 si el moviment actual supera l’altre moviment i -1 si el moviment actual perd per l’altre moviment. Això serà útil per determinar el guanyador del joc. Per implementar aquest mètode, primer retornarem 0 si els moviments són els mateixos i, per tant, tenim un empat. A continuació, escriviu una instrucció switch per retornar 1 o -1.
private enum Move {ROCK, PAPER, TISORES; / ** * Compara aquest moviment amb un altre moviment per determinar un empat, una victòria o una * pèrdua. * * @param otherMove * move to compare to * @return 1 if this move beats the other move, -1 if this move perds to * the other move, 0 if these moves tie * / public int compareMoves (Move otherMove) {/ / Empata si (aquest == altreMou) retorna 0; switch (this) {case ROCK: return (otherMove == TISORES? 1: -1); cas PAPER: return (otherMove == ROCK? 1: -1); TISORES de cas: return (otherMove == PAPER? 1: -1); } // No hauria d’arribar mai aquí retornar 0; }}
Pas 9. Creeu un
començar el joc()
mètode a
Pedra paper tisores
classe.
Aquest mètode serà el joc del joc. Comenceu posant un senzill
System.out.println
en el mètode.
public void startGame () {System.out.println ("ROCK, PAPER, TISORES!"); }
Pas 10. Obteniu moviments de l'usuari i l'ordinador
A la
començar el joc()
mètode, utilitzeu el mètode
getMove ()
mètodes de
Usuari
classe i el
Ordinador
classe per obtenir els moviments de l'usuari i l'ordinador.
Move userMove = user.getMove (); Mou computerMove = computer.getMove (); System.out.println ("\ nHeu jugat" + userMove + "."); System.out.println ("S'ha reproduït l'ordinador" + ComputerMove + ". / N");
Pas 11. Compareu els dos moviments i determineu si l’usuari ha guanyat o l’equip ha guanyat
Utilitzar el
compareMoves ()
mètode de la
Mou
enum to per determinar si l'usuari ha guanyat o no. Si l'usuari ha guanyat, augmenteu la puntuació de l'usuari en 1. Si l'usuari ha perdut, incrementeu la puntuació de l'ordinador en 1. Si hi ha hagut un empat, no incrementeu cap de les puntuacions. A continuació, incrementeu el nombre de partides jugades per una.
int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); trencar; cas 1: // L'usuari guanya System.out.println (userMove + "beats" + computerMove + ". Has guanyat!"); userScore ++; trencar; cas -1: // L'equip guanya System.out.println (computerMove + "beats" + userMove + ". Has perdut."); computerScore ++; trencar; } numberOfGames ++;
Pas 12. Pregunteu si l'usuari vol tornar a jugar
Si l'usuari vol tornar a jugar, truqueu
començar el joc()
de nou. En cas contrari, truqueu
printGameStats ()
que imprimirà les estadístiques del joc. Escriure aquest mètode al següent pas.
if (user.playAgain ()) {System.out.println (); començar el joc(); } else {printGameStats (); }
Pas 13. Escriviu el
printGameStats ()
mètode.
Aquest mètode mostrarà les estadístiques del joc: nombre de victòries, nombre de pèrdues, nombre d'empats, nombre de jocs jugats i percentatge de jocs guanyats per l'usuari. El percentatge de jocs guanyats es calcula per (# victòries + (# empats / 2)) / (# jocs jugats). Aquest mètode utilitza
System.out.printf
per imprimir text formatat.
private void printGameStats () {int wins = userScore; int pèrdues = computerScore; int ties = numberOfGames - userScore - computerScore; doble percentatge Guanyat = (guanya + ((doble) empats) / 2) / nombreOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Imprimir títols System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "GUANYA", "PÈRDUES", "LLIGATS", "JOCS JUGATS", "PORCENTATGE GUANYAT "); // Line 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 ("|"); // Imprimeix els valors System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", victòries, pèrdues, empats, nombreDeJocs, percentatge Guanyat * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Pas 14. Comenceu el joc a la classe principal
A la classe principal, inicialitzeu una instància del fitxer
Pedra paper tisores
classe i truqueu al
començar el joc()
mètode.
public static void main (String args) {Joc RockPaperScissors = nou RockPaperScissors (); game.startGame (); }
Pas 15. Proveu el vostre joc
Ara que hem passat tot l’esforç d’escriure el joc Rock, Paper, Scissors, és hora de compilar i provar-ho tot.
Programa de mostra
importa java.util. Random; importar java.util. Scanner; classe pública RockPaperScissors {usuari d'usuari privat; ordinador privat; private int userScore; private int computerScore; private int numberOfGames; private enum Move {ROCK, PAPER, TISORES; / ** * Compara aquest moviment amb un altre moviment per determinar un empat, una victòria o una * pèrdua. * * @param otherMove * move to compare to * @return 1 if this move beats the other move, -1 if this move perds to * the other move, 0 if these moves tie * / public int compareMoves (Move otherMove) {/ / Empateu si (this == otherMove) retorna 0; switch (this) {case ROCK: return (otherMove == TISORES? 1: -1); cas PAPER: return (otherMove == ROCK? 1: -1); TISORES de cas: return (otherMove == PAPER? 1: -1); } // No hauria d’arribar mai aquí retornar 0; }} usuari de classe privada {private Scanner inputScanner; Usuari públic () {inputScanner = nou escàner (System.in); } public Move getMove () {// Sol·licita a l'usuari System.out.print ("Roca, paper o tisores?"); // Obteniu l'entrada d'usuari String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// L'usuari ha introduït un commutador d'entrada vàlid (firstLetter) {case 'R': return Move. ROCK; cas 'P': torna Move. PAPER; cas 'S': torna Move. SCISSORS; }} // L'usuari no ha introduït cap entrada vàlida. Pregunteu de nou. retorn getMove (); } public boolean playAgain () {System.out.print ("Voleu tornar a jugar?"); 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); retorn es mou [índex]; }} public RockPaperScissors () {usuari = usuari nou (); computer = new Computer (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Obtenir moviments Move userMove = user.getMove (); Mou computerMove = computer.getMove (); System.out.println ("\ nHeu jugat" + userMove + "."); System.out.println ("S'ha reproduït l'ordinador" + ComputerMove + ". / N"); // Compara moviments i determina el guanyador int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); trencar; cas 1: // L'usuari guanya System.out.println (userMove + "beats" + computerMove + ". Has guanyat!"); userScore ++; trencar; cas -1: // L'equip guanya System.out.println (computerMove + "beats" + userMove + ". Has perdut."); computerScore ++; trencar; } numberOfGames ++; // Demaneu a l'usuari que torni a jugar si (user.playAgain ()) {System.out.println (); començar el joc(); } else {printGameStats (); }} / ** * Imprimeix les estadístiques del joc. Calcula els empats com a 1/2 una victòria en * percentatge de guanys. * / private void printGameStats () {int wins = userScore; int pèrdues = computerScore; int ties = numberOfGames - userScore - computerScore; doble percentatge Guanyat = (guanya + ((doble) empats) / 2) / nombreOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Imprimir títols System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "GUANYA", "PÈRDUES", "LLIGATS", "JOCS JUGATS", "PORCENTATGE GUANYAT "); // Line 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 ("|"); // Imprimir valors System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", victòries, pèrdues, empats, nombreDeJocs, percentatge Guanyat * 100); // Line 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) {Joc RockPaperScissors = new RockPaperScissors (); game.startGame (); }}