@melirika12

Можно ли так решить задачу «камень-ножницы-бумага»?

Грамотное ли это решение задачи? Я надеюсь, что суть задачи понятна)
Особенно интересна предпоследняя строчка, можно ли так решить проблему с одинаковыми значениями? Если нет, то почему? (пока не встречала, что так делают). А так все работает...

import random

num1 = 'Камень'
num2 = 'Ножницы'
num3 = 'Бумага'

def main():
       number = random.randint(1,3)
       if number == 1:
           number = num1
       elif number == 2:
           number = num2
       else:
           number = num3
       game(number)

def game(number):
             print('Введите 1, если хотите выбрать Камень')
             print('Введите 2, если хотите выбрать Ножницы')
             print('Введите 3, если хотите выбрать Бумагу')
             your_number = int(input())
            if your_number == 1:
                  your_number = num1
            elif your_number == 2:
                  your_number = num2
            elif your_number == 3:
                  your_number = num3
            else:
                 while your_number !=1 and your_number !=2 and your_number!=3:
                           print('Так нельзя!Введите правильное число!')
                           your_number = int(input())
             print(f'Компьютер выбрал {number}')

             if number == num1 and your_number == num2:
                        print('Компьютер победил! Камень разбивает ножницы!')
             elif number == num2 and your_number == num1:
                        print('Вы победили! Камень разбивает ножницы!')
             elif number == num2 and your_number == num3:
                        print('Компьютер победил! Ножницы режут бумагу!')
             elif number == num3 and your_number == num2:
                        print('Вы победили! Ножницы режут бумагу!')
             elif number == num3 and your_number == num1:
                        print('Компьютер победил! Бумага заворачивает камень!')
             elif number == num1 and your_number == num3:
                        print('Вы победили! Бумага заворачивает камень!')
             else:
                        print('Ничья!Сыграйте повторный раунд!')
                        main()

main()
  • Вопрос задан
  • 489 просмотров
Пригласить эксперта
Ответы на вопрос 4
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
1.Зачем вы два раза запрашиваете ввод числа? Просто сделайте бесконечный цикл а для выхода используйте проверку на соответствие данных.
2.Проверку ввода можно свести к двум вариантам:
а. Введенное число удовлетворяет требованием.
б. Оно не удовлетворяет
Для проверки можно использовать два подхода: конструкция match case и оператор in.
Хотя, на мой взгляд, вариант с match тут чуть более уместен с точки зрения семантики.
3.Зачем вы вводите название "жестов" и потом добавляете "прослойку" для сравнения чисел? Эти названия все-равно нигде не фигурируют, не лучше ли сравнивать сразу цифры?
По поводу остального уже ответили.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Думаю что вся игровая логика описывается орграфом из трех вершин и 3 ребер.
from enum import Enum

class Game(Enum):
     STONE    = 1
     SCISSORS = 2
     PAPER    = 3

winners = { Game.STONE : Game.SCISSORS, 
            Game.SCISSORS : Game.PAPER, 
						Game.PAPER : Game.STONE }
Ответ написан
Комментировать
@artempawww
Даже если не использовать словари (тобеж победители и т.д.), то Ваше решение тоже можно сократить:

from random import choice

loss, win, draw = "Компьютер выиграл!", "Вы выиграли!", "Ничья"
stuffs = ["камень", "ножницы", "бумага"]  #создает список с возможными предметами
computer_choice = choice(stuffs)

while True:
    player_stuff = input("Введите предмет (камень, ножницы, бумага): ").strip().lower()  #предлагает игроку ввести свой предмет (strip убирает пробел на конце, lower переводит все в нижний регистр (КаМенЬ => камень))
    if player_stuff not in stuffs:
        print("Так нельзя! Вы можете ввести только камень, ножницы и бумага!")  #уходит в бесконечный цикл
    else:
        break  #выходит из цикла

print(f"Ваш предмет: {player_stuff}\nПредмет компьютера: {computer_choice}")    
if player_stuff == computer_choice:  #проверяет на ничью
    print(draw)
elif player_stuff == "камень":
    if computer_choice == "бумага": print(loss)
    elif computer_choice == "ножницы": print(win)
elif player_stuff == "ножницы":
    if computer_choice == "бумага": print(win)
    elif computer_choice == "камень": print(loss)
elif player_stuff == "бумага":
    if computer_choice == "камень": print(win)
    elif computer_choice == "ножницы": print (loss)


PS: Почитайте PEP8
Ответ написан
Комментировать
@occupiedwork
В свое время решил ее так:

import random

stuffs = ["камень", "ножницы", "бумага"]  #создаем список с возможными предметами
rand = random.randint(0, 2) #генерим число рандомом от 0 до 2

pobed = ["каменьножницы", "ножницыбумага", "бумагакамень"] #варианты исходов
beda = ["ножницыкамень", "бумаганожницы", "каменьбумага"]
nich = ["ножницыножницы", "бумагабумага", "каменькамень"]

while True:
    lox = input ("Введите команду (камень, ножницы, бумага) : ") #игрок вводит значение
    game = lox+stuffs[rand]   #складываем значение игрока и рандома
    if lox not in stuffs:
        print ("Введите верные данные, можно только слова: камень, ножницы или бумага!")
    else:
        print (f'У тебя {lox}, а у компьютера {stuffs[rand]}', end = " ") #ищем в списках результат
        if game in pobed:
            print ("ты победил!")
        elif game in beda:
            print ("ты проиграл!")
        elif game in nich:
            print ("тоже, у вас ничья!")
        break


Возможно и не верно))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы