Jak zrobić grę w kamień, papier, nożyce w Javie (ze zdjęciami)

Spisu treści:

Jak zrobić grę w kamień, papier, nożyce w Javie (ze zdjęciami)
Jak zrobić grę w kamień, papier, nożyce w Javie (ze zdjęciami)

Wideo: Jak zrobić grę w kamień, papier, nożyce w Javie (ze zdjęciami)

Wideo: Jak zrobić grę w kamień, papier, nożyce w Javie (ze zdjęciami)
Wideo: Importing Images as Textures in Your SketchUp Model - SketchUp Quick Tips 2024, Może
Anonim

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

1585279 1 1
1585279 1 1

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) { } }

1585279 2 1
1585279 2 1

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 }

1585279 3 1
1585279 3 1

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) { } }

1585279 4 1
1585279 4 1

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]; }

1585279 5 1
1585279 5 1

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(); }

1585279 6
1585279 6

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'; }

1585279 7
1585279 7

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; }

1585279 8
1585279 8

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; } }

1585279 9
1585279 9

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!"); }

1585279 10
1585279 10

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");

1585279 11
1585279 11

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++;

1585279 12
1585279 12

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(); }

1585279 13
1585279 13

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("+"); }

1585279 14
1585279 14

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(); }

1585279 15
1585279 15

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(); } }

Zalecana: