본문 바로가기

Programming/Algorithm

[Python3] 31게임! 필승전략

1부터 31까지 순서대로 번갈아가며 1개 이상 3개 이하의 숫자를 말한다.
31을 말하면 게임에서 패배한다.

ex) 1, 2, 3 / 4, 5 / 6, 7, 8 / .... / 28, 29, 30 / 31(패배)

 내가 먼저 시작한다고 할 때 이 게임을 반드시 이기고 싶다면 어떻게 해야할까? 우선, 상대방이 31을 말하게 할려면 내가 30을 말해야 한다는 것부터 시작하자.

 내가 30을 말하기 위해선 내가 26을 말해서 상대방이 27을 말하여 내가 28, 29, 30을 말하거나 상대방이 27, 28를 말해서, 내가 29, 30을 말하거나 상대방이 27, 28, 29를 말하여 내가 30을 말을 하도록 해야한다.

 그런식으로 쭉 생각해 나가면 다음 숫자들을 내가 반드시 말해야 한다.

2, 6, 10, 14, 18, 22, 26, 30

 이 숫자들을 말하기 위해선 내가 먼저 시작한 뒤에 1, 2를 외치고 상대방이 말한 숫자의 갯수를 4에서 뺀 만큼 내가 말하면 된다.

 예를들어 상대방이 3, 4를 외쳤다면 난 두개(4-2 == 2)인 5, 6을 외치면 된다는 말이다.

 이걸 컴퓨터가 먼저 시작하게 한 뒤에 컴퓨터가 항상 이기도록 해보자.

# from random import randint
import sys

print('1 2')
num = []
for i in range(3, 34): # 컴퓨터가 이미 1과 2를 말한 상태이다.
num.append(i)


def com_num(n): # 컴퓨터 차례
com_range = 4 - n
while(com_range > 0):
"""
if(num[0] == 31): # 컴퓨터가 31을 실수로 불러 자폭대비
break #앞에서 숫자를 제어해 주므로 주석처리
"""
print(num[0], end=' ')
del(num[0])
com_range -= 1
print()


while(1):
while(1):
usr_num = input().split()
if(not (0 < len(usr_num) < 4)): # 갯수방지
print("1~3 nums!")
continue
check = True
for i in range(len(usr_num)):
try:
if(int(usr_num[i]) != num[i]): # 건너 뛰면서 입력 방지
print("Wront Input!")
check = False
break
except ValueError: # 문자방지
print("Numbers!")
check = False
break
if(check):
break

for i in range(len(usr_num)):
if(int(usr_num[i]) == 31): # 패배
print("You Loose")
sys.exit()
del(num[0])
"""
if(num == [31, 32, 33]):
print("I loose!!")
break # 이 알고리즘에서 컴퓨터는 패배하지 않으니 주석처리
"""
com_num(len(usr_num))

초록색이 유저의 입력이다.

1 2

3

4 5 6 

7 8

9 10 

11 12 13

14 

15

16 17 18 

19 20

21 22 

23 24

25 26 

27

28 29 30 

31

You Loose


Process finished with exit code 0


'Programming > Algorithm' 카테고리의 다른 글

[Python3] 글자 순서 바꾸기  (2) 2017.04.01
[Python3] 이진수 게임!  (4) 2017.03.26
[Python3] 31게임!  (1) 2017.03.21
[Python3] 제곱해서 같은 수 - 2  (0) 2017.03.12
[Python3] 제곱해서 같은 수 - 1  (0) 2017.03.11