Rock, Paper, Scissors on käsipeli, jota pelaavat kaksi henkilöä. Molemmat ihmiset sanoisivat "kivi, paperi, sakset" ja muodostavat sitten samanaikaisesti yhden kolmesta esineestä (kivi, paperi tai sakset) ojennetulla kädellä. Voittaja määräytyy käsirakenteiden perusteella. Sakset lyövät paperia, paperi lyö kiveä ja rock voittaa sakset. Jos molemmat pelaajat pelaavat samaa käden muodostusta, sitä pidetään tasapelinä. Kirjoitamme yksinkertaisen Java -pelin, joka simuloi kalliota, paperia ja saksia, jossa yksi pelaaja on käyttäjä ja toinen tietokone.
Askeleet
Vaihe 1. Luo pääluokka ja kutsu se
Kivi paperi sakset
.
Tämä on luokka, jossa kirjoitamme pelin. Voit halutessasi nimetä sen muuksi, kuten
Peli
tai
Pääasiallinen
. Kirjoita rakenteen ja päämenetelmän menetelmäilmoitukset.
public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Vaihe 2. Luo käsieleiden luettelo (kivi, paperi tai sakset)
Voisimme käyttää merkkijonoja edustamaan kiveä, paperia tai saksia, mutta luetteloinnin avulla voimme ennalta määritellä vakiomme, mikä tarkoittaa, että luetteloinnin käyttäminen on parempi muotoilu. Me kutsumme enum -tyyppiämme
Liikkua
arvojen kanssa
ROCK
PAPERI
ja
SAKSET
private enum Siirrä {ROCK, PAPER, SCISSORS}
Vaihe 3. Luo kaksi yksityistä luokkaa
Käyttäjä
ja
Tietokone
.
Nämä luokat edustavat pelaajiamme pelissä. Voit halutessasi julkistaa nämä luokat. The
Käyttäjä
luokka on luokka, joka kehottaa käyttäjää joko kiven, paperin tai saksien saamiseen, joten meidän on kirjoitettava
getMove ()
menetelmä. The
Tietokone
luokalla on oltava myös
getMove ()
menetelmä, jotta tietokone voi myös tehdä siirron. Laitamme paikkamerkit näihin menetelmiin ja otamme ne käyttöön myöhemmin. The
Käyttäjä
luokka vaatii konstruktorin, joka määrittää
Skanneri
kohde, joka ottaa vastaan käyttäjän syötteen. Laitamme
Skanneri
yksityisenä kentänä käyttäjälle ja käynnistä se sitten konstruktorissa. Koska käytämme
Skanneri
luokka, meidän on kirjoitettava tuontilausunto sille koodimme yläreunaan. The
Tietokone
luokka ei vaadi konstruktoria, joten meidän ei tarvitse kirjoittaa sitä; kun aloitamme
Tietokone
objekti, soitamme vain oletusrakentajaksi. Tässä on meidän
Kivi paperi sakset
luokka näyttää nyt tältä:
tuoda java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} yksityinen luokka User {private Scanner inputScanner; julkinen käyttäjä () {inputScanner = uusi skanneri (System.in); } public Siirrä getMove () {// TODO: Toteuta tämä menetelmä return null; }} yksityisluokka Tietokone {public Move getMove () {// TODO: Toteuta tämä menetelmä return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Vaihe 4. Kirjoita
getMove ()
menetelmä
Tietokone
luokka.
Tämä menetelmä palauttaa satunnaisen
Liikkua
. Voimme saada joukon
Liikkua
numerot soittamalla
arvot ()
menetelmä:
Siirrä.arvot ()
. Valitse satunnainen
Liikkua
Tämän arvotaulukon luetteloinnissa meidän on luotava satunnainen indeksi, joka on kokonaisluku välillä 0 ja arvotaulukon pituus. Tätä varten voimme käyttää
nextInt ()
menetelmä
Satunnainen
luokka, josta meidän on tuotava
java.util
. Kun olemme saaneet satunnaisindeksin, voimme palauttaa
Liikkua
tästä indeksistä arvotaulukostamme.
public Siirrä getMove () {Siirrä liikkuu = Siirrä.arvot (); Satunnainen satunnainen = uusi Satunnainen (); int -indeksi = satunnainen.seuraavaInt (siirtyy.pituus); paluuliikkeet [hakemisto]; }
Vaihe 5. Kirjoita
getMove ()
menetelmä
Käyttäjä
luokka.
Tämä menetelmä palauttaa a
Liikkua
vastaa mitä käyttäjä on syöttänyt. Odotamme käyttäjän kirjoittavan joko "rock", "paperi" tai "sakset". Ensin meidän on pyydettävä käyttäjää syöttämään:
System.out.print ("Kivi, paperi tai sakset?")
. Käytä sitten
nextLine ()
menetelmä
Skanneri
objekti saadaksesi käyttäjän syötteen merkkijonona. Meidän on nyt tarkistettava, onko käyttäjä lähettänyt kelvollisen siirron, mutta voimme olla lempeitä, jos käyttäjä on kirjoittanut sanan väärin. Joten tarkistamme vain, onko käyttäjän syötteen ensimmäinen kirjain joko "R" (kallio), "P" (paperi) tai "S" (sakset), emmekä välitä tapauksesta, koska käytämme ensin
toUpperCase ()
menetelmä
Jousisoitin
luokka, jos haluat, että käyttäjän syöttöjono on iso. Jos käyttäjä ei ole syöttänyt kauko -oikeaa tuloa, kehotamme käyttäjää uudelleen. Sen jälkeen palautamme vastaavan siirron sen mukaan, mitä käyttäjä on asettanut.
public Move getMove () {// Kehota käyttäjää System.out.print ("Kivi, paperi tai sakset?"); // Hae käyttäjän syöttö Jono userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Käyttäjä on syöttänyt kelvollisen tulokytkimen (firstLetter) {case 'R': return Move. ROCK; kirjain 'P': palauta Move. PAPER; tapaus 'S': palauta siirto. SAKSIT; }} // Käyttäjä ei ole syöttänyt kelvollista syöttöä. Kysy uudelleen. return getMove (); }
Vaihe 6. Kirjoita a
pelaa uudestaan()
menetelmä
Käyttäjä
luokka.
Käyttäjän pitäisi pystyä pelaamaan peliä uudestaan ja uudestaan. Jotta voimme päättää, haluaako käyttäjä pelata uudelleen, meidän on kirjoitettava a
pelaa uudestaan()
menetelmä, joka palauttaa boolen kertomalla pelille, onko käyttäjä päättänyt pelata uudelleen vai ei. Tässä menetelmässä käytämme
Skanneri
että olimme aiemmin aloittaneet rakentamisessa saadaksesi "Kyllä" tai "Ei" käyttäjältä. Tarkistamme vain, onko ensimmäinen kirjain Y, jotta voimme päättää, haluaako käyttäjä pelata uudelleen. Mikä tahansa muu tulo tarkoittaa, että käyttäjä ei halua pelata uudelleen.
public boolean playAgain () {System.out.print ("Haluatko pelata uudelleen?"); Jono userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }
Vaihe 7. Liitä
Käyttäjä
ja
Tietokone
luokat yhdessä
Kivi paperi sakset
luokka.
Nyt kun olemme kirjoittaneet
Käyttäjä
ja
Tietokone
luokat, voimme keskittyä työskentelemään todellisen pelimme parissa. Luo yksityisiä kenttiä
Käyttäjä
ja
Tietokone
luokat
Kivi paperi sakset
luokka. Meidän on päästävä näihin kenttiin päästäksesi
getMove ()
menetelmiä, kun pelaamme peliä. Rakentaja varten
Kivi paperi sakset
luokka, aloita nämä kentät. Meidän on myös seurattava pisteitä
userScore
ja
computerScore
kentät, jotka meidän on aloitettava 0: na konstruktorissa. Meidän on myös seurattava pelien lukumäärää, joka on myös 0 -aloitus.
yksityinen käyttäjä; yksityinen Tietokone tietokone; yksityinen int userScore; yksityinen int computerScore; yksityinen int numeroOfGames; julkinen RockPaperScissors () {user = new User (); tietokone = uusi tietokone (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Vaihe 8. Laajenna
Liikkua
enum sisällyttää menetelmän, joka kertoo, mikä siirto voittaa kussakin tapauksessa.
Meidän on kirjoitettava a
compaMoves ()
menetelmä, joka palauttaa 0, jos liikkeet ovat samat, 1, jos nykyinen liike voittaa toisen liikkeen, ja -1, jos nykyinen siirto häviää toiselle liikkeelle. Tästä on hyötyä voittajan määrittämisessä pelissä. Tämän menetelmän toteuttamiseksi palautamme ensin 0, jos liikkeet ovat samat ja siksi meillä on tasapeli. Kirjoita sitten kytkinlauseke 1: n tai -1: n palauttamiseksi.
yksityinen enum Siirrä {ROCK, PAPER, SCISSORS; /** * Vertaa tätä siirtoa toiseen siirtoon tasapelin, voiton tai * tappion määrittämiseen. * * @param otherMove * siirrä vertaillaksesi arvoon * @return 1, jos tämä liike voittaa toisen siirron, -1, jos tämä siirto häviää * toiselle siirrolle, 0, jos nämä liikkeet sitovat * / public int compaMoves (Siirrä otherMove) { / / Tasapeli, jos (tämä == muuMove) palauttaa 0; kytkin (tämä) {case ROCK: return (otherMove == SCISSORS? 1: -1); tapaus PAPER: return (otherMove == ROCK? 1: -1); tapauksessa sakset: return (otherMove == PAPER? 1: -1); } // Ei pitäisi koskaan päästä tänne palaa 0; }}
Vaihe 9. Luo a
Aloita peli()
menetelmä
Kivi paperi sakset
luokka.
Tämä menetelmä on pelin pelaaminen. Aloita asettamalla yksinkertainen
System.out.println
menetelmässä.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }
Vaihe 10. Hanki liikkeet käyttäjältä ja tietokoneelta
Kohteessa
Aloita peli()
menetelmä, käytä
getMove ()
menetelmiä
Käyttäjä
luokka ja
Tietokone
luokka saadakseen käyttäjän ja tietokoneen liikkeet.
Siirrä userMove = user.getMove (); Siirrä tietokoneMove = computer.getMove (); System.out.println ("\ nPelasit" + userMove + "."); System.out.println ("Tietokonetta toistettu" + computerMove + ". / N");
Vaihe 11. Vertaa kahta liikettä ja määritä, voittaako käyttäjä vai tietokone
Käytä
compaMoves ()
menetelmä
Liikkua
enum selvittääkseen voittiko käyttäjä vai ei. Jos käyttäjä voitti, lisää käyttäjäpistettä yhdellä. Jos käyttäjä häviää, lisää tietokoneen pistettä yhdellä. Jos tulos oli tasan, älä lisää mitään pisteistä. Lisää sitten pelattujen pelien määrää yhdellä.
int compaMoves = userMove.compareMoves (computerMove); switch (compaMoves) {case 0: // Tie System.out.println ("Tie!"); tauko; tapaus 1: // Käyttäjä voittaa System.out.println (userMove + "lyö" + computerMove + ". Voitit!"); userScore ++; tauko; case -1: // Tietokone voittaa System.out.println (computerMove + "lyö" + userMove + ". Hävisit."); computerScore ++; tauko; } numberOfGames ++;
Vaihe 12. Kysy, haluaako käyttäjä pelata uudelleen
Jos käyttäjä haluaa pelata uudelleen, soita
Aloita peli()
uudelleen. Muussa tapauksessa soita
printGameStats ()
joka tulostaa pelin tilastot. Kirjoitamme tämän menetelmän seuraavassa vaiheessa.
if (user.playAgain ()) {System.out.println (); Aloita peli(); } else {printGameStats (); }
Vaihe 13. Kirjoita
printGameStats ()
menetelmä.
Tämä menetelmä näyttää pelin tilastot: voittojen, tappioiden, tasapelien, pelattujen pelien ja käyttäjän voittamien pelien määrän. Voitettujen pelien prosenttiosuus lasketaan (# voittoa + (# tie/2))/(# pelattua peliä) perusteella. Tämä menetelmä käyttää
System.out.printf
tulostaa muotoiltua tekstiä.
private void printGameStats () {int voitot = userScore; int tappiot = computerScore; int site = numberOfGames - userScore - computerScore; kaksinkertainen prosenttivoitto = (voittaa + ((kaksinkertainen)) tasapeli) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Tulosta otsikot System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "PELATUT PELIT", "PERCENTAGE VOITTI"); // 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 ("|"); // Tulosta arvot System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", voitot, tappiot, tasapelit, lukumääräOfGames, prosenttivoitto * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Vaihe 14. Aloita peli pääluokassa
Alusta pääluokassa
Kivi paperi sakset
luokka ja soita
Aloita peli()
menetelmä.
public staattinen void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
Vaihe 15. Testaa peliäsi
Nyt kun olemme käyneet läpi kaikki ponnistelut Rock, Paper, Scissors -pelin kirjoittamiseksi, on aika koota ja testata kaikki!
Esimerkkiohjelma
tuonti java.util. Random; tuoda java.util. Scanner; public class RockPaperScissors {yksityinen käyttäjä; yksityinen Tietokone tietokone; yksityinen int userScore; yksityinen int computerScore; yksityinen int numeroOfGames; yksityinen enum Siirrä {ROCK, PAPER, SCISSORS; /** * Vertaa tätä siirtoa toiseen siirtoon tasapelin, voiton tai * tappion määrittämiseen. * * @param otherMove * siirrä vertaillaksesi arvoon * @return 1, jos tämä liike voittaa toisen siirron, -1, jos tämä siirto häviää * toiselle siirrolle, 0, jos nämä liikkeet sitovat * / public int compaMoves (Siirrä otherMove) { / / Tasapeli, jos (tämä == muuMove) palauttaa 0; kytkin (tämä) {case ROCK: return (otherMove == SCISSORS? 1: -1); tapaus PAPER: return (otherMove == ROCK? 1: -1); tapaus sakset: return (otherMove == PAPER? 1: -1); } // Ei pitäisi koskaan päästä tänne palaa 0; }} yksityinen luokka Käyttäjä {yksityinen skanneri inputScanner; julkinen käyttäjä () {inputScanner = uusi skanneri (System.in); } public Move getMove () {// Kehota käyttäjää System.out.print ("Kivi, paperi tai sakset?"); // Hae käyttäjän syöttö Jono userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Käyttäjä on syöttänyt kelvollisen tulokytkimen (firstLetter) {case 'R': return Move. ROCK; kirjain P: palauta Move. PAPER; tapaus 'S': palauta siirto. SAKSIT; }} // Käyttäjä ei ole syöttänyt kelvollista syöttöä. Kysy uudelleen. return getMove (); } public boolean playAgain () {System.out.print ("Haluatko pelata uudelleen?"); Jono userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); return userInput.charAt (0) == 'Y'; }} yksityinen luokka Tietokone {public Move getMove () {Move move = Move.values (); Satunnainen satunnainen = uusi Satunnainen (); int -indeksi = satunnainen.seuraavaInt (siirtyy.pituus); paluuliikkeet [hakemisto]; }} public RockPaperScissors () {user = new User (); tietokone = uusi tietokone (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Hae liikkeet Siirrä userMove = user.getMove (); Siirrä tietokoneMove = computer.getMove (); System.out.println ("\ nPelasit" + userMove + "."); System.out.println ("Tietokonetta toistettu" + computerMove + ". / N"); // Vertaa liikkeitä ja määritä voittaja int compaMoves = userMove.compareMoves (computerMove); switch (compaMoves) {case 0: // Tie System.out.println ("Tie!"); tauko; tapaus 1: // Käyttäjä voittaa System.out.println (userMove + "lyö" + computerMove + ". Voitit!"); userScore ++; tauko; case -1: // Tietokone voittaa System.out.println (computerMove + "lyö" + userMove + ". Hävisit."); computerScore ++; tauko; } numberOfGames ++; // Pyydä käyttäjää toistamaan, jos (user.playAgain ()) {System.out.println (); Aloita peli(); } else {printGameStats (); }} /*** Tulostaa pelin tilastot. Laskee tasat 1/2 voittoon * voittoprosentissa. */ private void printGameStats () {int voitot = userScore; int tappiot = computerScore; int site = numberOfGames - userScore - computerScore; kaksinkertainen prosenttivoitto = (voittaa + ((kaksinkertainen)) tasapeli) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Tulosta otsikot System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "WINS", "LOSSES", "TIES", "PELATUT PELIT", "PERCENTAGE VOITTI"); // 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 ("|"); // Tulosta arvot System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", voitot, tappiot, tasapelit, lukumääräOfGames, prosenttivoitto * 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 staattinen void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }}