Rock, Paper, Scissors adalah permainan tangan yang dimainkan oleh dua orang. Kedua-dua orang akan mengatakan "batu, kertas, gunting" dan kemudian secara serentak membentuk salah satu daripada tiga objek (batu, kertas, atau gunting) dengan tangan terentang. Pemenang ditentukan oleh formasi tangan. Gunting mengalahkan kertas, kertas mengalahkan batu, dan gunting pemukul batu. Sekiranya kedua-dua pemain bermain formasi tangan yang sama, ia dianggap seri. Kami akan menulis permainan sederhana di Java untuk mensimulasikan Rock, Paper, Gunting di mana satu pemain adalah pengguna dan pemain lain adalah komputer.
Langkah-langkah
Langkah 1. Buat kelas utama dan namakannya
Batu kertas gunting
.
Ini akan menjadi kelas di mana kita akan menulis permainan. Anda boleh memilih untuk menamakannya seperti yang lain
Permainan
atau
Utama
. Tulis dalam deklarasi kaedah untuk pembina dan kaedah utama.
kelas awam RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Langkah 2. Buat penghitungan untuk isyarat tangan (batu, kertas, atau gunting)
Kita boleh menggunakan tali untuk mewakili batu, kertas, atau gunting, tetapi penghitungan memungkinkan kita untuk menentukan pemalar kita yang bermaksud bahawa menggunakan pencacahan adalah reka bentuk yang lebih baik. Kami akan memanggil jenis enum kami
Bergerak
dengan nilai-nilai
ROCK
KERTAS
dan
PEMAKAI
enum peribadi Pindah {ROCK, PAPER, SCISSORS}
Langkah 3. Buat dua kelas persendirian
Pengguna
dan
Komputer
.
Kelas-kelas ini akan mewakili pemain kami dalam permainan. Anda boleh memilih untuk menjadikan kelas ini umum. The
Pengguna
kelas akan menjadi kelas yang meminta pengguna sama ada batu, kertas, atau gunting, jadi kita perlu menulis a
getMove ()
kaedah. The
Komputer
kelas juga perlu mempunyai
getMove ()
kaedah supaya komputer juga dapat bergerak. Kami akan meletakkan placeholder dalam kaedah ini dan melaksanakannya kemudian. The
Pengguna
kelas akan memerlukan pembina yang menetapkan
Pengimbas
objek untuk diambil input pengguna. Kami akan meletakkan
Pengimbas
sebagai medan peribadi untuk pengguna dan kemudian memulakannya dalam konstruktor. Oleh kerana kita menggunakan
Pengimbas
kelas, kita perlu menulis pernyataan import untuknya di bahagian atas kod kami. The
Komputer
kelas tidak memerlukan pembina, jadi kita tidak perlu menulis satu; semasa kita memulakan
Komputer
objek, kita hanya akan memanggil pembina lalai. Inilah yang kami
Batu kertas gunting
kelas kelihatan seperti sekarang:
import java.util. Scanner; kelas awam RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} pengguna kelas peribadi {private Scanner inputScanner; Pengguna awam () {inputScanner = Pengimbas baru (System.in); } public Move getMove () {// TODO: Laksanakan kaedah ini return null; }} kelas peribadi Komputer {public Move getMove () {// TODO: Laksanakan kaedah ini return null; }} awam RockPaperScissors () {} umum kekosongan statik awam (String args) {}}
Langkah 4. Tuliskan
getMove ()
kaedah untuk
Komputer
kelas.
Kaedah ini akan mengembalikan rawak
Bergerak
. Kita boleh mendapatkan pelbagai
Bergerak
penghitungan dengan memanggil
nilai ()
kaedah:
Alih. Nilai ()
. Untuk memilih rawak
Bergerak
penghitungan dalam array nilai ini, kita perlu menghasilkan indeks rawak yang merupakan bilangan bulat antara 0 dan panjang array nilai kita. Untuk melakukan ini, kita boleh menggunakan
seterusnyaInt ()
kaedah
Secara rawak
kelas yang perlu kita import
java.util
. Setelah memperoleh indeks rawak, kita dapat mengembalikannya
Bergerak
indeks itu dari tatasusila nilai kami.
awam Move getMove () {Move bergerak = Move.values (); Rawak rawak = Rawak baru (); int index = random.nextInt (move.length); pergerakan kembali [indeks]; }
Langkah 5. Tuliskan
getMove ()
kaedah untuk
Pengguna
kelas.
Kaedah ini akan mengembalikan a
Bergerak
sesuai dengan apa yang pengguna masukkan. Kami mengharapkan pengguna menulis "rock", "paper", atau "gunting". Pertama, kita perlu meminta pengguna untuk memasukkan:
System.out.print ("Batu, kertas, atau gunting?")
. Kemudian gunakan
talian seterusnya ()
kaedah
Pengimbas
objek untuk mendapatkan input pengguna sebagai rentetan. Kita sekarang perlu memeriksa sama ada pengguna telah mengemukakan langkah yang sah, tetapi kita boleh bersikap lunak jika pengguna salah mengeja kata. Oleh itu, kami hanya akan memeriksa sama ada huruf pertama input pengguna sama ada "R" (untuk batu), "P" (untuk kertas), atau "S" (untuk gunting), dan kami tidak akan peduli dengan kes itu kerana pertama kita akan menggunakan
keUpperCase ()
kaedah
Tali
kelas untuk menjadikan rentetan input pengguna menjadi huruf besar. Sekiranya pengguna belum memasukkan input yang betul dari jarak jauh, kami akan meminta pengguna lagi. Kemudian, bergantung pada apa yang dimasukkan oleh pengguna, kami akan mengembalikan langkah yang sesuai.
awam Move getMove () {// Meminta pengguna System.out.print ("Batu, kertas, atau gunting?"); // Dapatkan input pengguna String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Pengguna telah memasukkan suis input yang sah (firstLetter) {case 'R': return Move. ROCK; kes 'P': return Move. PAPER; kes 'S': return Move. SCISSORS; }} // Pengguna belum memasukkan input yang sah. Prompt lagi. kembali getMove (); }
Langkah 6. Tuliskan a
bermain lagi()
kaedah untuk
Pengguna
kelas.
Pengguna semestinya dapat bermain permainan berulang kali. Untuk menentukan sama ada pengguna mahu bermain lagi, kita perlu menulis a
bermain lagi()
kaedah yang mengembalikan boolean memberitahu permainan sama ada pengguna telah bertekad untuk bermain lagi atau tidak. Dalam kaedah ini, kami menggunakan
Pengimbas
bahawa kita sebelum ini memulakan di konstruktor untuk mendapatkan "Ya" atau "Tidak" dari pengguna. Kami hanya akan memeriksa sama ada huruf pertama adalah 'Y' untuk menentukan sama ada pengguna mahu bermain lagi. Sebarang input lain bermaksud pengguna tidak mahu bermain lagi.
public boolean playAgain () {System.out.print ("Adakah anda mahu bermain lagi?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); mengembalikan penggunaInput.charAt (0) == 'Y'; }
Langkah 7. Sambungkan
Pengguna
dan
Komputer
kelas bersama di
Batu kertas gunting
kelas.
Sekarang kita sudah selesai menulis
Pengguna
dan
Komputer
kelas, kita dapat memberi tumpuan untuk mengusahakan permainan sebenar kita. Buat medan peribadi untuk
Pengguna
dan
Komputer
kelas di
Batu kertas gunting
kelas. Kita perlu mengakses bidang ini untuk mengakses
getMove ()
kaedah semasa kita bermain permainan. Dalam pembina untuk
Batu kertas gunting
kelas, mulakan bidang ini. Kami juga perlu memantau skor dalam
skor pengguna
dan
skor komputer
medan, yang perlu kita mulakan sebagai 0 dalam konstruktor. Kita juga perlu mengawasi jumlah permainan, yang juga akan dimulakan sebagai 0.
pengguna Pengguna persendirian; komputer Komputer persendirian; Markah pengguna int peribadi; skor komputer int peribadi; nombor int peribadiOfGames; RockPaperScissors awam () {user = pengguna baru (); komputer = Komputer baru (); skor pengguna = 0; skor komputer = 0; numberOfGames = 0; }
Langkah 8. Panjangkan
Bergerak
enum untuk memasukkan kaedah yang memberitahu kita langkah mana yang menang dalam setiap kes.
Kita perlu menulis a
bandingkanPindah ()
kaedah yang mengembalikan 0 jika pergerakannya sama, 1 jika pergerakan semasa mengalahkan pergerakan yang lain, dan -1 jika pergerakan semasa kalah dengan pergerakan yang lain. Ini akan berguna untuk menentukan pemenang dalam permainan. Untuk melaksanakan kaedah ini, kami akan mengembalikan 0 terlebih dahulu jika pergerakannya sama dan oleh itu kami mempunyai kedudukan yang sama. Kemudian tulis pernyataan pertukaran untuk mengembalikan 1 atau -1.
enum peribadi Pindah {ROCK, KERTAS, SCISSORS; / ** * Bandingkan langkah ini dengan langkah lain untuk menentukan keputusan seri, kemenangan, atau * kekalahan. * * @param otherMove * pindah untuk dibandingkan dengan * @return 1 jika gerakan ini mengalahkan gerakan yang lain, -1 jika gerakan ini kalah dari * gerakan yang lain, 0 jika pergerakan ini mengikat * / public int membandingkanMoves (Move otherMove) {/ / Ikat jika (ini == otherMove) kembali 0; tukar (ini) {case ROCK: return (otherMove == SCISSORS? 1: -1); kes KERTAS: return (otherMove == ROCK? 1: -1); kes SCISSORS: return (otherMove == KERTAS? 1: -1); } // Tidak boleh sampai di sini kembali 0; }}
Langkah 9. Buat a
mula permainan()
kaedah dalam
Batu kertas gunting
kelas.
Kaedah ini akan menjadi permainan. Mulakan dengan meletakkan yang sederhana
Sistem.out.println
dalam kaedah.
publicGoid startGame () {System.out.println ("ROCK, KERTAS, SCISSORS!"); }
Langkah 10. Dapatkan pergerakan dari pengguna dan komputer
Di dalam
mula permainan()
kaedah, gunakan
getMove ()
kaedah dari
Pengguna
kelas dan
Komputer
kelas untuk mendapatkan pengguna dan pergerakan komputer.
Pindahkan userMove = user.getMove (); Pindahkan computerMove = computer.getMove (); System.out.println ("\ nAnda bermain" + userMove + "."); System.out.println ("Komputer dimainkan" + komputerMove + ". / N");
Langkah 11. Bandingkan kedua pergerakan dan tentukan sama ada pengguna menang atau komputer menang
Menggunakan
bandingkanPindah ()
kaedah dari
Bergerak
enum untuk menentukan sama ada pengguna menang atau tidak. Sekiranya pengguna menang, tambahkan skor pengguna dengan 1. Sekiranya pengguna kalah, tambahkan skor komputer dengan 1. Sekiranya ada seri, jangan menambah skor mana pun. Kemudian tambahkan bilangan permainan yang dimainkan oleh satu.
int membandingkanMoves = userMove.compareMoves (computerMove); tukar (bandingkanMoves) {kes 0: // Tie System.out.println ("Tie!"); rehat; kes 1: // Pengguna menang System.out.println (userMove + "beats" + computerMove + ". Anda menang!"); skor pengguna ++; rehat; kes -1: // Komputer menang System.out.println (computerMove + "beats" + userMove + ". Anda kalah."); skor komputer ++; rehat; } numberOfGames ++;
Langkah 12. Tanya sama ada pengguna mahu bermain lagi
Sekiranya pengguna mahu bermain lagi, hubungi
mula permainan()
lagi. Jika tidak, hubungi
printGameStats ()
yang akan mencetak statistik permainan. Kami akan menulis kaedah ini pada langkah seterusnya.
jika (user.playAgain ()) {System.out.println (); mula permainan(); } lain {printGameStats (); }
Langkah 13. Tuliskan
printGameStats ()
kaedah.
Kaedah ini akan memaparkan statistik permainan: jumlah kemenangan, jumlah kekalahan, jumlah pertandingan, jumlah permainan yang dimainkan, dan peratusan permainan yang dimenangi oleh pengguna. Peratusan permainan yang dimenangi dikira dengan (# menang + (# ikatan / 2)) / (# permainan dimainkan). Kaedah ini menggunakan
Sistem.out.printf
untuk mencetak teks berformat.
print kosong permainan peribadi () {int win = userScore; kerugian int = skor komputer; int ties = numberOfGames - userScore - computerScore; peratusan bergandaWon = (menang + ((berganda) ikatan) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Cetak tajuk System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "MENANG", "KEHILANGAN", "HUBUNGAN", "PERMAINAN BERMAIN", "PERATUS MENANG"); // 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 ("|"); // Nilai cetak System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", kemenangan, kerugian, ikatan, numberOfGames, peratusanWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); }
Langkah 14. Mulakan permainan di kelas utama
Di kelas utama, mulakan contoh
Batu kertas gunting
kelas dan panggil
mula permainan()
kaedah.
public static void main (String args) {RockPaperScissors game = RockPaperScissors baru (); game.startGame (); }
Langkah 15. Uji permainan anda
Sekarang kita telah melalui semua usaha menulis permainan Rock, Paper, Scissors, inilah masanya untuk menyusun dan menguji semuanya!
Contoh Program
import java.util. Rawak; import java.util. Scanner; kelas awam RockPaperScissors {pengguna Pengguna persendirian; komputer Komputer persendirian; Markah pengguna int peribadi; Skor komputer int peribadi; nombor int peribadiOfGames; enum peribadi Pindah {ROCK, KERTAS, SCISSORS; / ** * Bandingkan langkah ini dengan langkah lain untuk menentukan keputusan seri, kemenangan, atau * kekalahan. * * @param otherMove * pindah untuk dibandingkan dengan * @return 1 jika gerakan ini mengalahkan gerakan yang lain, -1 jika gerakan ini kalah dari * gerakan yang lain, 0 jika pergerakan ini mengikat * / public int membandingkanMoves (Move otherMove) {/ / Ikat jika (ini == otherMove) kembali 0; tukar (ini) {case ROCK: return (otherMove == SCISSORS? 1: -1); kes KERTAS: return (otherMove == ROCK? 1: -1); kes SCISSORS: return (otherMove == KERTAS? 1: -1); } // Tidak boleh sampai di sini kembali 0; }} pengguna kelas peribadi {private Scanner inputScanner; Pengguna awam () {inputScanner = Pengimbas baru (System.in); } umum Move getMove () {// Meminta pengguna System.out.print ("Batu, kertas, atau gunting?"); // Dapatkan input pengguna String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Pengguna telah memasukkan suis input yang sah (firstLetter) {case 'R': return Move. ROCK; kes 'P': return Move. PAPER; kes 'S': return Move. SCISSORS; }} // Pengguna belum memasukkan input yang sah. Prompt lagi. kembali getMove (); } main boolean awamAgain () {System.out.print ("Adakah anda mahu bermain lagi?"); String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); mengembalikan penggunaInput.charAt (0) == 'Y'; }} kelas peribadi Komputer {public Move getMove () {Move move = Move.values (); Rawak rawak = Rawak baru (); int index = random.nextInt (move.length); pergerakan kembali [indeks]; }} RockPaperScissors awam () {user = pengguna baru (); komputer = Komputer baru (); skor pengguna = 0; skor komputer = 0; numberOfGames = 0; } awam batal startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Dapatkan bergerak Move userMove = user.getMove (); Pindahkan computerMove = computer.getMove (); System.out.println ("\ nAnda bermain" + userMove + "."); System.out.println ("Komputer dimainkan" + komputerMove + ". / N"); // Bandingkan pergerakan dan tentukan pemenang int membandingkanMoves = userMove.compareMoves (computerMove); tukar (bandingkanMoves) {kes 0: // Tie System.out.println ("Tie!"); rehat; kes 1: // Pengguna menang System.out.println (userMove + "beats" + computerMove + ". Anda menang!"); skor pengguna ++; rehat; kes -1: // Komputer menang System.out.println (computerMove + "beats" + userMove + ". Anda kalah."); skor komputer ++; rehat; } numberOfGames ++; // Minta pengguna bermain semula jika (user.playAgain ()) {System.out.println (); mula permainan(); } lain {printGameStats (); }} / ** * Mencetak statistik permainan. Mengira ikatan sebagai 1/2 kemenangan dalam * peratusan menang. * / private void printGameStats () {int menang = userScore; kerugian int = skor komputer; int ties = numberOfGames - userScore - computerScore; peratusan bergandaWon = (menang + ((berganda) ikatan) / 2) / numberOfGames; // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); // Cetak tajuk System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "MENANG", "KEHILANGAN", "HUBUNGAN", "PERMAINAN BERMAIN", "PERATUS MENANG"); // 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 ("|"); // Nilai cetak System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", kemenangan, kerugian, ikatan, numberOfGames, peratusanWon * 100); // Line System.out.print ("+"); printDashes (68); System.out.println ("+"); } printDashes void peribadi (int numberOfDashes) {untuk (int i = 0; i <numberOfDashes; i ++) {System.out.print ("-"); }} umum kekosongan statik awam (String args) {RockPaperScissors game = RockPaperScissors baru (); game.startGame (); }}