log.Sehee

TIL / 3/28 / Python teminal game, time.sleep(), While문 ... 본문

TLC - 5 ⛺/Today I Learn

TIL / 3/28 / Python teminal game, time.sleep(), While문 ...

Sehe_e 2023. 3. 29. 02:40

문제

 

1)  while문 속의 if문으로 플레이어가 어떤 공격을 할 지 선택지를 주는 과정에서 입력값을 두 번 넣어주어야 else 처리가 되는 오류가 발생하였다.

print(f'{p.name}의 선공! \n1.일반공격 2.마법공격(MP:-50) / 번호를 입력해주세요!')
    if input() == '1':		# 위 1.일반공격의 1이 문자열로 되어있기 때문에 문자열로 넣어주어야 맞다
        p.attack(m)
    elif input() == '2':
        p.magic_attack(m)
    else:
        print('잘못 입력하셨습니다.')

 

2) while문 속에 '몬스터가 출현하였다!' 같은 불필요한 요소들이 반복되게 만들어졌다.

while True :
    print(f"{p.name}의 앞에 서경몬이 나타났다!")
    p.show_status(m)
    .....
    ....
    print(f"{p.name}의 앞에 서경몬이 나타났다!")
    p.show_status(m)
    # 반복

 

 

3) 플레이어의 MP가 모자랄 시, 마법 공격이 불가능하면서 공격방식을 재선택하게 만들어주어야 하는데 그대로 몬스터의 공격으로 넘어가버리는 오류가 발생

print(f'{p.name}의 선공! \n1.일반공격 2.마법공격(MP:-50) / 번호를 입력해주세요!')
    choice = input()
    if choice == '1':
        p.attack(m)
    elif choice == '2':
        p.magic_attack(m)
    else:
        print('잘못 입력하셨습니다.')
    print('서경몬의 들레 소환술! 들레가 할퀴기를 시전했다!')
    m.attack(p)

 

4) while문의 종료방법과 종료멘트의 출력 방법을 찾지 못했음

 

5) 플레이어나 몬스터의 hp가 0이 되면 게임이 종료된다는 if문이 while문 제일 아래 깔려있어 hp가 0가 되어도 attack, magic_attack 함수가 출력하는 print문만 출력될 뿐 플레이어나 몬스터의 해당 턴 공격이 종료된 후 게임이 종료되는 오류가 발생

 

6) print문이 전체적으로 뭉텅이지게 출력되면서 가독성이 떨어짐, 동시에 출력속도가 너무 빨라서 time.sleep 함수 사용을 시도했지만 print문 바로 전 사이사이 넣어주기에는 코드가 너무 더러워질 것 같아서 고민함

 


해결

 

2023.03.28 - [TLC - 5 ⛺/Today I Learn] - TIL / 3/28 / Python Class, MiniGame

어제의 인스턴스, 클래스의 지정이 잘못되어 함수에서 출력이 잘못되었음을 깨달았다.

p = Character(ment_1(input('당신의 이름을 알려주세요 : ')), 1000, 55, 65, 300)
m = Character("들레", 1000, 55, 0, 0)

이런 식으로 인스턴스는 한 번만 선언해주며 뒤에 값을 넣어주는 것이라고 한다.

 

1)  while문 속의 if문으로 플레이어가 어떤 공격을 할 지 선택지를 주는 과정에서 입력값을 두 번 넣어주어야 else 처리가 되는 오류가 발생하였다.

해결방법

: input() 함수를 변수 안에 넣음으로써 한 번만 선언한 것으로 만들어 입력값 하나만으로 input을 두 번 실행하는 결과를 만들어냈다. 변수라는 것은 이렇게 사용한다는 것을 다시 한 번 깨닫게 되었다.

print(f'{p.name}의 선공! \n1.일반공격 2.마법공격(MP:-50) / 번호를 입력해주세요!')
    choice = input()
    if choice == '1':
        p.attack(m)
    elif choice == '2':
        p.magic_attack(m)
    else:
        print('잘못 입력하셨습니다.')

 

2) while문 속에 '몬스터가 출현하였다!' 같은 불필요한 요소들이 반복되게 만들어졌다.

해결방법

: while문 속에는 다시 반복되어야만 하는 문장들만 넣음으로써 계속 돌아가게 만드는 구조이기 때문에 '몬스터가 출현하였다!' 같은 불필요한 print문은 while문 실행 바로 윗줄에 넣어주면 되는 문제였다.

print(f"{p.name}의 앞에 들레가 나타났다!")

while True :
	# ... 반복할 문장들

 

3) 플레이어의 MP가 모자랄 시, 마법 공격이 불가능하면서 공격방식을 재선택하게 만들어주어야 하는데 그대로 몬스터의 공격으로 넘어가버리는 오류가 발생

해결방법

: elif에 if p.mp == 0 : continue 를 추가해주었더니 status로 

ment_1(print(f'{p.name}의 선공! \n1.일반공격 2.마법공격(MP:-50) / 번호를 입력해주세요!'))
    choice = input()
    if choice == '1':
        p.attack(m)
    elif choice == '2':
        p.magic_attack(m)
        if p.mp == 0 : continue
    else:
        print('잘못 입력하셨습니다.')
        continue

 

4) while문의 종료방법과 종료멘트의 출력 방법을 찾지 못했음

해결방법

: while문의 실행 조건을 True로 설정했었는데 플레이어와 몬스터의 피가 0보다 클 때 로 실행조건을 바꾸고 if문으로 플레이어의 피가 0 일 때, elif 몬스터의 피가 0일 때 break를 걸어주니 종료가 제대로 실행되었다.

while p.hp or m.hp > 0 :
	...
    ment_1(print(f'{p.name}의 선공! \n1.일반공격 2.마법공격(MP:-50) / 번호를 입력해주세요!'))
    ...
    if m.hp == 0 :
        ment_1(print(f"{p.name}이(가) 들레를 이겼다!"))
        break
        
    ment_1(print(f'들레의 할퀴기! {p.name}은(는) 얌전히 맞아주었다!'))
    m.attack(p)
	
    if p.hp == 0 :
        ment_1(print(f"{p.name}이(가) 들레에게 당했다!"))
        break

 

5) 플레이어나 몬스터의 hp가 0이 되면 게임이 종료된다는 if문이 while문 제일 아래 깔려있어 hp가 0가 되어도 attack, magic_attack 함수가 출력하는 print문만 출력될 뿐 플레이어나 몬스터의 해당 턴 공격이 종료된 후 게임이 종료되는 오류가 발생

해결방법

: 위와 같이 플레이어의 공격에 의해 몬스터의 피가 0이 될 경우를 상정해 먼저 if문을 사용해주고 그 뒤 몬스터의 공격을 넣어준다. 그 후 플레이어의 피가 0가 될 경우의 분기문을 작성한다.

 

6) print문이 전체적으로 뭉텅이지게 출력되면서 가독성이 떨어짐, 동시에 출력속도가 너무 빨라서 time.sleep 함수 사용을 시도했지만 print문 바로 전 사이사이 넣어주기에는 코드가 너무 더러워질 것 같아서 고민함

해결방법

: ment_1 이라는 함수를 만들어 time.sleep(1)과 (3)을 각각 만들어주었다.  print문을 ment_1, ment_3 함수로 감싸주어 그림은 조금 더 지연되게, 문장은 조금 더 빨리 지나가게 만들어주었다.

# 멘트의 전체적인 딜레이 타임 조절
def ment_1(a) :
    time.sleep(1)
    return a

def ment_3(b) :
    time.sleep(3)
    return b

...

ment_1(print("\n당신은 길을 걷다가 길냥이를 발견하고 헤벌레 다가갑니다..."))
ment_1(print("\n하지만 귀여운 길냥이에게 눈이 멀어 공명의 함정에 빠지게 됩니다!"))
ment_3(print(""" 

 .∧_∧   ∧_∧.
(`・ω・)つ)゜Д゜)・゜
(つ    r⊂ ⊂)'
|  _つ ⊂_⊂ノ
`し´
"""))

 


 

배운 점

 

- 거의 클래스의 A-Z... 인스턴스를 선언하고 클래스 뒤에 튜플로 선언해야 한다는 점까지 알게되었다.

- while문을 어떻게 사용해야할지 감이 조금 잡힌 것 같다. 꼭 반복해야 할 문장만을 넣고 아닌 문장들은 변수에 집어넣은 뒤 바깥에서 선언하고 넣어주거나 잘 골라서 넣어야 한다는 점.. 그리고 실행조건도 신중히 정해야 한다는 점도  알게되었다.

- input()이 두 번 들어가면 값을 두 번 받게된다는.. 알고들으면 당연하지만 코드로 쓸 때는 이게 왜이러지 싶은 오류를 새삼 알게되었다. 앞으로 input을 if문으로 쓸 경우에는 거의 변수에 넣어서 사용할 것 같다

 

 

Comments