Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL][240702] 가위 바위 보 게임, 다중 반복문 본문

WHAT I LEARN/TIL

[TIL][240702] 가위 바위 보 게임, 다중 반복문

노네임드개발자 2024. 7. 2. 21:21

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에 대해 집중적으로 공부하고 팀과제를 진행해 봐야겠다.