본문 바로가기

Python

[Python] 09

실습(01 ~ 08 총정리)

보물상자에서 랜덤으로 무기를 획득하여 길을 가다가 마주치는 몬스터와 싸우는 게임 만들기

 

1-1. 보물상자를 발견했다는 메시지를 출력하고 사용자가 아무 키나 누르기를 기다린다.(print, input)

print('당신은 길을 가다가 ' + YELLOW + '[보물상자]' + END + '를 발견했습니다.')
input('아무 키나 누르십시오...............')

 

1-2. 보물상자에서 랜덤으로 1개의 무기를 획득한다.(random, list)

- 각 무기는 [무기이름, 최소공격력, 최대공격력]의 데이터를 가짐

sel = rd.randint(0, 4)  # 선택 가능 weapons 개수([0] ~ [4])
weapons = [['휴지', 1, 3], ['목검', 3, 5], ['검', 5, 10], ['대포', 1, 50], ['에픽검', 50, 100]]
my_weapon = weapons[sel]  # 획득한 무기

if sel == 0:  # sel : weapons 1번째 항목, [0] : 1번째 항목의 휴지
    print('당신은 [{}]을/를 획득하엿습니다.'.format(weapons[sel][0]))
elif sel == 1:  # sel : weapons 2번째 항목, [0] : 2번째 항목의 목검
    print('당신은' + GREEN + '[{}]'.format(weapons[sel][0]) + END + '을/를 획득하엿습니다.')
elif sel == 2:  # sel : weapons 3번째 항목, [0] : 3번째 항목의 검
    print('당신은' + BLUE + '[{}]'.format(weapons[sel][0]) + END + '을/를 획득하엿습니다.')
elif sel == 3:  # sel : weapons 4번째 항목, [0] : 4번째 항목의 대포
    print('당신은' + YELLOW + '[{}]'.format(weapons[sel][0]) + END + '을/를 획득하엿습니다.')
elif sel == 4:  # sel : weapons 5번째 항목, [0] : 5번째 항목의 에픽검
    print('당신은' + MAGENTA + '[{}]'.format(weapons[sel][0]) + END + '을/를 획득하엿습니다.')

 

2-1. 길을 가다가 랜덤으로 몬스터를 만난다.(random, List)

- 각 몬스터는 [몬스터명, 최소공격력, 최대공격력]의 데이터를 가짐

MYIMAGE = '(・ิω・ิ)'
MONIMAGE = ['(;◔д◔)', 'ヘ(= ̄∇ ̄)ノ', '๑◕‿‿◕๑']

mons = [['늑대', 1, 3], ['산적', 5, 10], ['드래곤', 1, 100]]
sel = rd.randint(0, 2)  # 선택 가능 mons 개수([0] ~ [4])

if sel == 2:  # sel : mons 3번째 항목, [0] : 3번째 항목의 드래곤
    print('당신은 길을 가다가' + RED + '[{}]'.format(mons[sel][0]) + END + '을/를 만났습니다.')
else:
    print('당신은 길을 가다가' + GREEN + '[{}]'.format(mons[sel][0]) + END + '을/를 만났습니다.')
    
my_mons = mons[sel]  # 마주친 몬스터

 

3-1. 초기 양쪽의 에너지는 100이다.(my_energy, mon_energy에 저장한다.)

my_energy = 100
mon_energy = 100

 

3-2. 무한루프로 전투를 한다. 단, 둘 중 하나가 에너지가 0이 되면 탈출한다.(while, break)

while True:

 

3-3. 사용자는 공격 또는 회복을 선택한다.

user_input = input('행동을 선택하십시오.(1. 공격, 2. 회복) : ')
    while True:
        if user_input == '1' or user_input == '2':
            break

 

3-4. 공격을 선택했다면 최소와 최대 공격력 사이로 공격을 한다.

    if user_input == '1':
        damage = rd.randint(my_weapon[1], my_weapon[2])
        mon_energy = mon_energy - damage

        print('당신은 공격으로 {}의 데미지를 입혔습니다. {}의 체력 : {}'.format(damage, my_mons[0], mon_energy)
        print(MYIMAGE + ' ' * 11 + MONIMAGE[sel])
        energy_str = ''
        
        if my_energy < 30:
            energy_str += RED_BG + ' ' * int(my_energy / 5) + END  # 에너지를 한 칸당 5로 설정하여 총 20칸으로 설정
        else:
            energy_str += GREEN_BG + ' ' * int(my_energy / 5) + END
        energy_str += ' ' * (21 - int(my_energy / 5))  # 21로 설정하지 않으면 몬스터와 나의 에너지가 붙어서 출력된다(위에서 IMAGE 출력을 11로 설정했기 때문)

        if mon_energy < 30:
            energy_str += RED_BG + ' ' * int(mon_energy / 5) + END
        else:
            energy_str += GREEN_BG + ' ' * int(mon_energy / 5) + END
        print(energy_str)

        if mon_energy <= 0:
            break

 

3-5. 회복을 선택했다면 0 ~ 30 사이로 회복한다.(단, 최대 에너지인 100을 넘길 수 없다.)

    if user_input == '2':
        heal = rd.randint(0, 30)
        my_energy = my_energy + heal

        if my_energy > 100:
            my_energy = 100

        print('당신은 회복으로 {}의 에너지가 회복되었습니다. 당신의 체력 : {}'.format(heal, my_energy))
        print(MYIMAGE + ' ' * 11 + MONIMAGE[sel])
        energy_str = ''
        
        if my_energy < 30:
            energy_str += RED_BG + ' ' * int(my_energy / 5) + END
        else:
            energy_str += GREEN_BG + ' ' * int(my_energy / 5) + END
        energy_str += ' ' * (21 - int(my_energy / 5))
        
        if mon_energy < 30:
            energy_str += RED_BG + ' ' * int(mon_energy / 5) + END
        else:
            energy_str += GREEN_BG + ' ' * int(mon_energy / 5) + END
        print(energy_str)

 

3-6. 몬스터 차례

    damage = rd.randint(my_mons[1], my_mons[2])
    my_energy = my_energy - damage

    if my_energy < 0:
        my_energy = 0

    print('당신은 {}의 공격으로 {}의 피해를 입었습니다. 당신의 체력 : {}'.format(my_mons[0], damage, my_energy))
    print(MYIMAGE + ' ' * 11 + MONIMAGE[sel])
    energy_str = ''
    
    if my_energy < 30:
        energy_str += RED_BG + ' ' * int(my_energy / 5) + END
    else:
        energy_str += GREEN_BG + ' ' * int(my_energy / 5) + END
    energy_str += ' ' * (21 - int(my_energy / 5))

    if mon_energy < 30:
        energy_str += RED_BG + ' ' * int(mon_energy / 5) + END
    else:
        energy_str += GREEN_BG + ' ' * int(mon_energy / 5) + END
    print(energy_str)

    if my_energy <= 0:
        break

 

4-1. 승리 또는 패배에 따라 메시지를 출력한다.

if mon_energy <= 0:  # 승리
    print('{}이/가 말했습니다. "강하군"'.format(my_mons[0]))
    time.sleep(1)  # 1초 후 다음 print()가 출력됨
    print('{}이/가 [붉은보석]을 주었습니다.'.format(my_mons[0]))
else:  # 패배
    print('{}이/가 말했습니다. 하하하 상대가 안되는군'.format(my_mons[0]))
    print('{}이/가 [내 가방]을 가져갔습니다.'.format(my_mons[0]))

 

5. 결과

 

 

※ 전체 코드

from myutils import *
import random as rd
import time

# 1-1. 보물상자를 발견했다는 메시지를 출력하고 사용자가 아무 키나 누르기를 기다린다.(print, input)
print('당신은 길을 가다가 ' + YELLOW + '[보물상자]' + END + '를 발견했습니다.')
input('아무 키나 누르십시오...............')

# 1-2. 보물상자에서 랜덤으로 1개의 무기를 획득한다.(random, list)
#      각 무기는 [무기이름, 최소공격력, 최대공격력]의 데이터를 가짐
sel = rd.randint(0, 4)  # 선택 가능 weapons 개수([0] ~ [4])
weapons = [['휴지', 1, 3], ['목검', 3, 5], ['검', 5, 10], ['대포', 1, 50], ['에픽검', 50, 100]]
my_weapon = weapons[sel]  # 획득한 무기

if sel == 0:  # sel : weapons 1번째 항목, [0] : 1번째 항목의 휴지
    print('당신은 [{}]을/를 획득하엿습니다.'.format(weapons[sel][0]))
elif sel == 1:  # sel : weapons 2번째 항목, [0] : 2번째 항목의 목검
    print('당신은' + GREEN + '[{}]'.format(weapons[sel][0]) + END + '을/를 획득하엿습니다.')
elif sel == 2:  # sel : weapons 3번째 항목, [0] : 3번째 항목의 검
    print('당신은' + BLUE + '[{}]'.format(weapons[sel][0]) + END + '을/를 획득하엿습니다.')
elif sel == 3:  # sel : weapons 4번째 항목, [0] : 4번째 항목의 대포
    print('당신은' + YELLOW + '[{}]'.format(weapons[sel][0]) + END + '을/를 획득하엿습니다.')
elif sel == 4:  # sel : weapons 5번째 항목, [0] : 5번째 항목의 에픽검
    print('당신은' + MAGENTA + '[{}]'.format(weapons[sel][0]) + END + '을/를 획득하엿습니다.')

# 2-1. 길을 가다가 랜덤으로 몬스터를 만난다.(random, List)
#       각 몬스터는 [몬스터명, 최소공격력, 최대공격력]의 데이터를 가짐
MYIMAGE = '(・ิω・ิ)'
MONIMAGE = ['(;◔д◔)', 'ヘ(= ̄∇ ̄)ノ', '๑◕‿‿◕๑']
mons = [['늑대', 1, 3], ['산적', 5, 10], ['드래곤', 1, 100]]
sel = rd.randint(0, 2)  # 선택 가능 mons 개수([0] ~ [4])

if sel == 2:  # sel : mons 3번째 항목, [0] : 3번째 항목의 드래곤
    print('당신은 길을 가다가' + RED + '[{}]'.format(mons[sel][0]) + END + '을/를 만났습니다.')
else:
    print('당신은 길을 가다가' + GREEN + '[{}]'.format(mons[sel][0]) + END + '을/를 만났습니다.')
my_mons = mons[sel]  # 마주친 몬스터

# 3-1. 초기 양쪽의 에너지는 100이다.(my_energy, mon_energy에 저장한다.)
my_energy = 100
mon_energy = 100

# 3-2. 무한루프로 전투를 한다. 단, 둘 중 하나가 에너지가 0이 되면 탈출한다.(while, break)
while True:

    # 3-3. 사용자는 공격 또는 회복을 선택한다.
    user_input = input('행동을 선택하십시오.(1. 공격, 2. 회복) : ')
    while True:
        if user_input == '1' or user_input == '2':
            break

    # 3-4. 공격을 선택했다면 최소와 최대 공격력 사이로 공격을 한다.
    if user_input == '1':
        damage = rd.randint(my_weapon[1], my_weapon[2])
        mon_energy = mon_energy - damage

        print('당신은 공격으로 {}의 데미지를 입혔습니다. {}의 체력 : {}'.format(damage, my_mons[0], mon_energy))
        print(MYIMAGE + ' ' * 11 + MONIMAGE[sel])
        energy_str = ''
        
        if my_energy < 30:
            energy_str += RED_BG + ' ' * int(my_energy / 5) + END  # 에너지를 한 칸당 5로 설정하여 총 20칸으로 설정
        else:
            energy_str += GREEN_BG + ' ' * int(my_energy / 5) + END
        energy_str += ' ' * (21 - int(my_energy / 5))  # 21로 설정하지 않으면 몬스터와 나의 에너지가 붙어서 출력된다(위에서 IMAGE 출력을 11로 설정했기 때문)

        if mon_energy < 30:
            energy_str += RED_BG + ' ' * int(mon_energy / 5) + END
        else:
            energy_str += GREEN_BG + ' ' * int(mon_energy / 5) + END
        print(energy_str)

        if mon_energy <= 0:
            break

    # 3-5. 회복을 선택했다면
    if user_input == '2':
        heal = rd.randint(0, 30)
        my_energy = my_energy + heal

        if my_energy > 100:
            my_energy = 100

        print('당신은 회복으로 {}의 에너지가 회복되었습니다. 당신의 체력 : {}'.format(heal, my_energy))
        print(MYIMAGE + ' ' * 11 + MONIMAGE[sel])
        energy_str = ''
        
        if my_energy < 30:
            energy_str += RED_BG + ' ' * int(my_energy / 5) + END
        else:
            energy_str += GREEN_BG + ' ' * int(my_energy / 5) + END
        energy_str += ' ' * (21 - int(my_energy / 5))
        
        if mon_energy < 30:
            energy_str += RED_BG + ' ' * int(mon_energy / 5) + END
        else:
            energy_str += GREEN_BG + ' ' * int(mon_energy / 5) + END
        print(energy_str)

    # 3-6. 몬스터 차례
    damage = rd.randint(my_mons[1], my_mons[2])
    my_energy = my_energy - damage

    if my_energy < 0:
        my_energy = 0

    print('당신은 {}의 공격으로 {}의 피해를 입었습니다. 당신의 체력 : {}'.format(my_mons[0], damage, my_energy))
    print(MYIMAGE + ' ' * 11 + MONIMAGE[sel])
    energy_str = ''
    
    if my_energy < 30:
        energy_str += RED_BG + ' ' * int(my_energy / 5) + END
    else:
        energy_str += GREEN_BG + ' ' * int(my_energy / 5) + END
    energy_str += ' ' * (21 - int(my_energy / 5))

    if mon_energy < 30:
        energy_str += RED_BG + ' ' * int(mon_energy / 5) + END
    else:
        energy_str += GREEN_BG + ' ' * int(mon_energy / 5) + END
    print(energy_str)

    if my_energy <= 0:
        break

# 4-1. 승리 또는 패배에 따라 메시지를 출력한다.
if mon_energy <= 0:  # 승리
    print('{}이/가 말했습니다. "강하군"'.format(my_mons[0]))
    time.sleep(1)  # 1초 후 다음 print()가 출력됨
    print('{}이/가 [붉은보석]을 주었습니다.'.format(my_mons[0]))
else:  # 패배
    print('{}이/가 말했습니다. 하하하 상대가 안되는군'.format(my_mons[0]))
    print('{}이/가 [내 가방]을 가져갔습니다.'.format(my_mons[0]))

'Python' 카테고리의 다른 글

[Python] 11  (0) 2021.11.28
[Python] 10  (0) 2021.11.27
[Python] 08  (0) 2021.11.23
[Python] 07  (0) 2021.11.21
[Python] 06  (0) 2021.11.20