TIL(Today I Learned)

3월 27일 TIL - while문의 continue, break

Hyerin P. 2023. 3. 27. 21:38

개인 과제로 플레이어와 몬스터를 생성하여 1대 1으로 싸우는 상황을 파이썬으로 구현하는 것을 진행하였다. 코드를 구성하는 여러 문법 중에서도 단연 'class'와 'while'에서 많은 어려움을 겪었다. 그 중 몇가지 문제점을 말해보겠다. 첫번째로 while 문 내에서 중간에서 처음으로 다시 돌아가는 방법을 찾고자 하였다. 입력되어야 하는 번호가 아닌 번호를 입력하면 다시 처음으로 돌아가 다시 입력하는 문구가 나타나게 해야했다.

while True:
...
    else:
        while attack_input != '1' or attack_input != '2':
            print('공격 번호를 바르게 입력해주세요.')
            continue

이런 방식으로 코드를 작성하고 실행시켜 보니 continue가 가장 바깥쪽에 있는 while문으로 실행되는 게 아니라 else 안쪽에 있는 while문으로 실행되어 print가 무한반복되고 있었다. 뭘 바꿔야 할까 하고 고민한 결과 continue가 실행되기 위해선 else 밑에 있는 while문을 바꾸어줘야한다고 생각하였다. 그래서 while 대신 if로 바꿔주고 실행 시켜주니 정상적으로 작동하는 것을 알 수 있었다.

 

두번째 문법도 비슷한 상황이다. 마나가 부족할 시 마법공격을 할 수 없도록 설정해 주었다. 그런데 일반공격을 진행하고자 1을 선택하면 공격이 들어가지 않고 몬스터 차례로 돌아가버렸다.

elif player.mp < 5 and attack_input == '2':
        while True:
            print("더이상 마법공격을 할 수 없습니다.")
            print("-------------------")
            player.show_status()
            attack_input = str(input('일반공격을 진행하시겠습니까? 1.일반공격: '))
            if attack_input == '1':
               break

그래서 공격이 이루어 질 수 있게끔 공격메소드를 if절에 넣어주었다. 정상적으로 공격이 실행되나 무한반복으로 진행되었기에 추가로 if절에 break를 넣어주었다.

elif player.mp < 5 and attack_input == '2':
        while True:
            print("더이상 마법공격을 할 수 없습니다.")
            print("-------------------")
            player.show_status()
            attack_input = str(input('일반공격을 진행하시겠습니까? 1.일반공격: '))
            if attack_input == '1':
               player.attack(m)
                print("-------------------")
                player.show_status()
                m.show_status()

break를 넣어주니 의도한대로 잘 흘러갔다. 그래도 좀더 흐름을 부드럽게 해주고자 코드의 위치를 조금 수정하였다.

elif player.mp < 5 and attack_input == '2':
        print(" ")
        print("MP가 부족하여 더이상 마법공격을 할 수 없습니다.")
        while True:
            attack_input = str(input('일반공격을 진행하시겠습니까? 1.일반공격: '))
            if attack_input == '1':
                player.attack(m)
                print("-------------------")
                player.show_status()
                m.show_status()
                break
            else:
                print('숫자를 입력해 주세요.')
                continue

의도대로 진행되는 모습이다.

while문을 사용하고 다시 되돌아 가던지 넘어갈건지 설정하는 부분이 어딘지 아는 것이 중요한 것 같다. 사실 아직 while문을 적절히 사용하는 법은 잘 모르겠다. 반복문인 것을 알고 있지만 때를 알기가 어렵다. 물론 class도 쉽지 않다. 그래도 이번 연습을 통해 break와 continue의 쓰임새는 익힐 수 있었던 것 같다. 부족한 부분이 아직 많기에 다양한 상황에 맞춰 연습하는 훈련을 해야 할 것 같다.