Rock, Paper, Scissors to gra ręczna, w którą grają dwie osoby. Obie osoby powiedziałyby „kamień, papier, nożyczki”, a następnie jednocześnie uformowały jeden z trzech przedmiotów (kamień, papier lub nożyczki) z wyciągniętą ręką. Zwycięzca jest określany przez układy rąk. Nożyce biją papier, papier bije kamień, a kamień bije nożyczki. Jeśli obaj gracze zagrają tę samą formację rąk, uznaje się to za remis. Napiszemy prostą grę w Javie symulującą kamień, papier, nożyce, w której jeden gracz jest użytkownikiem, a drugi komputerem.
Kroki
Krok 1. Stwórz główną klasę i nazwij ją
KamieńPapierNożyczki
.
To będzie klasa, na której napiszemy grę. Możesz nazwać go czymś innym, takim jak
Gra
lub
Główny
. Napisz deklaracje metod dla konstruktora i metody głównej.
public class RockPaperScissors { public RockPaperScissors() { } public static void main(String args) { } }
Krok 2. Utwórz wyliczenie dla gestów rąk (kamień, papier lub nożyczki)
Moglibyśmy użyć ciągów do reprezentowania kamienia, papieru lub nożyczek, ale wyliczenie pozwala nam wstępnie zdefiniować nasze stałe, co oznacza, że użycie wyliczenia jest lepszym projektem. Nazwiemy nasz typ wyliczenia
Ruszaj się
z wartościami
GŁAZ
PAPIER
oraz
NOŻYCE
private enum Przenieś { ROCK, PAPIER, NOŻYCZKI }
Krok 3. Utwórz dwie prywatne zajęcia
Użytkownik
oraz
Komputer
.
Te klasy będą reprezentować naszych graczy w grze. Możesz upublicznić te zajęcia. ten
Użytkownik
class będzie klasą, która prosi użytkownika o kamień, papier lub nożyczki, więc będziemy musieli napisać a
pobierzPrzenieś()
metoda. ten
Komputer
klasa będzie również musiała mieć
pobierzPrzenieś()
tak, aby komputer również mógł wykonać ruch. W tych metodach umieścimy symbole zastępcze i zaimplementujemy je później. ten
Użytkownik
klasa będzie wymagała konstruktora, który konfiguruje
Skaner
obiekt do pobrania danych wejściowych użytkownika. Położymy
Skaner
jako pole prywatne dla użytkownika, a następnie zainicjuj je w konstruktorze. Ponieważ używamy
Skaner
klasy, musimy napisać dla niej instrukcję importu na początku naszego kodu. ten
Komputer
klasa nie wymaga konstruktora, więc nie musimy go pisać; kiedy inicjujemy
Komputer
obiekt, będziemy po prostu wywoływać domyślny konstruktor. Oto, co nasze
KamieńPapierNożyczki
klasa wygląda teraz:
importować java.util. Scanner; public class RockPaperScissors { private enum Przenieś { ROCK, PAPIER, NOŻYCZKI } private class Użytkownik { private Skaner inputScanner; public User() { inputScanner = new Scanner(System.in); } public Move getMove() { // TODO: Zaimplementuj tę metodę return null; } } private class Komputer { public Move getMove() { // TODO: Zaimplementuj tę metodę return null; } } public RockPaperScissors() { } public static void main(String args) { } }
Krok 4. Napisz
pobierzPrzenieś()
metoda dla
Komputer
klasa.
Ta metoda zwróci losowo
Ruszaj się
. Możemy uzyskać tablicę
Ruszaj się
wyliczenia, wywołując
wartości()
metoda:
Przenieś.wartości()
. Aby wybrać losowo
Ruszaj się
wyliczenia w tej tablicy wartości, musimy wygenerować losowy indeks, który jest liczbą całkowitą od 0 do długości naszej tablicy wartości. Aby to zrobić, możemy użyć
następnyInt()
metoda
Losowy
klasa, z której musimy importować
java.util
. Po uzyskaniu losowego indeksu możemy zwrócić
Ruszaj się
tego indeksu z naszej tablicy wartości.
public Move getMove() { Move move = Move.values(); Random random = nowy Random(); int index = random.nextInt(moves.length); ruchy zwrotne[indeks]; }
Krok 5. Napisz
pobierzPrzenieś()
metoda dla
Użytkownik
klasa.
Ta metoda zwróci a
Ruszaj się
odpowiadające temu, co wprowadził użytkownik. Oczekujemy, że użytkownik napisze „kamień”, „papier” lub „nożyczki”. Najpierw musimy poprosić użytkownika o wprowadzenie danych:
System.out.print("Kamień, papier czy nożyczki? ")
. Następnie użyj
następnaLinia()
metoda
Skaner
obiekt, aby uzyskać dane wejściowe użytkownika jako ciąg. Musimy teraz sprawdzić, czy użytkownik przesłał prawidłowy ruch, ale możemy być wyrozumiali, jeśli użytkownik popełnił błąd ortograficzny. Sprawdzimy więc tylko, czy pierwsza litera danych wprowadzonych przez użytkownika to „R” (dla kamienia), „P” (dla papieru) lub „S” (dla nożyczek) i nie będziemy się tym przejmować, ponieważ najpierw użyjemy
do wielkich liter()
metoda
Strunowy
class, aby ciąg wejściowy użytkownika był pisany wielkimi literami. Jeśli użytkownik nie wprowadził poprawnej zdalnie danych wejściowych, poprosimy użytkownika ponownie. Następnie, w zależności od tego, co włożył użytkownik, zwrócimy odpowiedni ruch.
public Move getMove() { // Pytaj użytkownika System.out.print("Kamień, papier czy nożyczki? "); // Pobierz dane wejściowe użytkownika String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Użytkownik wprowadził poprawny przełącznik wejściowy (firstLetter) { case 'R': return Move. ROCK; przypadek 'P': powrót Move. PAPER; przypadek 'S': powrót Move. SCISSORS; } } // Użytkownik nie wprowadził poprawnych danych wejściowych. Pytaj ponownie. return getMove(); }
Krok 6. Napisz
Zagraj ponownie()
metoda dla
Użytkownik
klasa.
Użytkownik powinien móc grać w grę w kółko. Aby ustalić, czy użytkownik chce ponownie zagrać, musimy napisać a
Zagraj ponownie()
metoda, która zwraca wartość logiczną informującą grę, czy użytkownik zdecydował się zagrać ponownie, czy nie. W tej metodzie używamy
Skaner
które wcześniej zainicjowaliśmy w konstruktorze, aby uzyskać od użytkownika „Tak” lub „Nie”. Sprawdzimy tylko, czy pierwsza litera to „Y”, aby określić, czy użytkownik chce ponownie zagrać. Każde inne wejście oznacza, że użytkownik nie będzie chciał ponownie grać.
public boolean playAgain() { System.out.print("Chcesz zagrać ponownie? "); Ciąg userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; }
Krok 7. Połącz
Użytkownik
oraz
Komputer
zajęcia razem w
KamieńPapierNożyczki
klasa.
Teraz, gdy skończyliśmy pisać
Użytkownik
oraz
Komputer
zajęcia, możemy skupić się na pracy nad naszą aktualną grą. Utwórz prywatne pola dla
Użytkownik
oraz
Komputer
zajęcia w
KamieńPapierNożyczki
klasa. Będziemy musieli uzyskać dostęp do tych pól, aby uzyskać dostęp do
pobierzPrzenieś()
metody, kiedy gramy w grę. W konstruktorze dla
KamieńPapierNożyczki
klasy, zainicjuj te pola. Będziemy również musieli śledzić wynik w
wynik użytkownika
oraz
wynik komputera
pola, które musimy zainicjować jako 0 w konstruktorze. Musimy również śledzić liczbę gier, co również będzie polem zainicjowanym jako 0.
prywatny użytkownik Użytkownik; prywatny komputer komputerowy; prywatny int userScore; prywatny int computerScore; private int numberOfGames; public RockPaperScissors() { użytkownik = nowy użytkownik(); komputer = nowy Komputer(); wynik użytkownika = 0; wynik komputera = 0; liczbaGry = 0; }
Krok 8. Rozszerz
Ruszaj się
enum, aby dołączyć metodę, która mówi nam, który ruch wygrywa w każdym przypadku.
Musimy napisać
porównajRuchy()
metoda, która zwraca 0, jeśli ruchy są takie same, 1, jeśli bieżący ruch bije inny ruch, i -1, jeśli bieżący ruch przegrywa z innym ruchem. Przyda się to przy ustalaniu zwycięzcy w grze. Aby zaimplementować tę metodę, najpierw zwrócimy 0, jeśli ruchy są takie same i dlatego mamy remis. Następnie napisz instrukcję switch, która zwraca 1 lub -1.
prywatne wyliczenie Przenieś { ROCK, PAPIER, NOŻYCZKI; /** * Porównuje ten ruch z innym ruchem w celu określenia remisu, wygranej lub * przegranej. * * @param otherMove * ruch do porównania z * @return 1 jeśli ten ruch pokonuje inny ruch, -1 jeśli ten ruch przegrywa z * innym ruchem, 0 jeśli te ruchy remisują */ public int CompareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == NOŻYCZKI ? 1: -1); wielkość liter PAPER: return (otherMove == ROCK ? 1: -1); wielkość liter NOŻYCZKI: return (otherMove == PAPER ? 1: -1); } // Nigdy nie powinien tu sięgać return 0; } }
Krok 9. Utwórz
uruchomić grę()
metoda w
KamieńPapierNożyczki
klasa.
Ta metoda będzie graniem w grę. Zacznij od prostego
System.out.println
w metodzie.
public void startGame() { System.out.println("Skała, papier, nożyczki!"); }
Krok 10. Uzyskaj ruchy od użytkownika i komputera
w
uruchomić grę()
metoda, użyj
pobierzPrzenieś()
metody z
Użytkownik
klasa i
Komputer
klasa, aby uzyskać użytkownika i ruchy komputera.
Przenieś userMove = user.getMove(); Przenieś komputerMove = komputer.getMove(); System.out.println("\nGrałeś w " + userMove + "."); System.out.println("Odtwarzany na komputerze " + computerMove + ".\n");
Krok 11. Porównaj oba ruchy i ustal, czy wygrał użytkownik, czy komputer
Użyj
porównajRuchy()
metoda z
Ruszaj się
enum, aby określić, czy użytkownik wygrał, czy nie. Jeśli użytkownik wygrał, zwiększ wynik użytkownika o 1. Jeśli użytkownik przegrał, zwiększ wynik komputera o 1. W przypadku remisu nie zwiększaj żadnego wyniku. Następnie zwiększ liczbę rozegranych gier o jeden.
int porównanieRuchów = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Powiąż System.out.println("Powiąż!"); przerwa; przypadek 1: // Użytkownik wygrywa System.out.println(userMove + " bije " + computerMove + ". Wygrałeś!"); wynik użytkownika++; przerwa; case -1: // Komputer wygrywa System.out.println(computerMove + " beats " + userMove + ". Przegrałeś."); wynik komputera++; przerwa; } liczbaGry++;
Krok 12. Zapytaj, czy użytkownik chce ponownie zagrać
Jeśli użytkownik chce zagrać ponownie, zadzwoń
uruchomić grę()
ponownie. W przeciwnym razie zadzwoń
drukujStatystykiGry()
który wydrukuje statystyki gry. Opiszemy tę metodę w następnym kroku.
if (user.playAgain()) { System.out.println(); uruchomić grę(); } else { printGameStats(); }
Krok 13. Napisz
drukujStatystykiGry()
metoda.
Ta metoda wyświetli statystyki gry: liczba wygranych, liczba przegranych, liczba remisów, liczba rozegranych gier i procent gier wygranych przez użytkownika. Procent wygranych gier jest obliczany na podstawie (# wygranych + (# remisów/2))/(# rozegranych gier). Ta metoda wykorzystuje
System.out.printf
aby wydrukować sformatowany tekst.
private void printGameStats() { int wygrywa = wynik użytkownika; straty int = wynik komputera; int ties = liczbaGry - wynik_użytkownika - wynik_komputera; podwójny procentWygrane = (wygrane + ((podwójne) remisy) / 2) / numberOfGames; // Linia System.out.print("+"); printDash(68); System.out.println("+"); // Wydrukuj tytuły System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "WYGRYWKI", "PRZEGRANE", "REMISY", "GRY", "PROCENT WYGRAŁA"); // Linia 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("|"); // Wydrukuj wartości System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", wygrane, przegrane, remisy, numberOfGames, procentwygrane * 100); // Linia System.out.print("+"); printDash(68); System.out.println("+"); }
Krok 14. Rozpocznij grę w głównej klasie
W klasie głównej zainicjuj instancję
KamieńPapierNożyczki
klasę i zadzwoń do
uruchomić grę()
metoda.
public static void main(String args) { RockPaperScissors gra = nowe RockPaperScissors(); gra.startGra(); }
Krok 15. Przetestuj swoją grę
Teraz, gdy wykonaliśmy już wszystkie wysiłki związane z napisaniem gry Rock, Paper, Scissors, nadszedł czas, aby wszystko skompilować i przetestować!
Przykładowy program
import java.util. Losowo; importować java.util. Scanner; public class RockPaperScissors { private Użytkownik użytkownik; prywatny komputer komputerowy; prywatny int userScore; prywatny int computerScore; private int numberOfGames; prywatne wyliczenie Przenieś { ROCK, PAPIER, NOŻYCZKI; /** * Porównuje ten ruch z innym ruchem w celu określenia remisu, wygranej lub * przegranej. * * @param otherMove * ruch do porównania z * @return 1 jeśli ten ruch pokonuje inny ruch, -1 jeśli ten ruch przegrywa z * innym ruchem, 0 jeśli te ruchy remisują */ public int CompareMoves(Move otherMove) { / / Tie if (this == otherMove) return 0; switch (this) { case ROCK: return (otherMove == NOŻYCZKI ? 1: -1); wielkość liter PAPER: return (otherMove == ROCK ? 1: -1); wielkość liter NOŻYCZKI: return (otherMove == PAPER ? 1: -1); } // Nigdy nie powinien tu sięgać return 0; } } private class Użytkownik { private Skaner inputScanner; public User() { inputScanner = new Scanner(System.in); } public Move getMove() { // Pytaj użytkownika System.out.print("Kamień, papier czy nożyczki? "); // Pobierz dane wejściowe użytkownika String userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); char firstLetter = userInput.charAt(0); if (firstLetter == 'R' || firstLetter == 'P' || firstLetter == 'S') { // Użytkownik wprowadził poprawny przełącznik wejściowy (firstLetter) { case 'R': return Move. ROCK; przypadek 'P': powrót Move. PAPER; przypadek 'S': powrót Move. SCISSORS; } } // Użytkownik nie wprowadził poprawnych danych wejściowych. Pytaj ponownie. return getMove(); } public boolean playAgain() { System.out.print("Chcesz zagrać jeszcze raz? "); Ciąg userInput = inputScanner.nextLine(); userInput = userInput.toUpperCase(); return userInput.charAt(0) == 'Y'; } } private class Komputer { public Move getMove() { Move move = Move.values(); Random random = nowy Random(); int index = random.nextInt(moves.length); ruchy zwrotne[indeks]; } } public RockPaperScissors() { user = new User(); komputer = nowy Komputer(); wynik użytkownika = 0; wynik komputera = 0; liczbaGry = 0; } public void startGame() { System.out.println("SKAŁA, PAPIER, NOŻYCZKI!"); // Pobierz ruchy Przenieś userMove = user.getMove(); Przenieś komputerMove = komputer.getMove(); System.out.println("\nGrałeś w " + userMove + "."); System.out.println("Odtwarzany na komputerze " + computerMove + ".\n"); // Porównaj ruchy i określ zwycięzcę int CompareMoves = userMove.compareMoves(computerMove); switch (compareMoves) { case 0: // Powiąż System.out.println("Powiąż!"); przerwa; przypadek 1: // Użytkownik wygrywa System.out.println(userMove + " bije " + computerMove + ". Wygrałeś!"); wynik użytkownika++; przerwa; case -1: // Komputer wygrywa System.out.println(computerMove + " beats " + userMove + ". Przegrałeś."); wynik komputera++; przerwa; } liczbaGry++; // Poproś użytkownika o ponowne odtworzenie if (user.playAgain()) { System.out.println(); uruchomić grę(); } else { printGameStats(); } } /** * Drukuje statystyki gry. Oblicza remisy jako 1/2 wygranej w * procentach wygranych. */ private void printGameStats() { int wins = userScore; straty int = wynik komputera; int ties = liczbaGry - wynik_użytkownika - wynik_komputera; podwójny procentWygrane = (wygrane + ((podwójne) remisy) / 2) / numberOfGames; // Linia System.out.print("+"); printDash(68); System.out.println("+"); // Wydrukuj tytuły System.out.printf("| %6s | %6s | %6s | %12s | %14s |\n", "WYGRYWKI", "PRZEGRANE", "REMISY", "GRY", "PROCENT WYGRAŁA"); // Linia 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("|"); // Wydrukuj wartości System.out.printf("| %6d | %6d | %6d | %12d | %13.2f%% |\n", wygrane, przegrane, remisy, numberOfGames, procentwygrane * 100); // Linia 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 gra = new RockPaperScissors(); gra.startGra(); } }