. Как написать игру "камень, ножницы, бумага" на Java
Как написать игру "камень, ножницы, бумага" на Java

Как написать игру "камень, ножницы, бумага" на Java

wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали, в том числе анонимно, 13 человек(а).

Количество просмотров этой статьи: 14 602.

«Камень, ножницы, бумага» – это игра «на пальцах» для двоих. Игроки вместе говорят «камень, ножницы, бумага» и выбрасывают вперед руку, пальцами формируя одну из трех фигур (камень, ножницы или бумагу). Победитель определяется следующим образом: ножницы бьют бумагу, бумага бьет камень, камень бьет ножницы. Если оба игрока показывают одну и ту же фигуру, это считается ничьей. Мы напишем простую игру на Java, которая позволит играть в «камень, ножницы, бумага» с компьютером.

Создайте основной класс и назовите его RockPaperScissors . В этом классе мы опишем игру. Вы можете назвать его иначе, например Game или Main . Напишите объявления конструктора и метода main.

Создайте перечисление (enum) для описания возможных ходов (камень, ножницы, бумага). Мы можем задать ходы строками, но перечисление позволяет нам предопределить константы, поэтому использование enum лучше. Назовем наше перечисление Move и зададим значения ROCK , PAPER и SCISSORS .

Создайте два закрытых (ключевое слово private) класса User и Computer . Эти классы будут представлять игроков. Вы также можете сделать эти классы открытыми (ключевое слово public). Класс User будет запрашивать у пользователя, какой ход он делает – камень, ножницы или бумага – поэтому нам нужно написать метод getMove() . Класс Computer также должен иметь метод getMove() , чтобы мы могли получить ход компьютера. Пока что мы просто объявим эти методы, а реализацию напишем позже. Класс User должен иметь конструктор, в котором инициализируется объект Scanner , который будет считывать ввод пользователя. Объявим Scanner закрытым членом данных класса User и инициализируем его в конструкторе. Поскольку мы собираемся использовать класс Scanner , мы должны подключить его, используя ключевое слово import . Классу Computer конструктор не нужен, поэтому мы не будем его писать; при инициализации объекта Computer мы просто вызовем конструктор по умолчанию. Вот как класс RockPaperScissors выглядит теперь:

Напишите реализацию метода getMove() для класса Computer . Этот метод будет возвращать случайное значение Move . Мы можем получить массив значений Move вызвав метод values() вот так: Move.values() . Чтобы выбрать случайное значение Move из этого массива, нам нужно сгенерировать случайный индекс между 0 и количеством элементом массива. Для этого вызовем метод nextInt() класса Random , который мы подключим так: import java.util.Random . Получив случайный индекс, вернем значение Move с этим индексом в нашем массиве.

Напишите реализацию метода getMove() для класса User . Этот метод будет возвращать значение Move соответствующее вводу пользователя. Пользователь может ввести "камень", "ножницы", или "бумага". Сначала выведем сообщение: System.out.print("Камень, ножницы или бумага?") . Затем, с помощью метода nextLine() объекта Scanner , мы получим ввод пользователя в виде строки. Теперь нужно проверить корректность ввода пользователя. Однако мы не будет обращать внимание на опечатки, а просто проверим первую букву «К», «Н» или «Б». Также мы не будем обращать внимание на регистр букв, так как, предварительно, мы вызовем метод toUpperCase() класса String , приводя ввод пользователя к верхнему регистру. Если пользователь не ввел даже приблизительно корректный выбор, запросим его ход еще раз. Затем, в зависимости от ввода пользователя, наш метод вернет соответствующее значение Move .

Напишите реализацию метода playAgain() класса User . Пользователь должен иметь возможность играть снова и снова. Чтобы определить хочет ли пользователь сыграть еще раз, напишите метод playAgain() , который будет возвращать значение типа bool и, таким образом, сообщать игре хочет ли пользователь сыграть еще раз. В этом методе мы используем объект Scanner , который мы инициализировали в конструкторе, чтобы получить "Да" или "Нет" от пользователя. Мы всего лишь проверим первую букву, если она 'Д', значит, пользователь хочет сыграть еще раз, любая другая буква будет означать "Нет".

Свяжите код класса User и класса Computer в классе RockPaperScissors . Написав код для классов User и Computer , мы можем заняться самой игрой. Объявите классы User и Computer закрытыми членами данных класса RockPaperScissors . Мы будем обращаться к ним, вызывая метод getMove() , чтобы получить ходы игроков. Инициализируйте их в конструкторе класса RockPaperScissors . Также нам нужно хранить счет. Объявите userScore и computerScore , затем инициализируйте их нулем. И, наконец, создайте поле данных для хранения количества игр, также инициализировав его нулем.

Дополните перечисление Move методом, который будет сравнивать ходы и определять победителя. Напишем код для метода compareMoves() который будет возвращать 0, если ходы одинаковы, 1 – если текущий ход бьет другой и -1 – если другой ход бьет текущий. Текущий ход представлен указателем this, а другой передается в параметре otherMove. Это пригодится для определения победителя. Сначала напишем код определяющий ничью и возвращающий 0, а затем напишем инструкцию switch для определения победителя.

Объявите метод startGame() в классе RockPaperScissors . В этом методе будет происходить игра. Начните вызовом метода System.out.println .

Получите ходы компьютера и пользователя. В методе startGame() вызовите getMove() классов User и Computer , чтобы получить их ходы.

Сравните ход компьютера и ход игрока, чтобы определить кто выиграл. Вызовите метод compareMoves() перечисления Move , чтобы определить выиграл ли пользователь. Если да, увеличьте его счет на 1. Если нет, увеличьте счет компьютера. В случае ничьей счет остается прежним. После этого увеличьте количество сыгранных игр на 1.

Спросите пользователя хочет ли он сыграть еще раз. Если да, вызовите метод startGame() еще раз. Если же нет, вызовите метод printGameStats() , который выведет статистику игры. Мы напишем его реализацию в следующем шаге.

Напишите реализацию метода printGameStats() . Этот метод будет выводить статистику игры: количество побед, поражений, ничьих, количество сыгранных игр и процент побед игрока. Процент выигранных игр считается так: (кол-во побед + (кол-во ничьих/2))/(кол-во сыгранных игр). Этот метод использует System.out.printf для форматированного вывода текста.

Начните игру. В основном классе инициализируйте объект RockPaperScissors и вызовите его метод startGame() .

📎📎📎📎📎📎📎📎📎📎