Как задать правило в Python

Рейтинг: 1Ответов: 2Опубликовано: 16.02.2023

У нас есть код который определяет победителя в игре JS

MATCH = {
  scissors: ['paper', 'lizard'],
  paper: ['rock', 'spock'],
  rock: ['lizard', 'scissors'],
  lizard: ['spock', 'paper'],
  spock: ['scissors', 'rock'],
};

function rpsls(pl1, pl2) {
  return MATCH[pl1].indexOf(pl2) >= 0 ? 'Player 1 Won!' :
         MATCH[pl2].indexOf(pl1) >= 0 ? 'Player 2 Won!' : 'Draw!';
}

то есть, scissors имеет 1, а paper и lizard 0 paper имеет 1, в случае сравнения rock и spock,

как корректно задать такое же правило (MATCH) в Python?

Ответы

▲ 3Принят

Небольшая оптимизация в структуре словаря - удалены ключи win, вложенные словари заменены на кортежи. Также словарь вынесен за пределы функции, т.е. создается один раз. Добавлена проверка на допустимые сущности.

rules = {'rock': ('lizard', 'scissors'),
         'paper': ('rock', 'spock'),
         'scissors': ('lizard', 'paper'),
         'lizard': ('paper', 'spock'),
         'spock': ('rock', 'scissors')}


def who_win(pl1, pl2, rules):
    if pl1 in rules and pl2 in rules:
        if pl1 == pl2:
            return 'Draw!'
        return f'Player {(2, 1)[pl2 in rules[pl1]]} Won!'
    else:
        return "Invalid item!"


# тест
lst = 'rock', 'flower', 'paper', 'scissors', 'lizard', 'spock'
for pl1 in lst:
    for pl2 in lst:
        print(pl1, pl2, ': ', who_win(pl1, pl2, rules))
rock rock :  Draw!
rock flower :  Invalid item!
rock paper :  Player 2 Won!
rock scissors :  Player 1 Won!
rock lizard :  Player 1 Won!
rock spock :  Player 2 Won!
...
▲ 0

Нашёл решение своего вопроса, но если кто-то может предложить более лучшее или оптимизированное решение, пожалуйста напишите его.

if (pl1 == pl2): return 'Draw!'

rules = {'rock': {'win': ['lizard', 'scissors']},
       'paper': {'win': ['rock', 'spock']},
       'scissors': {'win': ['lizard', 'paper']},
       'lizard': {'win': ['paper', 'spock']},
       'spock': {'win': ['rock', 'scissors']}}


if rules.get(pl1):
    if pl2 in rules[pl1]['win']:
        return 'Player 1 Won!'
    else:
        return 'Player 2 Won!'