숫자 야구 게임

숫자 야구 게임은 연역적 논리 게임으로 컴퓨터가 1부터 9까지 중복되지 않은 3자리 비밀 숫자를 무작위로 뽑고, 플레이어는 3자리 비밀 숫자를 맞추는 게임입니다. 3자리 비밀 숫자 중 위치와 숫자까지 맞추면 스트라이크, 숫자만 맞추며 볼, 위치와 숫자 모두 맞추지 못했다면 노볼입니다.

예)

숫자 야구 게임    
컴퓨터 123 “123”은 비밀 숫자로 플레이어는 알 수 없습니다.
플레이어 145 1 스트라이크
플레이어 415 1 볼
플레이어 412 2 볼
플레이어 321 1스트라이크, 2 볼
플레이어 456 0 볼

10번 안에 비밀 숫자를 맞추면(3 스트라이크) 플레이어가 이기는 게임입니다.

1. 비밀 숫자 만들기

[파이썬-의사 난수 생성] https://docs.python.org/ko/3/library/random.html

  • random.randint(a,b) : a <= N <= b 를 만족하는 임의의 정수 N을 반환합니다.
import random

secret_number = random.randint(1,9)
print(secret_number)
2

3자리 비밀 숫자를 만드는 다양한 방법

  • random.sample() 사용
    random.sample(list, k) : list에 있는 목록 중 k길이의 list를 반환합니다.
import random
secret_number = random.sample(range(1,10),3) # range()
#secret_number = random.sample([1,2,3,4,5,6,7,8,9], 3)
print(secret_number)
[2, 9, 1]
  • in 연산자를 이용하여 리스트에 숫자가 있으면 pass하고 없다면 리스트에 추가합니다.
import random
secret_number = []
while True :
  number = random.randint(1,9)
  
  if number in secret_number :
    pass
  else :
    secret_number.append(number)
  
  if len(secret_number) == 3 :
    break
  
print(secret_number)
[1, 5, 4]

2. 플레이어가 입력한 3자리 숫자와 비밀 숫자 비교하기

import random

strike = 0 # 스트라이크
ball = 0 # 볼
index = 0 # 플레이어가 입력한 3자리 숫자의 인덱스

secret_number = random.sample(range(1,10),3) # 3자리 비밀 숫자
player_number = input("추측한 숫자를 입력하세요 >> ")
print(secret_number)
for number in secret_number :
  if int(player_number[index]) == number : # 비밀 숫자와 플레이어가 입력한 숫자 비교 (스트라이크)
    strike = strike + 1
  elif int(player_number[index]) in secret_number : # in 연산자를 이용하여 비밀 숫자가 있는지 비교 (볼)
    ball = ball + 1
  index = index + 1 # 인덱스 증가

print(strike, "스트라이크", " / ", ball, "볼")
추측한 숫자를 입력하세요 >> 123
[9, 6, 7]
0 스트라이크  /  0 볼

3. 숫자 야구 게임 소스코드

import random

game_count = 0 # 게임 회수를 카운트
strike = 0 # 스트라이크
ball = 0 # 볼
index = 0 # 플레이어가 입력한 3자리 숫자의 인덱스

secret_number = random.sample(range(1,10),3) # 3자리 비밀 숫자

print(" >> 숫자 야구 게임 << ")
#print(secret_number)

while game_count < 10 :
  strike, ball, index = 0, 0, 0
  player_number = input("추측한 숫자를 입력하세요 >> ")
  
  for number in secret_number :
    if int(player_number[index]) == number : # 비밀 숫자와 플레이어가 입력한 숫자 비교 (스트라이크)
      strike = strike + 1
    elif int(player_number[index]) in secret_number : # in 연산자를 이용하여 비밀 숫자가 있는지 비교 (볼)
      ball = ball + 1
    
    index = index + 1 # 인덱스 증가
  
  print(strike, "스트라이크", " / ", ball, "볼")
  game_count = game_count + 1
  
  if strike == 3 :
    print("축하합니다.", game_count, "번만에 맞췄습니다.")
    break
    35
if game_count == 10 : print("게임 종료")

 >> 숫자 야구 게임 << 
추측한 숫자를 입력하세요 >> 123
0 스트라이크  /  1 볼
추측한 숫자를 입력하세요 >> 456
0 스트라이크  /  1 볼
추측한 숫자를 입력하세요 >> 789
0 스트라이크  /  1 볼
추측한 숫자를 입력하세요 >> 234
0 스트라이크  /  0 볼
추측한 숫자를 입력하세요 >> 516
2 스트라이크  /  0 볼
추측한 숫자를 입력하세요 >> 517
3 스트라이크  /  0 볼
축하합니다. 6 번만에 맞췄습니다.

4. 추가로 생각해보기

  • 플레이어가 입력한 값이 숫자가 아니거나 똑같은 숫자를 입력하는 경우
  • 플레이어가 입력한 값의 숫자가 3자리가 아닌 경우와 숫자와 숫자 사이에 공백이 입력된 경우
  • 게임이 종료되면 다시 한번 게임을 할 것인지? 물어보고 시작하거나 종료할 수 있도록 수정
  • 소스코드를 함수로 만들어서 간결하게 만들기
import random

def player_input() :
  while True :
    player_number = input(">>추측한 숫자를 입력하세요 : ")
    player_number = ''.join(dict.fromkeys(player_number)) # 똑같은 숫자 입력시 중복 제거

    if player_number.isnumeric() and len(player_number) == 3 :
      return player_number
    else :
      print("---------------------------------------")
      print("| 게임 방법                           |")
      print("---------------------------------------")
      print("| 1 ~ 9사이의 서로 다른 숫자를 입력   |")
      print("| 3자리 모두 다른 숫자 값을 입력      |")
      print("| 예)                                 |")
      print("| >>추측한 숫자를 입력하세요 : 123    |")
      print("---------------------------------------")
      continue

def game_check(player_number) :
  strike, ball, index = 0, 0, 0
  
  for number in secret_number :
    if int(player_number[index]) == number :
      strike += 1
    elif int(player_number[index]) in secret_number :
      ball += 1
    index += 1
  return strike, ball


def game_print() :
  game_count = 0
  while game_count < 10 :
    number = player_input()
    strike, ball = game_check(number)
    print(strike, "스트라이크", " / ", ball, "볼")
    game_count += 1

    if strike == 3 :
      print("축하합니다.")
      print(game_count, "번만에 성공했습니다.")
      break

while True :
  secret_number = random.sample(range(1,10),3)
  print(" #######################")
  print(" >>> 야구 숫자 게임 <<< ")
  print(" #######################")
  
  game_print()
  
  result = input("숫자 야구 게임을 다시 시작하시겠습니까?(y/n)")
  if result == 'n' or result == 'N' :
    print("게임을 종료합니다.")
    break
  elif result == 'y' or result == 'Y' :
    continue
  else :
    print("잘못 입력했습니다.")
    

댓글남기기