👇과제👇
- **요구사항**
- 이름을 입력해 플레이어를 생성할 수 있어야 합니다.
- 몬스터는 임의 생성할 수 있어야 합니다.
- while 반복문을 사용해 종료 조건을 충족할 때까지 턴제 플레이어와 몬스터간 전투를 반복 진행해야 합니다.
- 플레이어는 공격 타입을 선택할 수 있어야 합니다.
ex) `일반공격` , `마법공격`
- 몬스터는 일반 공격을 할 수 있어야 합니다.
- 매 전투시 플레이어와 몬스터의 상태 정보를 출력해야 합니다.
- 모든 공격은 캐릭터의 파워 기준으로 랜덤성을 가지고있어야 합니다.
ex) 파워가 10인경우 일반공격은 8~12사이의 랜덤한 값으로 공격
- 몬스터나 플레이어의 HP가 0이되면 전투를 종료하고 승리 또는 패배를 출력해야 합니다.
- **기본 가이드**
# **가능한 기본 가이드를 지켜 과제를 진행해주세요**
1. 시작
- 플레이어 생성 (Player)
- 이름
- HP
- MP
- 파워
- 일반공격
- 마법파워
- 마법공격
- 몬스터 생성 (Monster)
- 이름
- HP
- 일반공격
2. 전투
- 몬스터와 턴제 전투 (While 반복문 사용)
- 플레이어, 몬스터 상태 출력
- 플레이어의 공격 방법 선택 (일반, 마법)
- 플레이어 공격
- 몬스터 공격
3. 종료
- 승리 or 패배
시작 시 플레이어 이름 받아오기
실행할 행동 선택하기
전투
- 플레이어 선공
- 공격 시 공격 대상, 공격 방법 선택
- 30%의 확률로 몬스터의 공격이 빗나감 (회피기)
- 마법공격 mp50 소모
- 궁극기 mp 100 소모, 소모한 hp의 40% 회복
- 마력이 부족하면 다시 선택
- 선택한 몬스터가 죽었거나 존재하지 않으면 다시 선택
- 몬스터 한 마리 처치할 때 마다 레벨이 오르고, 그에 따라 최대 체력과 공격력 증가 (최대 체력은 회복량에 영향)
character.py 👉 몬스터와 플레이어의 클래스
# character.py
import random
class Character:
"""
모든 캐릭터의 모체가 되는 클래스
"""
def __init__(self, name, hp, power):
self.name = name
self.max_hp = hp
self.hp = hp
self.power = 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"\033[38;2;255;108;108m\n .. {self.name}에게 공격 받음 | HP - {damage}\033[0m")
if other.hp == 0:
print(f"\033[38;2;193;51;51m\n ... {other.name}(이)가 쓰러졌습니다 8ㅅ8\033[0m")
else:
print(f"\n{other.name} : {other.hp}/{other.max_hp} [HP]")
# ---------- 플레이어 이름 받아오기 ----------
global_name = input('\n용사님의 이름을 입력하세요 : ')
# ========================== 플레이어 ==========================
class Player(Character):
def __init__(self, name, hp,power, mp, lv):
self.name = name
self.hp = hp
self.max_hp = hp
self.power = power
self.max_mp = mp
self.mp = mp
self.lv = lv
def use_skill(self, other, skill_type):
if skill_type == 'physical':
damage = random.randint(self.power * 0.8, self.power * 1.2)
mp_cost = 0
elif skill_type == 'magic':
damage = random.randint(self.power * 0.9, self.power * 1.5)
mp_cost = 50
elif skill_type == 'heal':
damage = random.randint(self.power * 0.9, self.power * 1.5)
exhausted_hp = self.max_hp-self.hp
heal_amount = int(exhausted_hp * 0.4)
self.hp += heal_amount
mp_cost = 100
other.hp = max(other.hp - damage, 0)
self.mp -= mp_cost # 스킬 사용시 마력 소모
if skill_type == 'physical':
print(f"\033[38;2;161;196;255m\n .. 일반공격 | {other.name}에게 {damage}의 피해를 주었습니다!\033[0m")
elif skill_type == 'magic':
print(
f"\033[38;2;161;196;255m\n .. 마법공격 | MP -50 | {other.name}에게 {damage}의 피해를 주었습니다!\033[0m")
elif skill_type == 'heal':
print(
f"\033[38;2;161;196;255m\n .. 궁극기공격 | {other.name}에게 {damage}의 피해를 주었습니다! \n .. 체력을 {heal_amount}만큼 회복했습니다.({self.hp}/{self.max_hp})\033[0m")
print(f" .. 남은 마력: {self.mp}/{self.max_mp}")
if other.hp == 0:
self.lv += 1
self.max_hp += 500
self.power += 200
print(f"\033[38;2;141;172;255m\n ... {other.name}을 처치했다!!\033[0m")
print(f"\n ... 레벨 1 증가 | 공격력 증가, 최대 체력 증가.")
else:
print(f"\n{other.name} : {other.hp}/{other.max_hp} [HP]")
# ========================== 몬스터 ==========================
class Monster(Character):
def __init__(self, name, hp, power):
self.name = name
self.hp = hp
self.max_hp = hp
self.power = power
def wait(self):
print(f'\n\033[38;2;255;156;166m .. {self.name}의 공격이 빗나갔다!!\033[0m')
function.py 👉 실행할 때 필요한 함수들
# function.py
from character import *
from random import choices
from time import sleep
# ========================== 게임 진행 함수 ==========================
def create_monsters(): # 몬스터들을 저장
global Hero
Hero = Player(global_name, 10000,2000, 300, 1) # 마력 값 추가
Monsters = {}
Monsters['종민몬'] = Monster('종민몬', 2000, 2000)
Monsters['탁근몬'] = Monster('탁근몬', 3000, 1000)
Monsters['영우몬'] = Monster('영우몬', 4000, 2000)
Monsters['진규몬'] = Monster('진규몬', 5000, 1500)
return Hero, Monsters
# 플레이어와 몬스터들의 상태
def show_start(Player, Monsters):
print("\n\n---------------------------------------------------------------")
print(f"\033[38;2;255;177;108m ♥ ♥ {Player.name}용사님 등장!! ♥ ♥\033[0m")
print("---------------------------------------------------------------")
print(
f"\033[38;2;102;255;178m HP : {Player.hp}/{Player.max_hp} | MP : {Player.mp}/{Player.max_mp} | 공격력 : {Player.power} | LV : {Player.lv}\033[0m")
print("---------------------------------------------------------------\n")
def show_monster(Player, Monsters):
print("\033[38;2;255;177;108m\n 야생의 몬스터들이 등장했다! \n\033[0m")
for key, name in Monsters.items(): # 몬스터들의 상태 표시
print(f"\033[38;2;255;108;167m {name.name} \033[38;2;102;255;178m[ HP : {name.hp}/{name.max_hp} | 공격력 : {name.power}] \033[0m")
def skill_info():
print("\033[38;2;255;181;216m\n\n전투는 \033[38;2;102;255;178m몬스터 네 마리와 플레이어 한 명\033[38;2;255;181;216m이 진행하게 되며, 플레이어의 선공으로 시작됩니다. \n매 턴마다 공격할 몬스터를 \033[38;2;102;255;178m이름\033[38;2;255;181;216m으로 선택하세요. \n\n플레이어는 \033[38;2;102;255;178m일반 공격, 마법 공격, 궁극기\033[38;2;255;181;216m를 선택해서 사용할 수 있습니다. \033[38;2;255;108;167m\n\n일반 공격 : 가장 낮은 공격력 / mp 소모 0\n마법 공격 : 조금 더 강한 공격 / MP 50 소모\n궁극기 : 마법 공격과 함께 체력 회복 / mp 100 소모\n궁극기의 회복량은 소모된 HP에 비례합니다. \n\n\033[0m")
# ---------- 플레이어 턴 ----------
def player_turn(Player, Monsters):
# 공격 대상 선택하는 함수
def use_mp(need,skill_type):
if Player.mp < need: # 마력이 부족한 경우
print("\n ※ ※ 마력이 부족합니다! ※ ※")
player_turn(Player, Monsters)
else: # 사용가능 - 스킬 사용
Player.use_skill(Monsters[other],skill_type)
# 몬스터 딕셔너리에 없는 대상을 선택했을 시 예외 처리
try:
other = input('\n ... ▶ 공격 대상을 선택하세요 (이름입력) : ')
command = input(
'\n ▶ 공격 방법을 선택하세요 (숫자 입력)\n [1. 일반공격 | 2. 마법공격 | 3. 궁극기] : ')
if command == '1':
use_mp(0,'physical')
elif command == '2':
use_mp(50,'magic')
elif command == '3':
use_mp(100,'heal')
return Monsters
except KeyError as e: # 이미 죽은 몬스터를 선택했을 때
print("선택한 대상이 이미 사망했거나 존재하지 않습니다. 다시 선택하세요")
player_turn(Player, Monsters)
# ---------- 몬스터 사망 처리 ----------
def monster_death(Monsters):
dead_monsters = []
for key, name in Monsters.items():
if name.hp <= 0:
dead_monsters.append(key)
for name in dead_monsters:
del Monsters[name]
if len(Monsters) <= 0:
return Monsters, True
else:
return Monsters, False
# ---------- 몬스터 턴 ----------
def monster_turn(Player, Monsters):
sleep(1)
for key, value in Monsters.items():
commands = ['attack', 'wait']
weights = [0.7, 0.3] # 회피 확률
command = choices(commands, weights=weights)[0]
if command == 'attack':
value.attack(Player)
elif command == 'wait':
value.wait()
return Player
# ---------- 플레이어 생존 확인 ----------
def player_death(Player):
if Player.hp <= 0:
return True
else:
return False
main.py 👉 실제 실행하는 함수
# main.py
from character import *
from function import *
from time import sleep
# ========================== 실행 ==========================
def game():
Hero, Monsters = create_monsters()
while True:
print("\n\n -------------------------------------------")
print(f"\033[38;2;81;169;255m ~용사님의 대모험~ ♥{global_name}용사님♥ \033[0m")
print(" -------------------------------------------")
print("\033[38;2;206;149;255m 1. 튜토리얼")
print(" 2. 전투")
print(" 3. 내 정보 보기")
print(" 4. 몬스터 도감")
print(" 5. 종료\033[0m")
print(" -------------------------------------------")
command = int(input(" ... ▶ 숫자 선택 : "))
if command == 1:
skill_info()
elif command == 2:
while True:
show_start(Hero, Monsters)
show_monster(Hero, Monsters)
# 플레이어 공격
Monsters = player_turn(Hero, Monsters)
sleep(1)
# 몬스터 체력 확인
Monsters, game_over = monster_death(Monsters)
if game_over:
# player_lv+=1
print("\n================= 승리 =================")
print("모든 몬스터를 물리쳤습니다! 게임 종료!")
break
# 몬스터 공격
Hero = monster_turn(Hero, Monsters)
# 주인공 체력 확인
game_over = player_death(Hero)
if game_over:
print("\n================= 패배 =================")
break
sleep(1)
elif command == 3:
show_start(Hero, Monsters)
elif command == 4:
print("\n-----------------------------------------")
print("\033[38;2;74;215;112m ♥몬스터 도감♥\033[0m")
print("-----------------------------------------")
print("\n종민몬 [ HP : 2000/2000 | 공격력 : 2000]\n탁근몬 [ HP : 3000/3000 | 공격력 : 1000]\n영우몬 [ HP : 4000/4000 | 공격력 : 2000]\n진규몬 [ HP : 5000/5000 | 공격력 : 1500]")
print("\n-----------------------------------------")
elif command == 5:
print("게임을 종료합니다.")
break
else:
print("잘못입력")
game()
GitHub 댓글