야구게임을 함수로 바꿔보려는데 global 쓰는 방법 말고는 없을까요??

조회수 2305회

아래는 제가 만들어본 야구게임 인데요,

import random                           

answer = random.sample(range(1,10),3)    

tr_num = 0  # 몇번 시도하였는지를 나타내는 변수
st_num = 0  # strike의 갯수를 나타내는 변수
bl_num = 0  # ball의 갯수를 나타내는 변수

print("게임을 시작합니다.")
while(st_num < 3):                  
    num = (input("숫자를 입력하세요: "))  
    if(num[0] == num[1] == num[2]):                 
        print("숫자가 중복됩니다. 다시 입력해 주세요.")  
        continue
    elif(num[0] == num[1]):
        print("숫자가 중복됩니다. 다시 입력해 주세요.")
        continue
    elif(num[0] == num[2]):
        print("숫자가 중복됩니다. 다시 입력해 주세요.")
        continue
    elif(num[1] == num[2]):
        print("숫자가 중복됩니다. 다시 입력해 주세요.")
        continue
    else:                                           
        pass
    st_num = 0                   
    bl_num = 0

    for i in range(0,3):       
        for j in range(0,3):    
            if(num[i] == str(answer[j]) and i == j):
                st_num += 1               
            elif(num[i] == str(answer[j]) and i != j):
                bl_num += 1    
    print(st_num, "strike", bl_num, "ball")
    tr_num += 1             
print(tr_num,"번 만에 성공하셨습니다.")   

여기서!! (1)세 자리 숫자 안에 같은 숫자가 존재하는지 판단하는 부분이랑 (2)사용자가 입력한 숫자와 정답을 비교하는 부분을 함수로 바꿔보려고 합니다.

제가 (1)을 해결한 방법은,

def same_num():
    global result
    if (num[0] == num[1] == num[2]) or (num[0] == num[1]) or (num[0] == num[2]) or (num[1] == num[2]):
        result = False
    else:
        result = True

이렇게 해서 (1)에서는 같은 숫자가 있는지를 따진 결과를 나타내주는 조건(result 변수)를 만들어서 풀려고 했습니다.

중복되는 숫자가 있으면 조건 result를 False로 받아 나중에 if result = False면 밖의 while문에서 continue 되서 다시 사용자에게 숫자를 받도록 하는 의도입니다.

그런데 여기서 아시다시피 함수 밖에서 result = True로 해놔서, 함수 내에서 아무리 결과 값에 따라 result가 False이든 True이든 result라는 값이 할당이 안되서 에러가 나서 결국 global를 써서 밖의 result 변수와 연결되게 했습니다.

그런데 global을 쓰는 코딩은 상당히 안좋은 코딩이고 기피해야한다고 해서요 ... global을 안쓰고 이 문제를 해결할 수 있는 방법은 없을까요??

(2) 입력한 숫자와 정답을 비교하는 부분을 함수로 바꿀만한 아이디어도 잘 안떠오르네요..

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 굳이 global 변수를 쓰지 않고, same_num 함수가 true/false를 반환하면 될 것 같아요.

    
    def same_num(num):
        if (num[0] == num[1] == num[2]) or (num[0] == num[1]) or (num[0] == num[2]) or (num[1] == num[2]):
            return True
        else:
            return False   
    
    # ...
    
    while(st_num < 3):                  
        num = (input("숫자를 입력하세요: "))  
        if same_num(num):
            print("숫자가 중복됩니다. 다시 입력해 주세요.")
            continue
    
    # ...
    
    

    이런식으로요. same_num 함수에 개선할 점이 보입니다.

    입력값에 중복이 있는지 확인하려면 len(set(num)) == len(num) 을 이용하세요. set 함수는 iterable(리스트나 스트링과 같이 줄줄이 연결된 데이터형)의 중복을 제거해줍니다.

    또, 기왕이면 숫자를 3개만 입력했는지 검사하는 로직도 있으면 좋겠지요?

    ex)

    import random
    
    
    def same_num(nums):
        return not (len(set(nums)) == len(nums) == 3)
    
    
    answer = random.sample(range(1, 10), 3)
    
    tr_num = 0  # 몇번 시도하였는지를 나타내는 변수
    st_num = 0  # strike의 갯수를 나타내는 변수
    bl_num = 0  # ball의 갯수를 나타내는 변수
    
    print("게임을 시작합니다.")
    while (st_num < 3):
        num = (input("숫자를 입력하세요: "))
        if same_num(num):
            print("숫자가 중복됩니다. 다시 입력해 주세요.")
            continue
        st_num = 0
        bl_num = 0
    
        for i in range(0, 3):
            for j in range(0, 3):
                if (num[i] == str(answer[j]) and i == j):
                    st_num += 1
                elif (num[i] == str(answer[j]) and i != j):
                    bl_num += 1
        print(st_num, "strike", bl_num, "ball")
        tr_num += 1
    print(tr_num, "번 만에 성공하셨습니다.")
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)