Rock, Paper, Scissors este un joc de mână jucat de două persoane. Ambii oameni spuneau „stâncă, hârtie, foarfece” și apoi formează simultan unul dintre cele trei obiecte (stâncă, hârtie sau foarfece) cu o mână întinsă. Câștigătorul este determinat de formațiile de mână. Foarfeca bate hârtia, hârtia bate rock, iar roca bate foarfeca. Dacă ambii jucători joacă aceeași formație de mână, este considerat egal. Vom scrie un joc simplu în Java pentru a simula Rock, Paper, foarfece unde un jucător este utilizatorul și celălalt jucător este computerul.
Pași
Pasul 1. Creați clasa principală și numiți-o
RockPaperScissors
.
Aceasta va fi clasa în care vom scrie jocul. Puteți alege să-l numiți altceva, cum ar fi
Joc
sau
Principal
. Scrieți în declarații de metodă pentru constructor și metoda principală.
public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Pasul 2. Creați o enumerare pentru gesturile mâinii (stâncă, hârtie sau foarfece)
Am putea folosi șiruri pentru a reprezenta stâncă, hârtie sau foarfece, dar o enumerare ne permite să ne predefinim constantele, ceea ce înseamnă că utilizarea enumerării este un design mai bun. Vom numi tipul nostru de enum
Mutare
cu valorile
ROCK
HÂRTIE
și
FOARFECE
private enum Move {ROCK, PAPER, SCISSORS}
Pasul 3. Creați două clase private
Utilizator
și
Calculator
.
Aceste clase vor reprezenta jucătorii noștri în joc. Puteți alege să faceți publice aceste cursuri. The
Utilizator
clasa va fi clasa care solicită utilizatorului fie piatră, hârtie sau foarfece, așa că va trebui să scriem un
getMove ()
metodă. The
Calculator
clasa va trebui, de asemenea, să aibă un
getMove ()
metodă, astfel încât computerul să poată face și o mișcare. Vom pune substituenți în aceste metode și le vom implementa mai târziu. The
Utilizator
clasa va necesita un constructor care să seteze
Scanner
obiect de luat în intrarea utilizatorului. Vom pune
Scanner
ca un câmp privat pentru utilizator și apoi inițiați-l în constructor. Deoarece folosim
Scanner
clasă, trebuie să scriem o declarație de import pentru aceasta în partea de sus a codului nostru. The
Calculator
clasa nu necesită un constructor, deci nu este necesar să scriem unul; când inițiem
Calculator
obiect, vom numi doar constructorul implicit. Iată ce este al nostru
RockPaperScissors
clasa arată acum:
import java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; Utilizator public () {inputScanner = Scanner nou (System.in); } public Move getMove () {// TODO: Implementați această metodă return null; }} private class Computer {public Move getMove () {// TODO: Implementați această metodă return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Pasul 4. Scrieți
getMove ()
metoda pentru
Calculator
clasă.
Această metodă va returna o întâmplare
Mutare
. Putem obține o serie de
Mutare
enumerări prin apelarea
valori ()
metodă:
Move.values ()
. Pentru a alege o întâmplare
Mutare
enumerarea în această matrice de valori, trebuie să generăm un indice aleatoriu care este un număr între 0 și lungimea matricei noastre de valori. Pentru a face acest lucru, putem folosi
nextInt ()
metoda
Aleatoriu
clasă din care trebuie să importăm
java.util
. După ce am obținut indicele aleatoriu, putem returna
Mutare
a acelui index din matricea noastră de valori.
public Move getMove () {Move moves = Move.values (); Random random = new Random (); int index = random.nextInt (moves.length); returnează mutări [index]; }
Pasul 5. Scrieți
getMove ()
metoda pentru
Utilizator
clasă.
Această metodă va returna un
Mutare
corespunzând celor introduse de utilizator. Ne vom aștepta ca utilizatorul să scrie fie „stâncă”, „hârtie”, fie „foarfecă”. Mai întâi, trebuie să solicităm utilizatorului o intrare:
System.out.print („Stâncă, hârtie sau foarfece?”)
. Apoi utilizați
nextLine ()
metoda
Scanner
obiect pentru a obține intrarea utilizatorului ca un șir. Acum trebuie să verificăm dacă utilizatorul a trimis o mutare validă, dar putem fi îngăduitori dacă utilizatorul a scris greșit un cuvânt. Deci, vom verifica doar dacă prima literă a datelor introduse de utilizator este fie „R” (pentru piatră), „P” (pentru hârtie) sau „S” (pentru foarfece) și nu ne va păsa de caz deoarece vom folosi mai întâi
toUpperCase ()
metoda
Şir
clasă pentru a face șirul de introducere al utilizatorului cu majuscule. Dacă utilizatorul nu a introdus o intrare corectă de la distanță, îl vom solicita din nou. Apoi, în funcție de ceea ce a introdus utilizatorul, vom returna o mișcare corespunzătoare.
public Move getMove () {// Solicitați utilizatorului System.out.print („Stâncă, hârtie sau foarfece?”); // Obțineți intrarea utilizatorului String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Utilizatorul a introdus un comutator de intrare valid (firstLetter) {case 'R': returnează Move. ROCK; cazul 'P': returnează Move. PAPER; cazul 'S': returnează Move. SCISSORS; }} // Utilizatorul nu a introdus o intrare validă. Solicitați din nou. returnează getMove (); }
Pasul 6. Scrieți un
joaca din nou()
metoda pentru
Utilizator
clasă.
Utilizatorul ar trebui să poată juca jocul din nou și din nou. Pentru a determina dacă utilizatorul dorește să joace din nou, trebuie să scriem un
joaca din nou()
metodă care returnează un boolean care spune jocului dacă utilizatorul a decis să joace din nou sau nu. În această metodă, folosim
Scanner
pe care am inițiat-o anterior în constructor pentru a obține un „Da” sau un „Nu” de la utilizator. Vom verifica doar dacă prima literă este „Y” pentru a determina dacă utilizatorul dorește să joace din nou. Orice altă intrare va însemna că utilizatorul nu vrea să redea din nou.
public boolean playAgain () {System.out.print ("Vrei să joci din nou?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }
Pasul 7. Conectați
Utilizator
și
Calculator
cursuri împreună în
RockPaperScissors
clasă.
Acum că am terminat de scris
Utilizator
și
Calculator
clase, ne putem concentra pe lucrul la jocul nostru real. Creați câmpuri private pentru
Utilizator
și
Calculator
cursuri în
RockPaperScissors
clasă. Va trebui să accesăm aceste câmpuri pentru a accesa
getMove ()
metode atunci când jucăm jocul. În constructorul pentru
RockPaperScissors
clasă, inițiați aceste câmpuri. De asemenea, va trebui să ținem evidența scorului
userScore
și
computerScore
câmpuri, pe care trebuie să le inițiem ca 0 în constructor. Trebuie să urmărim și numărul de jocuri, care va fi, de asemenea, un câmp inițiat ca 0.
utilizator de utilizator privat; computer computer privat; private int userScore; private int computerScore; private int numberOfGames; public RockPaperScissors () {user = new User (); computer = computer nou (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Pasul 8. Extindeți
Mutare
enum pentru a include o metodă care ne spune care mutare câștigă în fiecare caz.
Trebuie să scriem un
compareMoves ()
metoda care returnează 0 dacă mișcările sunt aceleași, 1 dacă mișcarea curentă bate cealaltă mișcare și -1 dacă mișcarea curentă pierde față de cealaltă mișcare. Acest lucru va fi util pentru determinarea câștigătorului în joc. Pentru a implementa această metodă, vom returna mai întâi 0 dacă mișcările sunt aceleași și, prin urmare, avem o egalitate. Apoi scrieți o declarație de comutare pentru returnarea 1 sau -1.
private enum Move {ROCK, HARTIE, foarfece; / ** * Compară această mutare cu o altă mutare pentru a determina o egalitate, o victorie sau * o pierdere. * * @param otherMove * mutați pentru a compara cu * @return 1 dacă această mișcare bate cealaltă mișcare, -1 dacă această mișcare pierde la * cealaltă mișcare, 0 dacă aceste mișcări se leagă * / public int compareMoves (Mutați altulMutați) {/ / Tie if (this == otherMove) returnează 0; switch (this) {case ROCK: return (otherMove == foarfece? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); caz foarfece: return (otherMove == PAPER? 1: -1); } // Nu ar trebui să ajungi niciodată aici returnează 0; }}
Pasul 9. Creați un
incepe jocul()
metoda în
RockPaperScissors
clasă.
Această metodă va reprezenta jocul. Începeți prin a pune un simplu
System.out.println
în metodă.
public void startGame () {System.out.println ("ROCK, PAPER, foarfece!"); }
Pasul 10. Obțineți mișcări de la utilizator și computer
În
incepe jocul()
metoda, utilizați
getMove ()
metode din
Utilizator
clasa și
Calculator
clasă pentru a obține mișcările utilizatorului și computerului.
Mutare userMove = user.getMove (); Muta computerMove = computer.getMove (); System.out.println ("\ nAți jucat" + userMove + "."); System.out.println ("Computer jucat" + computerMove + ". / N");
Pasul 11. Comparați cele două mișcări și stabiliți dacă utilizatorul a câștigat sau computerul a câștigat
Folosește
compareMoves ()
metoda din
Mutare
enum to pentru a determina dacă utilizatorul a câștigat sau nu. Dacă utilizatorul a câștigat, creșteți scorul utilizatorului cu 1. Dacă utilizatorul a pierdut, creșteți scorul computerului cu 1. Dacă a existat o egalitate, nu creșteți niciunul dintre scoruri. Apoi creșteți numărul de jocuri jucate de unul.
int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); pauză; cazul 1: // Utilizatorul câștigă System.out.println (userMove + "bate" + computerMove + ". Ai câștigat!"); userScore ++; pauză; caz -1: // Computer câștigă System.out.println (computerMove + "bate" + userMove + ". Ai pierdut."); computerScore ++; pauză; } numberOfGames ++;
Pasul 12. Întrebați dacă utilizatorul vrea să joace din nou
Dacă utilizatorul dorește să redea din nou, sunați
incepe jocul()
din nou. În caz contrar, sunați
printGameStats ()
care va imprima statisticile jocului. Vom scrie această metodă în pasul următor.
if (user.playAgain ()) {System.out.println (); incepe jocul(); } else {printGameStats (); }
Pasul 13. Scrieți
printGameStats ()
metodă.
Această metodă va afișa statisticile jocului: numărul de victorii, numărul de pierderi, numărul de egalități, numărul de jocuri jucate și procentul de jocuri câștigate de utilizator. Procentul de jocuri câștigate este calculat de (# victorii + (# egalități / 2)) / (# jocuri jucate). Această metodă folosește
System.out.printf
pentru a imprima text formatat.
private void printGameStats () {int wins = userScore; int loss = computerScore; int ties = numberOfGames - userScore - computerScore; procent dublu Câștigat = (câștigă + ((dublu) egalități) / 2) / numărOfGame; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Tipărește titlurile System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "CÂȘTIGĂRI", "PIERDERI", "LEGĂTURI", "JOCURI JOCATE", "PROCENTARE CASTIGAT"); // 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 ("|"); // Imprimați valorile System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", victorii, pierderi, egalități, numberOfGames, percentWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Pasul 14. Începe jocul în clasa principală
În clasa principală, inițializați o instanță a
RockPaperScissors
clasa și sunați la
incepe jocul()
metodă.
public static void main (String args) {joc RockPaperScissors = new RockPaperScissors (); game.startGame (); }
Pasul 15. Testează-ți jocul
Acum, că am trecut prin tot efortul de a scrie jocul Rock, Paper, foarfece, este timpul să compilăm și să testăm totul!
Program de probă
import java.util. Random; import java.util. Scanner; clasă publică RockPaperScissors {utilizator utilizator privat; computer computer privat; private int userScore; private int computerScore; private int numberOfGames; private enum Move {ROCK, HARTIE, foarfece; / ** * Compară această mutare cu o altă mutare pentru a determina o egalitate, o victorie sau * o pierdere. * * @param otherMove * mutați pentru a compara cu * @return 1 dacă această mișcare bate cealaltă mișcare, -1 dacă această mișcare pierde la * cealaltă mișcare, 0 dacă aceste mișcări se leagă * / public int compareMoves (Mută altulMuți) {/ / Tie if (this == otherMove) returnează 0; switch (this) {case ROCK: return (otherMove == foarfece? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); caz foarfece: return (otherMove == PAPER? 1: -1); } // Nu ar trebui să ajungi niciodată aici returnează 0; }} private class User {private Scanner inputScanner; Utilizator public () {inputScanner = Scanner nou (System.in); } public Move getMove () {// Solicitați utilizatorului System.out.print („Stâncă, hârtie sau foarfece?”); // Obțineți intrarea utilizatorului String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Utilizatorul a introdus un comutator de intrare valid (firstLetter) {case 'R': returnează Move. ROCK; cazul 'P': returnează Move. PAPER; cazul 'S': returnează Move. SCISSORS; }} // Utilizatorul nu a introdus o intrare validă. Solicitați din nou. returnează getMove (); } public boolean playAgain () {System.out.print ("Vrei să joci din nou?"); 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); returnează mutări [index]; }} public RockPaperScissors () {user = new User (); computer = computer nou (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Obține mișcări Mută userMove = user.getMove (); Muta computerMove = computer.getMove (); System.out.println ("\ nAți jucat" + userMove + "."); System.out.println ("Computer jucat" + computerMove + ". / N"); // Comparați mișcările și determinați câștigătorul int compareMoves = userMove.compareMoves (computerMove); switch (compareMoves) {case 0: // Tie System.out.println ("Tie!"); pauză; cazul 1: // Utilizatorul câștigă System.out.println (userMove + "bate" + computerMove + ". Ai câștigat!"); userScore ++; pauză; case -1: // Computer câștigă System.out.println (computerMove + "bate" + userMove + ". Ai pierdut."); computerScore ++; pauză; } numberOfGames ++; // Solicitați utilizatorului să redea din nou dacă (user.playAgain ()) {System.out.println (); incepe jocul(); } else {printGameStats (); }} / ** * Tipărește statisticile jocului. Calculează egalități ca 1/2 o victorie în * procent câștigat. * / private void printGameStats () {int wins = userScore; int loss = computerScore; int ties = numberOfGames - userScore - computerScore; procent dublu Câștigat = (câștigă + ((dublu) egalități) / 2) / numărOfGame; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Tipărește titlurile System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "CÂȘTIGĂRI", "PIERDERI", "LEGĂTURI", "JOCURI JOCATE", "PROCENTARE CASTIGAT"); // 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 ("|"); // Imprimați valorile System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", victorii, pierderi, egalități, numberOfGames, percentWon * 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 (); }}