Qoya, qog'oz, qaychi - bu ikki kishi o'ynaydigan qo'l o'yini. Ikkala odam ham "tosh, qog'oz, qaychi" deyishadi va keyin bir vaqtning o'zida qo'llarini cho'zgan holda uchta narsadan birini (tosh, qog'oz yoki qaychi) hosil qiladilar. G'olib qo'llar yordamida aniqlanadi. Qaychi qog'ozni uradi, qog'oz toshni uradi va tosh qaychi bilan uriladi. Agar ikkala o'yinchi ham bir xil qo'lda o'ynasa, bu durang hisoblanadi. Biz Java, Rok, Qog'oz, Qaychi simulyatsiyasi uchun oddiy o'yin yozamiz, bunda bitta o'yinchi foydalanuvchi, ikkinchisi esa kompyuter.
Qadamlar
Qadam 1. Asosiy sinfni yarating va uni chaqiring
RockPaperScissors
.
Bu o'yinni yozadigan sinf bo'ladi. Siz boshqa nom berishni tanlashingiz mumkin, masalan
O'yin
yoki
Asosiy
. Konstruktor va asosiy usul uchun deklaratsiyalarni yozing.
ommaviy klass RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
2 -qadam. Qo'l imo -ishoralari uchun ro'yxat tuzing (tosh, qog'oz yoki qaychi)
Biz tosh, qog'oz yoki qaychini tasvirlash uchun satrlardan foydalanishimiz mumkin edi, lekin sanab o'tish bizga o'z turg'unligini oldindan belgilashga imkon beradi, demak, sanashdan foydalanish yaxshiroq dizayndir. Biz enum turini chaqiramiz
Ko'chirish
qadriyatlar bilan
ROCK
QOG'OZ
va
Qaychi
Maxsus raqamni ko'chirish {ROCK, PAPER, SCISSORS}
3 -qadam. Ikkita xususiy sinf yarating
Foydalanuvchi
va
Kompyuter
.
Bu darslar bizning o'yinchilarimizni o'yinda namoyish etadi. Siz ushbu darslarni hammaga ochiq qilishni tanlashingiz mumkin. The
Foydalanuvchi
class - bu foydalanuvchini tosh, qog'oz yoki qaychi talab qiladigan sinf bo'ladi, shuning uchun biz yozishimiz kerak bo'ladi.
getMove ()
usul. The
Kompyuter
sinf ham bo'lishi kerak
getMove ()
Kompyuter ham harakat qila oladigan usul. Biz bu usullarga joy egalarini qo'yamiz va keyinroq ularni amalga oshiramiz. The
Foydalanuvchi
class ga o'rnatadigan konstruktor kerak bo'ladi
Skaner
foydalanuvchi kiritadigan ob'ekt. Biz qo'yamiz
Skaner
foydalanuvchi uchun shaxsiy maydon sifatida va keyin uni konstruktorda ishga tushiring. Biz foydalanayotganimiz uchun
Skaner
class, biz kodning yuqori qismiga import bayonotini yozishimiz kerak. The
Kompyuter
sinfga konstruktor kerak emas, shuning uchun biz uni yozishimiz shart emas; biz boshlaganimizda
Kompyuter
ob'ekt, biz faqat standart konstruktorni chaqiramiz. Mana bizniki
RockPaperScissors
sinf hozir shunday ko'rinadi:
java.util. Scanner -ni import qilish; umumiy sinf RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// TODO: Bu usulni qaytarish null; }} shaxsiy sinfli kompyuter {public Move getMove () {// TODO: Bu usulni qaytaring null; }} umumiy RockPaperScissors () {} umumiy statik void main (String args) {}}
4 -qadam
getMove ()
uchun usul
Kompyuter
sinf
Bu usul tasodifiy qaytadi
Ko'chirish
. Biz qatorni olishimiz mumkin
Ko'chirish
raqamlarini chaqirish orqali
qiymatlar()
usul:
Move.values ()
. Tasodifiy tanlash uchun
Ko'chirish
bu qiymatlar majmuasida sanab o'tish uchun biz 0 va qiymatlar qatorimiz uzunligi orasidagi tamsayı bo'lgan tasodifiy indeksni yaratishimiz kerak. Buning uchun biz dan foydalanishimiz mumkin
nextInt ()
usuli
Tasodifiy
biz import qilishimiz kerak bo'lgan sinf
java.util
. Tasodifiy indeksni olgandan so'ng, biz uni qaytarishimiz mumkin
Ko'chirish
bu indeksni bizning qiymatlar qatoridan.
public Move getMove () {Move move = Move.values (); Tasodifiy tasodif = yangi tasodifiy (); int indeksi = random.nextInt (harakatlarning uzunligi); qaytish harakatlari [indeks]; }
5 -qadam
getMove ()
uchun usul
Foydalanuvchi
sinf
Bu usul qaytadi
Ko'chirish
foydalanuvchi kiritgan ma'lumotlarga mos keladi. Biz foydalanuvchidan "tosh", "qog'oz" yoki "qaychi" yozishini kutamiz. Birinchidan, biz foydalanuvchini kirishni so'rashimiz kerak:
System.out.print ("Tosh, qog'oz yoki qaychi?")
. Keyin dan foydalaning
nextLine ()
usuli
Skaner
foydalanuvchi kiritishni mag'lubiyat sifatida olish uchun ob'ekt. Endi biz foydalanuvchining to'g'ri harakat qilganligini tekshirishimiz kerak, lekin agar foydalanuvchi so'zni noto'g'ri yozgan bo'lsa, biz yumshoq bo'lishimiz mumkin. Shunday qilib, biz faqat foydalanuvchi kiritgan birinchi harf "R" (rok uchun), "P" (qog'oz uchun) yoki "S" (qaychi uchun) yoki yo'qligini tekshirib ko'ramiz va biz bu ishni qiziqtirmaymiz, chunki biz birinchi navbatda foydalanamiz
toUpperCase ()
usuli
Ip
Foydalanuvchi kirish satrini katta harflar bilan yozish uchun sinf. Agar foydalanuvchi masofadan turib to'g'ri kirishni kiritmagan bo'lsa, biz foydalanuvchini yana taklif qilamiz. Keyin, foydalanuvchi nima kiritganiga qarab, biz tegishli harakatni qaytaramiz.
public Move getMove () {// Foydalanuvchiga System.out.print ("Tosh, qog'oz yoki qaychi?") so'rovini yuborish; // String userInput = inputScanner.nextLine () foydalanuvchi kirishini oling; userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Foydalanuvchi to'g'ri kirish kalitini kiritdi (firstLetter) {case 'R': return Move. ROCK; case 'P': Move. PAPER -ni qaytarish; case 'S': Move. SCISSORS; }} // Foydalanuvchi to'g'ri kiritmagan. Yana taklif. getMove () ni qaytaring; }
6 -qadam
playAgain ()
uchun usul
Foydalanuvchi
sinf
Foydalanuvchi o'yinni qayta -qayta o'ynashi kerak. Foydalanuvchining qayta o'ynashni xohlashini aniqlash uchun biz a yozishimiz kerak
playAgain ()
Foydalanuvchi yana o'ynashga qaror qilganmi yoki yo'qmi, bu o'yinni mantiqiy tarzda qaytaradigan usul. Ushbu usulda biz
Skaner
biz ilgari konstruktorda foydalanuvchidan "Ha" yoki "Yo'q" olishni boshlaganmiz. Foydalanuvchining qayta o'ynashni xohlashini aniqlash uchun biz faqat birinchi harf "Y" ekanligini tekshiramiz. Boshqa har qanday kirish foydalanuvchi qayta o'ynashni xohlamasligini bildiradi.
public boolean playAgain () {System.out.print ("Qayta o'ynashni xohlaysizmi?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); userInput.charAt (0) == 'Y' ni qaytarish; }
7 -qadam
Foydalanuvchi
va
Kompyuter
ichida birgalikda darslar
RockPaperScissors
sinf
Endi biz yozishni tugatdik
Foydalanuvchi
va
Kompyuter
darslar, biz o'z o'yinimiz ustida ishlashga e'tibor qaratishimiz mumkin. Shaxsiy maydonlarni yarating
Foydalanuvchi
va
Kompyuter
dagi sinflar
RockPaperScissors
sinf Biz kirish uchun bu maydonlarga kirishimiz kerak bo'ladi
getMove ()
O'yin o'ynayotganimizda usullar. Uchun konstruktorda
RockPaperScissors
sinf, bu maydonlarni boshlang. Shuningdek, biz hisobni kuzatib borishimiz kerak bo'ladi
userScore
va
computerScore
maydonlarda biz konstruktorda 0 deb boshlashimiz kerak. Biz o'yinlar sonini ham kuzatib borishimiz kerak, bu ham 0 deb boshlangan maydon bo'ladi.
shaxsiy foydalanuvchi; shaxsiy kompyuter; shaxsiy int userScore; shaxsiy int computerScore; shaxsiy int numberOfGames; ommaviy RockPaperScissors () {user = new User (); kompyuter = yangi kompyuter (); userScore = 0; computerScore = 0; numberOfGames = 0; }
8 -qadam
Ko'chirish
har bir holatda qaysi harakat g'alaba qozonishini aytadigan usulni o'z ichiga oladi.
Biz a yozishimiz kerak
solishtirishMoves ()
Harakatlar bir xil bo'lsa 0 qaytaradi, agar harakat boshqa harakatni mag'lub qilsa 1, joriy harakat boshqa harakatda yutqazsa -1 qaytaradi. Bu o'yinda g'olibni aniqlash uchun foydali bo'ladi. Bu usulni amalga oshirish uchun, avvalo 0 qaytaramiz, agar harakatlar bir xil bo'lsa va shuning uchun bizda durang bo'lsa. Keyin 1 yoki -1 ni qaytarish uchun kalit so'zini yozing.
xususiy enum Move {ROCK, PAPER, Scissor; /** * Bu harakatni durang, g'alaba yoki * mag'lubiyatni aniqlashning boshqa harakati bilan solishtiradi. * * @param otherMove *, agar bu harakat boshqa harakatni mag'lub qilsa * @Return 1 bilan taqqoslash uchun harakatlaning, agar bu harakat * boshqa harakatga yutqazsa -1, agar bu harakatlar teng bo'lsa * / public int solishtirishMoves (Move otherMove) { / / Bog'lang, agar (this == otherMove) 0 qaytarsa; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); ish qaychi: qaytish (otherMove == PAPER? 1: -1); } // Bu erga hech qachon etib bormaslik kerak 0; }}
Qadam 9. a yaratish
startGame ()
ichida usul
RockPaperScissors
sinf
Bu usul o'yinni o'ynashi bo'ladi. Oddiy so'z bilan boshlang
System.out.println
usulda.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }
Qadam 10. Foydalanuvchi va kompyuterdan harakatlarni oling
Ichida
startGame ()
usulidan foydalaning
getMove ()
dan olingan usullar
Foydalanuvchi
sinf va
Kompyuter
foydalanuvchi va kompyuter harakatlarini olish uchun sinf.
UserMove = user.getMove () ni ko'chiring; ComputerMove = computer.getMove () ni ko'chiring; System.out.println ("\ nSiz" + userMove + "o'ynadingiz."); System.out.println ("Kompyuter o'ynadi" + computerMove + ". / N");
Qadam 11. Ikkala harakatni solishtiring va foydalanuvchi yutganini yoki kompyuter yutganini aniqlang
Dan foydalaning
solishtiringMoves ()
dan olingan usul
Ko'chirish
enum, foydalanuvchi yutganmi yoki yo'qligini aniqlash uchun. Agar foydalanuvchi g'alaba qozongan bo'lsa, foydalanuvchi reytingini 1 ga oshiring. Agar foydalanuvchi yutqazsa, kompyuter hisobini 1 ga oshiring. Agar durang natija qayd etilgan bo'lsa, hech qanday ballni oshirmang. Keyin bitta o'ynagan o'yinlar sonini ko'paytiring.
int solishtirishMoves = userMove.compareMoves (computerMove); switch (comparMoves) {0 holat: // System.out.println bog'lang ("Bog'la!"); tanaffus; 1 -holat: // Foydalanuvchi System.out.printlnni yutadi (userMove + "beats" + computerMove + ". Siz yutdingiz!"); userScore ++; tanaffus; case -1: // Kompyuter System.out.printlnni yutadi (computerMove + "beats" + userMove + ". Siz yutqazdingiz."); computerScore ++; tanaffus; } numberOfGames ++;
Qadam 12. Foydalanuvchi yana o'ynashni xohlaydimi, deb so'rang
Agar foydalanuvchi yana o'ynamoqchi bo'lsa, qo'ng'iroq qiling
startGame ()
yana Aks holda, qo'ng'iroq qiling
printGameStats ()
bu o'yin statistikasini chop etadi. Bu usulni keyingi bosqichda yozamiz.
if (user.playAgain ()) {System.out.println (); startGame (); } boshqa {printGameStats (); }
13 -qadam
printGameStats ()
usul.
Bu usul o'yin statistikasini ko'rsatadi: yutuqlar soni, yo'qotishlar soni, bog'lanishlar soni, o'tkazilgan o'yinlar soni va foydalanuvchi yutgan o'yinlar foizi. G'alaba qozongan o'yinlar foizi (# g'alaba + (# durang/2))/(# o'yin o'tkazilgan) bilan hisoblanadi. Bu usuldan foydalaniladi
System.out.printf
formatlangan matnni chop etish uchun.
private void printGameStats () {int wins = userScore; int yo'qotishlar = computerScore; int tie = numberOfGames - userScore - computerScore; er -xotin foizWon = (g'alaba + ((dubli) galstuk) / 2) / numberOfGames; // Chiziq System.out.print ("+"); printDashes (68); System.out.println ("+"); // Bosib chiqarish sarlavhalari System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "G'ALABA", "YO'QOLISH", "BILGILAR", "O'YINLAR", "FOZI) YUTUQ"); // Chiziq 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 ("|"); // Bosib chiqarish qiymatlari System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", g'alabalar, yo'qotishlar, bog'lanishlar, numberOfGames, foizWon * 100); // Chiziq System.out.print ("+"); printDashes (68); System.out.println ("+"); }
14 -qadam O'yinni asosiy sinfda boshlang
Asosiy sinfda, misolini ishga tushiring
RockPaperScissors
sinfga qo'ng'iroq qiling
startGame ()
usul.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
15 -qadam. O'yiningizni sinab ko'ring
Endi biz "Rok, qog'oz, qaychi" o'yinini yozish uchun ko'p harakatlarni boshdan kechirdik, hamma narsani yig'ish va sinab ko'rish vaqti keldi!
Namuna dasturi
java.util. Random -ni import qilish; java.util. Scanner -ni import qilish; ommaviy sinf RockPaperScissors {Maxsus foydalanuvchi foydalanuvchisi; shaxsiy kompyuter; shaxsiy int userScore; shaxsiy int computerScore; shaxsiy int numberOfGames; xususiy enum Move {ROCK, PAPER, Scissor; /** * Bu harakatni durang, g'alaba yoki * mag'lubiyatni aniqlashning boshqa harakati bilan solishtiradi. * * @param otherMove *, agar bu harakat boshqa harakatni mag'lub qilsa * @Return 1 bilan taqqoslash uchun harakatlaning, agar bu harakat * boshqa harakatga yutqazsa -1, agar bu harakatlar teng bo'lsa * / public int müqayisəMoves (Move otherMove) { / / Bog'lang, agar (this == otherMove) 0 qaytarsa; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); ish qaychi: qaytish (otherMove == PAPER? 1: -1); } // Bu erga hech qachon etib bormaslik kerak 0; }} shaxsiy sinf User {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// Foydalanuvchiga System.out.print ("Qoya, qog'oz yoki qaychi?") so'rovini yuborish; // String userInput = inputScanner.nextLine () foydalanuvchi kirishini oling; userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Foydalanuvchi to'g'ri kirish kalitini kiritdi (firstLetter) {case 'R': return Move. ROCK; case 'P': Move. PAPER -ni qaytarish; case 'S': Move. SCISSORS; }} // Foydalanuvchi to'g'ri kiritmagan. Yana taklif. getMove () ni qaytaring; } public boolean playAgain () {System.out.print ("Qayta o'ynashni xohlaysizmi?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); userInput.charAt (0) == 'Y' ni qaytarish; }} shaxsiy sinf Kompyuter {public Move getMove () {Move move = Move.values (); Tasodifiy tasodif = yangi tasodifiy (); int indeksi = random.nextInt (harakatlarning uzunligi); qaytish harakatlari [indeks]; }} ommaviy RockPaperScissors () {user = new User (); kompyuter = yangi kompyuter (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Harakatlarni oling Move userMove = user.getMove (); ComputerMove = computer.getMove () ni ko'chiring; System.out.println ("\ nSiz" + userMove + "o'ynadingiz."); System.out.println ("Kompyuter o'ynadi" + computerMove + ". / N"); // Harakatlarni solishtiring va g'olibni aniqlang int comparMoves = userMove.compareMoves (computerMove); switch (solishtirishMoves) {0 holat: // System.out.println bog'lang ("bog'lang!"); tanaffus; 1 -holat: // Foydalanuvchi System.out.printlnni yutadi (userMove + "beats" + computerMove + ". Siz yutdingiz!"); userScore ++; tanaffus; ish -1: // Kompyuter System.out.printlnni yutadi (computerMove + "beats" + userMove + ". Siz yutqazdingiz."); computerScore ++; tanaffus; } numberOfGames ++; // Agar foydalanuvchi (user.playAgain ()) {System.out.println (); startGame (); } boshqa {printGameStats (); }} /*** O'yin statistikasini chop etadi. Bog'lanishlarni 1/2 yutuq * foizli yutuq deb hisoblaydi. */ private void printGameStats () {int wins = userScore; int yo'qotishlar = computerScore; int tie = numberOfGames - userScore - computerScore; er -xotin foizWon = (g'alaba + ((dubli) galstuk) / 2) / numberOfGames; // Chiziq System.out.print ("+"); printDashes (68); System.out.println ("+"); // Bosib chiqarish sarlavhalari System.out.printf ("| %6s | %6s | %6s | %12s | %14s | / n", "G'ALaba", "YO'QOLISH", "GALATLAR", "O'YINLAR", "FOZI) YUTUQ"); // Chiziq 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 ("|"); // Bosib chiqarish qiymatlari System.out.printf ("| %6d | %6d | %6d | %12d | %13.2f %% | / n", g'alabalar, yo'qotishlar, bog'lanishlar, numberOfGames, foizlarWon * 100); // Chiziq 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 (); }}