[코드잇] 파이썬 응용하기
[미니 프로젝트]
본 프로젝트는 모듈, 사용자 정의 함수 개념을 적용해 숫자 야구 게임을 하는 것으로 코드잇 파이썬 응용하기 과정에 나와 있다.
generate_numbers()
from random import randint
def generate_numbers():
numbers = []
while len(numbers) < 3: #리스트에 값이 3개가 들어갈 때까지 실행
num = randint(0,9)
if num not in numbers: #리스트에 숫자가 없는 경우에만 추가(중복 방지)
numbers.append(num)
print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
return numbers
테스트 결과
take_guess()
def take_guess():
print("숫자 3개를 하나씩 차례대로 입력하세요.")
new_guess = []
cnt = 1
while len(new_guess) < 3:
num = int(input(f"{cnt}번째 숫자를 입력하세요: "))
if num < 0 or num > 9:
print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
elif num in new_guess:
print("중복되는 숫자입니다. 다시 입력하세요.")
else:
new_guess.append(num)
cnt += 1
return new_guess
3가지 숫자를 입력받을 때 각각의 변수를 생성하면 조건문도 반복해서 써야하므로 포매팅을 이용해 조건문은 한 번만 나오도록 했다.
while문 전에 cnt를 만들어 몇 번째 숫자인지 나타내고, 입력받은 값이 new_guess 리스트에 담기면 1씩 증가하도록 했다.
+코드잇에서는 cnt 대신 포맷에 len(new_guess) + 1
를 썼다.
테스트 결과
get_score(guesses, solution)
def get_score(guesses, solution):
strike_count = 0
ball_count = 0
for i in range(len(guesses)):
if guesses[i] == solution[i]: #같은 위치에 같은 숫자면 +1 Strike
strike_count += 1
elif guesses[i] in solution: #그렇지는 않지만 사용자가 입력한 숫자가 컴퓨터가 뽑은 숫자 중에 있다면 +1 ball
ball_count += 1
return strike_count, ball_count
테스트 결과
from random import randint
def generate_numbers():
numbers = []
while len(numbers) < 3:
num = randint(0,9)
if num not in numbers:
numbers.append(num)
print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
return numbers
def take_guess():
print("숫자 3개를 하나씩 차례대로 입력하세요.")
new_guess = []
cnt = 1
while len(new_guess) < 3:
num = int(input(f"{cnt}번째 숫자를 입력하세요: "))
if num < 0 or num > 9:
print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
elif num in new_guess:
print("중복되는 숫자입니다. 다시 입력하세요.")
else:
new_guess.append(num)
cnt += 1
return new_guess
def get_score(guesses, solution):
strike_count = 0
ball_count = 0
for i in range(len(guesses)):
if guesses[i] == solution[i]:
strike_count += 1
elif guesses[i] in solution:
ball_count += 1
return strike_count, ball_count
# 여기서부터 게임 시작!
ANSWER = generate_numbers()
tries = 0
while True:
guesses = take_guess()
s, b = get_score(guesses, ANSWER)
print(f"{s}S {b}B\n")
tries += 1
if s == 3:
break
print("축하합니다. {}번 만에 숫자 3개의 값과 위치를 모두 맞추셨습니다.".format(tries))
시도 횟수는 tries 변수에 담아 한 번 숫자 3개를 입력받을 때마다 1씩 증가 시킨다.
그리고 get_score()
함수로 사용자가 입력한 숫자와 컴퓨터 숫자 3개를 비교해 스트라이크와 볼 갯수를 알려준다.
스트라이크가 3이 되었을 때는 while문을 끝내고 시도 횟수를 알려준다.
숫자 야구 실행
오 두 번 만에 맞았다👀
첫 번째 시도에서 [3, 5, 6]을 입력했을 때 1S, 1B이었다.
3은 맞고 6은 위치가 다르다고 생각해 6을 두 번째 숫자로 입력하고 마지막은 그냥 생각나는 숫자로 7을 입력했는데 맞았다...!
후기
파이썬에 대한 기본 개념만 있으면 누구나 간단하게 만들 수 있다. 별거 아니지만 이론이나 강의를 따라서 코딩하는 것보다는 조금이라도 머리를 쓰는 게 훨씬 도움이 되는 것 같다. 숫자 야구는 지난번 로또 시뮬레이션과는 다르게 파이썬 콘솔창으로 실행이 돼서 쉽게 확인할 수 있지만 이것도 html, css, JS를 통해 좀 더 시각적인 재미도 있으면 좋을 것 같다.