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

Загрузить PDFЗагрузить PDF

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

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

    public class RockPaperScissors {    public RockPaperScissors() {            }        public static void main(String[] args) {            }}
  2. 2
    Создайте перечисление (enum) для описания возможных ходов (камень, ножницы, бумага). Мы можем задать ходы строками, но перечисление позволяет нам предопределить константы, поэтому использование enum лучше. Назовем наше перечисление Move и зададим значения ROCK, PAPERи SCISSORS.

    private enum Move {    ROCK, PAPER, SCISSORS}
  3. 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. 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. 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. 6
    Напишите реализацию метода playAgain() класса User. Пользователь должен иметь возможность играть снова и снова. Чтобы определить хочет ли пользователь сыграть еще раз, напишите метод playAgain(), который будет возвращать значение типа bool и, таким образом, сообщать игре хочет ли пользователь сыграть еще раз. В этом методе мы используем объект Scanner , который мы инициализировали в конструкторе, чтобы получить "Да" или "Нет" от пользователя. Мы всего лишь проверим первую букву, если она 'Д', значит, пользователь хочет сыграть еще раз, любая другая буква будет означать "Нет".

    public boolean playAgain() {    System.out.print("Хотите сыграть еще раз? ");    String userInput = inputScanner.nextLine();    userInput = userInput.toUpperCase();    return userInput.charAt(0) == 'Д';}
  7. 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. 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;    }}
  9. 9
    Объявите метод startGame() в классе RockPaperScissors. В этом методе будет происходить игра. Начните вызовом метода System.out.println.

    public void startGame() {        System.out.println("КАМЕНЬ, НОЖНИЦЫ, БУМАГА!");}
  10. 10
    Получите ходы компьютера и пользователя. В методе startGame() вызовите getMove() классов User и Computer , чтобы получить их ходы.

    Move userMove = user.getMove();Move computerMove = computer.getMove();System.out.println("\nВаш ход  " + userMove + ".");System.out.println("Ход компьютера  " + computerMove + ".\n");
  11. 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. 12
    Спросите пользователя хочет ли он сыграть еще раз. Если да, вызовите метод startGame() еще раз. Если же нет, вызовите метод printGameStats(), который выведет статистику игры. Мы напишем его реализацию в следующем шаге.

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

    private void printGameStats() {    int wins = userScore;    int losses = computerScore;    int ties = numberOfGames - userScore - computerScore;    double percentageWon = (wins + ((double) ties) / 2) / numberOfGames;    // Вывод линии    System.out.print("+");    printDashes(68);    System.out.println("+");    // Вывод заголовков таблицы    System.out.printf("|  %6s  |  %6s  |  %6s  |  %12s  |  %14s  |\n",            "ПОБЕДА", "ПОРАЖЕНИЕ", "НИЧЬЯ", "ВСЕГО ИГР", "ПРОЦЕНТ ПОБЕД");    // Вывод линии    System.out.print("|");    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("|");    // Вывод значений    System.out.printf("|  %6d  |  %6d  |  %6d  |  %12d  |  %13.2f%%  |\n",            wins, losses, ties, numberOfGames, percentageWon * 100);    // Вывод линии    System.out.print("+");    printDashes(68);    System.out.println("+");}
  14. 14
    Начните игру. В основном классе инициализируйте объект RockPaperScissors и вызовите его метод startGame().

    public static void main(String[] args) {    RockPaperScissors game = new RockPaperScissors();    game.startGame();}
  15. How.com.vn Русский: Screen Shot 2013 06 23 at 2.27.50 AM.png
    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 + ".\n");        // Сравнение ходов и определение победителя        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() {        int wins = userScore;        int losses = computerScore;        int ties = numberOfGames - userScore - computerScore;        double percentageWon = (wins + ((double) ties) / 2) / numberOfGames;            // Вывод линии        System.out.print("+");        printDashes(68);        System.out.println("+");            // Вывод заголовков таблицы        System.out.printf("|  %6s  |  %6s  |  %6s  |  %12s  |  %14s  |\n",                "WINS", "LOSSES", "TIES", "GAMES PLAYED", "PERCENTAGE WON");            // Вывод линии        System.out.print("|");        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("|");            // Вывод значений        System.out.printf("|  %6d  |  %6d  |  %6d  |  %12d  |  %13.2f%%  |\n",                wins, losses, ties, numberOfGames, percentageWon * 100);            // Вывод линии        System.out.print("+");        printDashes(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();    }}

Об этой статье

How.com.vn работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали, в том числе анонимно, 13 человек(а). Количество просмотров этой статьи: 19 342.
Эту страницу просматривали 19 342 раза.

Была ли эта статья полезной?

⚠️ Disclaimer:

Content from Wiki How Русский language website. Text is available under the Creative Commons Attribution-Share Alike License; additional terms may apply.
Wiki How does not encourage the violation of any laws, and cannot be responsible for any violations of such laws, should you link to this domain, or use, reproduce, or republish the information contained herein.

Notices:
  • - A few of these subjects are frequently censored by educational, governmental, corporate, parental and other filtering schemes.
  • - Some articles may contain names, images, artworks or descriptions of events that some cultures restrict access to
  • - Please note: Wiki How does not give you opinion about the law, or advice about medical. If you need specific advice (for example, medical, legal, financial or risk management), please seek a professional who is licensed or knowledgeable in that area.
  • - Readers should not judge the importance of topics based on their coverage on Wiki How, nor think a topic is important just because it is the subject of a Wiki article.

Реклама