규칙
- 컴퓨터가 0 ~ 9 사이의 서로 다른 숫자 3개 무작위로 뽑기
- 사용자는 컴퓨터가 뽑은 숫자의 값과 위치 맞추어야 함
- 컴퓨터는 사용자가 입력한 숫자 3개에 대해서 아래의 규칙대로 스트라이크(S)와 볼 (S)의 개수 알려줌
- 숫자의 값과 위치가 모두 일치하면 S
- 숫자의 값은 일치하지만 위치가 틀렸으면 B
기회 무제한. 몇 번의 시도 끝에 맞췄는지는 기록
3S 나오면 게임 종료
# 과제에 필요한 함수
generate_numbers
무작위로 0과 9 사이의 서로 다른 숫자 3개를 뽑고, 그 숫자들이 담긴 리스트를 리턴
take_guess
유저에게 숫자 3개를 반복적으로 입력받은 후, 유저가 입력한 숫자들을 리스트에 정리해서 리턴
유저가 범위에서 벗어나는 숫자를 입력하면, "범위를 벗어나는 숫자입니다. 다시 입력하세요." 메시지가 출력, 다시 입력 받기
유저가 이미 입력한 숫자를 다시 입력하면, "중복되는 숫자입니다. 다시 입력하세요." 메시지가 출력, 다시 입력 받기
take_guess 함수 : 결과적으로 리스트를 리턴해야 함
get_score
두 개의 파라미터 받음
- guesses → 유저가 뽑은 번호 3개가 담긴 리스트
- solution → 컴퓨터가 뽑은 정답 번호 3개가 담긴 리스트
두 리스트 비교해서 스트라이크 수와 볼 수를 계산, 리턴
from random import randint
def generate_numbers():
numbers = []
while len(numbers) < 3:
num = randint(0, 9)
if num not in numbers: # new_number가 numbers 리스트에 없는 경우에만 추가
numbers.append(num)
print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
return numbers
def take_guess():
print("숫자 3개를 하나씩 차례대로 입력하세요.")
new_guess = [] # 유저가 입력한 숫자 3개 보관할 리스트
while len(new_guess) < 3:
new_num = int(input("{}번째 숫자를 입력하세요: ".format(len(new_guess) + 1)))
if new_num < 0 or new_num > 9:
print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
elif new_num in new_guess:
print("중복되는 숫자입니다. 다시 입력하세요.")
else:
new_guess.append(new_num)
return new_guess
def get_score(guesses, solution): # 리스트 guesses, solution
strike_count = 0
ball_count = 0
# 스트라이크, 볼 판단
for i in range(3):
if guesses[i] == solution[i]: # guesses의 인덱스 i에 있는 숫자와 solution의 인덱스 i에 있는 숫자가 동일하면 스트라이크
strike_count += 1
elif guesses[i] in solution: # gusses의 인덱스 i에 있는 숫자가 solution 안에 있으면 볼 (solution의 인덱스 i에 있으면 안됨)
ball_count += 1
return strike_count, ball_count
# 여기서부터 게임 시작!
ANSWER = generate_numbers() # 정답 리스트 변수 선언
tries = 0 # 시도 횟수 상수 선언 (0부터 시작)
while True:
user_guess = take_guess() # 유저에게 번호 3개 입력
s, b = get_score(user_guess, ANSWER) # 스트라이크, 볼 판단
print("{}S {}B\n".format(s, b)) # *S *B 의 형태로 스트라이크 수와 볼 수 출력
tries += 1 # 시도횟수 1 늘림
if s == 3: # 만약 스트라이크 3개를 하면 반복문 종료
break
print("축하합니다. {}번 만에 세 숫자의 값과 위치를 모두 맞추셨습니다.".format(tries))
cf) 게임 시작 부분의 while 문의 조건을 True 라고 한 이유 (s != 3 로 작성하지 않은 이유)
조건 부분을 s != 3 로 하기 위해서는 s 를 미리 정의해야 함. 번거롭고 지저분하기 때문
'Language > Python' 카테고리의 다른 글
Project : 로또 시뮬레이션 (0) | 2022.08.30 |
---|---|
파일 읽고 쓰기 (0) | 2021.07.12 |
모듈 , 사용자 입력 (0) | 2021.07.12 |
데이터 (0) | 2021.07.09 |
사전 (0) | 2021.07.08 |