나는 기본 문제를 먼저 만들고 심화로 들어감!
플레이 하는 영상은 다른 게시글 있으니까 확인해주세용~~
이거는 내가 짠 코드 주석으로 설명 달아놓은거!! 게임 만드는 거 너무 재밌당 징짜룽 ~!~!~!
배운거를 내가 직접 어느 부분에 써야하고 이런거를 생각하면서 하니까 더 그런듯(?)
암튼 피드백 환영이욥!
(주석을 이제 다 달아서 이제 올림ㅎ)
(초보자용)
- 물고기는 고등어 뿐입니다. 물고기 구매, 판매기능은 존재하지 않는다.
- 다만 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 |