Nonamed Develog
[TIL][240702] 가위 바위 보 게임, 다중 반복문 본문
1. 다중 반복문의 이해
어떤 문제가 있었나?
어제 UP DOWN 게임 문제를 풀 때 재시작 여부를 묻고 그에 따라 게임을 초기화하거나 종료하는 기능을 내가 원하는 것의 의 8할 정도만 완성해서 찜찜했다. 오늘 가위 바위 보 문제를 푸는데 똑같은 조건이 있어서 이 것을 해결하고자 했다. 문제는 다중 반복문을 사용할 때 어느 위치에 루프를 설정하는지, if 문에서 continue/break를 적절하게 사용하는지가 너무 헷갈렸다. 작성한 코드에 무한 루프를 설정하면 무한으로 출력되거나 원하는 부분이 출력되지 않았다.
UP DOWN 게임 문제를 풀 때와 마찬가지로 y/n의 선택지를 주고 다시 게임을 진행할지 묻는 코드에서 y, n 이외의 입력값이 있으면 다시 y/n 선택지로 돌아가는 루프를 구현하기 어려웠다. y, n이 아닌 입력값일 때 루프는 처음부터 다시 시작하였다. 이 부분만 루프를 중간에서 시작하고 싶었지만 도저히 방법이 떠오르지 않았다.
무엇을 시도했나?
처음에는 y, n이 아닌 입력값일 때 게임이 종료된다는 안내 멘트를 넣고 종료시켰다. 하나의 루프로 반복하여 아래 코드와 같이 y, n이 아닌 입력값은 조건에서 제외했다.
re_game = input('다시 하시겠습니까? y/n: \n 다른 입력은 게임 종료')
if re_game == "y":
continue
elif re_game == "n":
print(f"게임오버! {count_victory}승 {count_draw}무 {count_defeat}패")
break
else:
print(f"게임오버! {count_victory}승 {count_draw}무 {count_defeat}패")
break
하지만 팀원들과 과제에 대해서 공유를 하는 시간을 가졌는데 감사하게도 여기서 힌트를 얻었다. 그 해법은 다중 반복문! 한 팀원의 힌트를 공유하자면 다음과 같다.
retry 변수 안에 y 가 들어가면 해당 반복문을 중단 >> 기존 반복문으로 돌아감
retry 변수 안에 n 이 들어가면 해당 반복문을 중단 >> 바깥의 조건문으로
retry 변수를 또 체크해서 이게 n 임을 확인하고 또 break >> 바깥 반복문에서까지 나가면서 게임 종료
retry 변수 안에 y와 n 중 어떤 것도 없을 시 그냥 해당 반복문을 continue 해서 재질문
다중 반복문의 루프를 이해한다면 내가 고민했던 y, n 입력을 풀 수 있을 것 같았다. 아 묻지도 따지지도 않고 바로 while True: 입력! 이해 없이 될 리가... y/n 묻는 코드에 무한 루프를 걸어봤지만 역시 처음으로 돌아가버렸다.
어떻게 해결됐는가?
힌트를 참고로 바깥 반복문이라는 개념에 대해서 고민을 했다.
while True:
computer_choice = random.choice(computer_choices)
#가위/바위/보 코드
while True:
re_game = input("다시 하시겠습니까? y/n: ").casefold()
if re_game == "y":
print()
print("<새로운 게임>")
break
elif re_game == "n":
print("\n게임을 종료합니다\n")
print("<게임 결과>")
print(f"{count_victory}승 {count_draw}무 {count_defeat}패")
break
else:
print("y 또는 n을 입력하세요\n")
continue
이런 코드에서 바깥쪽 루프를 만든다면 바깥쪽 루프가 안쪽 루프 2개를 감싸는 형태일 것이다. 바로 코드를 작성해 봤다.
import random
computer_choices = ["바위", "보", "가위"]
count_victory = 0
count_defeat = 0
count_draw = 0
while True:
computer_choice = random.choice(computer_choices)
while True:
#가위 바위 보 코드
while True:
re_game = input("다시 하시겠습니까? y/n: ").casefold()
if re_game == "y":
print()
print("<새로운 게임>")
break
elif re_game == "n":
print("\n게임을 종료합니다\n")
print("<게임 결과>")
print(f"{count_victory}승 {count_draw}무 {count_defeat}패")
break
else:
print("y 또는 n을 입력하세요\n")
continue
if re_game == "n":
break
안쪽 루프가 돌아갈 동안 바뀌지 않게 computer_choice를 바깥쪽 루프로 가져왔고, y, n 외의 입력값일 때는 안쪽 루프를 통해 재질문을 할 수 있었고, n일 경우 안쪽 루프에서 종료 후 바깥 루프도 나갈 수 있었다.
새로 알게 된 점은 무엇인가?
- 반복문 안에 반복문이 올 수 있으며 안쪽 반복문이 종료되면 바깥쪽 반복문이 돌아가는 순서다.
- 다중 반복문을 사용할 때 continue, break 논리가 맞지 않으면 파이참에서 오류 메시지가 나온다.
대소문자를 구분하지 않아도 되는 함수: .casefold() cf) 소문자 .lower(): 대문자 .upper():- 파이참에서 github 연동을 할 때 git bash에서 github의 user.name과 user.email을 입력해야 한다. 안 하면 초기 커밋에서 오류가 나온다.
- git bash에 입력
git config --global user.name "사용자 이름"
git config --global user.email 사용자 이메일
무엇을 느꼈고 내일은 무엇을 할까?
발제 시간 때 "저걸 어떻게 해?!" 했던 내 물음과 다르게 차근차근 풀다 보니 풀렸고 진짜 안 풀리는 부분은 팀원들에서 힌트를 얻어서 풀어냈다. 이제 팀 과제를 해야 하는데 강의를 들었음에도 class에 대한 이해가 부족하여 각자 개별 탐구를 해보고 팀 과제를 진행하기로 하였다. 내일은 class에 대해 집중적으로 공부하고 팀과제를 진행해 봐야겠다.
'WHAT I LEARN > TIL' 카테고리의 다른 글
[TIL][240705] hashlib, logging, sleep() (0) | 2024.07.05 |
---|---|
[TIL][240704] class, Branch(PyCharm) (0) | 2024.07.04 |
[TIL][240701] UP & DOWN Game, Code Conventions, try/except, 다중 반복문 (0) | 2024.07.01 |
[TIL][240628] requests, 웹 스크래핑(크롤링), Flask, url_for, form, Database, SQLite (0) | 2024.06.28 |
[TIL][240627] 미니 프로젝트 발표, jQuery, API(GET), FETCH (0) | 2024.06.27 |