Пишу игру пьяница

Пытаюсь обучаться по книгам, и в качестве практики тут идёт карточная игра пьяница. Код скопирован с самой книги с минимальными изменениями, но какие бы данные я не вводил выдаётся лишь надпись о победе, но вместо ника победившего слово "ничья". Все необходимые походу игры вещи, как например описание каждой операции тоже не выводятся. Подскажите что делать, пожалуйста.

class Card():
    suits = ['пикей','червей','бубей','треф']
    values = [None, None,"2", "3","4", "5", "6", "7","8", "9", "10","валета", "даму","короля","туза"]
    def __init__(self, v, s):
        self.value = v
        self.suit = s
    def __lt__(self, c2):
        if self.value < c2.value:
            return True
        if self.value == c2.value:
            if self.suit < c2.suit:
                return True
            else:
                return False
        return False
    def __gt__(self, c2):
        if self.value > c2.value:
            return True
        if self.value == c2.value:
            if self.suit > c2.suit:
                return True
            else:
                return False
        return False
    def __repr__(self):
        v = self.values[self.value] +""+ self.suits[self.suit]
        return v

from random import shuffle

class Deck():
    def __init__(self):
        self.cards = []
        for i in range(2, 15):
            for j in range(4):
                self.cards.append(Card(i, j))
        shuffle(self.cards)

    def rm_card(self):
        if len(self.cards) == 0:
            return
        return self.cards.pop()

class Player():
    def __init__(self, name):
        self.wins = 0
        self.card = None
        self.name = name

class Game():
    def __init__(self):
        name1 = input("Имя игрока №1: ")
        name2 = input("Имя игрока №2: ")
        self.deck = Deck()
        self.p1 = Player(name1)
        self.p2 = Player(name2)

    def wins(self, winner):
        w = "{} забирает карты"
        w = w.format(winner)
        print(w)

    def draw(self, p1n, p1c, p2n, p2c):
        d = "{} кладёт {}, а {} кладёт {}"
        d = d.format(p1n, p1c, p2n, p2c)
        print(d)

    def play_game(self):
        cards = self.deck.cards
        print("Поехали!")
        while len(cards) >= 2:
            m = "Нажмите X для выхода. Нажмите любую другую кнопку для старта"
            response = input(m).lower()
            if response == 'х' or 'x' or '[' or 'ч':
                break
            p1c = self.deck.rm_card()
            p2c = self.deck.rm_card()
            p1n = self.p1.name
            p2n = self.p2.name
            self.draw(p1n, p1c, p2n, p2c)
            if p1c > p2c:
                self.p1.wins += 1
                self.wins(self.p1.name)
            else:
                self.p2.wins += 1
                self.wins(self.p2.name)
        
        win = self.winner(self.p1, self.p2)

        print("Игра окончена. {} выиграл!".format(win))


    def winner(self, p1, p2):
        if p1.wins > p2.wins:
            return p1.name
        if p1.wins < p2.wins:
            return p2.name
        return "Ничья!"

game=Game()
game.play_game()

Ответы (1 шт):

Автор решения: ThelArteml

Игра останавливается из-за строки: if response == 'х' or 'x' or '[' or 'ч':, в классе Game, методе play_game. Эта строка вместо того, чтобы проверить нажимал ли пользователь клавишу с похожим на 'x' знаком, проверяла существуют ли строки 'x', '[', 'ч', а раз они по-любому существуют, то завершала игру, думая, что игрок не хочет играть.

Исправление: if response == 'х' or response == 'x' or response == '[' or response == 'ч':.

Но в общем этот код ужасен, так как имеет много недочётов, например:

  1. пишет название карт слитно (8треф, дамучервей)
  2. при ничьей пишет:

ничья выиграл

→ Ссылка