Qaya, Kağız, Qayçı iki nəfərin oynadığı əl oyunudur. Hər iki insan "qaya, kağız, qayçı" deyər və eyni zamanda uzanan əli ilə üç cisimdən birini (qaya, kağız və ya qayçı) əmələ gətirərdi. Qalib əl formaları ilə müəyyən edilir. Qayçı kağızı döyür, kağız qaya vurur, qaya qayçı döyür. Hər iki oyunçu eyni əl formasında oynayırsa, bu bərabərlik sayılır. Bir oyunçunun istifadəçi, digərinin isə kompüter olduğu Rock, Paper, Scissors simulyasiya etmək üçün Java -da sadə bir oyun yazacağıq.
Addımlar
Addım 1. Əsas sinif yaradın və ona zəng edin
RockPaperScissors
.
Oyunu yazacağımız sinif bu olacaq. Kimi başqa bir şey adlandırmağı seçə bilərsiniz
Oyun
və ya
Əsas
. Konstruktor və əsas metod üçün metod bəyannamələrini yazın.
ictimai sinif RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Addım 2. Əl hərəkətləri (qaya, kağız və ya qayçı) üçün bir siyahı yaradın
Qaya, kağız və ya qayçı göstərmək üçün simlərdən istifadə edə bilərik, ancaq bir sayım sabitlərimizi əvvəlcədən təyin etməyə imkan verir ki, bu da sayımdan istifadə etmək daha yaxşı bir dizayndır. Enum növümüzə zəng edəcəyik
Hərəkət et
dəyərlərlə
ROCK
KAĞIT
və
QAYAÇ
şəxsi nömrəni köçür {ROCK, PAPER, SCISSORS}
Addım 3. İki xüsusi sinif yaradın
İstifadəçi
və
Kompüter
.
Bu dərslər oyunçularımızı oyunda təmsil edəcək. Bu dərsləri ictimaiyyətə açmağı seçə bilərsiniz. The
İstifadəçi
sinif, istifadəçini ya qaya, kağız və ya qayçı tələb edən bir sinif olacaq, buna görə bir şey yazmalıyıq.
getMove ()
üsul The
Kompüter
sinif də olmalıdır a
getMove ()
kompüterin də hərəkət edə biləcəyi üsul. Bu üsullara yer tutucuları qoyacağıq və sonra tətbiq edəcəyik. The
İstifadəçi
class quran bir konstruktor tələb edəcək
Skaner
istifadəçi girişini almaq üçün obyekt. Qoyacağıq
Skaner
istifadəçi üçün xüsusi bir sahə olaraq qurun və sonra onu konstruktorda başladın. -Dən istifadə etdiyimiz üçün
Skaner
class, kodumuzun üstündə bunun üçün bir idxal ifadəsi yazmalıyıq. The
Kompüter
sinif bir konstruktor tələb etmir, buna görə də yazmağa ehtiyac yoxdur; başladıqda
Kompüter
obyekt, yalnız standart konstruktoru çağıracağıq. Budur bizimki
RockPaperScissors
sinif indi belə görünür:
java.util. Scanner idxal edin; ictimai sinif RockPaperScissors {özəl hərəkət Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// TODO: Bu metodu tətbiq edin return null; }} xüsusi sinif Kompüter {public Move getMove () {// TODO: Bu metodu tətbiq edin null qaytar; }} ictimai RockPaperScissors () {} ümumi statik boşluq əsas (String args) {}}
Addım 4. Yazın
getMove ()
üçün metod
Kompüter
sinif
Bu üsul təsadüfi bir nəticə verəcəkdir
Hərəkət et
. Bir sıra ala bilərik
Hərəkət et
nömrələrinə zəng vuraraq nömrələr yaza bilərsiniz
dəyərlər ()
üsul:
Move.values ()
. Bir təsadüfi seçmək üçün
Hərəkət et
bu dəyərlər silsiləsində, 0 ilə dəyərlər dizimizin uzunluğu arasında bir tamsayı olan təsadüfi bir indeks yaratmalıyıq. Bunu etmək üçün
nextInt ()
metodu
Təsadüfi
idxal etməyimiz lazım olan sinif
java.util
. Təsadüfi indeksi əldə etdikdən sonra geri qaytara bilərik
Hərəkət et
dəyərlər dizimizdən o indeksi.
public Move getMove () {Move hamle = Move.values (); Random random = new Random (); int index = random.nextInt (moves.length); dönüş hərəkətləri [indeks]; }
Addım 5. Yazın
getMove ()
üçün metod
İstifadəçi
sinif
Bu üsul a qaytaracaq
Hərəkət et
istifadəçinin daxil etdiyi məlumatlara uyğun gəlir. İstifadəçinin "qaya", "kağız" və ya "qayçı" yazmasını gözləyəcəyik. Birincisi, istifadəçidən daxil olmağı istəməliyik:
System.out.print ("Qaya, kağız və ya qayçı?")
. Sonra istifadə edin
nextLine ()
metodu
Skaner
istifadəçi girişini simli olaraq almaq üçün obyekt. İstifadəçinin düzgün bir hərəkət təqdim edib etmədiyini indi yoxlamalıyıq, amma istifadəçinin bir sözü səhv yazması ilə yumşaq ola bilərik. İstifadəçi girişinin ilk hərfinin "R" (qaya üçün), "P" (kağız üçün) və ya "S" (qayçı üçün) olub olmadığını yalnız yoxlayacağıq və bu işlə maraqlanmayacağıq. ilk olaraq istifadə edəcəyik
toUpperCase ()
metodu
Simli
İstifadəçi giriş sətrini bütün böyük hərflərə çevirmək üçün sinif. İstifadəçi uzaqdan düzgün bir giriş etməyibsə, istifadəçiyə yenidən müraciət edəcəyik. Sonra, istifadəçinin nə qoyduğundan asılı olaraq, müvafiq bir hərəkəti qaytaracağıq.
public Move getMove () {// İstifadəçiyə bildirin System.out.print ("Qaya, kağız və ya qayçı?"); // İstifadəçi girişini alın String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// İstifadəçi etibarlı giriş açarı (firstLetter) daxil etdi {case 'R': return Move. ROCK; hal 'P': Move. PAPER qaytar; halda 'S': Move. SCISSORS; }} // İstifadəçi etibarlı giriş daxil etməyib. Yenə də soruş. getMove () qaytarın; }
Addım 6. a yazın
yenidən oynamaq()
üçün metod
İstifadəçi
sinif
İstifadəçi oyunu təkrar -təkrar oynamağı bacarmalıdır. İstifadəçinin yenidən oynamaq istədiyini müəyyən etmək üçün a yazmalıyıq
yenidən oynamaq()
İstifadəçinin yenidən oynamağa qərar verib -vermədiyini oyuna izah edən boolean metodu. Bu üsulda
Skaner
İstifadəçidən "Bəli" və ya "Xeyr" almaq üçün əvvəllər konstruktorda başladıq. İstifadəçinin yenidən oynamaq istədiyini müəyyən etmək üçün yalnız ilk hərfin 'Y' olub olmadığını yoxlayacağıq. Hər hansı digər giriş, istifadəçinin yenidən oynamaq istəməməsi deməkdir.
public boolean playAgain () {System.out.print ("Yenidən oynamaq istəyirsən?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); userInput.charAt (0) == 'Y' qaytar; }
Addım 7. Bağlayın
İstifadəçi
və
Kompüter
siniflər birlikdə
RockPaperScissors
sinif
İndi yazmağı bitirdik
İstifadəçi
və
Kompüter
dərslərdə, həqiqi oyunumuz üzərində işləməyə diqqət edə bilərik. Şəxsi sahələr yaradın
İstifadəçi
və
Kompüter
siniflər
RockPaperScissors
sinif Daxil olmaq üçün bu sahələrə daxil olmalıyıq
getMove ()
oyun oynayarkən üsullar. Üçün konstruktorda
RockPaperScissors
sinif, bu sahələri başladın. Hesabdakı hesabı da izləməli olacağıq
userScore
və
kompüter skoru
sahələrdə, konstruktorda 0 olaraq başlamalıyıq. Oyunların sayını da izləməliyik, bu da 0 olaraq başlayan bir sahə olacaq.
şəxsi istifadəçi; fərdi kompüter; şəxsi int userScore; şəxsi int computerScore; şəxsi int numberOfGames; ictimai RockPaperScissors () {user = new User (); kompüter = yeni Kompüter (); userScore = 0; computerScore = 0; sayıOfGames = 0; }
Addım 8. Uzadın
Hərəkət et
hər vəziyyətdə hansı hərəkətin qalib gəldiyini bizə izah edən bir metodu daxil edin.
A yazmalıyıq
müqayisəMoves ()
hərəkətlər eyni olarsa 0, cari hərəkət digər hərəkəti məğlub edərsə 1, cari hərəkət digər hərəkətdə uduzarsa -1 qaytaran metoddur. Bu oyunda qalibin müəyyən edilməsi üçün faydalı olacaq. Bu metodu tətbiq etmək üçün, hərəkətlər eyni olsa və buna görə də bərabərliyimiz varsa, ilk olaraq 0 qaytaracağıq. Sonra 1 və ya -1 qaytarılması üçün bir keçid ifadəsi yazın.
şəxsi nömrəni hərəkət etdir {ROCK, PAPER, Scissor; /** * Bu hərəkəti bərabərlik, qələbə və ya * məğlubiyyət müəyyən etmək üçün başqa bir hərəkətlə müqayisə edir. * * @param otherMove *, bu hərəkət digər hərəkəti üstələyərsə, * @Return 1 ilə müqayisə etmək üçün hərəkət edin, bu hərəkət * digər hərəkətə məğlub olarsa -1, bu hərəkətlər bağlandıqda 0 * / public int müqayisəMoves (Move otherMove) { / / Bağla (bu == otherMove) 0 qaytararsa; keçid (bu) {halda ROCK: qayıt (otherMove == QAYA? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); hal QAYDASI: qayıt (otherMove == PAPER? 1: -1); } // Bura heç vaxt çatmamalıdır 0; }}
Addım 9. a yaradın
startGame ()
-də metod
RockPaperScissors
sinif
Bu üsul oyunun oynanılması olacaq. Sadə bir ifadə qoyaraq başlayın
System.out.println
metodda.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }
Addım 10. İstifadəçidən və kompüterdən hərəkətlər alın
İçində
startGame ()
metodundan istifadə edin
getMove ()
-dan gələn üsullar
İstifadəçi
sinif və
Kompüter
istifadəçi və kompüterin hərəkətlərini öyrənmək üçün sinif.
UserMove = user.getMove () hərəkət etdirin; ComputerMove = computer.getMove () hərəkət etdirin; System.out.println ("\ n" " + userMove +" oynadın. "); System.out.println ("Kompüter oynandı" + computerMove + ". / N");
Addım 11. İki hərəkəti müqayisə edin və istifadəçinin qazandığını və ya kompüterin qazandığını təyin edin
İstifadə edin
müqayisəMoves ()
metodu
Hərəkət et
istifadəçinin qalib olub olmadığını müəyyən etmək üçün enum. İstifadəçi qazanırsa, istifadəçi hesabını 1 artırın. İstifadəçi itirirsə, kompüter hesabını 1 artır. Sonra bir oynanan oyun sayını artırın.
int müqayisəMoves = userMove.compareMoves (computerMove); keçid (müqayisəMoves) {halda 0: // System.out.println bağlayın ("Bağla!"); fasilə; hal 1: // İstifadəçi System.out.println qazanır (userMove + "beats" + computerMove + ". Siz qazandınız!"); userScore ++; fasilə; dava -1: // Kompüter System.out.println qazanır (computerMove + "beats" + userMove + ". Siz uduzdunuz."); computerScore ++; fasilə; } numberOfGames ++;
Addım 12. İstifadəçinin yenidən oynamaq istəməsini soruşun
İstifadəçi yenidən oynamaq istəyirsə, zəng edin
startGame ()
yenidən. Əks təqdirdə zəng edin
printGameStats ()
oyunun statistikasını çap edəcək. Bu üsulu növbəti addımda yazacağıq.
if (user.playAgain ()) {System.out.println (); startGame (); } başqa {printGameStats (); }
Addım 13. Yazın
printGameStats ()
üsul
Bu üsul oyunun statistikasını göstərəcək: qalibiyyətlərin sayı, itkilərin sayı, əlaqələrin sayı, oynanan oyunların sayı və istifadəçinin qazandığı oyunların faizi. Qazanılan oyunların faizi (# qalibiyyət + (# bərabərlik/2))/(# oynanan oyun) ilə hesablanır. Bu metoddan istifadə olunur
System.out.printf
formatlaşdırılmış mətni çap etmək.
şəxsi boşluq printGameStats () {int wins = userScore; int zərərləri = computerScore; int əlaqələri = numberOfGames - userScore - computerScore; ikiqat faizWon = (qalib + ((ikiqat) bağlar) / 2) / numberOfGames; // Satır System.out.print ("+"); printDashes (68); System.out.println ("+"); // Çap başlıqları System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "QƏLƏBƏTLƏR", "İTİBARLAR", "QALAQLAR", "OYNANAN OYUNLAR", "YÜZDƏ") QALDI "); // Satır 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 ("|"); // Çap dəyərləri System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", qalibiyyətlər, itkilər, əlaqələr, sayıOfGames, faizWon * 100); // Satır System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Addım 14. Oyuna əsas sinifdən başlayın
Əsas sinifdə, bir nümunəsini başladın
RockPaperScissors
sinif və zəng edin
startGame ()
üsul
public static void main (String args) {RockPaperScissors oyunu = yeni RockPaperScissors (); game.startGame (); }
Addım 15. Oyununuzu sınayın
Qaya, Kağız, Qayçı oyunu yazmaq üçün bütün səyləri keçmişik, indi hər şeyi tərtib etməyin və sınamağın vaxtı gəldi!
Nümunə Proqramı
java.util. Random idxal edin; java.util. Scanner idxal edin; ictimai sinif RockPaperScissors {şəxsi istifadəçi; fərdi kompüter; şəxsi int userScore; şəxsi int computerScore; şəxsi int numberOfGames; şəxsi nömrəni hərəkət etdir {ROCK, PAPER, Scissor; /** * Bu hərəkəti bərabərlik, qalibiyyət və ya * məğlubiyyət müəyyən etmək üçün başqa bir hərəkətlə müqayisə edir. * * @param otherMove *, bu hərəkət digər hərəkəti üstələyərsə, * @Return 1 ilə müqayisə etmək üçün hərəkət edin, bu hərəkət * digər hərəkətə məğlub olarsa -1, bu hərəkətlər bağlandıqda 0 * / public int müqayisəMoves (Move otherMove) { / / Bağla (bu == otherMove) 0 qaytararsa; keçid (bu) {halda ROCK: qayıt (otherMove == QAYA? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); hal QAYDASI: qayıt (otherMove == PAPER? 1: -1); } // Bura heç vaxt çatmamalıdır 0; }} xüsusi sinif İstifadəçi {özəl Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// İstifadəçiyə System.out.print bildirin ("Qaya, kağız və ya qayçı?"); // İstifadəçi girişini alın String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// İstifadəçi etibarlı giriş açarı (firstLetter) daxil etdi {case 'R': return Move. ROCK; hal 'P': Move. PAPER qaytar; halda 'S': Move. SCISSORS; }} // İstifadəçi etibarlı giriş daxil etməyib. Yenə də soruş. getMove () qaytarın; } public boolean playAgain () {System.out.print ("Yenidən oynamaq istəyirsən?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); userInput.charAt (0) == 'Y' qaytar; }} xüsusi sinif Kompüteri {public Move getMove () {Move move = Move.values (); Random random = new Random (); int index = random.nextInt (moves.length); dönüş hərəkətləri [indeks]; }} ictimai RockPaperScissors () {user = new User (); kompüter = yeni Kompüter (); userScore = 0; computerScore = 0; sayıOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Hərəkətlər alın Move userMove = user.getMove (); ComputerMove = computer.getMove () hərəkət etdirin; System.out.println ("\ n" " + userMove +" oynadın. "); System.out.println ("Kompüter oynandı" + computerMove + ". / N"); // Hərəkətləri müqayisə edin və qalibi müəyyən edin int comparMoves = userMove.compareMoves (computerMove); keçid (müqayisəMoves) {halda 0: // System.out.println bağlayın ("Bağla!"); fasilə; hal 1: // İstifadəçi System.out.println qazanır (userMove + "beats" + computerMove + ". Siz qazandınız!"); userScore ++; fasilə; halda -1: // Kompüter System.out.println qazanır (computerMove + "beats" + userMove + ". Məğlub oldunuz."); computerScore ++; fasilə; } numberOfGames ++; // İstifadəçidən yenidən oynamasını istəyin, əgər (user.playAgain ()) {System.out.println (); startGame (); } başqa {printGameStats (); }} /*** Oyunun statistikasını çap edir. Bağları * qazanılan faiz nisbətində 1/2 qalibiyyət olaraq hesablayır. */ private void printGameStats () {int wins = userScore; int zərərləri = computerScore; int əlaqələri = numberOfGames - userScore - computerScore; ikiqat faizWon = (qalib + ((ikiqat) bağlar) / 2) / numberOfGames; // Satır System.out.print ("+"); printDashes (68); System.out.println ("+"); // Çap başlıqları System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "QƏLƏBƏTLƏR", "İTİBARLAR", "QALAQLAR", "OYNANAN OYUNLAR", "YÜZDƏ") QALDI "); // Satır 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 ("|"); // Çap dəyərləri System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", qalibiyyətlər, itkilər, əlaqələr, sayıOfGames, faizWon * 100); // Satır System.out.print ("+"); printDashes (68); System.out.println ("+"); } şəxsi boş printDashes (int numberOfDashes) {üçün (int i = 0; i <numberOfDashes; i ++) {System.out.print ("-"); }} public static void main (String args) {RockPaperScissors oyunu = yeni RockPaperScissors (); game.startGame (); }}