파이썬 베스킨라빈스 31게임
오늘 테스트는 파이썬으로 베스킨라빈스 31 게임을 구현하는 것이었다. 처음 버전은 플레이어와 컴퓨터가 무작위로 최대 3개까지의 연속된 숫자를 말하는 방법이고, 두번째 버전은 컴퓨터가 *한가지 경우를 제외하고 무조건 이기는 방법이다.
* 플레이어가 먼저 시작해서 빅토르 숫자를 계속 말하는 경우
가능하면 플레이어와 컴퓨터가 숫자를 뽑는 코드는 함수화 하라고 했는데, 아직 함수를 쓰는게 익숙하지 않아서, 조건문과 반복문으로만 작성했다.
- 무작위로 숫자를 말하는 버전
세번째 줄에 <number = list(range(1, 32)) # 숫자는 리스트로 31까지 넣어준다.> 부분은 사실 없어도 되는 부분이다. 처음에 저 변수를 사용해서 구현하려고 하다가 31까지 세는 변수 i 를 지정했기 때문이다.
i가 30에서 3개의 숫자를 부르면 31을 초과해서 부를 경우가 있어서 while문의 가장 첫번째에 i가 31이 되면 종료하도록 설정했다.
import random
order = random.randrange(0,2) # 0이 나오면 나 먼저, 1이 나오면 컴퓨터 먼저
number = list(range(1, 32)) # 숫자는 리스트로 31까지 넣어준다.
count = list(range(1, 4)) # 외칠 수 있는 개수는 1, 2, 3
i = 0
# print(order)
while i <= 31: # 31까지만 돌린다.
if i == 31 : # 31 되면 while문 종료.
break
if order % 2 == 0:
print("사용자가 시작합니다.")
P = int(input("최대 숫자 3개를 말할 수 있습니다. 숫자 개수를 입력하세요."))
while P not in range(0,4):
print('최대 3개 숫자만 가능합니다.')
P = int(input("최대 숫자 3개를 말할 수 있습니다. 숫자 개수를 입력하세요."))
for count in range(P):
i += 1
print(str(i)+"!")
if i == 31:
print("컴퓨터 승!")
break
else:
print("컴퓨터가 시작합니다.")
C = random.randrange(1,4)
for count in range(C):
i += 1
print(str(i)+"!")
if i == 31:
print("플레이어 승!") # 5. 31을 말하는 사람이 컴퓨터라면 '플레이어 승'을, 31을 말하는 사람이 플레이어라면 '컴퓨터 승'을 출력한다.
break
order += 1
- 컴퓨터가 항상 이기는 버전(AI 버전)
import random
order = random.randrange(0,2) # 0이 나오면 나 먼저, 1이 나오면 컴퓨터 먼저
number = list(range(1, 32)) # 숫자는 리스트로 31까지 넣어준다.
count = list(range(1, 4)) # 외칠 수 있는 개수는 1, 2, 3
victory = list(range(2,31,4)) # 승리의 수
# print(order)
i = 0
while i <= 31: # 31까지만 돌린다.
if i == 31 : # 31 되면 while문 종료. # 이거는 31에서 강제종료해서 컴퓨터 시작하는거 막기.
break
if order % 2 == 0:
print("사용자가 시작합니다.")
P = int(input("최대 숫자 3개를 말할 수 있습니다. 숫자 개수를 입력하세요."))
while P not in range(0,4):
print('최대 3개 숫자만 가능합니다.')
P = int(input("최대 숫자 3개를 말할 수 있습니다. 숫자 개수를 입력하세요."))
if i == 30:
P = 1
print('당신은 졌습니다.')
P = int(input("1개를 불러 패배를 인정하세요."))
while P != 1:
print('당신은 졌습니다.')
P = int(input("1개를 불러 패배를 인정하세요."))
for count in range(P):
i += 1
print(str(i)+"!")
if i == 31:
print("컴퓨터 승!")
break
else:
print("컴퓨터가 시작합니다.")
if i == 0: # 컴퓨터가 시작하면, 시작에서 victory인 2를 먼저 선점하자.
C = 2
for count in range(C):
i += 1
print(str(i)+"!")
elif i == 1: # 상대방이 빠가라서 선빵을 1을 날리면 컴퓨터는 1개만 부르자.
C = 1
for count in range(C):
i += 1
print(str(i)+"!")
elif i == 2 or i % 4 == 2:
C = random.randrange(1,4)
for count in range(C): # 상대방이 2로 시작하거나 2 이후의 빅토리 숫자를 가져갈 때 아무거나 내자.
i += 1
print(str(i)+"!")
if i == 31 :
print("플레이어 승!")
break
elif i % 4 == 0: # 상대방이 victory 값 사이의 중간값인 4를 내면 2개를 불러서 victory 값 가져가자.
C = 2
for count in range(C):
i += 1
print(str(i)+"!")
elif i % 4 == 1: # 상대방이 victory 값 전의 값까지 가져가면 1개만 불러서 victory 값 가져가자.
C = 1
for count in range(C):
i += 1
print(str(i)+"!")
elif i % 4 == 3: # 상대방이 victory 값 다음의 값까지 가져가면 3개만 불러서 victory 값 가져가자.
C = 3
for count in range(C):
i += 1
print(str(i)+"!")
order += 1
두번째는 코드를 짜는 것 보다는 *victory 수를 알아내는게 핵심이다.
'2부터 시작하는 31 이하의 +4의 등차수열을 부르면 이긴다'는 것을 알면, 그 안의 조건들을 만들어서 해당하는 숫자들만 부르게 하면 된다.
* victory = [2, 6 ,10, 14, 18, 22, 26, 30]
victory 리스트의 숫자 사이에는 3개의 숫자가 있기 때문에, 4로 나눠서 나머지가 1, 2, 3이 나왔을 때의 조건을 구분해 놓고,
몇가지 예외사항만 챙기면 된다.
예외사항에는,
1. 컴퓨터가 선이라서 2까지 부르는 경우.
2. 상대방이 선인데, 1만 부른 경우.
3. 상대방이 선이고, victory 수를 모두 가져가면서 컴퓨터가 31을 부르면서 지는 경우.
함수화하지 못했고, 그래서인지 쓸데없이 코드가 길어졌기 때문에 나에게 아직 끝난 과제는 아니다. 함수화된 버전으로 다시 포스팅 하자.
'파이썬 테스트 [Python]' 카테고리의 다른 글
파이썬 이차원 리스트 문제 (feat. reverse, reversed의 차이) (28) | 2022.01.20 |
---|---|
파이썬 tuple형태 반환 (feat. enumerate()) (36) | 2022.01.18 |
파이썬 주민등록번호 유효성 검사 (27) | 2022.01.07 |
파이썬 턴제(Turn-based Strategy) 게임 (4) | 2021.12.22 |
파이썬 숫자 맞추기 게임(업다운 게임) (18) | 2021.12.20 |
댓글