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

О чём эта инструкция
Создание простой игры — отличный способ закрепить базовые навыки программирования: ввод/вывод, управление ветвлением, циклы, структуры данных и модуль random. В статье описаны пошаговые инструкции, рабочий пример кода, локализация строк интерфейса и набор рекомендаций, как расширять игру.
Важно: в примерах приведён как исходный англоязычный код (тот, что часто встречается в учебниках), так и вариант с русскоязычными подсказками и ключами. Оба варианта корректны; выбирайте тот, который нужен вашей аудитории.
Что нужно подготовить
- Установленный Python (рекомендуется Python 3.6+).
- Текстовый редактор (VS Code, Notepad++, Sublime Text и т. п.).
- Терминал или командная строка для запуска скрипта.
Как настроить игру и запросить ход игрока
Ниже — базовый рабочий пример, который задаёт вопрос игроку, валидирует ввод и сохраняет варианты ходов в массиве.
- Создайте файл RockPaperScissors.py.
- Откройте файл в редакторе и импортируйте модуль random.
import random- Попросите игрока ввести вариант хода и приведите ввод к нижнему регистру.
userChoice = input("Rock, paper, or scissors? ").lower()- Объявите массив доступных ходов.
moveOptions = ['rock', 'paper', 'scissors']- Валидируйте ввод пользователя — если он не входит в 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}.")Примечание: если локализуете строки, не забудьте поменять соответствующие ключи в логике определения победителя (см. раздел ниже).
Как по очереди ходит компьютер и сравниваются ходы
Компьютер делает случайный выбор из тех же вариантов, что и игрок. Затем сравниваем ходы и определяем победителя.
- Случайный выбор компьютера с помощью random.choice:
computerChoice = random.choice(moveOptions)
print(f"The computer chose {computerChoice}.")- Для ясности логики можно описать, что побеждает каждое значение, в словаре (dictionary). Это упрощает проверку победителя:
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!")
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(), которая выполняет один раунд и обновляет счёт.
- Вынесите логику одного хода в функцию 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!")- Добавьте глобальную переменную turns и переменные счёта в начале файла:
turns = 3
computerScore = 0
playerScore = 0- Повторяйте вызов turn() в цикле for, печатая номер раунда:
for i in range(turns):
print("")
print(f"--- Round {i+1}: ---")
turn()- Чтобы функция turn() могла изменять глобальные счётчики, объявите их как global внутри функции:
def turn():
global computerScore, playerScore
# ... остальной код ...- В конце функции 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}")- После завершения всех раундов объявите победителя:
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!")Русская версия с подсчётом очков
Если вы используете русские строки и ключи, принцип тот же — только текст подсказок и ключи словаря будут на русском. Логика увеличения счёта и сравнения ничем не отличается.
Как запустить игру
- Откройте терминал и перейдите в папку с RockPaperScissors.py.
- Выполните команду (на некоторых системах может понадобиться python3):
python RockPaperScissors.py- Вводите один из вариантов: ‘rock’, ‘paper’, ‘scissors’ (или локализованные строки, если вы использовали русскую версию).
Идеи для улучшений и альтернативные подходы
Ниже — набор вариантов развития проекта. Выбирайте и комбинируйте в зависимости от цели обучения или продукта.
- Best‑of‑N: сделайте возможность задавать количество раундов (best of 3, 5 и т.д.).
- Интерфейс GUI: используйте tkinter или PySimpleGUI для графической версии.
- Сохранение очков: сохраняйте результаты в файл или базу данных для таблицы лидеров.
- Сеть: реализуйте игровой сервер/клиент для мультиплеера через сокеты.
- Умный соперник: добавьте простую модель машинного обучения (учёт предыдущих ходов игрока) или статистический подбор хода.
- Тестируемость: вынесите логику определения победителя в отдельную чистую функцию для юнит‑тестов.
Когда такой подход не подходит (контрпримеры)
- Если вы хотите полноценный графический опыт для мобильных устройств — консольная игра ограничена.
- Для серьёзного ИИ или обучения нейросети одного скелета игры недостаточно; нужна большая выборка данных и другая архитектура.
- Для многопользовательской игры в реальном времени нужны сети и синхронизация состояния, что выходит за рамки базового скрипта.
Критерии приёмки
- Скрипт запускается без ошибок на Python 3.6+.
- Игрок может ввести допустимый вариант хода, и программа корректно его распознаёт.
- Компьютер делает случайный выбор из тех же вариантов.
- После каждого раунда обновляется и выводится счёт.
- По завершении серии раундов выводится верный победитель или объявляется ничья.
Тестовые случаи и приёмо‑сдаточные проверки
- Валидный ввод: “rock” → программа принимает и сравнивает.
- Неверный ввод: “roc” → программа запрашивает ввод заново.
- Ничья: игрок и компьютер выбрали одно и то же — счёт не меняется.
- Инкремент счёта: при выигрыше игрока playerScore увеличивается на 1.
- Серия раундов: при turns=3 программа выполняет ровно три раунда и подводит итог.
Чек‑лист разработчика
- Добавлен импорт random.
- Реализован ввод и валидация пользователя.
- Реализован случайный выбор компьютера.
- Логика определения победителя вынесена в читаемый фрагмент.
- Результаты обновляют global‑счётчики.
- Корректный вывод финального результата.
- Добавлены комментарии и понятные сообщения для пользователя.
Модель принятия решений (ментальная модель)
- Прочитать ввод игрока.
- Проверить, что ввод валиден.
- Сгенерировать ход компьютера.
- Сравнить и определить результат раунда по правилу «A beats B».
- Обновить счёт и показать результат.
- Повторить необходимые раунды и объявить победителя.
Риски и простые mitigations
- Риск: пользователь вводит строки с лишними пробелами или разным регистром.
- Митигейшн: применять .strip().lower() к пользовательскому вводу.
- Риск: код рассчитан на строгие ключи («rock»), локализация ломает словарь.
- Митигейшн: при локализации менять и словарь, и проверку ввода одновременно.
Совместимость и миграция
- Код совместим с Python 3.6+ (f-строки используются в примерах).
- На старых версиях Python (<3.6) замените f-строки на форматирование через format().
Краткое руководство по расширению (mini‑methodology)
- Напишите функцию decide_winner(player, computer) → возвращает ‘player’|’computer’|’tie’.
- Покройте её юнит‑тестами (pytest/unittest).
- Вынесите ввод/вывод в отдельные функции, чтобы можно было подменять их в тестах.
- Добавьте конфигурацию (количество раундов) и опции локализации в начале файла.
Краткое резюме
Создание игры «Камень, ножницы, бумага» — полезный учебный проект: он покрывает ввод пользователя, случайные события, словари и базовую архитектуру программы. Проект легко расширяется: добавьте GUI, сеть, сохранение результатов или простой ИИ.
Важно: при локализации не забывайте синхронизировать ключи логики (словарь побед) и строки подсказок, иначе сравнение ходов перестанет работать.
Сводка шагов для быстрой реализации:
- Создать файл RockPaperScissors.py и импортировать random.
- Реализовать ввод и валидацию пользователя.
- Сгенерировать ход компьютера через random.choice.
- Сравнить ходы через словарь moves и обновить счёт.
- Повторять нужное количество раундов и объявить победителя.
Спасибо за прочтение — экспериментируйте с локализацией, интерфейсами и поведением соперника. Удачи в программировании!
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone