본문 바로가기
코딩공부/Python

[python]숫자야구 게임 구현해보기 (허접함주의) / TIL_220907

by Dong_Devlog 2022. 9. 7.
숫자야구 게임 구현해보기

 

혼자서 겨우 짜 본 완성 코드

import random

N = int(input("숫자야구 게임을 몇 자리 숫자로 할 지 입력하세요 : "))

random_num = random.sample([1, 2, 3, 4, 5, 6, 7, 8, 9], N)
cnt = 0
O = 0

print(random_num)

while True:
    try:
        answer_num = list(map(int, input("[exit를 입력하시면 게임이 종료됩니다] 숫자입력 : ").split()))
        cnt += 1
        S = 0
        B = 0

        for i, j in zip(random_num, answer_num):    # S 스트라이크 값
            if i == j:
                S += 1

        B = (N * 2) - len(list(set(random_num + answer_num)))     # B 볼 값

        if S == 0 and B == 0:   # O 아웃 값
            O += 1

        print(f"S={S} B={(B - S)} O={O}")

        if O == 3:
            print("삼진아웃, 다시 시도해보세요")
            break

        if S == N:
            print(f"정답을 맞추기까지 입력한 횟수 : {cnt}")
            break

    except:
        print("게임이 종료되었습니다.")
        break

 

random.sample() 랜덤 함수로 N개의 임의의 숫자를 리스트로 반환한다.

보통 숫자야구 게임은 3자리 숫자로 함

N = int(input("숫자야구 게임을 몇 자리 숫자로 할 지 입력하세요 : "))
random_num = random.sample([1, 2, 3, 4, 5, 6, 7, 8, 9], N)

 

무한루프 반복문으로 연속해서 숫자를 입력할 수 있고 try, except를 통해 실수로 잘못 입력하거나, 게임을 그만하고 싶을 때 게임이 종료되도록 만듬

while True:
    try:
        answer_num = list(map(int, input("[exit를 입력하시면 게임이 종료됩니다] 숫자입력 : ").split()))
        
    except:
        print("게임이 종료되었습니다.")
        break

 

zip() 함수로 같은 길이의 리스트를 같은 위치에 있는 값끼리 묶어줄 수 있다.

ex) random_num = [1, 2, 3] / answer_num = [1, 3, 5] 일 경우 zip함수에 넣어주면

     (1, 1)

     (2, 3)

     (3, 5)

     의 값을 같게 된다.

묶어준 후 값이 같으면 스트라이크 + 1씩 반복

        for i, j in zip(random_num, answer_num):    # S 스트라이크 값
            if i == j:
                S += 1

 

볼 값은 값은 같지만 위치가 다른 경우 이기 때문에

2개의 리스트 값을 더한 후 set 함수로 중복값을 제거 한 후 다시 리스트로 변환해주고 리스트의 길이를 구하면 중복 값이 몇개 였는지 구할 수 있음

        B = (N * 2) - len(list(set(random_num + answer_num)))     # B 볼 값

 

아웃값은 스트라이크와 볼이 0인 경우에 +1

        if S == 0 and B == 0:   # O 아웃 값
            O += 1

 

삼진 아웃일 경우 break를 통해 종료

        if O == 3:
            print("삼진아웃, 다시 시도해보세요")
            break

 

스트라이크 개수가 N가 일치하면 종료 !

        if S == N:
            print(f"정답을 맞추기까지 입력한 횟수 : {cnt}")
            break

댓글