Камень, ножницы, бумага на Python — пошаговое руководство

Коротко о том, что вы научитесь:
- Запускать простую игру в командной строке.
- Принимать и валидировать ввод пользователя.
- Сравнивать ходы и вести счёт по раундам.
- Тестировать и расширять игру.
Зачем начинать с этой игры
Создание «Камень, ножницы, бумага» — безопасный, быстрый и понятный проект. Он демонстрирует ввод/вывод, структуры данных и управление потоком выполнения: функции, циклы и условные операторы.
Краткое определение терминов:
- Раунд — один обмен ходами между игроком и компьютером.
- Счёт — накопление очков по раундам.
Что потребуется
- Python (версия 3.6+). Проверить: python –version
- Любой текстовый редактор (VS Code, Notepad++ и т. п.)
- Терминал или командная строка
Структура упражнения
- Создайте файл RockPaperScissors.py
- Напишите код для получения ввода игрока.
- Сделайте ход компьютера случайным.
- Сравните ходы и определите победителя раунда.
- Повторите на несколько раундов и подсчитайте финальный результат.
Основные фрагменты кода
Ниже — ключевые блоки, как они были в оригинальном обучающем материале. Код оставлен в исходной форме (ходы — англ. слова ‘rock/paper/scissors’).
Импорт модуля случайностей:
import randomЗапрос хода игрока:
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!")
if (moves[userChoice]['losesTo'] == computerChoice):
print(f"{userChoice} loses to {computerChoice}. The computer wins!")Пример: если вы выбрали “rock”, то moves[userChoice][‘beats’] даст “scissors” — значит, вы побеждаете “scissors”.
Добавление нескольких раундов и подсчёта очков
Чтобы играть несколько раундов (например, best of 3), оберните логику одного раунда в функцию 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 = 3
computerScore = 0
playerScore = 0
for i in range(turns):
print("")
print(f"--- Round {i+1}: ---")
turn()Если вы хотите, чтобы результат раунда увеличивал счёт, объявите в начале turn() глобальные переменные и инкрементируйте их при выигрыше:
computerScore = 0
playerScore = 0
def turn():
global computerScore, playerScore
# ... (логика ввода и сравнения)
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
- Выполните:
python RockPaperScissors.pyПосле трёх раундов программа покажет победителя.
Готовый компактный скрипт (чистая версия)
Ниже — компактный и работоспособный вариант игры, который объединяет всё вместе. Его можно вставить в RockPaperScissors.py и запускать.
import random
turns = 3
computerScore = 0
playerScore = 0
moveOptions = ['rock', 'paper', 'scissors']
moves = {
'rock': { 'beats': 'scissors', 'losesTo': 'paper' },
'scissors': { 'beats': 'paper', 'losesTo': 'rock' },
'paper': { 'beats': 'rock', 'losesTo': 'scissors' },
}
def turn():
global computerScore, playerScore
userChoice = input("Rock, paper, or scissors? ").lower()
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}.")
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!")
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}")
for i in range(turns):
print("")
print(f"--- Round {i+1}: ---")
turn()
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!")Дополнительные идеи и варианты расширения
- Локализация: заменить ходы и подсказки на русский (“камень”, “ножницы”, “бумага”) и поменять moveOptions/строки в коде.
- Best-of-N: сделать количество раундов настраиваемым вводом пользователя.
- Игрок против игрока: добавить режим для двух человек.
- GUI: создать интерфейс на Tkinter или Pygame.
- Статистика: сохранять историю игр в файл и показывать процент побед.
Когда такой подход не годится
- Если требуется более сложная логика ИИ (например, адаптивный соперник), случайный выбор random.choice будет слишком прост.
- Для сетевой игры нужно добавлять сокеты или web-приложение — это другая архитектура.
Ментальные модели и советы
- Модель: «Ввод → Проверка → Обработка → Ответ» — применима к большинству интерактивных программ.
- Правило: валидируй ввод как можно раньше.
- Используйте словарь (mapping) для компактного описания правил, а не длинные ветвления if/elif.
Проверка и тесты (минимальный набор)
- Тест ввода: введите невалидную строку — программа должна повторно запросить ввод.
- Тест ничьей: оба хода одинаковы — ожидается сообщение о ничьей.
- Тест выигрыша: для каждой триады ходов проверить выигрыши/проигрыши.
- Тест счёта: после трёх раундов суммарный счёт должен соответствовать исходам раундов.
Чек-лист разработчика перед релизом
- Код проходит ручные тесты для всех комбинаций ходов.
- Нет «зависаний» при вводе некорректных значений.
- Сообщения пользователю понятны и однородны по стилю.
- Скрипт корректно завершается и печатает итог.
Критерии приёмки
- Игра запускается командой python RockPaperScissors.py
- Программа принимает ввод игрока и валидирует его
- Программа показывает ход компьютера и результат раунда
- Ведётся счёт по N раундов, итог объявляется корректно
Факто-бокс
- Число возможных комбинаций ходов на один раунд: 3 × 3 = 9
- Количество базовых ходов: 3
- Типичный default: 3 раунда (best of 3)
Диаграмма принятия решения (Mermaid)
flowchart TD
A[Игрок вводит ход] --> B{Ход валиден?}
B -- Да --> C[Компьютер выбирает ход]
B -- Нет --> D[Запрос повторного ввода]
C --> E{Ходы равны}
E -- Да --> F[Ничья]
E -- Нет --> G{moves[player].beats == computer}
G -- Да --> H[Игрок выигрывает]
G -- Нет --> I[Компьютер выигрывает]Глоссарий (1 строка)
- Раунд — одна итерация выбора ходов игроком и компьютером; победитель раунда получает очко.
Безопасность и приватность
Игра не отправляет данных в сеть и не хранит личную информацию по умолчанию. Если вы добавляете логи или экранные снимки, будьте внимательны к персональным данным.
Краткий вывод
Создание «Камень, ножницы, бумага» на Python — быстрый и полезный опыт. Начните с базовой версии, затем расширяйте функциональность и улучшайте UX. Этот проект хорош и для обучения, и для демонстрации навыков.
Итоговые шаги: создайте файл RockPaperScissors.py, вставьте компактный скрипт и запустите python RockPaperScissors.py.
Похожие материалы
Как отключить воспоминания в Facebook
Как делать хорошие видео на YouTube
Как устанавливать расширения в Vivaldi, Brave, Tor и Opera
Звук из вкладок Chrome на разные устройства