소연의_개발일지
article thumbnail

파이썬을 배우던 와중 보드게임 로보77은 만들어볼 수 있지 않을까? 해서 만들기 시작했다.

그런데 몰랐다. 컴퓨터랑 하면 이렇게 재미없는 게임인 줄 ...

(4/20 1차 코드 제작 및 실패, 4/21 순서도 및 의사코드, 4/22 1차 제작)

 

1. 순서도

2. 코드

<python />
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()

 

3. 실행화면

4. 만난 문제 & 고쳐야 할 점

  • 아직 함수를 쓰는 방법을 잘 알지 못한다. 함수를 사용하는 방법을 더 공부해야 한다.
  • 그래도 순서도를 만들어서 코드를 짜니까 금요일만 만든 코드보다는 이해도가 높아졌다. 내가 어디 부분을 구현하고 싶은데 이 부분에서 막히는구나! 그럼 이 부분을 고치면 되겠다 -> 이 루틴이 순서도를 짜면 쉽게 찾을 수 있는것같다. 행맨이나 스무고개는 의사코드 짜는것으로 구현이 가능했지만 
  • *2를 내면 상대방이 두번 카드를 내는 상황을 아직 구현하지 못했다.
  • 컴퓨터와 하는 게임이 너무 재미없다. 다른 상황들을 넣거나.. 아니면 카드덱의 숫자를 대폭 줄여야겠다. 
  • 조금 더 코드를 예쁘게 만들고싶으나 위와 같은 이유로 살짝 이 코드에 정떨어진 상황. 
profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!