import easygui
import random

class Card:
    def __init__(self, name, attack, defense):
        self.name = name
        self.attack = attack
        self.defense = defense

    def play(self, opponent):
        opponent.defense -= self.attack

class SpecialCard(Card):
    def __init__(self, name, attack, defense, ability):
        super().__init__(name, attack, defense)
        self.ability = ability

    def play(self, opponent):
        super().play(opponent)
        self.ability.activate(opponent)

class Ability:
    def __init__(self, name, effect):
        self.name = name
        self.effect = effect

    def activate(self, opponent):
        self.effect(opponent)

class Deck:
    def __init__(self):
        self.cards = [Card("Card" + str(i), i, 40-i) for i in range(1, 21)]
        self.cards += [SpecialCard("SpecialCard" + str(i), i, 40-i, Ability("Ability" + str(i), lambda opponent: opponent.defense -= i)) for i in range(21, 41)]
        random.shuffle(self.cards)

    def draw_card(self):
        return self.cards.pop()

class Player:
    def __init__(self, name):
        self.name = name
        self.deck = Deck()
        self.hand = []
        self.defense = 100

    def draw_card(self):
        card = self.deck.draw_card()
        self.hand.append(card)

    def play_card(self, opponent):
        card = self.hand.pop()
        card.play(opponent)

class Game:
    def __init__(self, player1, player2):
        self.players = [player1, player2]

    def play(self):
        while True:
            for player in self.players:
                player.draw_card()
                opponent = [p for p in self.players if p != player][0]
                player.play_card(opponent)
                if len(player.deck.cards) == 0 or opponent.defense <= 0:
                    return player

def main():
    player1 = Player("Player")
    player2 = Player("AI")
    game = Game(player1, player2)
    winner = game.play()
    easygui.msgbox(f"{winner.name} wins the game and gets a new pack of cards!", title="Game Over")

if __name__ == "__main__":
    main()