Гид по технологиям

Игра «Камень, ножницы, бумага» на Python

6 min read Python Обновлено 04 Jan 2026
Камень, ножницы, бумага на Python
Камень, ножницы, бумага на Python

Человек показывает жест «ножницы» рукой

О чём эта инструкция

Создание простой игры — отличный способ закрепить базовые навыки программирования: ввод/вывод, управление ветвлением, циклы, структуры данных и модуль random. В статье описаны пошаговые инструкции, рабочий пример кода, локализация строк интерфейса и набор рекомендаций, как расширять игру.

Важно: в примерах приведён как исходный англоязычный код (тот, что часто встречается в учебниках), так и вариант с русскоязычными подсказками и ключами. Оба варианта корректны; выбирайте тот, который нужен вашей аудитории.

Что нужно подготовить

  • Установленный Python (рекомендуется Python 3.6+).
  • Текстовый редактор (VS Code, Notepad++, Sublime Text и т. п.).
  • Терминал или командная строка для запуска скрипта.

Как настроить игру и запросить ход игрока

Ниже — базовый рабочий пример, который задаёт вопрос игроку, валидирует ввод и сохраняет варианты ходов в массиве.

  1. Создайте файл RockPaperScissors.py.
  2. Откройте файл в редакторе и импортируйте модуль random.
import random
  1. Попросите игрока ввести вариант хода и приведите ввод к нижнему регистру.
userChoice = input("Rock, paper, or scissors? ").lower()
  1. Объявите массив доступных ходов.
moveOptions = ['rock', 'paper', 'scissors']
  1. Валидируйте ввод пользователя — если он не входит в moveOptions, запрашивайте заново.
while (userChoice not in moveOptions):
    userChoice = input("Invalid choice. Must be rock, paper, or scissors: ").lower()

print("")
print(f"You chose {userChoice}.")

Пояснение: moveOptions служит «справочником» допустимых значений. Приведение к lower() упрощает сравнение и уменьшает вероятность ошибки из‑за регистра.

Локализованный вариант (русские подсказки)

Если вы хотите, чтобы игра принимала русскоязычные ответы, можно заменить строки и варианты ходов. Пример:

import random

userChoice = input("Камень, ножницы или бумага? ").lower()

moveOptions = ['камень', 'бумага', 'ножницы']

while (userChoice not in moveOptions):
    userChoice = input("Неверный ввод. Введите: камень, бумага или ножницы: ").lower()

print("")
print(f"Вы выбрали {userChoice}.")

Примечание: если локализуете строки, не забудьте поменять соответствующие ключи в логике определения победителя (см. раздел ниже).

Как по очереди ходит компьютер и сравниваются ходы

Компьютер делает случайный выбор из тех же вариантов, что и игрок. Затем сравниваем ходы и определяем победителя.

  1. Случайный выбор компьютера с помощью random.choice:
computerChoice = random.choice(moveOptions)
print(f"The computer chose {computerChoice}.")
  1. Для ясности логики можно описать, что побеждает каждое значение, в словаре (dictionary). Это упрощает проверку победителя:
moves = {
    'rock': { 'beats': 'scissors', 'losesTo': 'paper' },
    'scissors': { 'beats': 'paper', 'losesTo': 'rock' },
    'paper': { 'beats': 'rock', 'losesTo': 'scissors' },
}
  1. Сравнение ходов и вывод результата:
if userChoice == computerChoice:
    print(f"Both you and the computer chose {userChoice}. It's a tie!")
else:
    if (moves[userChoice]['beats'] == computerChoice):
        print(f"{userChoice} beats {computerChoice}. You win!")

    if (moves[userChoice]['losesTo'] == computerChoice):
        print(f"{userChoice} loses to {computerChoice}. The computer wins!")

Пример: если вы выбрали “rock”, то moves[userChoice][‘beats’] даст “scissors”; если computerChoice — “scissors”, вы выиграли.

Локализованный словарь побед

Если вы используете русские ключи (“камень”, “ножницы”, “бумага”), словарь должен соответствовать:

moves = {
    'камень': { 'beats': 'ножницы', 'losesTo': 'бумага' },
    'ножницы': { 'beats': 'бумага', 'losesTo': 'камень' },
    'бумага': { 'beats': 'камень', 'losesTo': 'ножницы' },
}

Как вести счёт между игроком и компьютером при нескольких раундах

Часто играют не в один раунд, а в серию: например, best of 3 (три раунда). Ниже описан подход с глобальными переменными и функцией turn(), которая выполняет один раунд и обновляет счёт.

  1. Вынесите логику одного хода в функцию turn(). Пример исходного кода функции (англоязычная версия):
def turn():
    userChoice = input("Rock, paper, or scissors? ").lower()

    moveOptions = ['rock', 'paper', 'scissors']

    while (userChoice not in moveOptions):
        userChoice = input("Invalid choice. Must be rock, paper, or scissors: ").lower()

    print("")
    print(f"You chose {userChoice}.")

    computerChoice = random.choice(moveOptions)
    print(f"The computer chose {computerChoice}.")

    moves = {
    'rock': { 'beats': 'scissors', 'losesTo': 'paper' },
    'scissors': { 'beats': 'paper', 'losesTo': 'rock' },
    'paper': { 'beats': 'rock', 'losesTo': 'scissors' },
    }

    if userChoice == computerChoice:
        print(f"Both you and the computer chose {userChoice}. It's a tie!")
    else:
        if (moves[userChoice]['beats'] == computerChoice):
            print(f"{userChoice} beats {computerChoice}. You win this round!")

        if (moves[userChoice]['losesTo'] == computerChoice):
            print(f"{userChoice} loses to {computerChoice}. The computer wins!")
  1. Добавьте глобальную переменную turns и переменные счёта в начале файла:
turns = 3
computerScore = 0
playerScore = 0
  1. Повторяйте вызов turn() в цикле for, печатая номер раунда:
for i in range(turns):
    print("")
    print(f"--- Round {i+1}: ---")
    turn()
  1. Чтобы функция turn() могла изменять глобальные счётчики, объявите их как global внутри функции:
def turn():
    global computerScore, playerScore
    # ... остальной код ...
  1. В конце функции turn() увеличивайте счёт соответствующего игрока в зависимости от результата и выводите обновлённый табло:
if (moves[userChoice]['beats'] == computerChoice):
    print(f"{userChoice} beats {computerChoice}. You win this round!")
    playerScore += 1

if (moves[userChoice]['losesTo'] == computerChoice):
    print(f"{userChoice} loses to {computerChoice}. The computer wins!")
    computerScore += 1

# Печать обновлённого счёта после раунда
print("")
print(f"SCOREBOARD | Player's score: {playerScore} | Computer's score: {computerScore}")
  1. После завершения всех раундов объявите победителя:
print("")

if (computerScore > playerScore):
    print(f"The computer wins with {computerScore} points!")
elif (playerScore > computerScore):
    print(f"You win with {playerScore} points!")
else:
    print(f"It's a tie! You both win with {playerScore} points!")

Русская версия с подсчётом очков

Если вы используете русские строки и ключи, принцип тот же — только текст подсказок и ключи словаря будут на русском. Логика увеличения счёта и сравнения ничем не отличается.

Как запустить игру

  1. Откройте терминал и перейдите в папку с RockPaperScissors.py.
  2. Выполните команду (на некоторых системах может понадобиться python3):
python RockPaperScissors.py

Вступление игры «Камень, ножницы, бумага» в командной строке

  1. Вводите один из вариантов: ‘rock’, ‘paper’, ‘scissors’ (или локализованные строки, если вы использовали русскую версию). Процесс игры в командной строке

Идеи для улучшений и альтернативные подходы

Ниже — набор вариантов развития проекта. Выбирайте и комбинируйте в зависимости от цели обучения или продукта.

  • Best‑of‑N: сделайте возможность задавать количество раундов (best of 3, 5 и т.д.).
  • Интерфейс GUI: используйте tkinter или PySimpleGUI для графической версии.
  • Сохранение очков: сохраняйте результаты в файл или базу данных для таблицы лидеров.
  • Сеть: реализуйте игровой сервер/клиент для мультиплеера через сокеты.
  • Умный соперник: добавьте простую модель машинного обучения (учёт предыдущих ходов игрока) или статистический подбор хода.
  • Тестируемость: вынесите логику определения победителя в отдельную чистую функцию для юнит‑тестов.

Когда такой подход не подходит (контрпримеры)

  • Если вы хотите полноценный графический опыт для мобильных устройств — консольная игра ограничена.
  • Для серьёзного ИИ или обучения нейросети одного скелета игры недостаточно; нужна большая выборка данных и другая архитектура.
  • Для многопользовательской игры в реальном времени нужны сети и синхронизация состояния, что выходит за рамки базового скрипта.

Критерии приёмки

  • Скрипт запускается без ошибок на Python 3.6+.
  • Игрок может ввести допустимый вариант хода, и программа корректно его распознаёт.
  • Компьютер делает случайный выбор из тех же вариантов.
  • После каждого раунда обновляется и выводится счёт.
  • По завершении серии раундов выводится верный победитель или объявляется ничья.

Тестовые случаи и приёмо‑сдаточные проверки

  1. Валидный ввод: “rock” → программа принимает и сравнивает.
  2. Неверный ввод: “roc” → программа запрашивает ввод заново.
  3. Ничья: игрок и компьютер выбрали одно и то же — счёт не меняется.
  4. Инкремент счёта: при выигрыше игрока playerScore увеличивается на 1.
  5. Серия раундов: при turns=3 программа выполняет ровно три раунда и подводит итог.

Чек‑лист разработчика

  • Добавлен импорт random.
  • Реализован ввод и валидация пользователя.
  • Реализован случайный выбор компьютера.
  • Логика определения победителя вынесена в читаемый фрагмент.
  • Результаты обновляют global‑счётчики.
  • Корректный вывод финального результата.
  • Добавлены комментарии и понятные сообщения для пользователя.

Модель принятия решений (ментальная модель)

  1. Прочитать ввод игрока.
  2. Проверить, что ввод валиден.
  3. Сгенерировать ход компьютера.
  4. Сравнить и определить результат раунда по правилу «A beats B».
  5. Обновить счёт и показать результат.
  6. Повторить необходимые раунды и объявить победителя.

Риски и простые mitigations

  • Риск: пользователь вводит строки с лишними пробелами или разным регистром.
    • Митигейшн: применять .strip().lower() к пользовательскому вводу.
  • Риск: код рассчитан на строгие ключи («rock»), локализация ломает словарь.
    • Митигейшн: при локализации менять и словарь, и проверку ввода одновременно.

Совместимость и миграция

  • Код совместим с Python 3.6+ (f-строки используются в примерах).
  • На старых версиях Python (<3.6) замените f-строки на форматирование через format().

Краткое руководство по расширению (mini‑methodology)

  1. Напишите функцию decide_winner(player, computer) → возвращает ‘player’|’computer’|’tie’.
  2. Покройте её юнит‑тестами (pytest/unittest).
  3. Вынесите ввод/вывод в отдельные функции, чтобы можно было подменять их в тестах.
  4. Добавьте конфигурацию (количество раундов) и опции локализации в начале файла.

Краткое резюме

Создание игры «Камень, ножницы, бумага» — полезный учебный проект: он покрывает ввод пользователя, случайные события, словари и базовую архитектуру программы. Проект легко расширяется: добавьте GUI, сеть, сохранение результатов или простой ИИ.

Важно: при локализации не забывайте синхронизировать ключи логики (словарь побед) и строки подсказок, иначе сравнение ходов перестанет работать.

Сводка шагов для быстрой реализации:

  1. Создать файл RockPaperScissors.py и импортировать random.
  2. Реализовать ввод и валидацию пользователя.
  3. Сгенерировать ход компьютера через random.choice.
  4. Сравнить ходы через словарь moves и обновить счёт.
  5. Повторять нужное количество раундов и объявить победителя.

Спасибо за прочтение — экспериментируйте с локализацией, интерфейсами и поведением соперника. Удачи в программировании!

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство