728x90
320x100
오늘 배운 것
알고리즘 세션
빅오 표기법
메모리 기술의 발달로 인해
시간복잡도가 공간복잡도보다 더 중요해짐
배열과 연결 리스트
배열
- 가장 많이 사용되는 자료구조
- 조회 : O(1)의 조회시간
- 배열 끝에서 삽입&삭제 O(1)
- 정렬 : 어떤 정렬 알고리즘을 사용하느냐에 따라 시간 복잡도가 달라짐
- 검색 : 일반적으로 O(n) 정렬시 O(logn)
linked list
유동적으로 연결고리를 떼었다가 붙였다가 할 수 있는 자료구조
class Node:
def __init__(self, data):
self.data = data
self.next = None # None은 NULL과 같아요
# 3을 가진 Node 를 만드려면 아래와 같이 하면 됩니다!
node = Node(3) # 현재는 next 가 없이 하나의 노드만 있어요!
# 주의할 점은 노드를 만들 때 next까지 세팅을 하는 것이 아니에요!
# 이것은 링크드리스트 자료구조 클래스에서 해주는 역할인 것을 인지하셔야 합니다!
class LinkedList:
def __init__(self, value):
self.head = Node(value) # head 에 시작하는 Node 를 연결합니다.
def append(self, value): # LinkedList 가장 끝에 있는 노드에 새로운 노드를 연결합니다.
curr = self.head
while curr.next is not None: # curr의 다음이 끝에 갈 때까지 이동합니다.
curr = curr.next
curr.next = Node(value)
def get_node(self, index): # 원래 강의노트에 작성된 코드를 그대로 가져왔어요!
node = self.head # 링크드리스트의 Head를 처음 노드로 지정합니다!
curr_idx = 0 # 현재 순회하고 있는 index를 나타냅니다!
# 현재 순회하고 있는 index가 원하는 위치보다 작다면 계속 루프를 돌아요!
while curr_idx < index:
node = node.next # 원하는 위치에 당도할 때 까지 다음 노드로 이동!
curr_idx += 1 # 인덱스도 갱신!
return node # 원하는 인덱스의 노드를 리턴해요!
def add_node(self, index, value):
new_node = Node(value) # 일단 새로운 값을 기준으로 새 노드를 만들어요!
if index == 0: # 0번째에 추가를 하고 싶다면!
new_node.next = self.head # 원래 Head였던 노드를 새 노드의 next로 지정해요!
self.head = new_node # 그리고, Head를 새 노드로 바꾸어줍니다!
return
# [3] - [4] - [5]에서 [3] - [4] - [6] - [5]로 6을 중간에 넣는다고 할게요!
# 추가하고 싶은 index의 이전 노드 정보를 갖고옵니다! 여기선 [4] 입니다.
node = self.get_node(index - 1)
# 1. 이전 노드([4])의 포인터([5])를 next_node로 임시 저장해요!
next_node = node.next
# 2. 이전 노드([4])의 포인터를 [6]으로 지정합니다!
node.next = new_node
# 3. 새로 삽입한 노드([6])의 포인터를 next_node인 [5]으로 지정합니다!
new_node.next = next_node
# LinkedList 인스턴스 생성
linked_list = LinkedList(1)
# append 메서드를 활용하여 노드 추가
linked_list.append(2)
linked_list.append(3)
linked_list.append(4)
# get_node 메서드를 활용하여 인덱스 2에 해당하는 노드의 값을 출력
print(linked_list.get_node(2).data) # 출력 결과: 3
# add_node 메서드를 활용하여 인덱스 2에 5라는 값을 가지는 새로운 노드를 삽입
linked_list.add_node(2, 5)
# get_node 메서드를 활용하여 인덱스 2에 해당하는 노드의 값을 출력
print(linked_list.get_node(2).data) # 출력 결과: 5
팀 과제 진행
추가할 거 정리
기능 1. 직업 - 3가지 👉 구현 완료!
- 마법사 클래스 : 마력이 다른 직업에 비해 많고, 소모량도 높음. 특수공격시 공격력이 높음
- 전사 클래스 : 체력이 높고 기본 공격력이 높음. 특수공격시 기본 공격력보다 높은 공격력
- 뱀파이어 클래스 : 특수공격시 공격력은 기본공격과 같으나 상대를 공격함과 동시에 자신의 HP를 회복한다. (최대 HP와 소모 HP에 비례)
기능 2. 라운드 -> 코인 -> 아이템 👉 구현 예정!
기능 3. 승리 -> 경험치 -> 레벨 👉 구현 예정!
기능 1 추가
처음에 만들었던 Player 클래스를 각 직업 클래스로 분리했다.
마법사 클래스 : 체력 10000, 공격력 2000, 특수공격력 3000, 마력 400, 특수공격시 마력소모량 100 스킬 : 매직 익스플로전!!! >> 강한 공격
전사 클래스 : 체력 12000, 공격력 2500, 특수공격력 3000, 마력 250, 특수공격시 마력소모량 50 스킬 : 몸통박치기! >> 강한 공격
뱀파이어 클래스 : 체력 10000, 공격력 2000, 특수공격력 2000, 마력 250, 특수공격시 마력소모량 50 스킬 : 흡혈! >> 상대의 hp를 깎고 본인의 hp를 회복(hp소모량의 40%)
# ========================== 플레이어 (직업) ==========================
class Character:
"""
모든 캐릭터의 모체가 되는 클래스
"""
def __init__(self, name, hp, power, magic_power, mp):
self.name = name
self.max_hp = hp
self.hp = hp
self.power = power
self.max_mp = mp
self.mp = mp
self.magic_power = magic_power
# 공격 함수 - 플레이어의 일반공격과 몬스터의 공격에서 모두 사용
def attack(self, other):
damage = random.randint(self.power * 0.8, self.power * 1.2)
other.hp = max(other.hp - damage, 0)
print(f"\n{self.name}의 공격! {other.name}에게 {damage}의 데미지를 입혔습니다.")
if other.hp == 0:
print(f"{other.name}이(가) 쓰러졌습니다.")
else:
print(f"\n{other.name} : {other.hp}/{other.max_hp} [HP]")
# 상태창
def show_status(self):
print(f"{self.name}의 상태: HP {self.hp}/{self.max_hp}")
# ---------- 직업 클래스 ----------
"""
마법사 클래스 : 체력 10000, 공격력 2000, 특수공격력 3000, 마력 400, 특수공격시 마력소모량 100
스킬 : 매직 익스플로전!!! >> 강한 공격
"""
class Wizard(Character):
def __init__(self, name, hp, power, magic_power, mp):
super().__init__(name, hp, power, magic_power, mp)
self.job = '마법사' # 콘솔 출력을 위한 문자열
def magic_attack(self,other): # 특수공격
#특수공격 데미지
magic_damage = random.randint(self.magic_power * 0.8, self.magic_power * 1.5)
other.hp = max(other.hp - magic_damage, 0)
print(f"\033[38;2;161;196;255m\n .. 매직 익스플로전!!! | MP -100 | {other.name}에게 {magic_damage}의 피해를 주었습니다!\033[0m")
self.mp -= 100 # mp 소모
if other.hp == 0:
print(f"{other.name}이(가) 쓰러졌습니다.")
else:
print(f"\n{other.name} : {other.hp}/{other.max_hp} [HP]")
def show_status(self): # 상태 출력
print(f"{self.name}의 상태: HP {self.hp}/{self.max_hp} MP {self.mp}/{self.max_mp}")
"""
전사 클래스 : 체력 12000, 공격력 2500, 특수공격력 3000, 마력 250, 특수공격시 마력소모량 50
스킬 : 몸통박치기! >> 강한 공격
"""
class Warrier(Character):
def __init__(self, name, hp, power, magic_power, mp):
super().__init__(name, hp, power, magic_power, mp)
self.job = '전사' # 콘솔 출력을 위한 문자열
def magic_attack(self,other):
magic_damage = random.randint(self.magic_power * 0.8, self.magic_power * 1.5)
other.hp = max(other.hp - magic_damage, 0)
print(f"\033[38;2;161;196;255m\n .. 몸통박치기! | MP -50 | {other.name}에게 {magic_damage}의 피해를 주었습니다!\033[0m")
self.mp -= 50
if other.hp == 0:
print(f"{other.name}이(가) 쓰러졌습니다.")
else:
print(f"\n{other.name} : {other.hp}/{other.max_hp} [HP]")
def show_status(self):
print(f"{self.name}의 상태: HP {self.hp}/{self.max_hp} MP {self.mp}/{self.max_mp}")
"""
뱀파이어 클래스 : 체력 10000, 공격력 2000, 특수공격력 2000, 마력 250, 특수공격시 마력소모량 50
스킬 : 흡혈! >> 상대의 hp를 깎고 본인의 hp를 회복(hp소모량의 40%)
"""
class Vampire(Character):
def __init__(self, name, hp, power, magic_power, mp):
super().__init__(name, hp, power, magic_power, mp)
self.job = '뱀파이어' # 콘솔 출력을 위한 문자열
def magic_attack(self,other):
# 특수공격 데미지
magic_damage = random.randint(self.magic_power * 0.9, self.magic_power * 1.5)
# 회복량 - 소모 체력에 비례
heal_amount = int((self.max_hp-self.hp) * 0.4)
other.hp = max(other.hp - magic_damage, 0)
print(f"\033[38;2;161;196;255m\n .. 흡혈! | MP -50 | {other.name}에게 {magic_damage}의 피해를 주었습니다! \n .. 체력을 {heal_amount}만큼 회복했습니다.({self.hp}/{self.max_hp})\033[0m")
self.hp += heal_amount # 회복
self.mp -= 50 # mp 소모
if other.hp == 0:
print(f"{other.name}이(가) 쓰러졌습니다.")
else:
print(f"\n{other.name} : {other.hp}/{other.max_hp} [HP]")
def show_status(self):
print(f"{self.name}의 상태: HP {self.hp}/{self.max_hp} MP {self.mp}/{self.max_mp}")
시작하고 플레이어 이름 불러온 후에 직업 선택하는 함수 만들기!
처음엔 그냥 input
안에 넣으려고 했는데, 정수가 아닌 값에 대해 예외처리를 하려다보니 함수를 만들 수 밖에 없었다.
def get_job(): # 직업 선택할 때도 숫자 외의 값에 에러처리 위해 함수로 만듦
global global_job
while True:
try:
global_job = int(input("직업선택 | 1.마법사 | 2.전사 | 3.뱀파이어 |\n ... ▶ "))
break
except ValueError:
print("\n숫자로 입력해주세요.\n")
return global_job
그리고 main 파일 가장 위에 global_job = get_job()
을 선언해서 직업 변수를 사용해 게임 실행 함수에 사용한다.
300x250
반응형
GitHub 댓글