Rock, Paper, Scissors là một trò chơi tay do hai người chơi. Cả hai người sẽ nói "oẳn tù tì" và sau đó đồng thời tạo thành một trong ba vật thể (oẳn tù tì hoặc kéo) bằng bàn tay dang rộng. Người chiến thắng được xác định bằng hình thức bàn tay. Kéo đập giấy, kéo giấy đập đá, và kéo đập đá. Nếu cả hai đấu thủ chơi cùng một đội hình ván bài, nó được coi là hòa. Chúng tôi sẽ viết một trò chơi đơn giản bằng Java để mô phỏng Rock, Paper, Scissors trong đó một người chơi là người dùng và người chơi còn lại là máy tính.
Các bước
Bước 1. Tạo lớp chính và gọi nó
Oẳn tù tì
.
Đây sẽ là lớp mà chúng ta sẽ viết trò chơi. Bạn có thể chọn đặt tên cho nó một cái gì đó khác, chẳng hạn như
Trò chơi
hoặc
Chủ chốt
. Viết khai báo phương thức cho phương thức khởi tạo và phương thức chính.
public class RockPaperScissors {public RockPaperScissors () {} public static void main (String args) {}}
Bước 2. Tạo bảng liệt kê cho các cử chỉ tay (oẳn tù tì, hoặc kéo)
Chúng ta có thể sử dụng các chuỗi để biểu thị oẳn tù tì, hoặc kéo, nhưng một phép liệt kê cho phép chúng ta xác định trước các hằng số của mình, có nghĩa là sử dụng phép liệt kê là một thiết kế tốt hơn. Chúng tôi sẽ gọi loại enum của chúng tôi
Di chuyển
với các giá trị
ĐÁ
GIẤY
và
CÂY KÉO
enum private Move {ROCK, PAPER, SCISSORS}
Bước 3. Tạo hai lớp riêng
Người sử dụng
và
Máy vi tính
.
Các lớp này sẽ đại diện cho người chơi của chúng tôi trong trò chơi. Bạn có thể chọn đặt các lớp này ở chế độ công khai. Các
Người sử dụng
lớp sẽ là lớp nhắc người dùng oẳn tù tì, hoặc kéo, vì vậy chúng ta sẽ cần viết
getMove ()
phương pháp. Các
Máy vi tính
lớp học cũng sẽ cần phải có
getMove ()
để máy tính cũng có thể di chuyển. Chúng tôi sẽ đặt trình giữ chỗ trong các phương thức này và triển khai chúng sau. Các
Người sử dụng
lớp sẽ yêu cầu một phương thức khởi tạo thiết lập
Máy quét
đối tượng để nhận đầu vào của người dùng. Chúng tôi sẽ đặt
Máy quét
dưới dạng một trường riêng tư cho người dùng và sau đó khởi tạo nó trong phương thức khởi tạo. Vì chúng tôi đang sử dụng
Máy quét
chúng ta cần viết một câu lệnh nhập cho nó ở đầu mã của chúng ta. Các
Máy vi tính
lớp không yêu cầu một hàm tạo, vì vậy chúng ta không cần viết một hàm tạo; khi chúng tôi bắt đầu
Máy vi tính
đối tượng, chúng ta sẽ chỉ gọi hàm tạo mặc định. Đây là những gì của chúng tôi
Oẳn tù tì
lớp học giống như bây giờ:
nhập java.util. Scanner; public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class Người dùng {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// VIỆC CẦN LÀM: Thực hiện phương thức này return null; }} private class Computer {public Move getMove () {// VIỆC CẦN LÀM: Thực hiện phương thức này return null; }} public RockPaperScissors () {} public static void main (String args) {}}
Bước 4. Viết
getMove ()
phương pháp cho
Máy vi tính
lớp.
Phương thức này sẽ trả về một
Di chuyển
. Chúng ta có thể nhận được một loạt các
Di chuyển
liệt kê bằng cách gọi
giá trị ()
phương pháp:
Move.values ()
. Để chọn ngẫu nhiên
Di chuyển
liệt kê trong mảng giá trị này, chúng ta cần tạo một chỉ số ngẫu nhiên là một số nguyên từ 0 đến độ dài của mảng giá trị của chúng ta. Để làm điều này, chúng ta có thể sử dụng
nextInt ()
phương pháp của
Ngẫu nhiên
lớp mà chúng ta cần nhập từ
java.util
. Sau khi chúng tôi nhận được chỉ mục ngẫu nhiên, chúng tôi có thể trả về
Di chuyển
của chỉ mục đó từ mảng giá trị của chúng tôi.
public Move getMove () {Move move = Move.values (); Ngẫu nhiên ngẫu nhiên = new Random (); int index = random.nextInt (move.length); trả lại di chuyển [chỉ số]; }
Bước 5. Viết
getMove ()
phương pháp cho
Người sử dụng
lớp.
Phương thức này sẽ trả về một
Di chuyển
tương ứng với những gì người dùng có đầu vào. Chúng tôi sẽ mong đợi người dùng viết "đá", "giấy" hoặc "kéo". Đầu tiên, chúng ta cần nhắc người dùng nhập:
System.out.print ("Đá, giấy hay kéo?")
. Sau đó, sử dụng
hàng tiếp theo()
phương pháp của
Máy quét
đối tượng để nhận đầu vào của người dùng dưới dạng một chuỗi. Bây giờ chúng tôi cần kiểm tra xem người dùng đã gửi một động thái hợp lệ hay chưa, nhưng chúng tôi có thể khoan hồng nếu người dùng viết sai chính tả một từ. Vì vậy, chúng tôi sẽ chỉ kiểm tra xem chữ cái đầu tiên của người dùng nhập là "R" (đối với đá), "P" (đối với giấy) hoặc "S" (đối với kéo) và chúng tôi sẽ không quan tâm đến trường hợp này vì trước tiên chúng tôi sẽ sử dụng
Đến trường hợp trên()
phương pháp của
Dây
lớp để làm cho chuỗi nhập của người dùng tất cả là chữ hoa. Nếu người dùng chưa nhập đầu vào chính xác từ xa, chúng tôi sẽ nhắc người dùng một lần nữa. Sau đó, tùy thuộc vào những gì người dùng đã đưa vào, chúng tôi sẽ trả về một động thái tương ứng.
public Move getMove () {// Nhắc người dùng System.out.print ("Đá, giấy hay kéo?"); // Lấy đầu vào của người dùng String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Người dùng đã nhập một công tắc đầu vào hợp lệ (firstLetter) {case 'R': return Move. ROCK; case 'P': trả về Move. PAPER; case 'S': trả về Move. SCISSORS; }} // Người dùng chưa nhập đầu vào hợp lệ. Nhắc lại lần nữa. trả về getMove (); }
Bước 6. Viết một
chơi lại()
phương pháp cho
Người sử dụng
lớp.
Người dùng sẽ có thể chơi đi chơi lại trò chơi. Để xác định xem người dùng có muốn chơi lại hay không, chúng tôi cần viết
chơi lại()
phương thức trả về một boolean cho trò chơi biết liệu người dùng đã xác định chơi lại hay chưa. Trong phương pháp này, chúng tôi đang sử dụng
Máy quét
mà chúng tôi đã khởi tạo trước đó trong hàm tạo để nhận được "Có" hoặc "Không" từ người dùng. Chúng tôi sẽ chỉ kiểm tra xem chữ cái đầu tiên có phải là 'Y' hay không để xác định xem người dùng có muốn chơi lại hay không. Bất kỳ đầu vào nào khác sẽ có nghĩa là người dùng không muốn chơi lại.
public boolean playAgain () {System.out.print ("Bạn có muốn chơi lại không?"); Chuỗi userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); trả về userInput.charAt (0) == 'Y'; }
Bước 7. Kết nối
Người sử dụng
và
Máy vi tính
các lớp học cùng nhau trong
Oẳn tù tì
lớp.
Bây giờ chúng ta đã viết xong
Người sử dụng
và
Máy vi tính
lớp học, chúng tôi có thể tập trung vào làm việc trên trò chơi thực tế của chúng tôi. Tạo các trường riêng tư cho
Người sử dụng
và
Máy vi tính
các lớp học trong
Oẳn tù tì
lớp. Chúng tôi sẽ cần truy cập các trường này để truy cập vào
getMove ()
khi chúng tôi chơi trò chơi. Trong hàm tạo cho
Oẳn tù tì
lớp, khởi tạo các trường này. Chúng tôi cũng sẽ cần theo dõi điểm số trong
userScore
và
máy tính
các trường mà chúng ta cần bắt đầu bằng 0 trong hàm tạo. Chúng tôi cũng cần theo dõi số lượng trò chơi, đây cũng sẽ là trường được bắt đầu bằng 0.
người dùng người dùng riêng tư; máy vi tính cá nhân; int userScore riêng tư; private int computerScore; int numberOfGames riêng tư; public RockPaperScissors () {user = new User (); máy tính = new Máy tính (); userScore = 0; computerScore = 0; numberOfGames = 0; }
Bước 8. Mở rộng
Di chuyển
enum để bao gồm một phương thức cho chúng ta biết nước đi nào thắng trong mỗi trường hợp.
Chúng tôi cần viết một
so sánhMoves ()
phương thức trả về 0 nếu nước đi giống nhau, 1 nếu nước đi hiện tại thắng nước đi kia và -1 nếu nước đi hiện tại thua nước đi kia. Điều này sẽ hữu ích để xác định người chiến thắng trong trò chơi. Để thực hiện phương pháp này, trước tiên chúng ta sẽ trả về 0 nếu các nước đi giống nhau và do đó chúng ta có hòa. Sau đó, viết một câu lệnh switch để trả về 1 hoặc -1.
enum private Move {ROCK, PAPER, SCISSORS; / ** * So sánh nước đi này với nước đi khác để xác định hòa, thắng hoặc * thua. * * @param otherMove * di chuyển để so sánh với * @ quay lại 1 nếu nước đi này thắng nước đi kia, -1 nếu nước đi này thua * nước đi kia, 0 nếu những nước đi này hòa * / public int CompareMoves (Di chuyển khác) {/ / Tie if (this == otherMove) return 0; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPER? 1: -1); } // Không bao giờ đến được đây return 0; }}
Bước 9. Tạo một
bắt đầu trò chơi()
phương pháp trong
Oẳn tù tì
lớp.
Phương pháp này sẽ là cách chơi của trò chơi. Bắt đầu bằng cách đặt một đơn giản
System.out.println
trong phương pháp.
public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); }
Bước 10. Nhận chuyển động từ người dùng và máy tính
bên trong
bắt đầu trò chơi()
phương pháp, sử dụng
getMove ()
phương pháp từ
Người sử dụng
lớp học và
Máy vi tính
lớp để có được người dùng và di chuyển của máy tính.
Di chuyển userMove = user.getMove (); Di chuyển computerMove = computer.getMove (); System.out.println ("\ nBạn đã chơi" + userMove + "."); System.out.println ("Máy tính đã phát" + computerMove + ". / N");
Bước 11. So sánh hai nước đi và xác định xem người dùng thắng hay máy tính thắng
Sử dụng
so sánhMoves ()
phương pháp từ
Di chuyển
enum để xác định xem người dùng có thắng hay không. Nếu người dùng thắng, hãy tăng điểm người dùng lên 1. Nếu người dùng thua, hãy tăng điểm máy tính lên 1. Nếu hòa, không tăng bất kỳ điểm nào. Sau đó, tăng số lượng trò chơi của một trò chơi.
int so sánhMoves = userMove.compareMoves (computerMove); switch (CompareMoves) {case 0: // Tie System.out.println ("Tie!"); nghỉ; case 1: // Người dùng thắng System.out.println (userMove + "beat" + computerMove + ". Bạn đã thắng!"); userScore ++; nghỉ; case -1: // Máy tính thắng System.out.println (computerMove + "beat" + userMove + ". Bạn đã thua."); computerScore ++; nghỉ; } numberOfGames ++;
Bước 12. Hỏi xem người dùng có muốn chơi lại hay không
Nếu người dùng muốn chơi lại, hãy gọi
bắt đầu trò chơi()
lần nữa. Nếu không, hãy gọi
printGameStats ()
sẽ in ra số liệu thống kê của trò chơi. Chúng tôi sẽ viết phương pháp này trong bước tiếp theo.
if (user.playAgain ()) {System.out.println (); bắt đầu trò chơi(); } else {printGameStats (); }
Bước 13. Viết
printGameStats ()
phương pháp.
Phương pháp này sẽ hiển thị số liệu thống kê của trò chơi: số lần thắng, số lần thua, số lần hòa, số trận đã chơi và tỷ lệ phần trăm thắng của trò chơi mà người dùng đã chơi. Phần trăm trò chơi thắng được tính bằng (# trận thắng + (# hòa / 2)) / (# trận đã chơi). Phương pháp này sử dụng
System.out.printf
để in ra văn bản được định dạng.
private void printGameStats () {int won = userScore; int lỗ = computerScore; int tie = numberOfGames - userScore - computerScore; đôi phần trămWon = (thắng + ((đôi) quan hệ) / 2) / numberOfGames; // Dòng System.out.print ("+"); printDash (68); System.out.println ("+"); // In tiêu đề System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "WINS", "LOSSES", "TIES", "GAME PLAYED", "PERCENTAGE THẮNG"); // Dòng System.out.print ("|"); printDash (10); System.out.print ("+"); printDash (10); System.out.print ("+"); printDash (10); System.out.print ("+"); printDash (16); System.out.print ("+"); printDash (18); System.out.println ("|"); // In ra các giá trị System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", thắng, thua, hòa, numberOfGames, phần trămWon * 100); // Dòng System.out.print ("+"); printDash (68); System.out.println ("+"); }
Bước 14. Bắt đầu trò chơi trong lớp học chính
Trong lớp chính, khởi tạo một phiên bản của
Oẳn tù tì
lớp học và gọi
bắt đầu trò chơi()
phương pháp.
public static void main (String args) {RockPaperScissors game = new RockPaperScissors (); game.startGame (); }
Bước 15. Kiểm tra trò chơi của bạn
Bây giờ chúng tôi đã trải qua tất cả nỗ lực viết trò chơi Rock, Paper, Scissors, đã đến lúc biên dịch và kiểm tra mọi thứ!
Chương trình mẫu
nhập java.util. Random; nhập java.util. Scanner; public class RockPaperScissors {người dùng private User; máy vi tính cá nhân; int userScore riêng tư; private int computerScore; int numberOfGames riêng tư; enum private Move {ROCK, PAPER, SCISSORS; / ** * So sánh nước đi này với nước đi khác để xác định hòa, thắng hoặc * thua. * * @param otherMove * di chuyển để so sánh với * @ quay lại 1 nếu nước đi này thắng nước đi kia, -1 nếu nước đi này thua * nước đi kia, 0 nếu những nước đi này hòa * / public int CompareMoves (Di chuyển khác) {/ / Tie if (this == otherMove) return 0; switch (this) {case ROCK: return (otherMove == SCISSORS? 1: -1); case PAPER: return (otherMove == ROCK? 1: -1); case SCISSORS: return (otherMove == PAPER? 1: -1); } // Không bao giờ đến được đây return 0; }} lớp riêng Người dùng {private Scanner inputScanner; public User () {inputScanner = new Scanner (System.in); } public Move getMove () {// Nhắc người dùng System.out.print ("Đá, giấy hay kéo?"); // Lấy đầu vào của người dùng String userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); char firstLetter = userInput.charAt (0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') {// Người dùng đã nhập một công tắc đầu vào hợp lệ (firstLetter) {case 'R': return Move. ROCK; case 'P': trả về Move. PAPER; case 'S': trả về Move. SCISSORS; }} // Người dùng chưa nhập đầu vào hợp lệ. Nhắc lại lần nữa. trả về getMove (); } public boolean playAgain () {System.out.print ("Bạn có muốn chơi lại không?"); Chuỗi userInput = inputScanner.nextLine (); userInput = userInput.toUpperCase (); trả về userInput.charAt (0) == 'Y'; }} private class Máy tính {public Move getMove () {Move move = Move.values (); Ngẫu nhiên ngẫu nhiên = new Random (); int index = random.nextInt (move.length); trả lại di chuyển [chỉ số]; }} public RockPaperScissors () {user = new User (); máy tính = new Máy tính (); userScore = 0; computerScore = 0; numberOfGames = 0; } public void startGame () {System.out.println ("ROCK, PAPER, SCISSORS!"); // Nhận di chuyển Di chuyển userMove = user.getMove (); Di chuyển computerMove = computer.getMove (); System.out.println ("\ nBạn đã chơi" + userMove + "."); System.out.println ("Máy tính đã chơi" + computerMove + ". / N"); // So sánh nước đi và xác định người chiến thắng int so sánhMoves = userMove.compareMoves (computerMove); switch (CompareMoves) {case 0: // Tie System.out.println ("Tie!"); nghỉ; case 1: // Người dùng thắng System.out.println (userMove + "beat" + computerMove + ". Bạn đã thắng!"); userScore ++; nghỉ; case -1: // Máy tính thắng System.out.println (computerMove + "beat" + userMove + ". Bạn đã thua."); computerScore ++; nghỉ; } numberOfGames ++; // Yêu cầu người dùng chơi lại if (user.playAgain ()) {System.out.println (); bắt đầu trò chơi(); } else {printGameStats (); }} / ** * In ra số liệu thống kê của trò chơi. Tính tỷ lệ hòa là 1/2 trận thắng trong * tỷ lệ phần trăm thắng. * / private void printGameStats () {int won = userScore; int lỗ = computerScore; int tie = numberOfGames - userScore - computerScore; đôi phần trămWon = (thắng + ((đôi) quan hệ) / 2) / numberOfGames; // Dòng System.out.print ("+"); printDash (68); System.out.println ("+"); // In tiêu đề System.out.printf ("|% 6s |% 6s |% 6s |% 12s |% 14s | / n", "WINS", "LOSSES", "TIES", "GAME PLAYED", "PERCENTAGE THẮNG"); // Dòng System.out.print ("|"); printDash (10); System.out.print ("+"); printDash (10); System.out.print ("+"); printDash (10); System.out.print ("+"); printDash (16); System.out.print ("+"); printDash (18); System.out.println ("|"); // In ra các giá trị System.out.printf ("|% 6d |% 6d |% 6d |% 12d |% 13.2f %% | / n", thắng, thua, hòa, numberOfGames, phần trămWon * 100); // Dòng System.out.print ("+"); printDash (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 (); }}