당우 일기장

2. 개인과제 ) 파이썬 베스킨라빈스31 게임 만들기 (ai) 본문

내일배움캠프

2. 개인과제 ) 파이썬 베스킨라빈스31 게임 만들기 (ai)

당우 2021. 12. 21. 21:06

4의 배수를이용하여 컴퓨터가 무조건이기는 베스킨라빈스 31 게임을 만들어보자

 

[간단설명]

앞서 본 게임과 규칙은 동일하지만, 이번에는 플레이어가 어떤 식으로 숫자를 부르든, 컴퓨터는 항상 자신이 이기도록 나름의 방식의 가지고 숫자를 부릅니다. (그 방식이 무엇인지는 검색을 해보아도 좋고, 직접 생각해보셔도 좋습니다. *'항상'이라고 명시했지만, 딱 한 가지 경우에는 컴퓨터가 질 수도 있습니다.)

[상세설명]

  1. 컴퓨터가 먼저 숫자를 말할지, 플레이어가 먼저 숫자를 말할지는 랜덤으로 정한다.
  2. 기존의 게임과 마찬가지로 1부터 순서대로 연속된 숫자를 말하되, 플레이어는 input 함수를 통해서 부르고 싶은 숫자까지 이어서 말한다. 컴퓨터는 나름의 방식을 가지고 숫자를 말한다.
  3. 2번 과정을 31을 말하는 사람이 나올 때까지 반복한다. (즉, 2번을 for문 혹은 while문으로 작성할 것. 단, 컴퓨터와 플레이어 모두 31을 초과해서 숫자를 부를 수는 없다.)
  4. 31을 말하는 사람이 컴퓨터라면 '플레이어 승'을, 31을 말하는 사람이 플레이어라면 '컴퓨터 승'을 출력한다. (단, 컴퓨터는 자신이 항상 이기도록 나름의 방식을 가지고 숫자를 부르기 때문에, 딱 한 가지 경우를 제외하고는 항상 컴퓨터가 이길 수 밖에 없을 것임에 유의)
  1. 30을 컴퓨터가 무조건 부를수있게 하는 것
  2. 2, 6, 10, 14, 18, 22, 26, 30 하나만 컴퓨터가 부르기 시작해도 이어서 그 다음을 부를 수 있기에 무조건 승리
  3. 위 숫자들은 4로 나누면 나머지가 2인 숫자 -> 즉, +2 혹은 -2를 한 뒤에 4로 나누면 무조건 나머지가 0인 숫자들

 

from random import randrange

the_last_number = 0

# 3. 컴퓨터 혹은 플레이어는 앞 사람이 부른 숫자에 이어서, 1개~3개까지의 연속된 숫자를 말한다.
def computer_pick(the_last_number):
    if (the_last_number + 3) % 4 == 0:
        c = 1 # 플레이어가 1까지 불렀다면 컴퓨터는 2까지만 부르면 됨 -> 즉, 1개만 더 부르면됨
    elif (the_last_number + 4) % 4 == 0:
        c = 2 # 플레이어가 4까지 불렀다면 컴퓨터는 6까지 부르면 됨 -> 즉, 2개만 더 부르면됨
    elif (the_last_number + 5) % 4 == 0:
        c = 3
    else:
        c = randrange(1, 4)
    # 예외처리 - 31 초과는 부를 수 없고, 31 초과를 부르려고 한다면 그냥 컴퓨터가 31까지 부르려 한다고 생각
    if the_last_number + c > 31:
        c = 31 - the_last_number
    for i in range(1, 1+c):
        print('컴퓨터: ', the_last_number + i)
    return the_last_number + c

def player_pick(the_last_number): 
    p = int(input())
    # 31 초과는 부를 수 없음
    # 해당 예외처리는 플레이어가 숫자를 입력한다는 전제하에 작성된 것이고, 정확한 예외처리는 try, except 를 사용하는 것이 맞습니다!
    while (p not in [1, 2, 3]) or (the_last_number + p > 31):
        print('다시 입력하세요!')
        p = int(input())
    for i in range(1, 1+p):
        print('플레이어: ', the_last_number + i)
    return the_last_number + p

# 1. 컴퓨터가 먼저 숫자를 말할지, 플레이어가 먼저 숫자를 말할지는 랜덤으로 정한다.
whos_first = randrange(0, 2)

# 2. 컴퓨터 혹은 플레이어는 1 혹은 1, 2 혹은 1, 2, 3을 말하면서 게임을 시작한다. (단, 컴퓨터가 숫자를 1개 부를지, 2개 부를지, 3개 부를지는 random 패키지를 이용해서 랜덤으로 정한다. 플레이어는 input 함수를 통해서 부르고 싶은 숫자까지 이어서 말한다.)
# 컴퓨터가 먼저 할 경우
if whos_first == 1:
    the_last_number = computer_pick(the_last_number)

# 4. 2~3번을 31을 말하는 사람이 나올 때까지 반복한다. (즉, 2~3번을 while문으로 작성할 것. 단, 컴퓨터와 플레이어 모두 31을 초과해서 숫자를 부를 수는 없다.)
# 5. 31을 말하는 사람이 컴퓨터라면 '플레이어 승'을, 31을 말하는 사람이 플레이어라면 '컴퓨터 승'을 출력한다. 
while True:
    the_last_number = player_pick(the_last_number)
    if the_last_number == 31:
        print('컴퓨터 승!')
        break
    the_last_number = computer_pick(the_last_number)
    if the_last_number == 31:
        print('플레이어 승!')
        break