파이썬을 배우던 와중 보드게임 로보77은 만들어볼 수 있지 않을까? 해서 만들기 시작했다.
그런데 몰랐다. 컴퓨터랑 하면 이렇게 재미없는 게임인 줄 ...
(4/20 1차 코드 제작 및 실패, 4/21 순서도 및 의사코드, 4/22 1차 제작)
순서도
코드
import random
from random import randint
def gamerule():
'''게임규칙'''
print("이것은 게임규칙입니다.")
def random_5_cards(user_or_com, card_deck):
'''사용자와 컴퓨터 랜덤으로 카드 5장씩 받는 함수'''
user_or_com.extend(random.sample(card_deck,5))
for i in user_or_com:
card_deck.remove(i)
return user_or_com
def start_memeber():
'''선 결정'''
if randint(1,100) >= 50:
return 'com'
else:
return 'user'
def card_pick(user_or_com, card_deck):
'''카드덱에서 새로 카드 뽑는 함수'''
pick = random.choice(card_deck)
user_or_com.append(pick)
card_deck.remove(pick)
def card_away(user_or_com, card_deck):
'''가지고 있던 카드에서 카드 한장 내는 함수'''
away = random.choice(user_or_com)
user_or_com.remove(away)
# if away not in ['change', '*2']:
# new_card_list += int(away)
return away
user_life = 3
com_life = 3
# TODO 1. 게임 규칙 설명, 생명 3으로 시작
gamerule()
while True:
user_cards_list = [] ##유저 카드리스트
com_cards_list = [] ## 컴퓨터 카드리스트
round_card = 0 ##카드숫자 더해지는 곳
# TODO 2. 컴퓨터와 사용자 5장씩 받는다.
print("컴퓨터와 사용자가 카드를 하나씩 나눠 가집니다.")
card_list = [
'2', '2', '2',
'3', '3', '3',
'4', '4', '4',
'5', '5', '5',
'6', '6', '6',
'7', '7', '7',
'8', '8', '8',
'9', '9', '9',
'10', '10', '10', '10', '10', '10', '10', '10',
'11', '22', '33', '44', '55', '66', '76',
'0', '0', '0', '0',
'-10',
'*2', '*2', '*2', '*2',
'change', 'change', 'change', 'change', 'change',
]
user_cards_list = random_5_cards(user_cards_list, card_list)
com_cards_list = random_5_cards(com_cards_list, card_list)
# print(f"유저카드 확인용: {user_cards_list}") #유저카드 확인용
# print(f"컴카드 확인용: {com_cards_list}") #컴카드 확인용
# print(f"카드리스트 확인용: {card_list}") #카드리스트 확인용
# TODO 3. 랜덤으로 순서 결정
start = start_memeber()
# TODO 4. 카드를 낼 것인지 뽑을것인지 결정
## 컴퓨터는 70%의 확률로 카드를 낸다.
game_over = 0
while game_over != 1:
if start == 'com':
while True:
print("컴퓨터의 턴입니다.")
if randint(1, 100) <= 60: ##60프로의 확률로 카드 내기
print("컴퓨터는 카드를 내기로 결정했습니다.")
away_card_com = card_away(com_cards_list, card_list)
if away_card_com in ['*2', 'change']: ##행동카드 낼 때
print(f"순서를 바꾸는 카드 {away_card_com}을 냈습니다. 순서가 넘어갑니다.")
start = 'user'
# if away_card_com == '*2':
break
elif round_card >= 0 and away_card_com == '76': ## 합이 0인데 76 낼 때
print("합이 0 이상인데 76 카드를 뽑았습니다. 다시 생각합니다...")
continue
else: # 숫자카드 낼 때
round_card += int(away_card_com)
if round_card >= 77:
print("카드의 숫자의 합이 77이 넘어갑니다. 생명이 1 줄어듭니다.")
com_life -= 1
game_over = 1
break
elif round_card % 11 == 0:
print("카드의 숫자의 합의 배수가 77입니다. 생명이 1 줄어듭니다.")
com_life -= 1
game_over = 1
break
else:
if randint(1,100) <= 90:
print(f"컴퓨터는 정확히 덧셈을 했습니다.{away_card_com}을 내고 {round_card}(이)라고 답합니다.")
start = 'user'
break
else:
print("컴퓨터가 실수해서 덧셈을 틀렸습니다. 생명이 1 줄어듭니다.")
com_life -= 1
game_over = 1
break
else: ## 30프로의 확률로 카드 뽑기
print("컴퓨터는 카드를 뽑기로 결정했습니다.")
card_pick(com_cards_list, card_list)
start = 'user'
break
if com_life == 0:
print("컴퓨터 생명이 0입니다. 게임이 종료됩니다. ")
exit()
if start == 'user':
while True:
print("당신의 턴입니다.")
pick_or_away_user = input("선택하세요: (1.카드뽑기, 2.카드내기): ")
if pick_or_away_user == '1':
card_pick(user_cards_list,card_list)
print(f"유저가 카드를 하나 뽑습니다. 현재 카드 리스트: {user_cards_list}")
print("턴이 컴퓨터로 넘어갑니다.")
start = 'com'
break
else: #유저가 카드를 내기를 선택했을 때
print(f"어떤 카드를 낼 지 선택하세요. 당신의 카드 리스트: {user_cards_list}")
away_card_user = input("선택하세요: ")
if away_card_user not in user_cards_list:
print(f"{away_card_user}는 카드리스트에 없는 카드입니다. 다시 생각하세요.")
continue
if away_card_user == '76' and round_card >= 0:
print("합이 0이상인데 76카드를 낼 수 없습니다. 다시 생각하세요.")
continue
elif away_card_user in ["*2", "change"]:
user_cards_list.remove(away_card_user)
print("컴퓨터 차례로 순서가 넘어갑니다.")
start = 'com'
if away_card_user == '*2':
print("컴퓨터는 두장의 카드를 내야 합니다.")
break
else:
if round_card + int(away_card_user) >= 77:
print(f"당신이 낸 카드 {away_card_user}의 합이 77이 넘습니다. 생명을 하나 잃습니다!")
user_life -= 1 #여기서 어떻게 5장의 카드 뽑는곳으로 가야할지
game_over = 1
break
elif (round_card + int(away_card_user)) % 11 == 0:
print(f"당신이 낸 카드 {away_card_user}의 합이 11의 배수{(round_card + int(away_card_user))}입니다. 생명을 하나 잃습니다!")
user_life -= 1 #여기도
game_over = 1
break
else:
user_cards_list.remove(away_card_user)
quesiton = input(f"카드의 합이 얼마입니까?(현재 {round_card}): ")
if round_card + int(away_card_user) == int(quesiton):
round_card += int(away_card_user)
print("정답입니다! 순서가 넘어갑니다.")
start = 'com'
break
else:
print(f"틀렸습니다! 정답은 {round_card + int(away_card_user)}입니다.")
print("생명을 하나 잃습니다. 게임을 재개합니다.")
user_life -= 1 #여기도
game_over = 1
if user_life == 0:
print("당신의 생명이 0입니다. 게임이 종료됩니다.")
exit()
실행화면
만난 문제 & 고쳐야 할 점
- 아직 함수를 쓰는 방법을 잘 알지 못한다. 함수를 사용하는 방법을 더 공부해야 한다.
- 그래도 순서도를 만들어서 코드를 짜니까 금요일만 만든 코드보다는 이해도가 높아졌다. 내가 어디 부분을 구현하고 싶은데 이 부분에서 막히는구나! 그럼 이 부분을 고치면 되겠다 -> 이 루틴이 순서도를 짜면 쉽게 찾을 수 있는것같다. 행맨이나 스무고개는 의사코드 짜는것으로 구현이 가능했지만
- *2를 내면 상대방이 두번 카드를 내는 상황을 아직 구현하지 못했다.
- 컴퓨터와 하는 게임이 너무 재미없다. 다른 상황들을 넣거나.. 아니면 카드덱의 숫자를 대폭 줄여야겠다.
- 조금 더 코드를 예쁘게 만들고싶으나 위와 같은 이유로 살짝 이 코드에 정떨어진 상황.
'개발공부 > Python' 카테고리의 다른 글
[파이썬] 60갑자 조합 만들어보기 (0) | 2023.04.24 |
---|---|
(4.23) 파이썬 예외처리 공부(try except, raise) (0) | 2023.04.23 |
[파이썬] 행맨 게임 만들기( while, random, if, isalpha(), random 활용) (0) | 2023.04.21 |
[파이썬] UP & DOWN 게임 만들기(while, for, if, random, isdigit 사용) (0) | 2023.04.21 |
[파이썬] if문 개념 , if문 활용해 팀별 문제내고 풀기 (1) | 2023.04.21 |