Taş, Kağıt, Makas, iki kişi tarafından oynanan bir el oyunudur. Her iki kişi de "taş, kağıt, makas" der ve sonra aynı anda elini uzatarak üç nesneden (taş, kağıt veya makas) birini oluştururdu. Kazanan el formasyonları tarafından belirlenir. Makas kağıdı yener, kağıt taşı yener ve taş makası yener. Her iki oyuncu da aynı el dizilişini oynarsa, beraberlik olarak kabul edilir. Bir oyuncunun kullanıcı, diğer oyuncunun bilgisayar olduğu Rock, Paper, Scissors simülasyonu için Java'da basit bir oyun yazacağız.
adımlar
Adım 1. Ana sınıfı oluşturun ve çağırın
Taş kağıt makas
.
Bu oyunu yazacağımız sınıf olacak. gibi başka bir ad vermeyi seçebilirsiniz.
oyun
veya
Ana
. Yapıcı ve ana yöntem için yöntem bildirimlerini yazın.
public class RockPaperScissors { public RockPaperScissors() { } public static void main(String args) { } }
Adım 2. El hareketleri (taş, kağıt veya makas) için bir numaralandırma oluşturun
Taş, kağıt veya makası temsil etmek için dizeleri kullanabiliriz, ancak bir numaralandırma, sabitlerimizi önceden tanımlamamıza izin verir; bu, numaralandırmayı kullanmanın daha iyi bir tasarım olduğu anlamına gelir. enum türümüzü arayacağız
Hareket
değerlerle
KAYNAK
KAĞIT
ve
MAKAS
private enum Move { ROCK, PAPER, SCISSORS }
Adım 3. İki özel sınıf oluşturun
kullanıcı
ve
Bilgisayar
.
Bu sınıflar oyundaki oyuncularımızı temsil edecek. Bu sınıfları herkese açık hale getirmeyi seçebilirsiniz. NS
kullanıcı
sınıf, kullanıcıdan taş, kağıt veya makas isteyen sınıf olacaktır, bu yüzden bir yazmamız gerekecek.
getMove()
yöntem. NS
Bilgisayar
sınıfın da olması gerekecek
getMove()
yöntemi, böylece bilgisayar da bir hamle yapabilir. Bu yöntemlere yer tutucular koyacağız ve daha sonra uygulayacağız. NS
kullanıcı
sınıfını ayarlayan bir kurucu gerektirecektir.
Tarayıcı
Kullanıcı girdisini alacak nesne. biz koyacağız
Tarayıcı
kullanıcı için özel bir alan olarak seçin ve ardından yapıcıda başlatın. kullandığımızdan beri
Tarayıcı
class, bunun için kodumuzun en üstüne bir import ifadesi yazmamız gerekiyor. NS
Bilgisayar
sınıf bir kurucu gerektirmez, bu yüzden bir tane yazmamız gerekmez; başlattığımızda
Bilgisayar
nesne, biz sadece varsayılan kurucuyu çağıracağız. İşte bizim
Taş kağıt makas
sınıf şimdi benziyor:
java.util. Scanner'ı içe aktarın; public class RockPaperScissors { private enum Move { ROCK, PAPER, SCISSORS } private class Kullanıcı { private Scanner inputScanner; public User() { inputScanner = new Scanner(System.in); } public Move getMove() { // YAPILACAKLAR: Bu yöntemi uygulayın return null; } } özel sınıf Bilgisayar { public Move getMove() { // YAPILACAKLAR: Bu yöntemi uygulayın return null; } } public RockPaperScissors() { } public static void main(String args) { } }
Adım 4.
getMove()
için yöntem
Bilgisayar
sınıf.
Bu yöntem rastgele
Hareket
. bir dizi alabiliriz
Hareket
arayarak numaralandırma
değerler()
yöntem:
Taşı.değerler()
. rastgele seçmek için
Hareket
Bu değerler dizisinde numaralandırma için 0 ile değerler dizimizin uzunluğu arasında bir tam sayı olan rastgele bir dizin oluşturmamız gerekiyor. Bunu yapmak için, kullanabiliriz
sonrakiInt()
yöntemi
Rastgele
içe aktarmamız gereken sınıf
java.util
. Rastgele dizini aldıktan sonra, geri dönebiliriz.
Hareket
değerler dizimizden bu dizinin.
public Move getMove() { Move move = Move.values(); Rastgele rastgele = yeni Rastgele(); int dizin = random.nextInt(hareket.uzunluk); dönüş hareketleri[indeks]; }
Adım 5.
getMove()
için yöntem
kullanıcı
sınıf.
Bu yöntem, bir
Hareket
kullanıcının girdisine karşılık gelen. Kullanıcının "taş", "kağıt" veya "makas" yazmasını bekliyoruz. İlk olarak, kullanıcıdan bir girdi istememiz gerekiyor:
System.out.print("Taş, kağıt veya makas? ")
. Sonra kullanın
Sonraki satır()
yöntemi
Tarayıcı
Kullanıcı girdisini bir dize olarak almak için nesne. Şimdi kullanıcının geçerli bir hamle yapıp yapmadığını kontrol etmemiz gerekiyor, ancak kullanıcı bir kelimeyi yanlış yazmışsa hoşgörülü olabiliriz. Bu nedenle, yalnızca kullanıcı girişinin ilk harfinin "R" (taş için), "P" (kağıt için) veya "S" (makas için) olup olmadığını kontrol edeceğiz ve bu durumla ilgilenmeyeceğiz çünkü ilk önce kullanacağız
toUpperCase()
yöntemi
Sicim
kullanıcı giriş dizesini tamamen büyük harf yapmak için sınıf. Kullanıcı uzaktan doğru bir giriş girmediyse, kullanıcıya tekrar soracağız. Ardından, kullanıcının ne koyduğuna bağlı olarak, karşılık gelen bir hamle döndürürüz.
public Move getMove() { // Kullanıcıya sor System.out.print("Taş, kağıt veya makas? "); // Kullanıcı girdisini al String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Kullanıcı geçerli bir giriş anahtarı girdi (firstLetter) { case 'R': return Move. ROCK; durum 'P': dönüş Move. PAPER; durum 'S': dönüş Move. SCISSORS; } } // Kullanıcı geçerli bir giriş girmedi. Tekrar sor. getMove() döndür; }
Adım 6. Bir
tekrar oyna()
için yöntem
kullanıcı
sınıf.
Kullanıcı oyunu tekrar tekrar oynayabilmelidir. Kullanıcının tekrar oynamak isteyip istemediğini belirlemek için bir yazı yazmamız gerekiyor.
tekrar oyna()
oyuna kullanıcının tekrar oynamaya karar verip vermediğini söyleyen bir boole döndüren yöntem. Bu yöntemde kullandığımız
Tarayıcı
kullanıcıdan "Evet" veya "Hayır" almak için daha önce yapıcıda başlattığımız. Kullanıcının tekrar oynamak isteyip istemediğini belirlemek için sadece ilk harfin 'Y' olup olmadığını kontrol edeceğiz. Başka herhangi bir giriş, kullanıcının tekrar oynamak istemediği anlamına gelir.
public boolean playAgain() { System.out.print("Tekrar oynamak ister misiniz?"); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); dön userInput.charAt(0) == 'Y'; }
Adım 7.
kullanıcı
ve
Bilgisayar
sınıflarda birlikte
Taş kağıt makas
sınıf.
Şimdi yazmayı bitirdiğimize göre
kullanıcı
ve
Bilgisayar
sınıflar, asıl oyunumuz üzerinde çalışmaya odaklanabiliriz. için özel alanlar oluşturun.
kullanıcı
ve
Bilgisayar
sınıflar
Taş kağıt makas
sınıf. Erişmek için bu alanlara erişmemiz gerekecek.
getMove()
oyunu oynarken kullandığımız yöntemler. için yapıcıda
Taş kağıt makas
class, bu alanları başlatın. Ayrıca skoru da takip etmemiz gerekecek.
kullanıcıScore
ve
bilgisayarSkoru
yapıcıda 0 olarak başlatmamız gereken alanlar. 0 olarak başlatılan bir alan olacak olan oyun sayısını da takip etmemiz gerekiyor.
özel Kullanıcı kullanıcı; özel Bilgisayar bilgisayarı; özel int userScore; özel int computerScore; özel intOyunların sayısı; public RockPaperScissors() { kullanıcı = yeni Kullanıcı(); bilgisayar = yeni Bilgisayar(); kullanıcıSkoru = 0; bilgisayarSkoru = 0; Oyun Sayısı = 0; }
Adım 8. Genişletin
Hareket
enum bize her durumda hangi hareketin kazandığını söyleyen bir yöntem eklemek için.
bir yazmamız gerekiyor
karşılaştırmakMoves()
hamleler aynıysa 0, mevcut hamle diğer hamleyi yenerse 1 ve mevcut hamle diğer hamleye kaybederse -1 döndüren yöntem. Bu, oyunda kazananı belirlemek için faydalı olacaktır. Bu yöntemi uygulamak için hamleler aynıysa ve dolayısıyla bir beraberliğimiz varsa önce 0 döndüreceğiz. Ardından 1 veya -1 döndürmek için bir switch ifadesi yazın.
private enum Move { TAŞ, KAĞIT, MAKAS; /** * Bu hamleyi, beraberlik, galibiyet veya * mağlubiyet belirlemek için başka bir hamleyle karşılaştırır. * * @param otherMove * ile karşılaştırmak için hareket * @return 1 bu hamle diğer hamleyi yenerse, -1 bu hamle diğer hamleye kaybederse *, bu hamleler kravatsa 0 */ public int karşılaştırmaMoves(Move otherMove) { / / Tie if (this == otherMove) 0 döndürür; switch (bu) { case ROCK: return (otherMove == SCISSORS ? 1: -1); case PAPER: return (otherMove == ROCK ? 1: -1); case SCISSORS: return (otherMove == PAPER ? 1: -1); } // Buraya asla ulaşmamalı, return 0; } }
Adım 9.
Oyunu başlatmak()
yöntemde
Taş kağıt makas
sınıf.
Bu yöntem oyunun oynanması olacaktır. Basit bir koyarak başlayın
System.out.println
yöntemde.
public void startGame() { System.out.println("TAŞ, KAĞIT, MAKAS!"); }
Adım 10. Kullanıcıdan ve bilgisayardan hamle alın
İçinde
Oyunu başlatmak()
yöntemini kullanın,
getMove()
gelen yöntemler
kullanıcı
sınıf ve
Bilgisayar
kullanıcıyı ve bilgisayarın hareketlerini almak için sınıf.
userMove = user.getMove(); Bilgisayarı Taşı = computer.getMove(); System.out.println("\n" + userMove + "oynadınız."); System.out.println("Bilgisayarda oynatıldı" + computerMove + ".\n");
Adım 11. İki hareketi karşılaştırın ve kullanıcının mı yoksa bilgisayarın mı kazandığını belirleyin
Kullan
karşılaştırmakMoves()
yöntemden
Hareket
enum kullanıcının kazanıp kazanmadığını belirlemek için. Kullanıcı kazanırsa, kullanıcı puanını 1 artırın. Kullanıcı kaybederse, bilgisayar puanını 1 artırın. Beraberlik varsa, puanların hiçbirini artırmayın. Ardından, bir tarafından oynanan oyun sayısını artırın.
int karşılaştırmaMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Tie System.out.println("Tie!"); kırmak; durum 1: // Kullanıcı System.out.println(userMove + " beats " + computerMove + ". Kazandınız!"); kullanıcıSkor++; kırmak; case -1: // Bilgisayar System.out.println(computerMove + " yener " + userMove + " kazanır. Kaybettiniz."); bilgisayarSkoru++; kırmak; } sayıOfGames++;
Adım 12. Kullanıcının tekrar oynamak isteyip istemediğini sorun
Kullanıcı tekrar oynamak isterse, arayın
Oyunu başlatmak()
Yeniden. Aksi takdirde, arayın
printOyun İstatistikleri()
hangi oyunun istatistiklerini yazdıracak. Bu yöntemi bir sonraki adımda yazacağız.
if (user.playAgain()) { System.out.println(); Oyunu başlatmak(); } başka { printGameStats(); }
Adım 13.
printOyun İstatistikleri()
yöntem.
Bu yöntem oyunun istatistiklerini görüntüler: galibiyet sayısı, mağlubiyet sayısı, beraberlik sayısı, oynanan oyun sayısı ve kullanıcı tarafından kazanılan oyunların yüzdesi. Kazanılan oyunların yüzdesi (# galibiyet + (# beraberlik/2))/(# oyun oynandı) ile hesaplanır. Bu yöntem kullanır
System.out.printf
biçimlendirilmiş metni yazdırmak için
private void printGameStats() { int wins = userScore; int kayıplar = computerScore; int bağları = sayıOfGames - userScore - computerScore; double yüzdeKazandı = (galibiyet + ((çift) beraberlik) / 2) /Oyunların sayısı; // Satır System.out.print("+"); tireler(68); System.out.println("+"); // Başlıkları yazdır System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "KAZANÇ", "KAYIPLAR", "BAĞIŞLAR", "OYUNLAR OYNADI", "YÜZDE KAZANMAK"); // Satır System.out.print("|"); tireler(10); System.out.print("+"); tireler(10); System.out.print("+"); tireler(10); System.out.print("+"); tireler(16); System.out.print("+"); tireler(18); System.out.println("|"); // Değerleri yazdır System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", galibiyetler, mağlubiyetler, beraberlik, sayıOfGames, yüzde Kazanılan * 100); // Satır System.out.print("+"); tireler(68); System.out.println("+"); }
Adım 14. Oyunu ana sınıfta başlatın
Ana sınıfta, bir örneğini başlatın
Taş kağıt makas
sınıf ve ara
Oyunu başlatmak()
yöntem.
public static void main(String args) { RockPaperScissors oyunu = new RockPaperScissors(); oyun.startGame(); }
Adım 15. Oyununuzu test edin
Rock, Paper, Scissors oyununu yazmak için tüm çabayı harcadığımıza göre, şimdi her şeyi derleme ve test etme zamanı!
Örnek Program
java.util. Random'u içe aktar; java.util. Scanner'ı içe aktarın; public class RockPaperScissors { private User user; özel Bilgisayar bilgisayarı; özel int userScore; özel int computerScore; özel intOyunların sayısı; private enum Move { TAŞ, KAĞIT, MAKAS; /** * Bu hamleyi, beraberlik, galibiyet veya * mağlubiyet belirlemek için başka bir hamleyle karşılaştırır. * * @param otherMove * ile karşılaştırmak için hareket * @return 1 bu hamle diğer hamleyi yenerse, -1 bu hamle diğer hamleye kaybederse *, bu hamleler kravatsa 0 */ public int karşılaştırmaMoves(Move otherMove) { / / Tie if (this == otherMove) 0 döndürür; switch (bu) { case ROCK: return (otherMove == SCISSORS ? 1: -1); case PAPER: return (otherMove == ROCK ? 1: -1); case SCISSORS: return (otherMove == PAPER ? 1: -1); } // Buraya asla ulaşmamalı, return 0; } } özel sınıf Kullanıcı { özel Tarayıcı girişiScanner; public User() { inputScanner = new Scanner(System.in); } public Move getMove() { // Kullanıcıya sor System.out.print("Taş mı, kağıt mı, yoksa makas mı?"); // Kullanıcı girdisini al String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Kullanıcı geçerli bir giriş anahtarı girdi (firstLetter) { case 'R': return Move. ROCK; durum 'P': dönüş Move. PAPER; durum 'S': dönüş Move. SCISSORS; } } // Kullanıcı geçerli bir giriş girmedi. Tekrar sor. getMove() döndür; } public boolean playAgain() { System.out.print("Tekrar oynamak ister misiniz?"); String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); dön userInput.charAt(0) == 'Y'; } } özel sınıf Bilgisayar { public Move getMove() { Move moves = Move.values(); Rastgele rastgele = yeni Rastgele(); int dizin = random.nextInt(hareket.uzunluk); dönüş hareketleri[indeks]; } } genel RockPaperScissors() { kullanıcı = yeni Kullanıcı(); bilgisayar = yeni Bilgisayar(); kullanıcıSkoru = 0; bilgisayarSkoru = 0; Oyun Sayısı = 0; } public void startGame() { System.out.println("TAŞ, KAĞIT, MAKAS!"); // Hareketleri al Move userMove = user.getMove(); Bilgisayarı Taşı = computer.getMove(); System.out.println("\n" + userMove + "oynadınız."); System.out.println("Bilgisayarda oynatıldı" + computerMove + ".\n"); // Hareketleri karşılaştır ve kazananı belirle int karşılaştırmaMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Tie System.out.println("Tie!"); kırmak; durum 1: // Kullanıcı System.out.println(userMove + " beats " + computerMove + ". Kazandınız!"); kullanıcıSkor++; kırmak; case -1: // Bilgisayar System.out.println(computerMove + " yener " + userMove + " kazanır. Kaybettiniz."); bilgisayarSkoru++; kırmak; } sayıOfGames++; // Kullanıcıdan tekrar oynamasını isteyin if (user.playAgain()) { System.out.println(); Oyunu başlatmak(); } başka { printGameStats(); } } /** * Oyunun istatistiklerini yazdırır. Kazanılan yüzde * cinsinden galibiyetin 1/2'si olarak bağları hesaplar. */ private void printGameStats() { int wins = userScore; int kayıplar = computerScore; int bağları = sayıOfGames - userScore - computerScore; double yüzdeKazandı = (galibiyet + ((çift) beraberlik) / 2) /Oyunların sayısı; // Satır System.out.print("+"); tireler(68); System.out.println("+"); // Başlıkları yazdır System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "KAZANÇ", "KAYIPLAR", "BAĞIŞLAR", "OYUNLAR OYNADI", "YÜZDE KAZANMAK"); // Satır System.out.print("|"); tireler(10); System.out.print("+"); tireler(10); System.out.print("+"); tireler(10); System.out.print("+"); tireler(16); System.out.print("+"); tireler(18); System.out.println("|"); // Değerleri yazdır System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", galibiyetler, mağlubiyetler, beraberlik, sayıOfGames, yüzde Kazanılan * 100); // Satır System.out.print("+"); tireler(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 oyunu = new RockPaperScissors(); oyun.startGame(); } }