[2025.03.05] 물고기 키워 팔기 게임 만들기_심화

2025. 3. 7. 19:49·Python

나는 기본 문제를 먼저 만들고 심화로 들어감! 

플레이 하는 영상은 다른 게시글 있으니까 확인해주세용~~ 

이거는 내가 짠 코드 주석으로 설명 달아놓은거!! 게임 만드는 거 너무 재밌당 징짜룽 ~!~!~!

배운거를 내가 직접 어느 부분에 써야하고 이런거를 생각하면서 하니까 더 그런듯(?)

 

암튼 피드백 환영이욥!

 

(주석을 이제 다 달아서 이제 올림ㅎ)


(초보자용)

  • 물고기는 고등어 뿐입니다. 물고기 구매, 판매기능은 존재하지 않는다.
  • 다만 4턴마다 고등어가 전부 팔리면서 400원을 벌고 물고기 성장률은 0이 된다.
  • 화면은 현재 고등어의 성장률이 몇 %인지만 출력해주어도 괜찮다.
  • 처음 시작 돈은 0원이다.

 

(기본)

  • 물고기 종류는 '고등어', '도미", "참치"가 있다.
  • 각 물고기의 가격은 '고등어'는 10원, '도미'는 100원, '참치'는 1000원이다.
  • 고등어는 먹이 4번, 도미는 먹이 8번, 참치는 먹이 12번을 먹이면. 최대 가격으로 팔 수 있다.
  • 고등어는 다 크면 50원, 도미는 다 크면 300원, 참치는 다 크면 1800원이다. 다 자라지 않은 물고기는 팔 수 없다.
  • 판매를 선택할 경우 다 성장한 물고기는 전부 판매된다.
  • 물고기를 파는 행동과 사는 행동은 1턴 내에서 무한히 수행할 수 있다.
  • 어떤 물고기를 얼마만큼 살건지 선택할 수 있어야 한다. 턴을 넘어가는 행동은 먹이주기이다.
  • 이 게임의 목적은 '최소한의 턴으로 0000원 벌기'이다.(개인적으로 설정할 것)
  • 현재 물고기들의 성장 상태(%)를 확인하기 하면 현재 가진 물고기들의 모든 성장 상태를 확인할 수 있다.
  • 더이상 물고기를 살수도 없는데 팔수도 없을 때, 게임 오버한다. 목표 금액을 달성하면 '00턴 만에 승리!'를 출력한다.
  • 최대 물고기 수는 10마리로 제한된다. 적당한 텍스트로 현재 수조의 상태를 확인할 수 있도록 표현해주어야 한다.
  • 처음 시작할 시 돈은 100원이다.

 

(심화)

  • 먹이 가격은 고등어 먹이가 1원, 도미먹이가 5원, 참치 먹이가 20원이다.
  • 먹이주기를 선택하면 현재 가진 마리수에 맞게 먹이를 먹인다.
  • 만약에 돈이 부족하게 되면 대출을 받아 먹이므로 마이너스 돈도 가능하다.
  • 현재 마이너스 돈을 가진 상황에서 턴이 넘어가면 이자로 10%가 발생하고, 소수점 이하는 절삭한다.
  • 단 마이너스 돈이 2000원 넘어가면 패배한다.
  • 턴을 넘어가는 행동은 먹이주기, 수질관리이다.
  • 수질은 최대 100이며, 매 턴 마다 10씩 감소한다.
  • 수질관리를 할경우에는 모든 수조가 수질 100이 된다. 수질관리는 수조당 100원을 소비한다.
  • 수질관리는 돈이 0보다 적어도 할 수 있다. 수조 또한 턴내에서 무한히 수행할 수 있다.
  • 수질이 50미만일 경우 참치들은 20%확률로 사망하고, 수질 40미만일 경우 도미가 20% 확률로 사망하고, 수질 30미만일 경우 고등어가 20% 확률로 사망한다.
  • -> 이 때, 모든 물고기에게 개별로 이 확률이 적용된다.
  • 수조를 구매하면 최대 물고기 수가 10증가한다. 수조의 가격은 1000원이다. 수조는 돈이 0보다 작으면 살 수 없다.

 

# 2025.03.05.(수) 물고기 키워 팔기 게임
# 순서도 + 프로그램 만들기

import random

fish = ["고등어", "도미", "참치"] # 물고기 종류
price = [10, 100, 1000] # 물고기 살때 가격
feed_fee = [1, 5, 20] # 먹이 가격
feed_num = [4, 8, 12] # 먹이 횟수
max_price = [50, 300, 1800] # 팔 때 가격
user_money = 100 # 유저 초기 자금
pool_fish = [] # 수조 안 물고기
pool_rate = [] # 수조 안 물고기 성장률
turn = 0 # 턴 횟수
goal_money = 2000 # 목표 금액
water_quality = 100 # 수질
num_pool = 1 # 수조 갯수 초기값
pool_price = 1000 # 수조 가격
Game_over_condition = -2000 # 게임오버 조건

print("♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥  물고기 키워 팔기 게임 시작 ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥\n")
switch1 = True
switch2 = True

while True:
    while switch1:
        turn += 1

        # user_money가 마이너스이면 이자 10% 씩 추가됨.
        if user_money < 0: # user_money가 0보다 작으면
            user_money += user_money * 0.1 # 10%의 이자가 붙음.
            user_money = int(user_money) # 소수점 절작을 위해 int() 함수를 사용하여 정수화

        # 매 턴마타 수질 -10
        if switch2 == False:
            water_quality -= 10
            switch2 = True


        # 죽은 물고기 저장할 리스트 선언 => 이 리스트의 길이가 각 물고기의 죽은 마리 수임
        num_die_mackeral = [] # 죽은 고등어 수를 세기 위한 리스트
        num_die_seabream = [] # 죽은 도미 수를 세기 위한 리스트
        num_die_tuna = [] # 죽은 참치 수를 세기 위한 리스트
        # 수질 30미만 ===> 고등어 20% 확률로 사망
        if water_quality < 30: # 수질이 30 미만인 경우
            for i in range(len(pool_fish)): # 수조 안의 물고기 마리 수만큼
                if 1 in pool_fish: # 1은 고등어를 나타냄. => 고등어가 수조 안에 있는 경우
                    die_mackerel = pool_fish.index(1) # 고등어의 인덱스를 죽은 고등어(die_mackerel) 리스트에 추가함.
                    if random.random() <= 0.2: # 20% 확률로
                        num_die_mackeral.append(pool_fish.pop(die_mackerel)) # 수조 안의 물고기(pool_fish) 리스트에서 죽은 고등어를 pop으로 제거하고, num_die_mackeral 리스트에 추가
                        pool_rate.pop(die_mackerel) # 성장률(pool_rate) 리스트에서 죽은 고등어의 성장률을 pop으로 제거함.
            if len(num_die_mackeral) != 0: # 죽은 고등어 마리 수가 0마리가 아닐 경우, 즉 죽은 고등어가 있으면 몇 마리가 죽었는지 출력해줌.
                print(f"수질이 30 미만으로 20% 확률로 {fish[0]} {len(num_die_mackeral)} 마리가 사망하였습니다 ㅠㅠ\n")

        # 수질 40미만 ===> 도미 20% 확률로 사망
        if water_quality < 40: # 수질이 40 미만인 경우
            for i in range(len(pool_fish)): # 수조 안의 물고기 마리 수만큼
                if 2 in pool_fish: # 2는 도미를 나타냄. => 도미가 수조 안에 있는 경우
                    die_seabream = pool_fish.index(2) # 도미의 인덱스를 죽은 도미(die_seabream) 리스트에 추가함.
                    if random.random() <= 0.2: # 20% 확률로
                        num_die_seabream.append(pool_fish.pop(die_seabream)) # 수조 안의 물고기(pool_fish) 리스트에서 죽은 도미를 pop으로 제거하고, num_die_seabream 리스트에 추가
                        pool_rate.pop(die_seabream) # 성장률(pool_rate) 리스트에서 죽은 도미의 성장률을 pop으로 제거함.
            if len(num_die_seabream) != 0: # 죽은 도미 마리 수가 0마리가 아닐 경우, 즉 죽은 도미가 있으면 몇 마리가 죽었는지 출력해줌.
                print(f"수질이 40 미만으로 20% 확률로 {fish[1]} {len(num_die_seabream)} 마리가 사망하였습니다 ㅠㅠ\n")

        # # 수질 50미만 ===> 참치 20% 확률로 사망
        if water_quality < 50: # 수질이 50 미만인 경우
            for i in range(len(pool_fish)): # 수조 안의 물고기 마리 수만큼
                if 3 in pool_fish: # 3은 참치를 나타냄. => 참치가 수조 안에 있는 경우
                    die_tuna = pool_fish.index(3) # 참치의 인덱스를 죽은 참치(die_tuna) 리스트에 추가함.
                    if random.random() <= 0.2: # 20% 확률로
                        num_die_tuna.append(pool_fish.pop(die_tuna)) # 수조 안의 물고기(pool_fish) 리스트에서 죽은 참치를 pop으로 제거하고, num_die_tuna 리스트에 추가
                        pool_rate.pop(die_tuna) # 성장률(pool_rate) 리스트에서 죽은 참치의 성장률을 pop으로 제거함.
            if len(num_die_tuna) != 0: # 죽은 참치 마리 수가 0마리가 아닐 경우, 즉 죽은 참치가 있으면 몇 마리가 죽었는지 출력해줌.
                print(f"수질이 50 미만으로 20% 확률로 {fish[2]} {len(num_die_tuna)} 마리가 사망하였습니다 ㅠㅠ\n")


        print(f"======================== {turn}턴 시작! ========================")

        switch1 = False
        continue


    # user_money가 게임오버 조건보다 작거나 같으면 탈락 => break를 사용하여 게임을 중단함.
    if user_money <= Game_over_condition:
        print(f"소지금이 {Game_over_condition}원보다 적습니다. 탈락!!!!!!!!!!")
        break


    # 상점이동 / 먹이주기 / 수질관리 / 상태확인을 계속 진행하기 위한 while문
    while True:
        # 첫번째 질문(Q_1) 입력 => 상점이동 / 먹이주기 / 수질관리 / 상태확인 (1 or 2 or 3 or 4) 중 하나 선택
        Q_1 = input("。。。。。。。。。하고싶은 것을 선택하세요。。。。。。。。。\n                 | ① 상점 이동 |\n                 | ② 먹이 주기 |\n                 | ③ 수질 관리 |\n                 | ④ 상태 확인 |\n▶▶▶ ")
        Q_1 = int(Q_1) # Q_1 정수화

        if Q_1 == 1: # Q_1이 1인 경우 ==> 상점 이동
            # 두번째 질문(Q_2) 입력 => 구매 / 판매 (1 or 2) 중 하나 선택
            Q_2 = input("                 |   ① 구매   |\n                 |   ② 판매   |\n▶▶▶ ")
            Q_2 = int(Q_2) # Q_2 정수화
            if Q_2 == 1: # Q_2가 1이었을 때 ==> 구매
                # 어떤 것을 구매할지 입력 (1 or 2 or 3 or 4)
                buy_fish = input("。。。。。。。。。무엇을 구매하실 건가요? 。。。。。。。。。\n① 고등어(10원) | ② 도미(100원) | ③ 참치(1,000원) | ④ 수조(1,000원)\n▶▶▶ ")
                buy_fish = int(buy_fish) # buy_fish 정수화

                # buy_fish가 4일 때 ==> 수조 구매
                if buy_fish == 4:
                    if user_money < 0: # 현재 소지한 금액(user_money)가 마이너스이면 print 출력
                        print(f"돈이 없어 수조를 구입할 수 없습니다. [소지금 {user_money}원]\n")
                    else: # 현재 소지한 금액(user_money)가 마이너스가 아니면
                        user_money -= pool_price # 현재 소지금(user_money)에서 수조 가격(pool_price)를 빼서 user_money에 저장
                        num_pool += 1 # 가지고 있는 수조 갯수 +1
                        water_quality = 100 # 수질 100으로 초기화
                        print(f"현재 가지고 있는 수조는 {num_pool}개이고, 현재 소지금은 {user_money}원 입니다.")
                        print(f"수질 현황 : ", water_quality, "\n")
                    continue # 수조 구매가 끝나면 continue를 통해 다시 while문의 처음으로 돌아가 하고싶은 것을 선택하게 됨.

                # 수조를 구매하면 continue에 걸려 앞으로 돌아가기 떄문에 이 부분은 물고기를 골랐을 때만 실행됨.
                # 구매하려는 물고기 마리 수를 num_buy_fish에 정수화하여 저장
                num_buy_fish = input("몇 마리를 구매하실 건가요?\n▶▶▶ ")
                num_buy_fish = int(num_buy_fish)

                # 수조 하다당 수용할 수 있는 물고기는 10마리 ==> 수용 가능한 물고기 마리수 = 10 * 수조 갯수(num_pool)
                # 수용 가능한 물고기 마리 수가 초가하면 경고문을 출력해줌.
                if num_buy_fish + len(pool_fish) > 10 * num_pool:
                    print(f"warning!!! 수조 하나당 최대 물고기 수는 10마리 입니다. 현재 소지한 물고기는 {len(pool_fish)}마리 입니다.")
                    continue # 수용 가능 물고기 마리 수를 초과하면 continue에 걸려 다시 while문 처음으로 돌아가서 하고싶은 것을 선택하게 됨.

                # 구매 금액(buy_money)는 구매할 물고기 마리 수(num_buy_fish) * 물고기 가격(price)
                # 물고기 가격은 제일 처음에 price 리스트로 선언하였음. 리스트는 0번째 부터 시작이기 때문에 price의 buy_fish에 1을 빼준 인덱스 값을 가져옴.
                buy_money = num_buy_fish * price[buy_fish - 1]
                print(f"\n구매 금액:  {buy_money}")
                user_money -= buy_money # 현재 소지한 금액(user_money)에서 구매 금액(buy_money)을 빼서 최종 소지 금액을 계산함.
                print(f"소지 금액:  {user_money}원")

                for i in range(num_buy_fish): # 새로 구매한 물고기 수만큼
                    pool_fish.append(buy_fish) # 수조 안의 물고기(pool_fish)에 구매한 물고기 종류(buy_fish) 추가
                    pool_rate.append(0) # 수조 안의 물고기 성장률(pool_rate)에 0 추가

                continue # 물고기 구매 및 리스트에 구매한 물고기 추가를 마치면 다시 while문 처음으로 돌아가 하고싶은 것을 선택하게 됨.

            elif Q_2 == 2: # Q_2가 2인 경우 ==> 판매
                max_fish_location = [] # 다 자란 물고기의 위치를 저장하기 위한 리스트 생성
                sell_money = 0 # 판매 금액
                max_fish_type = [] #

                # 다 자란 물고기 판매를 위해 다 자란 물고기 걸러내기 위한 반복문
                for i in range(len(pool_rate)): # 성장률 길이 만큼 (= 수조 안의 물고기 수)
                    if pool_rate.count(100) != 0: # 성장률이 100인 물고기 수가 0이 아닐때 (= 성정률이 100인 물고기가 존재할 경우)
                        max_fish = pool_rate.index(100) # 성장률(pool_rate) 값이 100인 인덱스를 max_fish에 저장
                        max_fish_location.append(max_fish) # max_fish_location에 다 자란 물고기 인덱스(max_fish)를 저장
                        pool_rate.pop(max_fish) # 성장률(pool_rate) 리스트에서 다 자란 물고기 값 제거
                        # B = pool_fish.pop(max_fish) # 덜 자란 물고기를 남겨두기 위해 pop() 함수를 사용하여 다 자란 물고기 제거, 다 자란 물고기 인덱스(max_fish)를 B에 저장
                        max_fish_type.append(pool_fish.pop(max_fish)) # 수조 안의 물고기(pool_fish) 리스트에서 다 자란 물고기 인덱스(max_fish) 번째에 해당하는 값(물고기 종류)을 max_fish_type에 추가

                    else: # 성장률이 100인 물고기 수가 0마리 일때 break를 통해 for 문을 종료 시키고 다음으로 넘어감.
                        break

                for i in range (len(max_fish_type)): # 다 자란 물고기 수만큼
                    sell_money += max_price[max_fish_type[i]-1] # 처음 선언한 다 자란 물고기 판매 가격(max_price)으로 판매. 인덱스는 0부터 시작이기 때문에, max_fish_type[i]에서 1을 빼줌.
                print(f"\n판매 금액:  {sell_money}")  # 총 판매 가격
                user_money += sell_money # 현재 소지 금액을 계산하기 위해 판매 금액을 더해줌.
                print(f"소지 금액:  {user_money}원")

                # 현재 소지 금액(user_money)가 목표 금액(gool_money)보다 크거나 같으면 게임에 승리했다는 멘트를 출력함.
                # 그리고, break에 걸려서 게임이 끝나게 됨.
                if user_money >= goal_money:
                    print(f"목표 금액 {goal_money}원 달성!!!!! {turn}턴 만에 승리하였습니다!")
                    break
                continue # 게임 승리 조건에 달성하지 못했다면 continue에 걸려 while 문의 처음으로 돌아가 하고싶은 것을 선택하게 됨.

        elif Q_1 == 2: # Q_1 이 2인 경우 ==> 먹이 주기
            switch1 = True
            switch2 = False

            # 성장률, 먹잇값 계산하기
            for i in range(len(pool_fish)): # 수조 안의 물고기(pool_fish) 마리 수만큼
                if pool_fish[i] == 1: # pool_fish가 1인 경우 ==> 고등어
                    pool_rate[i] += (100/feed_num[0]) # 기존 성장률(pool_rate)에 100/4 씩 더해줌
                    user_money -= feed_fee[0] # 현재 소지금(user_money)에서 고등어 먹잇값을 빼줌
                elif pool_fish[i] == 2: # pool_fish가 2인 경우 ==> 도미
                    pool_rate[i] += (100/feed_num[1]) # 기존 성장률에 100/8 씩 더해줌
                    user_money -= feed_fee[1] # 현재 소지금(user_money)에서 도미 먹잇값을 빼줌
                else: # pool_fish가 3인 경우 ==> 참치
                    pool_rate[i] += (100/feed_num[2]) # 기존 성장률(pool_rate)에 100/12 씩 더해줌
                    user_money -= feed_fee[2] # 현재 소지금(user_money)에서 참치 먹잇값을 빼줌

                if pool_rate[i] > 100: # 성장률이 100이 넘아가면
                    pool_rate[i] = 100 # 100으로 함
            break

        elif Q_1 == 3: # Q_1 이 3인 경우 ==> 수질 관리
            switch1 = True
            switch2 = True

            user_money -= 1000 # 수질 관리 비용 1000원 빼기
            water_quality = 100 # 수질 관리 하면 수질이 100으로 올라감
            break # 수질 관리를 하면 break에 걸려 1턴이 추가되고, 다시 메인 화면으로 돌아감

        elif Q_1 == 4: # Q_1 이 4인 경우 ==> 상태 확인
            print("。。。。。。。。。。。。상태 확인。。。。。。。。。。。。")
            print(f" 소 지 금  [{user_money}원]\n 수   질  [{water_quality}]\n 물 고 기  {pool_fish}\n 성 장 률  {pool_rate}\n")
            continue # 상태 확인을 하면 continue에 걸려서 턴 추가 없이, 메인 화면으로 돌아감

'Python' 카테고리의 다른 글

[2025.03.08] 숫자 야구 게임 만들기_동영상_2  (5) 2025.03.08
[2025.03.06] 숫자 야구 게임 만들기_동영상_1  (1) 2025.03.07
[2025.03.05] 물고기 키워 팔기 게임_심화_동영상  (4) 2025.03.05
[2025.03.04] 순서도 그리기_4_리스트  (0) 2025.03.04
[2025.03.04] 물고기 키워 팔기 게임  (0) 2025.03.04
'Python' 카테고리의 다른 글
  • [2025.03.08] 숫자 야구 게임 만들기_동영상_2
  • [2025.03.06] 숫자 야구 게임 만들기_동영상_1
  • [2025.03.05] 물고기 키워 팔기 게임_심화_동영상
  • [2025.03.04] 순서도 그리기_4_리스트
polibo
polibo
Polibo의 개발 성장기 지켜봐주십슈 (콩 싫어해요.)
  • polibo
    Polibo와 개발 콩나무 키우기
    polibo
  • 전체
    오늘
    어제
    • 분류 전체보기 (64)
      • Python (23)
      • C (32)
        • 본수업 (19)
        • 예습 (7)
        • 개인프로젝트01 - 로또 (3)
        • 개인프로젝트02 - 복켓몬 키우기 (2)
        • 개인프로젝트03 - 김복천국 POS기 (1)
        • 팀프로젝트01 - 용사 복이의 대모험 RPG (0)
        • 팀프로젝트02 - 메일 프로그램 (0)
      • TCP_IP (0)
      • DB (1)
      • C++ (7)
      • QT (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C
    조건문
    파이썬조건문
    파이썬 숫자야구
    문자열
    코딩
    순서도
    파이썬예제
    for문
    c언어 scanf
    파이썬게임
    반복문
    else if
    c우선순위
    while문
    파이썬반복문
    Python
    if문
    c언어
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
polibo
[2025.03.05] 물고기 키워 팔기 게임 만들기_심화

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.