초보 개발자

두 번째 개인 과제 베스킨 라빈스 31 게임 본문

AI 웹개발 트랙 - 내배캠/2주차

두 번째 개인 과제 베스킨 라빈스 31 게임

taehyeki 2021. 12. 21. 11:03

일반적인 베스킨라빈스 31게임

import random

# 31게임을 위한 배열 1 ~ 31
numbers = [i for i in range(1,31+1)]
# player가 0이면 user, 1이면 computer를 의미함
player = random.randrange(0,2)

def user(array):
    global player
    # 1~3사이의 숫자 그리고 배열의 갯수보다 많이 말하면 안됨
    while True:
        num = int(input('1~3의 숫자를 입력해주세요.'))
        if 1 <= num <=3 and num <= len(numbers):
            break
        print('다시 입력해주세요')
    for i in range(num):
        print('플레이어 :', array[0])
        del array[0]
    player = 1

def computer(array):
    global player
    num = random.randrange(1, 4)
    if len(numbers) <= 3:
        num = len(numbers) - 1
        if (num==0):
            num = 1

    for i in range(num):
        print('컴퓨터 :',array[0])
        del array[0]
    player = 0


# 배열에 요소 가 남지 않으면 while문 탈출
while  0 < len(numbers):
    if player == 0:
        user(numbers)
    else:
        computer(numbers)

if player == 0:
    print('플레이어의 승리 입니다.')
else:
    print('컴퓨터의 승리 입니다.')

 

 

단 한가지 경우를 제외하고 컴퓨터가 이기는 베스킨라빈스 31게임

컴퓨터가 '무조건'이길려면 30을 가져와야한다. 그래야 user가 31을 말할테니,

근데 user입장에서도 이길려면 30을 가져와야한다. 따라서 둘 다 게임을 이기기 위해 30을 확정적으로 가져올려면

26이라는 숫자를 먼저 선점하는 player가 30을 말할 수 있을 것이다. 이런식으로 체인을 타고 내려가면 아래와 같다.

2 6 10 14 18 22 26 30 이 숫자 중 하나라도 가져오면 우위를 선점할 수 있다. 왜냐면 확정적으로 그 다음 체인을 타고 갈 수 있기 때문에

import random

# 31게임을 위한 배열 1 ~ 31
numbers = [i for i in range(1,31+1)]
# player가 0이면 user, 1이면 computer를 의미함
player = random.randrange(0,2)

#user의 함수
def user(array):
    #player 를 바꿔주기 위해 (user -> computer)
    global player

    while True:
        #숫자 유효성 검사 1 ~ 3 숫자, numbers의 갯수보다 많으면 안됨
        num = int(input('1~3의 숫자를 입력해주세요.'))
        if 1 <= num <=3 and num <= len(array):
            break
        print('다시 입력해주세요')
    # 갯수만큼 list에서 삭제
    for i in range(num):
        print('플레이어 :', array[0])
        del array[0]
    #공수 교대 (user -> computer)
    player = 1

def computer(array):
    # 필승 조건임
    list = [2,6,10,14,18,22,26,30]
    # player 를 바꿔주기 위해 (user -> computer)
    global player
    # range_num 이란걸 일단 None로 설정해두고
    range_num = None
    # array가 3보다 작으면 이 분기문을 탄다. 
    if len(array) <= 3:
        #range_num에 array의 길이를 집어 넣는다.
        range_num = len(array)

    # array가 3보다 작기 전까진 3번을 확인
    # 이유는 내가 필승 조건을 맞추기 위해 최대 3개말할 수 있기 때문에 (1,2,3!)
    # 근데 range(3)이라고만 적어두면 마지막에 IndexError: list index out of range가 난다
    # 따라서 range_num을 통해서 그걸 해결
    # for에서 break가 걸렸다는 것은 필승 조건에 해당하는 숫자를 찾았다는 뜻
    for i in range( range_num or 3):
        if array[i] in list:
            num = i + 1
            break
    #else로 빠졌다는 것은 compteur가아닌 user가 필승 조건에 해당하는 숫자를 찾았다는 뜻
    #따라서 random으로 돌려주었다.
    else:
        num = random.randrange(1, 4)
        # 이 분기문으로 들어왔다는 것은
        # 30을 선점하지 못했다는 뜻이므로 num은 1이 되어야만 한다.
        if len(array) <= 3:
                num = 1

    for i in range(num):
        print('컴퓨터 :',array[0])
        del array[0]
    player = 0


# 배열에 요소 가 남지 않으면 while문 탈출
while  0 < len(numbers):
    if player == 0:
        user(numbers)
    else:
        computer(numbers)

# 마지막에 player가 된 사람이 진 것이다.
if player == 0:
    print('플레이어의 승리 입니다.')
else:
    print('컴퓨터의 승리 입니다.')