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

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

4 min read Python Обновлено 21 Dec 2025
Камень, ножницы, бумага на Python
Камень, ножницы, бумага на Python

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

Коротко о том, что вы научитесь:

  • Запускать простую игру в командной строке.
  • Принимать и валидировать ввод пользователя.
  • Сравнивать ходы и вести счёт по раундам.
  • Тестировать и расширять игру.

Зачем начинать с этой игры

Создание «Камень, ножницы, бумага» — безопасный, быстрый и понятный проект. Он демонстрирует ввод/вывод, структуры данных и управление потоком выполнения: функции, циклы и условные операторы.

Краткое определение терминов:

  • Раунд — один обмен ходами между игроком и компьютером.
  • Счёт — накопление очков по раундам.

Что потребуется

  • Python (версия 3.6+). Проверить: python –version
  • Любой текстовый редактор (VS Code, Notepad++ и т. п.)
  • Терминал или командная строка

Структура упражнения

  1. Создайте файл RockPaperScissors.py
  2. Напишите код для получения ввода игрока.
  3. Сделайте ход компьютера случайным.
  4. Сравните ходы и определите победителя раунда.
  5. Повторите на несколько раундов и подсчитайте финальный результат.

Основные фрагменты кода

Ниже — ключевые блоки, как они были в оригинальном обучающем материале. Код оставлен в исходной форме (ходы — англ. слова ‘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!")

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

  1. Откройте терминал и перейдите в папку с RockPaperScissors.py
  2. Выполните:
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.

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

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

Как отключить воспоминания в Facebook
Социальные сети

Как отключить воспоминания в Facebook

Как делать хорошие видео на YouTube
Создание контента

Как делать хорошие видео на YouTube

Как устанавливать расширения в Vivaldi, Brave, Tor и Opera
Браузеры

Как устанавливать расширения в Vivaldi, Brave, Tor и Opera

Звук из вкладок Chrome на разные устройства
Windows

Звук из вкладок Chrome на разные устройства

Открыть Internet Explorer в Windows 11
Руководство

Открыть Internet Explorer в Windows 11

Ошибка обновления Google Chrome в Windows — как исправить
Технологии

Ошибка обновления Google Chrome в Windows — как исправить