소연의_개발일지
article thumbnail

파이썬을 배우던 와중 보드게임 로보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를 내면 상대방이 두번 카드를 내는 상황을 아직 구현하지 못했다.
  • 컴퓨터와 하는 게임이 너무 재미없다. 다른 상황들을 넣거나.. 아니면 카드덱의 숫자를 대폭 줄여야겠다. 
  • 조금 더 코드를 예쁘게 만들고싶으나 위와 같은 이유로 살짝 이 코드에 정떨어진 상황. 
profile

소연의_개발일지

@ssoyxon

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