A Rock, Paper, Scissors egy kézi játék, amelyet két ember játszik. Mindkét ember azt mondaná, hogy "szikla, papír, olló", majd egyidejűleg kinyújtott kézzel három tárgy (kő, papír vagy olló) egyikét alkotja. A győztest a kézi formációk határozzák meg. Az olló veri a papírt, a papír a kőzetet, a kő pedig az ollót. Ha mindkét játékos ugyanazt a leosztást játssza, döntetlennek számít. Egy egyszerű játékot fogunk írni Java nyelven, hogy szimulálja a kőzetet, papírt, ollót, ahol az egyik játékos a felhasználó, a másik pedig a számítógép.
Lépések
1. lépés. Hozza létre a főosztályt, és hívja fel
Kő papír olló
.
Ez lesz az osztály, ahol megírjuk a játékot. Választhat más nevet is, mint pl
Játszma, meccs
vagy
Fő
. Írja be a konstruktor és a fő módszer módszer deklarációit.
public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Lépés 2. Hozzon létre egy felsorolást a kézmozdulatokhoz (kő, papír vagy olló)
A húrokat használhatnánk kőzet, papír vagy olló ábrázolására, de a felsorolás lehetővé teszi számunkra, hogy előre meghatározzuk az állandókat, ami azt jelenti, hogy a felsorolás használata jobb megoldás. Enum típusunkat fogjuk hívni
Mozog
az értékekkel
SZIKLA
PAPÍR
és
OLLÓ
private enum Move {ROCK, PAPER, SCISSORS}
3. Hozzon létre két magánórát
Felhasználó
és
Számítógép
.
Ezek az osztályok képviselik játékosainkat a játékban. Dönthet úgy, hogy nyilvánosságra hozza ezeket az osztályokat. Az
Felhasználó
osztály lesz az az osztály, amely kőzetet, papírt vagy ollót kér a felhasználótól, ezért írnunk kell egy
getMove ()
módszer. Az
Számítógép
osztálynak is szüksége lesz a
getMove ()
módszerrel, hogy a számítógép is mozoghasson. Helyőrzőket helyezünk ezekbe a módszerekbe, és később megvalósítjuk őket. Az
Felhasználó
osztályhoz olyan konstruktorra lesz szükség, amely beállítja a
Scanner
objektumot a felhasználói bevitelhez. Feltesszük a
Scanner
privát mezőként a felhasználó számára, majd kezdeményezze azt a konstruktorban. Mivel a
Scanner
osztály, akkor import kódot kell írnunk hozzá a kódunk tetejére. Az
Számítógép
osztályhoz nem szükséges konstruktor, tehát nem kell írnunk egyet; amikor kezdeményezzük a
Számítógép
objektumot, csak az alapértelmezett konstruktőrt fogjuk hívni. Íme, miénk
Kő papír olló
az osztály most így néz ki:
import java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; public User () {inputScanner = új szkenner (System.in); } public Move getMove () {// TODO: A módszer megvalósítása return null; }} magánosztályú számítógép {public Move getMove () {// TODO: implementálja ezt a módszert return null; }} public RockPaperScissors () {} public static void main (String args) {}}
4. lépés. Írja be a
getMove ()
módszer a
Számítógép
osztály.
Ez a módszer véletlenszerűen tér vissza
Mozog
. Kaphatunk egy tömböt
Mozog
felsorolás hívásával
értékek ()
módszer:
Move.values ()
. Véletlen kiválasztásához
Mozog
Ha felsoroljuk ezt az értéktömböt, akkor létre kell hoznunk egy véletlenszerű indexet, amely 0 és az értéktömbünk hossza közötti egész szám. Ehhez használhatjuk a
nextInt ()
módszere a
Véletlen
osztály, amelyből importálnunk kell
java.util
. Miután megkaptuk a véletlen indexet, visszatérhetünk a
Mozog
az indexből az értéktömbünkből.
public Move getMove () {Move move = Move.values (); Random random = new Random (); int index = random.nextInt (mozog.hossz); visszatérési lépések [index]; }
5. lépés Írja be a
getMove ()
módszer a
Felhasználó
osztály.
Ez a módszer visszatér a
Mozog
megfelel annak, amit a felhasználó bevitt. Elvárjuk a felhasználótól, hogy "kőzetet", "papírt" vagy "ollót" írjon. Először is meg kell kérnünk a felhasználót a bevitelre:
System.out.print ("Kő, papír vagy olló?")
. Ezután használja a
nextLine ()
módszere a
Scanner
objektumot, hogy a felhasználói bemenetet karakterláncként kapja meg. Most ellenőriznünk kell, hogy a felhasználó benyújtott -e érvényes lépést, de engedékenyek lehetünk, ha a felhasználó rosszul írt egy szót. Tehát csak azt ellenőrizzük, hogy a felhasználói bevitel első betűje vagy "R" (kőzet esetén), "P" (papír esetén) vagy "S" (olló esetén), és nem fogjuk érdekelni az esetet, mert először a
toUpperCase ()
módszere a
Húr
osztály, hogy a felhasználói beviteli karakterlánc nagybetűs legyen. Ha a felhasználó nem adott meg távolról helyes bemenetet, akkor újra megkéri a felhasználót. Ezután attól függően, hogy a felhasználó mit tett be, visszatérünk a megfelelő lépéshez.
public Move getMove () {// Kérdezze meg a System.out.print felhasználót ("Kő, papír vagy olló?"); // A felhasználói bemenet lekérése String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// A felhasználó érvényes beviteli kapcsolót adott meg (firstLetter) {case 'R': return Move. ROCK; „P” eset: return Move. PAPER; „S” eset: return Move. SCISSORS; }} // A felhasználó nem adott meg érvényes bemenetet. Kérd újra. return getMove (); }
6. lépés. Írja be a
játszd újra()
módszer a
Felhasználó
osztály.
A felhasználónak képesnek kell lennie arra, hogy újra és újra játssza a játékot. Annak megállapításához, hogy a felhasználó szeretne -e újra játszani, írnunk kell egy
játszd újra()
metódus, amely logikai értéket ad vissza, és megmondja a játéknak, hogy a felhasználó eldöntötte -e, hogy újra játszik. Ebben a módszerben a
Scanner
amit korábban a konstruktorban kezdeményeztünk, hogy "igen" vagy "nem" választ kapjunk a felhasználótól. Csak akkor ellenőrizzük, hogy az első betű "Y" -es, hogy meghatározzuk, hogy a felhasználó újra szeretne -e játszani. Bármely más bemenet azt jelenti, hogy a felhasználó nem akar újra játszani.
public boolean playAgain () {System.out.print ("Szeretnél újra játszani?"); Karakterlánc userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }
7. lépés Csatlakoztassa a
Felhasználó
és
Számítógép
osztályok együtt a
Kő papír olló
osztály.
Most, hogy befejeztük az írást
Felhasználó
és
Számítógép
osztályok, akkor koncentrálhatunk a tényleges játékunk kidolgozására. Hozzon létre privát mezőket a
Felhasználó
és
Számítógép
osztályok a
Kő papír olló
osztály. Hozzá kell férnünk ezekhez a mezőkhöz, hogy hozzáférjünk a
getMove ()
módszerek a játék során. A konstruktorban a
Kő papír olló
osztály, kezdeményezze ezeket a mezőket. Továbbá nyomon kell követnünk a pontszámot
userScore
és
computerScore
mezőket, amelyeket 0 -ként kell kezdeményeznünk a konstruktorban. Követnünk kell a játékok számát is, ami szintén 0 -ként kezdeményezett mezőny lesz.
privát felhasználó; saját számítógépes számítógép; private int userScore; privát int computerScore; privát int numberOfGames; public RockPaperScissors () {user = new User (); számítógép = új Számítógép (); userScore = 0; computerScore = 0; numberOfGames = 0; }
8. lépés. Hosszabbítsa ki a
Mozog
enum, hogy tartalmazzon egy módszert, amely megmondja, melyik lépés nyer minden esetben.
Írnunk kell egy
compaMoves ()
metódus, amely 0 -t ad vissza, ha a lépések azonosak, 1 -et, ha az aktuális lépés legyőzi a másik lépést, és -1 -et, ha az aktuális lépés elveszíti a másik lépést. Ez hasznos lesz a győztes meghatározásához a játékban. Ennek a módszernek a végrehajtásához először 0 -t adunk vissza, ha a mozdulatok azonosak, és ezért döntetlenek vagyunk. Ezután írjon kapcsoló utasítást az 1 vagy -1 visszaadására.
private enum Move {ROCK, PAPER, SCISSORS; /** * Összehasonlítja ezt a lépést egy másik lépéssel döntetlen, győzelem vagy * vereség meghatározásával. * * @param otherMove * áthelyezés a * @return 1 -hez, ha ez a lépés legyőzi a másik lépést, -1, ha ez a lépés elveszíti * a másik lépést, 0, ha ezek a lépések döntetlen * / public int compaMoves (Move otherMove) { / / Döntetlen, ha (this == otherMove) return 0; switch (ez) {case ROCK: return (otherMove == OLÓK? 1: -1); eset PAPÍR: return (otherMove == ROCK? 1: -1); eset OLLÓ: return (otherMove == PAPER? 1: -1); } // Soha ne érjen ide vissza 0; }}
9. lépés. Hozzon létre a
játék kezdése()
módszer a
Kő papír olló
osztály.
Ez a módszer lesz a játék. Kezdje azzal, hogy felvesz egy egyszerűt
System.out.println
a módszerben.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSOR!"); }
10. lépés. Lépéseket kérhet a felhasználótól és a számítógéptől
Ban,-ben
játék kezdése()
módszer, használja a
getMove ()
módszerek a
Felhasználó
osztály és a
Számítógép
osztály, hogy a felhasználó és a számítógép lépéseit.
Mozgassa userMove = user.getMove (); Számítógép mozgatásaMove = computer.getMove (); System.out.println ("\ nJátszottál" + userMove + "."); System.out.println ("A számítógép játszott" + computerMove + ". / N");
11. lépés: Hasonlítsa össze a két lépést, és határozza meg, hogy a felhasználó nyert, vagy a számítógép nyert
Használja a
compaMoves ()
módszer a
Mozog
enum annak eldöntésére, hogy a felhasználó nyert -e vagy sem. Ha a felhasználó nyert, növelje a felhasználói pontszámot 1 -gyel. Ha a felhasználó vesztett, növelje a számítógép pontszámát 1 -gyel. Ha döntetlen volt, ne növelje a pontszámokat. Ezután növelje a játszott játékok számát eggyel.
int compaMoves = userMove.compareMoves (computerMove); switch (compaMoves) {case 0: // Tie System.out.println ("Tie!"); szünet; 1. eset: // A felhasználó nyer System.out.println (userMove + "beats" + computerMove + ". Ön nyert!"); userScore ++; szünet; eset -1: // A számítógép nyer System.out.println (computerMove + "ütem" + userMove + ". Elvesztetted."); computerScore ++; szünet; } numberOfGames ++;
12. lépés. Kérdezze meg, hogy a felhasználó szeretne -e újra játszani
Ha a felhasználó újra szeretne játszani, hívjon
játék kezdése()
újra. Ellenkező esetben hívjon
printGameStats ()
amely kinyomtatja a játék statisztikáit. Ezt a módszert a következő lépésben írjuk le.
if (user.playAgain ()) {System.out.println (); játék kezdése(); } else {printGameStats (); }
13. lépés. Írja be a
printGameStats ()
módszer.
Ez a módszer megjeleníti a játék statisztikáit: a győzelmek száma, a veszteségek száma, a döntetlenek száma, a lejátszott játékok száma és a felhasználó által megnyert játékok százalékos aránya. A megnyert játékok százalékos arányát a (# győzelem + (# döntetlen/2))/(# lejátszott játék) alapján számítják ki. Ez a módszer használja
System.out.printf
formázott szöveg kinyomtatásához.
private void printGameStats () {int nyer = userScore; int veszteségek = computerScore; int ties = numberOfGames - userScore - computerScore; double percentWon = (nyer + ((kettős)) döntetlen) / 2) / numberOfGames; // Sor System.out.print ("+"); printDashes (68); System.out.println ("+"); // Címek nyomtatása System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMEES PLAYED", "PERCENTAGE NYERTE"); // 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 ("|"); // Értékek nyomtatása System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", győzelmek, veszteségek, döntetlenek, numberOfGames, percentWon * 100); // Sor System.out.print ("+"); printDashes (68); System.out.println ("+"); }
14. lépés: Indítsa el a játékot a főosztályon
A főosztályban inicializálja a
Kő papír olló
osztály és hívja a
játék kezdése()
módszer.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
15. lépés: Tesztelje játékát
Most, hogy minden erőfeszítést megtettünk a Rock, Paper, Scissors játék megírásához, itt az ideje mindent összeállítani és kipróbálni!
Mintaprogram
import java.util. Random; import java.util. Scanner; public class RockPaperScissors {privát felhasználó; saját számítógépes számítógép; private int userScore; privát int computerScore; privát int numberOfGames; private enum Move {ROCK, PAPER, SCISSORS; /** * Összehasonlítja ezt a lépést egy másik lépéssel döntetlen, győzelem vagy * vereség meghatározásával. * * @param otherMove * áthelyezés a * @return 1 -hez, ha ez a lépés legyőzi a másik lépést, -1, ha ez a lépés elveszíti * a másik lépést, 0, ha ezek a lépések döntetlen * / public int compaMoves (Move otherMove) { / / Döntetlen, ha (this == otherMove) return 0; switch (ez) {case ROCK: return (otherMove == OLÓK? 1: -1); eset PAPÍR: return (otherMove == ROCK? 1: -1); eset OLLÓ: return (otherMove == PAPER? 1: -1); } // Soha ne érjen ide vissza 0; }} privát osztály Felhasználó {privát szkenner inputScanner; public User () {inputScanner = új szkenner (System.in); } public Move getMove () {// Kérdezze meg a System.out.print felhasználót ("Kő, papír vagy olló?"); // A felhasználói bemenet lekérése String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// A felhasználó érvényes beviteli kapcsolót adott meg (firstLetter) {case 'R': return Move. ROCK; „P” eset: return Move. PAPER; „S” eset: return Move. SCISSORS; }} // A felhasználó nem adott meg érvényes bemenetet. Kérd újra. return getMove (); } public boolean playAgain () {System.out.print ("Szeretnél újra játszani?"); Karakterlánc userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} magánosztályú számítógép {public Move getMove () {Move move = Move.values (); Random random = new Random (); int index = random.nextInt (mozog.hossz); visszatérési lépések [index]; }} public RockPaperScissors () {user = new User (); számítógép = új Számítógép (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Mozgások lekérése Move userMove = user.getMove (); Számítógép mozgatásaMove = computer.getMove (); System.out.println ("\ nJátszottál" + userMove + "."); System.out.println ("A számítógép játszott" + computerMove + ". / N"); // Hasonlítsa össze a lépéseket, és határozza meg a győztest int compaMoves = userMove.compareMoves (computerMove); switch (compaMoves) {case 0: // Tie System.out.println ("Tie!"); szünet; 1. eset: // A felhasználó nyer System.out.println (userMove + "beats" + computerMove + ". Ön nyert!"); userScore ++; szünet; eset -1: // A számítógép nyer System.out.println (computerMove + "ütem" + userMove + ". Elvesztetted."); computerScore ++; szünet; } numberOfGames ++; // Kérje meg a felhasználót, hogy játsszon újra, ha (user.playAgain ()) {System.out.println (); játék kezdése(); } else {printGameStats (); }} /*** Kinyomtatja a játék statisztikáit. A nyereményeket 1/2 győzelemként számítja ki * megnyert százalékban. */ private void printGameStats () {int nyer = userScore; int veszteségek = computerScore; int ties = numberOfGames - userScore - computerScore; double percentWon = (nyer + ((kettős)) döntetlen) / 2) / numberOfGames; // Sor System.out.print ("+"); printDashes (68); System.out.println ("+"); // Címek nyomtatása System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "GAMEES PLAYED", "PERCENTAGE NYERTE"); // 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 ("|"); // Értékek nyomtatása System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", győzelmek, veszteségek, döntetlenek, numberOfGames, percentWon * 100); // Sor 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 (); }}