from IPython.core.display import display, HTML
display(HTML("<style>.container { width:1200px !important; }</style>"))
규칙
컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑습니다. 예를 들어서 컴퓨터가 5, 2, 3을 뽑을 수도 있고 6, 7, 4를 뽑을 수도 있는 거죠.
- 사용자는 컴퓨터가 뽑은 숫자의 값과 위치를 맞추어야 합니다.
- 컴퓨터는 사용자가 입력한 숫자 3개에 대해서, 아래의 규칙대로 스트라이크(S)와 볼(B)의 개수를 알려줍니다.
- 숫자의 값과 위치가 모두 일치하면 S입니다.
- 숫자의 값은 일치하지만 위치가 틀렸으면 B입니다.
- 예를 들어 컴퓨터가 1, 2, 3을 뽑았다고 가정합시다. 사용자가 1, 3, 5를 입력하면, 1S(1의 값과 위치가 일치) 1B(3의 값만 일치)입니다.
- 기회는 무제한입니다. 하지만 몇 번의 시도 끝에 맞췄는지 기록됩니다.
- 3S(숫자 3개의 값과 위치를 모두 맞춘 경우)가 나오면 게임이 끝납니다.
진행 방식
- "0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다."가 출력됩니다.
- "숫자 3개를 하나씩 차례대로 입력하세요."가 출력됩니다.
- "1번째 숫자를 입력하세요: "가 출력되고, 사용자로부터 입력을 받습니다. 마찬가지로 "2번째 숫자를 입력하세요: "와 "3번째 숫자를 입력하세요: "가 출력되고, 사용자로부터 각각 입력을 받습니다. 만약 사용자가 중복되는 숫자를 입력하거나 범위에서 벗어나는 숫자를 입력하면, 사용자로부터 입력을 다시 받습니다.
- 사용자가 올바르게 숫자 3개를 입력하면, 규칙에 따라 "S B"가 출력됩니다.
- 3S가 아닌 경우, 2번부터 다시 진행합니다.
- 사용자가 3S를 달성하면, "축하합니다. *번 만에 숫자 3개의 값과 위치를 모두 맞추셨습니다."가 출력됩니다. 그리고 게임은 종료됩니다.
1. 먼저 정답 숫자 3개를 뽑아 주는 generate_numbers 함수를 작성할 것입니다.¶
generate_numbers
무작위로 0과 9 사이의 서로 다른 숫자 3개를 뽑고, 그 숫자들이 담긴 리스트를 리턴합니다.
예를 들어서 아래 코드를 실행하면,
print(generate_numbers())
이런 결과가 나올 수 있습니다.
[5, 9, 2]
from random import randint
def generate_numbers():
numbers = []
for i in range(3):
while True:
i = randint(0,9)
if i not in numbers:
numbers.append(i)
break
print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
return numbers
print(generate_numbers())
0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다. [2, 5, 9]
이번에는 유저에게 숫자 3개를 입력받는 take_guess 함수를 작성하겠습니다.¶
take_guess
유저에게 숫자 3개를 반복적으로 입력받은 후, 유저가 입력한 숫자들을 리스트에 정리해서 리턴합니다.
예를 들어서 아래 코드를 실행하면,
print(take_guess())
이런 출력 결과가 나올 수 있습니다.
>
- 숫자 3개를 하나씩 차례대로 입력하세요.
- 1번째 숫자를 입력하세요: 5
- 2번째 숫자를 입력하세요: 11
- 범위를 벗어나는 숫자입니다. 다시 입력하세요.
- 2번째 숫자를 입력하세요: 7
- 3번째 숫자를 입력하세요: 5
- 중복되는 숫자입니다. 다시 입력하세요.
- 3번째 숫자를 입력하세요: 3
- [5, 7, 3]
보시다시피 유저가 범위에서 벗어나는 숫자를 입력하면, "범위를 벗어나는 숫자입니다. 다시 입력하세요."라는 메시지가 출력되고 다시 입력을 받습니다. 마찬가지로 유저가 이미 입력한 숫자를 다시 입력하면, "중복되는 숫자입니다. 다시 입력하세요."라는 메시지가 출력 되고 다시 입력을 받습니다.
take_guess 함수는 결과적으로 리스트를 리턴해야 합니다.
def take_guess():
new_guess = []
print("숫자 3개를 하나씩 차례대로 입력하세요.")
for i in range(3):
while True:
num = int(input(f"{i}번째 숫자를 입력하세요:"))
if num < 0 or num > 9:
print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
else:
if num in new_guess:
print("중복되는 숫자입니다. 다시 입력하세요.")
else:
new_guess.append(num)
break
return new_guess
print(take_guess())
숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:-1 범위를 벗어나는 숫자입니다. 다시 입력하세요. 0번째 숫자를 입력하세요:1 1번째 숫자를 입력하세요:1 중복되는 숫자입니다. 다시 입력하세요. 1번째 숫자를 입력하세요:1 중복되는 숫자입니다. 다시 입력하세요. 1번째 숫자를 입력하세요:2 2번째 숫자를 입력하세요:10 범위를 벗어나는 숫자입니다. 다시 입력하세요. 2번째 숫자를 입력하세요:9 [1, 2, 9]
이제 스트라이크 수와 볼 수를 알려 주는 get_score 함수를 작성할 것입니다.¶
get_score 이 함수는 두 개의 파라미터를 받는데요.
- guesses → 유저가 뽑은 번호 3개가 담긴 리스트
- solution → 컴퓨터가 뽑은 정답 번호 3개가 담긴 리스트
두 리스트를 비교해서 스트라이크 수와 볼 수를 계산하고 리턴합니다.
def get_score(guess, solution):
strike_count = 0
ball_count = 0
for i in range(len(guess)):
for j in range(len(solution)):
if guess[i] == solution[j]:
if i == j:
strike_count += 1
else:
ball_count +=1
return strike_count, ball_count
# 테스트
s_1, b_1 = get_score([2, 7, 4], [2, 4, 7])
print(s_1, b_1)
s_2, b_2 = get_score([7, 2, 4], [2, 4, 7])
print(s_2, b_2)
s_3, b_3 = get_score([0, 4, 7], [2, 4, 7])
print(s_3, b_3)
s_4, b_4 = get_score([2, 4, 7], [2, 4, 7])
print(s_4, b_4)
1 2 0 3 2 0 3 0
이제 이 함수들을 활용해서 숫자 야구 게임을 완성합시다.¶
from random import randint
def generate_numbers():
numbers = []
for i in range(3):
while True:
i = randint(0,9)
if i not in numbers:
numbers.append(i)
break
return numbers
def take_guess():
new_guess = []
print("숫자 3개를 하나씩 차례대로 입력하세요.")
for i in range(3):
while True:
num = int(input(f"{i}번째 숫자를 입력하세요:"))
if num < 0 or num > 9:
print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
else:
if num in new_guess:
print("중복되는 숫자입니다. 다시 입력하세요.")
else:
new_guess.append(num)
break
return new_guess
def get_score(guess, solution):
strike_count = 0
ball_count = 0
for i in range(len(guess)):
for j in range(len(solution)):
if guess[i] == solution[j]:
if i == j:
strike_count += 1
else:
ball_count +=1
return strike_count, ball_count
# 여기서부터 게임 시작!
ANSWER = generate_numbers()
tries = 0
while True:
chance = take_guess()
result = get_score(chance,ANSWER)
print(f"{result[0]}S {result[1]}B")
tries += 1
if get_score(chance,ANSWER) == (3,0):
break
print()
print("축하합니다. {}번 만에 숫자 3개의 값과 위치를 모두 맞추셨습니다.".format(tries))
숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:0 1번째 숫자를 입력하세요:1 2번째 숫자를 입력하세요:2 0S 1B 숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:2 1번째 숫자를 입력하세요:3 2번째 숫자를 입력하세요:4 0S 1B 숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:2 1번째 숫자를 입력하세요:3 2번째 숫자를 입력하세요:5 0S 1B 숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:1 1번째 숫자를 입력하세요:2 2번째 숫자를 입력하세요:3 0S 1B 숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:2 1번째 숫자를 입력하세요:6 2번째 숫자를 입력하세요:7 0S 0B 숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:0 1번째 숫자를 입력하세요:3 2번째 숫자를 입력하세요:8 0S 3B 숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:3 1번째 숫자를 입력하세요:0 2번째 숫자를 입력하세요:8 1S 2B 숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:8 1번째 숫자를 입력하세요:0 2번째 숫자를 입력하세요:3 0S 3B 숫자 3개를 하나씩 차례대로 입력하세요. 0번째 숫자를 입력하세요:3 1번째 숫자를 입력하세요:8 2번째 숫자를 입력하세요:0 3S 0B 축하합니다. 9번 만에 숫자 3개의 값과 위치를 모두 맞추셨습니다.
모범 답안
from random import randint
def generate_numbers():
numbers = []
while len(numbers) < 3:
new_number = randint(0, 9)
if new_number not in numbers:
numbers.append(new_number)
return numbers
def take_guess():
new_guess = []
while len(new_guess) < 3:
num = int(input("{}번째 수를 입력하세요: ".format(len(new_guess) + 1)))
if num < 0 or num > 9:
print("0에서 9까지의 수를 입력해 주세요!")
elif num in new_guess:
print("중복되는 숫자입니다. 다시 입력하세요.")
else:
new_guess.append(num)
return new_guess
def get_score(guess, answer_list):
strike_count = 0
ball_count = 0
for i in range(3):
if guess[i] == answer_list[i]:
strike_count += 1
elif guess[i] in answer_list:
ball_count += 1
return strike_count, ball_count
- 여기서부터 게임 시작! ANSWER = generate_numbers() tries = 0
while True:
user_guess = take_guess()
s, b = get_score(user_guess, ANSWER)
print("{}S {}B\n".format(s, b))
tries += 1
if s == 3:
break
print("축하합니다. {}번 만에 세 숫자의 값과 위치를 모두 맞추셨습니다.".format(tries))
'코드잇' 카테고리의 다른 글
[코드잇 & 머신러닝] 판다스 (0) | 2021.02.02 |
---|---|
[코드잇 & 머신러닝] 넘파이 (0) | 2021.02.02 |
[코드잇] 로또 시뮬레이션 (0) | 2021.02.01 |
[코드잇] 단어장 만들기>단어 퀴즈>고급 단어장 (1) | 2021.01.30 |
[코드잇] 코딩에 빠진 닭 (0) | 2021.01.27 |