Як написати гру `камінь, ножиці, бумага` на java
«Камінь, ножиці, папір» - це гра «на пальцях» для двох. Гравці разом кажуть «камінь, ножиці, папір» і викидають вперед руку, пальцями формуючи одну з трьох фігур (камінь, ножиці або папір). Переможець визначається наступним чином: ножиці б`ють папір, папір б`є камінь, камінь б`є ножиці. Якщо обидва гравці показують одну і ту ж фігуру, це вважається нічиєю. Ми напишемо просту гру на Java, яка дозволить грати в «камінь, ножиці, папір» з комп`ютером.
кроки
1. Створіть основний клас і назвіть його
RockPaperScissors
. У цьому класі ми опишемо гру. Ви можете назвати його інакше, наприклад Game
або Main
. Напишіть оголошення конструктора і методу main.public class RockPaperScissors {public RockPaperScissors () {} public static void main (String [] args) {}}
2. Створіть перерахування (enum) для опису можливих ходів (камінь, ножиці, папір). Ми можемо поставити ходи рядками, але перерахування дозволяє нам визначити константи, тому використання enum краще. Назвемо наше перерахування
Move
і задамо значенняROCK
, PAPER
і SCISSORS
.private enum Move {ROCK, PAPER, SCISSORS}
3. Створіть два закритих (ключове слово private) класу
User
і Computer
. Ці класи будуть представляти гравців. Ви також можете зробити ці класи відкритими (ключове слово public). класUser
буде запитувати у користувача, який хід він робить - камінь, ножиці або папір - тому нам потрібно написати метод getMove ()
. класComputer
також повинен мати методgetMove ()
, щоб ми могли отримати хід комп`ютера. Поки що ми просто оголосимо ці методи, а реалізацію напишемо пізніше. клас User
повинен мати конструктор, в якому инициализируется об`єкт Scanner
, який буде зчитувати введення користувача. оголосимоScanner
закритим членом даних класу User
і инициализируем його в конструкторі. Оскільки ми збираємося використовувати клас Scanner
, ми повинні підключити його, використовуючи ключове слово import
. класу Computer
конструктор не потрібен, тому ми не будемо його пісать- при ініціалізації об`єкта Computer
ми просто викличемо конструктор за замовчуванням. Ось як клас RockPaperScissors
виглядає тепер:import java.util.Scanner-public class RockPaperScissors {private enum Move {ROCK, PAPER, SCISSORS} private class User {private Scanner inputScanner-public User () {inputScanner = new Scanner (System.in) -} public Move getMove () {// TODO: Реалізація методаreturn null -}} private class Computer {public Move getMove () {// TODO: Реалізація методаreturn null -}} public RockPaperScissors () {} public static void main (String [] args) {}}
4. Напишіть реалізацію методу
getMove ()
для класу Computer
. Цей метод буде повертати випадкове значення Move
.Ми можемо отримати масив значень Move
викликавши метод values ()
ось так: Move.values ()
. Щоб вибрати випадкове значення Move
з цього масиву, нам потрібно згенерувати випадковий індекс між 0 і кількістю елементом масиву. Для цього викличемо методnextInt ()
класуRandom
, який ми підключимо так:import java.util.Random
. Отримавши випадковий індекс, повернемо значення Move
з цим індексом в нашому масиві.public Move getMove () {Move [] moves = Move.values () - Random random = new Random () - int index = random.nextInt (moves.length) -return moves [index] -}
5. Напишіть реалізацію методу
getMove ()
для класу User
. Цей метод буде повертати значення Move
відповідне введення користувача. Користувач може ввести "камінь", "ножиці", або "папір". Спочатку виведемо повідомлення: System.out.print ("Камінь, ножиці або папір?")
. Потім, за допомогою методу nextLine ()
об`єкта Scanner
, ми отримаємо введення користувача в вигляді рядка. Тепер потрібно перевірити коректність введення користувача. Однак ми не звертатиме увагу на помилки, а просто перевіримо першу букву «К», «Н» або «Б». Також ми не будемо звертати увагу на регістр букв, так як, попередньо, ми викличемо метод toUpperCase ()
класу String
, приводячи введення користувача до верхнього регістру. Якщо користувач не ввів навіть приблизно коректний вибір, запитаємо його хід ще раз. Потім, в залежності від введення користувача, наш метод поверне відповідне значення Move
.public Move getMove () {// Виведемо запит на вводSystem.out.print ("Камінь, ножиці або папір? ") - // Прочитаємо введення пользователяString userInput = inputScanner.nextLine () - userInput = userInput.toUpperCase () - char firstLetter = userInput.charAt (0) -if (firstLetter == `К` || firstLetter == `Н` || firstLetter == `Б`) {// Введення корректнийswitch (firstLetter) {case `К`: return Move.ROCK-case `Н`: return Move.PAPER-case `Б`: return Move.SCISSORS -}} // Введення некоректний. Виведемо запит на введення знову.return getMove () -}
6. Напишіть реалізацію методу
playAgain ()
класу User
. Користувач повинен мати можливість грати знову і знову. Щоб визначити чи хоче користувач зіграти ще раз, напишіть метод playAgain ()
, який буде повертати значення типу bool і, таким чином, повідомляти грі хоче користувач зіграти ще раз. У цьому методі ми використовуємо об`єкт Scanner
, який ми ініціалізували в конструкторі, щоб отримати"Так" або"немає" від користувача. Ми всього лише перевіримо першу букву, якщо она`Д `, значить, користувач хоче зіграти ще раз, будь-яка інша буква буде означати "немає".public boolean playAgain () {System.out.print ("Хочете зіграти ще раз? ") -String userInput = inputScanner.nextLine () - userInput = userInput.toUpperCase () - return userInput.charAt (0) == `Д`-}
7. Зв`яжіть код класу
User
і класу Computer
у класі RockPaperScissors
. Написавши код для класів User
і Computer
, ми можемо зайнятися самою грою. оголосіть класи User
і Computer
закритими членами даних класу RockPaperScissors
. Ми будемо звертатися до них, викликаючи метод getMove ()
, щоб отримати ходи гравців. Ініціалізуйте їх в конструкторі класу RockPaperScissors
. Також нам потрібно зберігати рахунок. оголосіть userScore
і computerScore
, затемініціалізіруйте їх нулем. І, нарешті, створіть поле даних для зберігання кількості ігор, також ініціалізувати його банкрутом.private User user-private Computer computer-private int userScore-private int computerScore-private int numberOfGames-public RockPaperScissors () {user = new User () - computer = new Computer () - userScore = 0-computerScore = 0-numberOfGames = 0 -}
8. доповніть перерахування
Move
методом, який буде порівнювати ходи і визначати переможця. Напишемо код для методу compareMoves ()
який буде повертати 0, якщо ходи однакові, 1 - якщо поточний хід б`є іншого і -1 - якщо інший хід б`є поточний. Поточний хід представлений покажчиком this, а інший передається в параметрі otherMove. Це стане в нагоді для визначення переможця. Спочатку напишемо код визначає нічию і повертає 0, а потім напишемо інструкцію switch для визначення переможця.private enum Move {ROCK, PAPER, SCISSORS - / *** Порівнює поточний хід з переданим в параметрі otherMove і визначає * перемогу, поразку чи нічию.** @param otherMove * хід, з яким порівнюється поточний * @return 1 якщо поточний хід б`є іншого, -1 якщо інший хід б`є поточний, * 0 в разі нічиєї * / public int compareMoves (Move otherMove) {// Нічья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) -} // Цей код не повинен виконуватися нікогдаreturn 0-}}
я. оголосіть метод
startGame ()
у класі RockPaperScissors
. У цьому методі буде відбуватися гра. Почніть викликом методу System.out.println
.public void startGame () {System.out.println ("КАМІНЬ НОЖИЦІ ПАПІР!") -}
10. Отримайте ходи комп`ютера і користувача. У методі
startGame ()
викличте getMove ()
класів User
і Computer
, щоб отримати їх ходи.Move userMove = user.getMove () - Move computerMove = computer.getMove () - System.out.println (" NВаш хід" + userMove + ".") -System.out.println ("хід комп`ютера" + computerMove + ".ен")-
11. Порівняйте хід комп`ютера і хід гравця, щоб визначити хто виграв. викличте метод
compareMoves ()
перерахування Move
, щоб визначити чи виграв користувач. Якщо так, збільште його рахунок на 1. Якщо немає, збільште рахунок комп`ютера. У разі нічиєї рахунок залишається колишнім. Після цього збільште кількість зіграних ігор на 1.int compareMoves = userMove.compareMoves (computerMove) -switch (compareMoves) {case 0: // НічьяSystem.out.println ("нічия!") -Break-case 1: // Переміг ігрокSystem.out.println (userMove + " beats " + computerMove + ". Ви виграли!") -UserScore ++ - break-case -1: // Переміг компьютерSystem.out.println (computerMove + " beats " + userMove + ". Ви програли.") -ComputerScore ++ - break-} numberOfGames++-
12. Запитайте користувача чи хоче він зіграти ще раз. Якщо так, викличте метод
startGame ()
ще раз. Якщо ж ні, викличте метод printGameStats ()
, який виведе статистику гри. Ми напишемо його реалізацію в наступному кроці.if (user.playAgain ()) {System.out.println () - startGame () -} else {printGameStats () -}
13. Напишіть реалізацію методу
printGameStats ()
. Цей метод буде виводити статистику гри: кількість перемог, поразок, нічиїх, кількість зіграних ігор і відсоток перемог гравця. Відсоток виграних ігор вважається так: (к-ть перемог + (кол-во нічиїх / 2)) / (к-ть зіграних ігор). Цей метод використовує System.out.printf
для форматованого виведення тексту.private void printGameStats () ") -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 ("
14. Почніть гру. В основному класі Ініціалізуйте об`єкт
RockPaperScissors
і викличте його метод startGame ()
.public static void main (String [] args) {RockPaperScissors game = new RockPaperScissors () - game.startGame () -}
15. протестуйте гру. Тепер, коли вся робота позаду, настав час скомпілювати і протестувати нашу гру!
приклад програми
import java.util.Random-import java.util.Scanner-public class RockPaperScissors {private User user-private Computer computer-private int userScore-private int computerScore-private int numberOfGames-private enum Move {ROCK, PAPER, SCISSORS - / *** Порівнює поточний хід з переданим в параметрі otherMove і визначає * перемогу, поразку чи нічию.** @param otherMove * хід, з яким порівнюється поточний * @return 1 якщо поточний хід б`є іншого, -1 якщо інший хід б`є поточний, * 0 в разі нічиєї * / public int compareMoves (Move otherMove) {// Нічья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) -} // Цей код не повинен виконуватися нікогдаreturn 0 -}} private class User {private Scanner inputScanner-public User () {inputScanner = new Scanner (System.in) -} public Move getMove () {// Виведемо запит на вводSystem.out.print ("Камінь, ножиці або папір? ") - // Прочитаємо введення пользователяString userInput = inputScanner.nextLine () - userInput = userInput.toUpperCase () - char firstLetter = userInput.charAt (0) -if (firstLetter == `К` || firstLetter == `Н` || firstLetter == `Б`) {// Введення корректнийswitch (firstLetter) {case `К`: return Move.ROCK-case `Н`: return Move.PAPER-case `Б`: return Move.SCISSORS -}} // Введення некоректний. Виведемо запит на введення знову.return getMove () -} public boolean playAgain () {System.out.print ("Хочете зіграти ще раз? ") -String userInput = inputScanner.nextLine () - userInput = userInput.toUpperCase () - return userInput.charAt (0) == `Y` -}} private class Computer {public Move getMove () {Move [] moves = Move.values () - Random random = new Random () - int index = random.nextInt (moves.length) -return moves [index] -}} public RockPaperScissors () {user = new User () - computer = new Computer () - userScore = 0-computerScore = 0-numberOfGames = 0} public void startGame () {System.out.println ("КАМІНЬ НОЖИЦІ ПАПІР!") - // Отримання ходовMove userMove = user.getMove () - Move computerMove = computer.getMove () - System.out.println (" NВаш хід " + userMove + ".") -System.out.println ("хід комп`ютера " + computerMove + ".ен") - // Порівняння ходів і визначення победітеляint compareMoves = userMove.compareMoves (computerMove) -switch (compareMoves) {case 0: // НічьяSystem.out.println ("Tie!") -Break-case 1: // Переміг ігрокSystem.out.println (userMove + " beats " + computerMove + ". Ви виграли!") -UserScore ++ - break-case -1: // Переміг компьютерSystem.out.println (computerMove + " beats " + userMove + ". Ви програли.") -ComputerScore ++ - break-} numberOfGames ++ - // Запропонуємо користувачеві зіграти ще разif (user.playAgain ()) {System.out.println () - startGame () -} else {printGameStats () -}} / *** Висновок статистики. Нічиї враховуються як півперемоги * при підрахунку відсотка перемог.* / Private void printGameStats ()% 13.2f %% 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 () -}}