Как можно причесать/оптимизировать данный код?

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

Игра орел решка. Мой уровень знаний: ну вы сами видите чем я занимаюсь :) В общей сложности часов 6 потратил на поиск информации и попытки реализовать счетчик и заставить его корректно выводить данные в конце раунда. Что и как можно было сделать лучше?

import random

coin = ["Head", "Tail"]
invitations = ["Let's play, head or tail?", "Your choice, Head or 
Tail?"]
player_prefix = "PLAYER: "
bot_prefix = "BOT: "

def toss():
  print(bot_prefix + "I'm tossing a coin!")
  return random.choice(coin)

def guess():
  print(bot_prefix + random.choice(invitations))
  return input(player_prefix)

class Counter:
    
    def __init__(self):
        self._value = 0
    
    def new_value(self):
        self._value += 1
        return self._value

    def display_info(self):
        return self.__str__()

    def __str__(self):
        return self._value

player_score = Counter()
bot_score = Counter()   

while True:
   
   player_guess = guess()
   coin_toss = toss()
   print(bot_prefix + "Your guess is: " + player_guess)
   print(bot_prefix + "The result of my toss is: " + coin_toss)
   if player_guess.casefold() == coin_toss.casefold():

     print("The winner is Player!")
     player_score.new_value()
     print(f"Player {player_score.display_info()} : {bot_score.display_info()} Bot")
     
   else: 

     print("The winner is BOT!")
     bot_score.new_value()
     print(f"Player {player_score.display_info()} : {bot_score.display_info()} Bot")
   
   print(bot_prefix + "Do you want to continue? Y/N?")
   user_answer = input(player_prefix)
   if user_answer.casefold() == "n" or user_answer.casefold() == "no":
     break

Ответы

▲ 0

Убрал класс, заменив на простые переменные, соответственно убрав .display_info() там, где оно есть. Вынес строку показа результата из if-else, потому что она не зависит от условий.

Функции guess() и toss() тоже можно убрать, и их код внести в цикл. Они используются только в одном месте.

player_score = 0
bot_score = 0

while True:

    player_guess = guess()
    coin_toss = toss()
    print(bot_prefix + "Your guess is: " + player_guess)
    print(bot_prefix + "The result of my toss is: " + coin_toss)

    if player_guess.casefold() == coin_toss.casefold():
        print("The winner is Player!")
        player_score += 1
    else:
        print("The winner is BOT!")
        bot_score += 1

    print(f"Player {player_score} : {bot_score} Bot")

    print(bot_prefix + "Do you want to continue? Y/N?")
    user_answer = input(player_prefix)
    if user_answer.casefold() == "n" or user_answer.casefold() == "no":
        break

Ну и я ожидал, что при вводе, допустим, "k" игра остановится, или хотя бы напишет, что непонятно. А она продолжилась.