1. 어떤 사용 예시가 있을까?

- 클래스를 만들면 동일하거나 비슷한 속성의 객체를 쉽게 관리할 수 있다.

- 예를 들어 카드의 전투력과 방어력이 변동하고 해당 값으로 승패를 가르는 게임이 있다면 쉽게 사용할 수 있을 것이다.

 

 

2. 카드 게임에 사용할 기본 클래스를 구현해보자

- 아래와 같이 구현해보자

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

    def __repr__(self):
        return f"BattleCard('{self.name}', {self.attack}, {self.defense})"
    
    def __getitem__(self, key):
        if key == 'name':
            return self.name
        elif key == 'attack':
            return self.attack
        elif key == 'defense':
            return self.defense
        else:
            raise KeyError(f"Invalid key: {key}")

# wave_card: BattleCard('훌라댄서 웨이브', 10, 5)
# wave_card['name']: 훌라댄서 웨이브
# wave_card['attack']: 10
# wave_card['defense']: 5
# --------------------------------
# surf_card: BattleCard('먹부림 대장 서프', 4, 9)
# surf_card['name']: 먹부림 대장 서프
# surf_card['attack']: 4
# surf_card['defense']: 9

- 그러면 아래와 같이 데이터를 각 카드의 속성을 확인할 수 있다.

wave_card = BattleCard(name="훌라댄서 웨이브", attack=10, defense=5)
surf_card = BattleCard(name="먹부림 대장 서프", attack=4, defense=9)

print(f"wave_card: {wave_card}")
print(f"wave_card['name']: {wave_card['name']}")
print(f"wave_card['attack']: {wave_card['attack']}")
print(f"wave_card['defense']: {wave_card['defense']}")
print("--------------------------------")
print(f"surf_card: {surf_card}")
print(f"surf_card['name']: {surf_card['name']}")
print(f"surf_card['attack']: {surf_card['attack']}")
print(f"surf_card['defense']: {surf_card['defense']}")

- 그렇다면 카드끼리 싸우는 함수를 통해 한 번의 싸움마다 카드의 승패를 확인할 수 있다.

def battle_result(player1_card, player2_card):
    player1_card_defense_status_after_battle = player1_card['defense'] - player2_card['attack']
    player2_card_defense_status_after_battle = player2_card['defense'] - player1_card['attack']
    
    if player1_card_defense_status_after_battle <= 0 and player2_card_defense_status_after_battle <= 0:
        return "두 카드가 모두 파괴되어 무승부입니다.."
    elif player1_card_defense_status_after_battle <= 0 and player2_card_defense_status_after_battle > 0:
        return f"{player1_card['name']} 패배했습니다."
    elif player1_card_defense_status_after_battle > 0 and player2_card_defense_status_after_battle <= 0:
        return f"{player2_card['name']} 패배했습니다."
    else:
        return "두 카드가 모두 살아있습니다."
        

battle_result(wave_card, surf_card)
# '먹부림 대장 서프 패배했습니다.'

- 하지만 만약 무승부로 끝나서 이어서 대결을 해야한다면??

- 그렇다면 인스턴스의 값을 변경하고 다시 대결을 하는 과정이 필요하다.

- 따라서 인스턴스의 값을 변경시킬 수 있는 특별 메서드를 추가한다.

 

 

3. 값을 변경할 수 있도록 바꾸고 배틀 함수를 변경해보자

- __setitem__을 추가해보자

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

    def __repr__(self):
        return f"BattleCard('{self.name}', {self.attack}, {self.defense})"
    
    def __getitem__(self, key):
        if key == 'name':
            return self.name
        elif key == 'attack':
            return self.attack
        elif key == 'defense':
            return self.defense
        else:
            raise KeyError(f"Invalid key: {key}")
    
    def __setitem__(self, key, value):
        if key == 'name':
            self.name = value
        elif key == 'attack':
            self.attack = value
        elif key == 'defense':
            self.defense = value
        else:
            raise KeyError(f"Invalid key: {key}")

- 그리고 배틀 함수에서 변경된 defence의 값을 적용하고 결과로 출력한다.

- 또한 배틀 후의 결과를 출력하는 함수와 배틀을 하는 함수로 분할해서 함수를 관리한다.

def cards_status_after_battle(player1_card, player2_card):
    player1_card_defense_status_after_battle = player1_card['defense'] - player2_card['attack']
    player2_card_defense_status_after_battle = player2_card['defense'] - player1_card['attack']
    player1_card['defense'] = player1_card_defense_status_after_battle
    player2_card['defense'] = player2_card_defense_status_after_battle
    return player1_card, player2_card
    
def battle_result(player1_card, player2_card):
    player1_card_defense_status_after_battle = player1_card['defense']
    player2_card_defense_status_after_battle = player2_card['defense']
    
    if player1_card_defense_status_after_battle <= 0 and player2_card_defense_status_after_battle <= 0:
        return "두 카드가 모두 파괴되어 무승부입니다.."
    elif player1_card_defense_status_after_battle <= 0 and player2_card_defense_status_after_battle > 0:
        return f"{player1_card['name']} 패배했습니다."
    elif player1_card_defense_status_after_battle > 0 and player2_card_defense_status_after_battle <= 0:
        return f"{player2_card['name']} 패배했습니다."
    else:
        return "두 카드가 모두 살아있습니다."


player1_card, player2_card = cards_status_after_battle(wave_card, surf_card)
print(battle_result(player1_card, player2_card))
print(player1_card)
print(player2_card)

# 먹부림 대장 서프 패배했습니다.
# BattleCard('훌라댄서 웨이브', 10, 1)
# BattleCard('먹부림 대장 서프', 4, -1)

 

'개발 공부 > Python' 카테고리의 다른 글

1. 특별 메서드의 기본적인 사용  (0) 2025.01.09

+ Recent posts