TIL

파이썬 토이 프로젝트 _ 낚시게임 (미완)

JJO.OYA 2022. 6. 7. 23:07

파이썬으로 낚시게임을 만들어 보자


 

수업시간에 진행했던 토이 프로젝트 복습. 0607

 

 

[1] 라이브러리 호출

import time
import random
import pandas as pd
import numpy as np

>> 필요한 라이브러리를 호출

 


 

 

[2] 낚시터 구현하기

낚시를 하기 위해서는 낚시터가 필요하다. 물고기를 잡을 수 있는 낚시터를 만든다.

 

def game_fishing_center():
    print('낚시를 시작합니다....')
    print('낚시줄을 던졌습니다....')
    
    fishing = pd.read_excel('물고기표.xlsx')
    choose_fish = np.array(fishing).reshape(-1,4)
    # 0부터 fishing 전체 행까지 반복, 랜덤 추출
    choose_fish_num = random.randint(0, len(fishing))  
    choose_fish_waiting_num = random.randint(choose_fish[choose_fish_num][0],
                                             choose_fish[choose_fish_num][1])
    
    time.sleep(choose_fish_waiting_num)  # 대기시간 주기
    
    # 낚시 성공 or 실패
    succ_fail = ['성공','실패']
    succ_fail_choice = random.choice(succ_fail)

    if succ_fail_choice == '성공':
        print('낚시에 성공하였습니다.')
        print('[성공] {}님이 낚은 물고기는 {}입니다.'.format('id',choose_fish[choose_fish_num][2]))
    #     print('[성공] {}님이 낚은 물고기는 {}입니다.'.format(id,choose_fish[choose_fish_num][2]))
    else:
        print('[실패] 낚시에 실패했습니다.ㅠㅠ')
        pass

    # DB 저장 / 엑셀 저장
    # id, pw, 물고기, 수량, 가격, 현황
    df.loc[len(df)] = [id, pw, choose_fish[choose_fish_num][2], 1,
                       choose_fish[choose_fish_num][-1], '미판']
    df.to_excel('텍스트게임.xlsx', sheet_name = "낚시게임", index=None)
print(game_fishing_center())

 


- 1. 물고기표 불러오기

pd.read_excel('물고기표.xlsx')

>>  물고기표 엑셀을 불러옴

      No1, No2 는 각각 가로 세로 길이이고, 물고기 이름과 가격이 나와있다.

 

 

 

- 2. 물고기표 엑셀에서 물고기 정보를 불러오자

def game_fishing_center():
    print('낚시를 시작합니다....')
    print('낚싯줄을 던졌습니다....')
    
    fishing = pd.read_excel('물고기표.xlsx')
    return fishing

print(game_fishing_center())

>> fame_fishing_center()를 정의

     

>> 불러온 엑셀을 fishing이라고 지정

 

 

choose_fish = np.array(fishing).reshape(-1,4)

>> fishing이 DataFrame이므로 numpy의 ndarray로 바꿔주자.

     이때, reshape(-1,4)로 재배열 (4개의 열을 가지는 배열)

     바꾼 numpy 배열을 choose_fish로 지정

 

     # reshape(-1,n) : 행 자리에 -1, 열 자리에 정수가 있을 때 정수에 따라서 해당 열 개수만큼 자동으로 구조화

 

 

 

-  3. 물고기표에서 랜덤으로 물고기를 낚기

# 0부터 fishing 전체 행까지 반복, 랜덤 추출
choose_fish_num = random.randint(0, len(fishing))    # 랜덤으로 낚은 물고기
choose_fish_waiting_num = random.randint(choose_fish[choose_fish_num][0],  # 물고기 낚는 데 걸린 시간
                                         choose_fish[choose_fish_num][1])
time.sleep(choose_fish_waiting_num)  # 대기시간 주기

>> 0 부터 fishing 전체 길이 (len(fishing) = 751) 중에서 랜덤 추출

 

     # random.randint(a,b) : a, b 사이의 정수(int)를 랜덤으로 반환,  b 포함인거 주의!! ( a<= N <= b)

 

 

>> 여기서 No1, No2 값을 뽑고 (choose_fish[choose_fish_num][0], [1])

      choose_fish_waiting_num이라고 지정 (물고기 낚는 데 걸린 시간)

 

>> choose_fish_waiting_num(물고기 낚는 데 걸린 시간)만큼 time.sleep을 걸어서 대기시간을 검

 

 

 

- 4. 낚시 성공? or 실패?

succ_fail = ['성공','실패']
succ_fail_choice = random.choice(succ_fail)

if succ_fail_choice == '성공':
    print('낚시에 성공하였습니다.')
    print('[성공] {}님이 낚은 물고기는 {}입니다.'.format('id',choose_fish[choose_fish_num][2]))
#     print('[성공] {}님이 낚은 물고기는 {}입니다.'.format(id,choose_fish[choose_fish_num][2]))
else:
    print('[실패] 낚시에 실패했습니다.ㅠㅠ')
    pass

>> '성공', '실패'가 들어있는 succ_fail 리스트에서 랜덤으로 하나를 뽑는다.

 

     # random.choice() : 랜덤하게 하나의 원소를 뽑음

 

>> 만약 '성공'을 뽑는다면 > 낚시 성공!  >  낚은 물고기의 이름 반환

 

>> 만약 '실패'를 뽑는다면 > 낚시 실패ㅠㅠ

 

 

 

- 뽑은 물고기를 '텍스트게임' 엑셀에 저장

# DB 저장 / 엑셀 저장
# id, pw, 물고기, 수량, 가격, 현황
df.loc[len(df)] = [id, pw, choose_fish[choose_fish_num][2], 1,
                    choose_fish[choose_fish_num][-1], '미판']
df.to_excel('텍스트게임.xlsx', sheet_name = "낚시게임", index=None)

>> 이런 엑셀이 생성되는데, 나중에 나올 로그인할때 지정한 id와 pw와 낚은 물고기 이름, 낚은 물고기 개수 (=1)

      낚은 물고기 가격, 현황(='미판' > 나중에 상점에서 팔면 '판매'로 바뀜)이 저장된다.

 

 

 


 

[3]  상점 구현하기

 

 

 

 


 

 

- 1. 상점 정의하기

def game_store(df, id, pw):
    print('현재 판매하지 않은 물고기는 {}개 입니다.'.
          format(len(df[(df['ID'] == id) & (df['현황'] == '미판')])))
          
#df = pd.read_excel('텍스트게임.xlsx')

>> '텍스트게임' 엑셀을 불러와서 df로 저장하고

     df에서 ID가 입력한 id와 같고, '현황' 중에서 '미판'인 개수를 반환

 

 

 

- 2. 낚은 물고기 중 아직 판매하지 않은 물고기를 팔기

미판_index = df[(df['ID'] == id) & (df['현황'] == '미판')].index

>> df에서 입력한 id의 물고기 중 미판인 행들만 미판_index라고 지정

 

 

if len(미판_index) != 0:
    for i in range(len(미판_index)):
        print('{} 물고기를 판매하였습니다.'.format(df[(df['ID'] == id) & (df['현황'] == '미판')][i]))
        
else:  # 빈 경우
	print('미판한 물고기를 완판했습니다.')

>> 미판_index의 개수가 0이 아니라면 (미판인 물고기가 있다면)

     for문을 돌면서 그 행들을 차례대로 판매

 

>> 미판_index가 0이면 (미판인 물고기가 없다면) 완판했다고 출력

 

 

 

- 3. 판매 완료한 내용을 엑셀에 저장

    if len(미판_index) != 0:
        for i in range(len(미판_index)):
            print('{} 물고기를 판매하였습니다.'.format(df[(df['ID'] == id) & (df['현황'] == '미판')][i]))
            
            # DB 저장 / 엑셀 저장 
            df.loc[미판_index[i]] = [
                 id, pw, 
                 df[ (df['ID'] == id) & (df['현황'] == '미판')]['물고기'][미판_index[i]],
                 df[ (df['ID'] == id) & (df['현황'] == '미판')]['수량'][미판_index[i]],
                 df[ (df['ID'] == id) & (df['현황'] == '미판')]['가격'][미판_index[i]],
                 "판매" ]

>> df에서 id, pw와 물고기, 수량, 가격 그대로 가져오고, '미판' >> '판매' 바꿈

 

df.to_excel('텍스트게임.xlsx', sheet_name = "낚시게임", index=None)

>> 엑셀에 저장

 

 

 


[4] 게임 플레이 및 사용자 정보 구현하기

 

# 게임 플레이 및 사용자 정보 구현하기 

def game_play(id, pw): 
    
    while True: 
        
        df = pd.read_excel('텍스트게임.xlsx')
        
        돈 = df[ (df['ID'] == id) & ( df['현황'] == '판매')]['가격'].sum()
        물고기_종류 = len(np.unique( df[df['ID'] == id]['물고기']))
        잡은_물고기 = df[df['ID'] == id]['수량'].sum()
        티어 = len(df[ (df['ID'] == id) & (df['현황'] =='판매') ])
        
        if 티어 <= 10 : 
            티어 = "낚시꿈나무"
        elif 티어 >=11 and 티어 <= 20 : 
            티어 = "낚시사생팬"
        elif 티어 >=21:
            티어 = "낚시꾼"
            
        # ID, 티어, 돈, 잡은 물고기 종류, 잡은 물고기 수 
        
        print("안녕하세요, {} 님 / 티어:{} / 가지고 있는 금액:{} / 잡은 물고기 종류:{} / 잡은 물고기 수량: {}".
             format(id, 티어, 돈, 물고기_종류, 잡은_물고기))
        
        선택 = int(input("낚시하기(1) / 상점이용(2) / 게임종료(3)"))
        
        if 선택 == 1: # 낚시터
            game_fishing_center(df, id, pw)
        elif 선택 ==2 : # 상점 
            game_store(df, id, pw)
        elif 선택 ==3 : # 게임 종료 
            break

 

 

 


- 1. 게임 플레이 정의

def game_play(id, pw): 
    
    while True: 
        
        df = pd.read_excel('텍스트게임.xlsx')
        
        돈 = df[ (df['ID'] == id) & ( df['현황'] == '판매')]['가격'].sum()
        물고기_종류 = len(np.unique( df[df['ID'] == id]['물고기']))
        잡은_물고기 = df[df['ID'] == id]['수량'].sum()
        티어 = len(df[ (df['ID'] == id) & (df['현황'] =='판매') ])

 >> game_play를 정의하는데, while True 무한 루프를 돌면서 break가 나올 때까지 게임을 플레이 함

 

>> '돈' : 입력한 id중 판매한 물고기의 가격을 더해서 '돈'이라고 지정

     '물고기_종류' : 입력한 id 중 물고기의 개수. 이때 고유한 값만 반환

     '잡은_물고기' : 입력한 id 중 '수량' 합

     '티어' : 입력한 id 낚시 정보의 '판매' 개수

 

 

- 2. 티어를 설정

        if 티어 <= 10 : 
            티어 = "낚시꿈나무"
        elif 티어 >=11 and 티어 <= 20 : 
            티어 = "낚시사생팬"
        elif 티어 >=21:
            티어 = "낚시꾼"

 

 

 

-3. 현재 상태

print("안녕하세요, {} 님 / 티어:{} / 가지고 있는 금액:{} / 잡은 물고기 종류:{} / 잡은 물고기 수량: {}".
     format(id, 티어, 돈, 물고기_종류, 잡은_물고기))

 

 

-4. 낚시 플레이를 선택

선택 = int(input("낚시하기(1) / 상점이용(2) / 게임종료(3)"))
        
if 선택 == 1: # 낚시터
    game_fishing_center(df, id, pw)
elif 선택 ==2 : # 상점 
    game_store(df, id, pw)
elif 선택 ==3 : # 게임 종료 
    break

 


# 계정 정보 생성

계정정보 = []

df = pd.read_excel('텍스트게임.xlsx')

계정 = int(input('로그인(1) / 회원가입(2)')) 

if 계정 == 1: # 로그인 
    계정정보.append(input('ID 입력: '))
    계정정보.append(int(input("PW 입력: ")))
    
    if 계정정보[0] in df['ID'].unique() and 계정정보[1] in df['PW'].unique():
        print('커먼~ 게임을 시작합니다. 유후~')
        game_play( 계정정보[0], 계정정보[1]) 
    else: 
        print( "ID 또는 PW 가 없네요~")
        pass

elif 계정 == 2: # 회원가입
    계정정보.append(input('ID 입력: '))
    계정정보.append(int(input("PW 입력: ")))
    
    print("[축하] 회원가입 완료~ ")
    print("게임을 시작합니다.")
    game_play( 계정정보[0], 계정정보[1])