Rock, Letër, Gërshërë është një lojë me dorë e luajtur nga dy persona. Të dy njerëzit do të thoshin "shkëmb, letër, gërshërë" dhe më pas formonin njëkohësisht një nga tre objektet (shkëmb, letër ose gërshërë) me një dorë të shtrirë. Fituesi përcaktohet nga formacionet e dorës. Gërshërët rreh letrën, letra rreh shkëmbin dhe shkëmbi rreh gërshërët. Nëse të dy lojtarët luajnë të njëjtën formacion dore, konsiderohet si barazim. Ne do të shkruajmë një lojë të thjeshtë në Java për të simuluar Rock, Letër, Gërshërë ku një lojtar është përdoruesi dhe lojtari tjetër është kompjuteri.
Hapa
Hapi 1. Krijoni klasën kryesore dhe thirreni atë
Gurë Letër gërshërë
.
Kjo do të jetë klasa ku do të shkruajmë lojën. Ju mund të zgjidhni ta emërtoni diçka tjetër si p.sh
Lojë
ose
Kryesore
Me Shkruani në deklaratat e metodës për konstruktorin dhe metodën kryesore.
klasë publike RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Hapi 2. Krijoni një numërim për gjestet e dorës (gurë, letër ose gërshërë)
Ne mund të përdorim tela për të përfaqësuar gurin, letrën ose gërshërët, por një numërim na lejon të paracaktojmë konstantet tona, që do të thotë se përdorimi i numërimit është një dizajn më i mirë. Ne do ta quajmë llojin tonë enum
Lëviz
me vlerat
ROCK
LET PR
dhe
Gërshërë
enum privat Lëviz {ROCK, PAPER, SCISSORS}
Hapi 3. Krijoni dy klasa private
Përdorues
dhe
Kompjuter
.
Këto klasa do të përfaqësojnë lojtarët tanë në lojë. Ju mund të zgjidhni t'i bëni këto klasa publike. E
Përdorues
klasa do të jetë klasa që i kërkon përdoruesit ose gurë, letër ose gërshërë, kështu që do të na duhet të shkruajmë një
getMove ()
metodë. E
Kompjuter
klasa gjithashtu do të duhet të ketë një
getMove ()
metodë në mënyrë që kompjuteri gjithashtu të mund të bëjë një lëvizje. Ne do t'i vendosim vendmbajtësit në këto metoda dhe do t'i zbatojmë ato më vonë. E
Përdorues
klasa do të kërkojë një konstruktor që krijon
Skaner
objekt për të marrë hyrjen e përdoruesit. Ne do të vendosim
Skaner
si një fushë private për përdoruesin dhe pastaj inicojeni atë në konstruktor. Meqenëse ne po përdorim
Skaner
class, ne duhet të shkruajmë një deklaratë importi për të në krye të kodit tonë. E
Kompjuter
klasa nuk kërkon një konstruktor, kështu që ne nuk kemi nevojë të shkruajmë një të tillë; kur inicojmë
Kompjuter
objekt, ne thjesht do të thërrasim konstruktorin e paracaktuar. Këtu është ajo që kemi
Gurë Letër gërshërë
klasa duket si tani:
import java.util. Scanner; klasë publike RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} klasë private Përdorues {private Scanner inputScanner; publik User () {inputScanner = skaner i ri (System.in); } public Move getMove () {// TODO: Zbatoni këtë metodë return null; }} kompjuteri i klasës private {public Move getMove () {// TODO: Zbatoni këtë metodë return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Hapi 4. Shkruani
getMove ()
metodë për
Kompjuter
klasa
Kjo metodë do të kthejë një rastësi
Lëviz
Me Ne mund të marrim një grup të
Lëviz
numërimet duke thirrur në
vlerat ()
metoda:
Zhvendos. Vlerat ()
Me Për të zgjedhur një rastësi
Lëviz
numërimi në këtë grup vlerash, ne duhet të gjenerojmë një indeks të rastësishëm që është një numër i plotë midis 0 dhe gjatësisë së grupit tonë të vlerave. Për ta bërë këtë, ne mund të përdorim
nextInt ()
metoda e
E rastësishme
klasë nga e cila duhet të importojmë
java.util
Me Pasi të kemi marrë indeksin e rastit, mund ta kthejmë
Lëviz
të atij indeksi nga grupi i vlerave tona.
publike Move getMove () {Move moves = Move.values (); Random random = i ri Random (); int index = random.nextInt (moves.length); lëvizjet e kthimit [indeksi]; }
Hapi 5. Shkruani
getMove ()
metodë për
Përdorues
klasa
Kjo metodë do të kthejë një
Lëviz
që korrespondon me atë që përdoruesi ka të dhëna. Ne do të presim që përdoruesi të shkruajë ose "shkëmb", "letër", ose "gërshërë". Së pari, ne duhet të kërkojmë nga përdoruesi një input:
System.out.print ("Shkëmb, letër, apo gërshërë?")
Me Pastaj përdorni
NextLine ()
metoda e
Skaner
objekt për të marrë hyrjen e përdoruesit si një varg. Ne tani duhet të kontrollojmë nëse përdoruesi ka paraqitur një lëvizje të vlefshme, por ne mund të jemi të butë nëse përdoruesi ka shkruar gabim një fjalë. Pra, ne do të kontrollojmë vetëm nëse shkronja e parë e hyrjes së përdoruesit është ose "R" (për shkëmb), "P" (për letër), ose "S" (për gërshërë), dhe ne nuk do të kujdesemi për rastin sepse ne së pari do të përdorim
rasti i sipërm ()
metoda e
Varg
klasë për ta bërë vargun hyrës të përdoruesit të gjithë të mëdhenj. Nëse përdoruesi nuk ka futur një hyrje të saktë nga distanca, ne do ta kërkojmë përsëri përdoruesin. Pastaj, në varësi të asaj që përdoruesi ka futur, ne do të kthejmë një lëvizje përkatëse.
publike Move getMove () {// Nxitni përdoruesin System.out.print ("Shkëmb, letër, apo gërshërë?"); // Merrni hyrjen e përdoruesit String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); nëse (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Përdoruesi ka futur një çelës hyrës të vlefshëm (firstLetter) {rasti 'R': kthehu Move. ROCK; rasti 'P': kthehu Move. PAPER; rasti 'S': kthehu Leviz. GJISLORT; }} // Përdoruesi nuk ka futur një hyrje të vlefshme. Nxit përsëri. kthehu getMove (); }
Hapi 6. Shkruani një
Luaj përsëri()
metodë për
Përdorues
klasa
Përdoruesi duhet të jetë në gjendje të luajë lojën pa pushim. Për të përcaktuar nëse përdoruesi dëshiron të luajë përsëri, duhet të shkruajmë a
Luaj përsëri()
metodë që kthen një boolean duke i treguar lojës nëse përdoruesi ka vendosur të luajë përsëri apo jo. Në këtë metodë, ne po përdorim
Skaner
që ne kishim inicuar më parë në konstruktor për të marrë një "Po" ose një "Jo" nga përdoruesi. Ne vetëm do të kontrollojmë nëse shkronja e parë është 'Y' për të përcaktuar nëse përdoruesi dëshiron të luajë përsëri. Çdo hyrje tjetër do të thotë që përdoruesi nuk dëshiron të luajë përsëri.
play boolean publicAgain () {System.out.print ("A doni të luani përsëri?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); kthehu userInput.charAt (0) == 'Y'; }
Hapi 7. Lidhni
Përdorues
dhe
Kompjuter
klasa së bashku në
Gurë Letër gërshërë
klasa
Tani që kemi mbaruar së shkruari
Përdorues
dhe
Kompjuter
klasa, ne mund të përqëndrohemi në punën në lojën tonë aktuale. Krijoni fusha private për
Përdorues
dhe
Kompjuter
klasa në
Gurë Letër gërshërë
klasa Ne do të duhet të hyjmë në këto fusha për të hyrë në
getMove ()
metodat kur luajmë lojën. Në konstruktorin për
Gurë Letër gërshërë
klasë, iniconi këto fusha. Ne gjithashtu do të duhet të mbajmë shënim rezultatin
userScore
dhe
rezultat kompjuterik
fushat, të cilat ne duhet të inicojmë si 0 në konstruktorin. Ne gjithashtu duhet të mbajmë shënim numrin e lojërave, të cilat gjithashtu do të jenë një fushë e inicuar si 0.
përdorues privat i përdoruesit; kompjuter kompjuterik privat; int int userScore; int int privateScore; numri int privat i lojërave; publike RockPaperScissors () {user = përdorues i ri (); kompjuter = kompjuter i ri (); userScore = 0; rezultat kompjuterik = 0; numriOfGames = 0; }
Hapi 8. Zgjatni
Lëviz
enum për të përfshirë një metodë që na tregon se cila lëvizje fiton në secilin rast.
Duhet të shkruajmë një
krahasoMoves ()
metodë që kthen 0 nëse lëvizjet janë të njëjta, 1 nëse lëvizja aktuale e mund lëvizjen tjetër dhe -1 nëse lëvizja aktuale humbet në lëvizjen tjetër. Kjo do të jetë e dobishme për përcaktimin e fituesit në lojë. Për të zbatuar këtë metodë, së pari do të kthejmë 0 nëse lëvizjet janë të njëjta dhe prandaj kemi një kravatë. Pastaj shkruani një deklaratë switch për kthimin 1 ose -1.
enum privat Lëviz {ROCK, PAPER, Gërshërë; /** * Krahason këtë lëvizje me një lëvizje tjetër me përcaktimin e barazimit, fitores ose * humbjes. * * @param otherMove * lëvizni për ta krahasuar me * @return 1 nëse kjo lëvizje rreh lëvizjen tjetër, -1 nëse kjo lëvizje humbet në * lëvizjen tjetër, 0 nëse këto lëvizje lidhin * / public int compareMoves (Lëvizni lëvizjen tjetër) { / / Tie nëse (kjo == otherMove) kthehet 0; switch (this) {case ROCK: return (otherMove == SCISSORS 1: -1); rast PAPER: kthim (tjetërLëviz == ROCK? 1: -1); gërshërë të rastit: kthim (tjetërLëviz == PAPER? 1: -1); } // Kurrë nuk duhet të arrijë këtu kthehu 0; }}
Hapi 9. Krijo një
Fillo lojen()
metodë në
Gurë Letër gërshërë
klasa
Kjo metodë do të jetë loja e lojës. Filloni duke vënë një të thjeshtë
System.out.println
në metodën.
public void startGame () {System.out.println ("ROCK, PAPER, Gërshërë!"); }
Hapi 10. Merrni lëvizje nga përdoruesi dhe kompjuteri
Në
Fillo lojen()
metodë, përdorni
getMove ()
metodat nga
Përdorues
klasa dhe
Kompjuter
klasë për të marrë lëvizjet e përdoruesit dhe kompjuterit.
Zhvendos userMove = user.getMove (); Leviz computerMove = computer.getMove (); System.out.println ("\ nJu keni luajtur" + userMove + "."); System.out.println ("Kompjuteri u luajt" + computerMove + ". / N");
Hapi 11. Krahasoni dy lëvizjet dhe përcaktoni nëse fitoi përdoruesi apo fitoi kompjuteri
Përdorni
krahasoMoves ()
metodë nga
Lëviz
enum për të përcaktuar nëse përdoruesi fitoi apo jo. Nëse përdoruesi fiton, shtoni rezultatin e përdoruesit me 1. Nëse përdoruesi humbet, rritni rezultatin e kompjuterit me 1. Nëse ka një barazim, mos e rritni asnjë nga rezultatet. Pastaj shtoni numrin e lojërave të luajtura me një.
int compareMoves = userMove.compareMoves (lëvizja e kompjuterit); switch (krahasoMoves) {case 0: // Tie System.out.println ("Tie!"); pushim; rasti 1: // Përdoruesi fiton System.out.println (userMove + "rreh" + computerMove + ". Ju fituat!"); userScore ++; pushim; rasti -1: // Kompjuteri fiton System.out.println (computerMove + "rreh" + userMove + ". Ke humbur."); kompjuterScore ++; pushim; } numberOfGames ++;
Hapi 12. Pyetni nëse përdoruesi dëshiron të luajë përsëri
Nëse përdoruesi dëshiron të luajë përsëri, telefononi
Fillo lojen()
përsëri. Përndryshe, telefononi
printGameStats ()
e cila do të printojë statistikat e lojës. Ne do ta shkruajmë këtë metodë në hapin tjetër.
if (user.playAgain ()) {System.out.println (); Fillo lojen(); } else {printGameStats (); }
Hapi 13. Shkruani
printGameStats ()
metodë.
Kjo metodë do të shfaq statistikat e lojës: numri i fitoreve, numri i humbjeve, numri i barazimeve, numri i lojërave të luajtura dhe përqindja e lojërave të fituara nga përdoruesi. Përqindja e lojërave të fituara llogaritet nga (# fiton + (# kravatë/2))/(# lojëra të luajtura). Kjo metodë përdor
System.out.printf
për të printuar tekst të formatuar.
private void printGameStats () {int fiton = userScore; humbjet int = rezultati kompjuterik; lidhjet int = numriOfGames - userScore - computerScore; përqindje e dyfishtë Fitoi = (fiton + ((dyfish) barazimet) / 2) / numberOfGames; // Line System.out.print ("+"); printDashhes (68); System.out.println ("+"); // Shtyp titujt System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "FITIMET", "HUMBJET", "LIDHJET", "LOJ PLRAT E LUARA", "PERRQINDJA FITOI"); // Line System.out.print ("|"); printDashes (10); System.out.print ("+"); printDashhes (10); System.out.print ("+"); printDashhes (10); System.out.print ("+"); printDashhes (16); System.out.print ("+"); printDashhes (18); System.out.println ("|"); // Vlerat e printimit System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", fitimet, humbjet, lidhjet, numriOfGames, përqindja Fituar * 100); // Line System.out.print ("+"); printDashhes (68); System.out.println ("+"); }
Hapi 14. Filloni lojën në klasën kryesore
Në klasën kryesore, filloni një shembull të
Gurë Letër gërshërë
klasë dhe telefononi
Fillo lojen()
metodë.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
Hapi 15. Provoni lojën tuaj
Tani që kemi kaluar të gjitha përpjekjet për të shkruar lojën Rock, Letër, Gërshërë, është koha për të përpiluar dhe testuar gjithçka!
Shembull Programi
importo java.util. Rastit; import java.util. Scanner; klasë publike RockPaperScissors {përdorues privat i përdoruesit; kompjuter kompjuterik privat; int int userScore; int int privateScore; numri int privat i lojërave; enum privat Lëviz {ROCK, PAPER, Gërshërë; /** * Krahason këtë lëvizje me një lëvizje tjetër me përcaktimin e barazimit, fitores ose * humbjes. * * @param otherMove * lëvizni për ta krahasuar me * @return 1 nëse kjo lëvizje rreh lëvizjen tjetër, -1 nëse kjo lëvizje humbet në * lëvizjen tjetër, 0 nëse këto lëvizje lidhen * / public int compareMoves (Lëvizni lëvizjen tjetër) { / / Tie if (this == otherMove) kthejë 0; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); rast PAPER: kthim (tjetërLëviz == ROCK? 1: -1); gërshërë të rastit: kthim (tjetërLëviz == PAPER? 1: -1); } // Kurrë nuk duhet të arrijë këtu kthehu 0; }} klasa private Përdoruesi {private Scanner inputScanner; publik User () {inputScanner = skaner i ri (System.in); } Public Move getMove () {// Nxitni përdoruesin System.out.print ("Shkëmb, letër, apo gërshërë?"); // Merrni hyrjen e përdoruesit String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); nëse (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Përdoruesi ka futur një çelës hyrës të vlefshëm (firstLetter) {rasti 'R': kthehu Move. ROCK; rasti 'P': kthehu Move. PAPER; rasti 'S': kthehu Leviz. GJISLORT; }} // Përdoruesi nuk ka futur një hyrje të vlefshme. Nxit përsëri. kthehu getMove (); } public boolean playAgain () {System.out.print ("A doni të luani përsëri?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); kthehu userInput.charAt (0) == 'Y'; }} klasë private Kompjuter {public Move getMove () {Move moves = Move.values (); Random random = i ri Random (); int index = random.nextInt (moves.length); lëvizjet e kthimit [indeksi]; }} publike RockPaperScissors () {user = përdorues i ri (); kompjuter = kompjuter i ri (); userScore = 0; rezultat kompjuterik = 0; numriOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, Gërshërë!"); // Merr lëvizje Leviz userMove = user.getMove (); Leviz computerMove = computer.getMove (); System.out.println ("\ nJu keni luajtur" + userMove + "."); System.out.println ("Kompjuteri u luajt" + computerMove + ". / N"); // Krahasoni lëvizjet dhe përcaktoni fituesin në compareMoves = userMove.compareMoves (lëvizja e kompjuterit); switch (krahasoMoves) {case 0: // Tie System.out.println ("Tie!"); pushim; rasti 1: // Përdoruesi fiton System.out.println (userMove + "rreh" + computerMove + ". Ju fituat!"); userScore ++; pushim; rasti -1: // Kompjuteri fiton System.out.println (computerMove + "rreh" + userMove + ". Ke humbur."); kompjuterScore ++; pushim; } numberOfGames ++; // Kërkoji përdoruesit të luajë përsëri nëse (user.playAgain ()) {System.out.println (); Fillo lojen(); } else {printGameStats (); }} /*** Shtyp statistikat e lojës. Llogarit barazimet si 1/2 e fitores në * përqindje të fituar. */ private void printGameStats () {int fiton = userScore; humbjet int = rezultati kompjuterik; lidhjet int = numriOfGames - userScore - computerScore; përqindje e dyfishtë Fitoi = (fiton + ((dyfish) barazimet) / 2) / numberOfGames; // Line System.out.print ("+"); printDashhes (68); System.out.println ("+"); // Shtyp titujt System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "FITIMET", "HUMBJET", "LIDHJET", "LOJAMRAT E LUARA", "PERRQINDJA FITOI"); // Line System.out.print ("|"); printDashes (10); System.out.print ("+"); printDashhes (10); System.out.print ("+"); printDashhes (10); System.out.print ("+"); printDashhes (16); System.out.print ("+"); printDashhes (18); System.out.println ("|"); // Vlerat e printimit System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", fitoret, humbjet, lidhjet, numriOfGames, përqindja Fituar * 100); // Line System.out.print ("+"); printDashhes (68); System.out.println ("+"); } printDashes private void (int numberOfDashes) {për (int i = 0; i <numberOfDashes; i ++) {System.out.print ("-"); }} public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }}