-
3월 28일 TIL - while문, breakTIL(Today I Learned) 2023. 3. 28. 16:34
오늘 해결해야 할 문제는 플레이어가 죽은 후에 다시 도전할 수 있는 기회가 주어지고 다시 플레이할 수 있도록 코드를 짜는 것이다. 처음 기능을 넣기 전에는 다음과 같이 몬스터와 플레이어 중 한 쪽의 hp가 0이 되면 게임이 끝나는 형식이었다. 하지만 여기에 코드를 붙여 다시 시작할 수 있도록 진행하였다.
while True: ... if m.hp == 0: break time.sleep(2) # 몬스터의 공격 print(" ") print("-------------------") print(f"{m.name}이(가) 공격을 시작하였습니다.") m.attack(player) print("-------------------") player.show_status() m.show_status() if player.hp == 0: break # 전투 결과 print("-------------------") if player.hp == 0: print('전투에서 패배하였습니다.') else : print('축하합니다! 전투에서 승리하였습니다.')
기존에 while문에 있던 플레이어나 몬스터의 hp가 0이 될때의 if 절들을 없애고 새롭게 하나의 if 절을 추가하였다. if 절은 플레이어가 패배하였을 시만 다시 시작할 수 있도록 짜보았다. 이렇게 코드를 만드니 계속해서 게임을 진행할 수 있었지만 다시 시작이 되도 hp는 회복되지 않은 상태로 재시작되는 문제점이 발생하였다. 또한 원래 몬스터 공격전에 있던 if절을 제거하고 새로 만드니 몬스터 hp가 0이 되어도 몬스터가 공격을 실행하는 문제가 생겼다.
if player.hp == 0: print('전투에서 패배하였습니다.') ready = input('다시 도전하시겠습니까? 예/아니오: ') if ready == '예': continue else: break else: print('축하합니다! 전투에서 승리하였습니다.') break
첫번째 문제를 해결하기 위해 플레이어와 몬스터의 hp를 추가해 주었다. 두번째 문제를 해결하기 위해선 원래의 코드를 가져와 몬스터 hp가 0이되는 if절을 몬스터의 공격 전으로 이동해주었다.
if m.hp == 0: print('축하합니다! 전투에서 승리하였습니다.') break time.sleep(2) # 몬스터의 공격 print(" ") print("-------------------") print(f"{m.name}이(가) 공격을 시작하였습니다.") m.attack(player) print("-------------------") player.show_status() m.show_status() if player.hp == 0: print("-------------------") print('전투에서 패배하였습니다. 다시 시작하시겠습니까?\n 1.예 2.아니오') answer = str(input('')) if answer == '1' or '예': player.hp = hp m.hp = 100 continue else: break
그런데 여기서 또 다른 문제점이 발견되었다. if절에 break를 거는 장치를 해줬음에도 게임을 나가지 않고 다시금 반복되었다. break가 왜 제 역할을 못하는 것일까? 혹시 상세한 조건을 설정해 주지 않아서 그런건가? 싶어서 else 대신 elif로 새로운 조건을 부여하였다.
# 전투 결과 - 몬스터 승리 if player.hp == 0: time.sleep(1) print("------------------------") print('전투에서 패배하였습니다. 다시 시작하시겠습니까?\n 1.예 2.아니오') answer = str(input('')) if answer == '1' or answer == '예': player.hp = hp player.mp = mp m.hp = 100 continue elif answer == '2' or answer == '아니오': break else: break
(혹시 몰라 else절도 break를 걸어두었다)
이렇게 조건을 걸어두니 다행히 잘 작동하였다. 오늘 배운 점은 코드는 위에서부터 작동된다... 흐름이 꽤나 중요하다. 그리고 이중반복문이나 여러겹이 있을 때 빠져나오고 싶다면 break 설정을 잘 해주어야 한다는 것이다. 빠져나오는 방법들을 찾아보면서 변수를 이용하여 이중반복문을 빠져나오는 방법을 발견하였다. 여기서 쓰이진 않았지만 브레이크를 주고싶을 때 감싸고 있는 코드들에 따라 복잡할 수도 간단할 수도 있다는 것을 깨달았다. 언젠간 이중반복문을 사용하면서 브레이크를 쓸날이 또 오겠지만 오늘 같은 문제는 발생하지 않았으면 한다. 아자아자
'TIL(Today I Learned)' 카테고리의 다른 글
3월 30일 TIL - 지역변수와 전역변수 (0) 2023.03.31 3월 29일 TIL - 최빈값 구하기 (0) 2023.03.29 3월 27일 TIL - while문의 continue, break (0) 2023.03.27 3월 24일 TIL - if문 or (0) 2023.03.24 3월 23일 TIL -try, except문 (0) 2023.03.23