"파이썬 유치원 (유아반)"의 두 판 사이의 차이

 
(사용자 18명의 중간 판 137개는 보이지 않습니다)
13번째 줄: 13번째 줄:
==제타위키 사용법==
==제타위키 사용법==
{{youtube|N1PfQecU7eY}}
{{youtube|N1PfQecU7eY}}


==유아반 친구들==
==유아반 친구들==
===맨탈 와르르맨션(맨탈 붕괴)===
====제목====
탐험의 땅,익스(EXplore)
====설명====
파이게임으로 화면 반복하는 스토리형  탐험게임 만들기(게임명:EXS.the island of traveling(WIDTH:900,HEIGHT:600)
====실행화면====
실행화면을 넣어주세요.
====난이도====
총 12스테이지가 있으며,4개 마다 난이도가 달라짐
=====easy=====
쉬운 적들이 나타남
상점에 약한 무기가 나옴
=====medium=====
중간 적들이 나타남
상점에 포션이 등장,괜찮은 무기가 등장
=====hard=====
어려운 적들 등장(???도 등장)
상점에 강력한 무기가 등장
====게임 요소====
=====본인=====
=====적=====
난이도에 따라서 달라짐(우측 상단에서 확인 가능)
=====상점=====
======HP포션======
HP를 일정량 회복할 수 있고,버프를 주는 것도 있다.
======무기======
공격력을 높여주는 아이템.몬스터를 시원하게 날릴 수 있음.
======방어구======
플레이어를 방어 해주며, 방어구가 있으면 적이 곤란해 할 수 있다.
=====여관=====
들어가면 돈을 내고 쉴 수 있다.(HP풀 회복)
=====(이스터 에그?)=====
쉿,비밀
====코드====
https://github.com/animicibal22534?tab=repositories
====업데이트====
가이드 완료(일러스트 몇개 완성)
====댓글====
* 김왼손: pygame 쉽지 않던데 대단하네요. :)
===김민재===
===김민재===
====제목====
스스로 척척 계산기
====설명====
====설명====
파이참을 이용해 계산기 기능과 디자인, 형태까지 만드는 코드
파이참을 이용해 계산기 기능과 디자인, 형태까지 만드는 코드
[[파일:계산기|섬네일]]
====실행화면====
실행화면을 넣어주세요.


====코드====
====코드====
<source lang='python'>
<source lang='python'>
while True:
# This Python file uses the following encoding: utf-8
    Question = int(input('계산연자를 입력하세요. 1 . +, 2 . -, 3 . *, 4 . / : '))
# -*- coding: utf-8 -*-
     # 덧샘식 계산
 
     if Question == 1:
from tkinter import *
         plus = int(input('첫번째로 더할수를 입력하세요.'))
 
         plus2 = int(input('두번째로 더할수를 입력하세요.'))
def press(value):
         print(plus + plus2)
    global calc
         Question2 = int(input('1.계속, 2.그만 : '))
     global value1
    # 뺄셈식 계산
     if value == 'C':
    if Question == 2:
         expression_field.delete(0, "end")
        minus = int(input('첫번째로 뺼수를 입력하세요.'))
         calc = 0.0
        minus2 = int(input('두번째로 뺼수를 입력하세요.'))
    elif value == '=':
        print(minus - minus2)
        equalpress()
        Question2 = int(input('1.계속, 2.그만 : '))
    else:
     # 곱셈식 계산
         value1 = expression_field.get()
    if Question == 3:
         value1 = value1 + value
        times = int(input('첫번째로 곱할수를 입력하세요.'))
        expression_field.delete(0, "end")
        times2 = int(input('두번째로 곱할수를 입력하세요.'))
        expression_field.insert(0, value1)
        print(times * times2)
 
        Question2 = int(input('1.계속, 2.그만 : '))
def equalpress():
    # 나눗셈 계산
    calc = expression_field.get()
    if Question == 4:
    total = str(eval(calc))
        divided = int(input('첫번째로 나눌수를 입력하세요.'))
    expression_field.delete(0, END)
        divided2 = int(input('두번째로 나눌수를 입력하세요.'))
    expression_field.insert(0, total)
        print(divided / divided2)
     calc = ""
         Question2 = int(input('1.계속, 2.그만 : '))
 
    #멈추기
window = Tk()
    if Question2 == 2:
window.title("계산기")
        break
 
    #계속하기
equa = ""
    if Question2 == 1:
equation = StringVar()
        continue
calc = StringVar()
    #여기까지 계산기 기능
expression_field = Entry(window, width="32", bg="white") #색깔
expression_field.grid(row=0, column=0, columnspan=4)
 
text_list = ['789/', '456*', '123-', '0.=+']
for r, text in enumerate(text_list):
    for c, t in enumerate(text):
         Button(window, text=t, command=lambda t=t: press(t), height=1, width=7).grid(row=r+1, column=c)
 
Button(window, text="C", command=lambda: press('C'), height=1, width=7).grid(row=1, column=4)
 
window.mainloop()
</source>
</source>
계속 추가할 예정


===맨탈붕괴===
====댓글====
* 김왼손: 와.. 대부분의 계산기 기능이 만들어졌네요. 계산기는 인터넷에 공개되어 있는 코드가 많을텐데 한번 참고해 보면 어떨까요? :)
* 김민재: 왼손님이 지적해 주신것(코드를 줄여봐라)를 한번 해봤어요. 저는 모르겠었는데 지식인의 도움을 받아서 완성했습니다!
* 김민재: 계산기 디자인은 '#색깔' 한곳만 바꿔주면 디자인이 달라집니다!
* Projects.Kinder : 와~ 반복되었던 버튼에 대한 코드들이 다 사라졌네요!! :) 대단하세요~~ 참고해서 제가 만든 구구단을 업그레이드 해봐야겠어요~~


===김지수===
====제목====
제목을 정해주세요.
====설명====
====설명====
Pygame을 이용해 탐험 게임을 만들어 보고 싶습니다.
=====수준=====
(더 추가될 예정)
한입에 쏙 파이썬 2/3 수강, 아직 익숙치 않아서 코드를 따라하면서 매우 낮은 수준의 엑셀 읽고 쓰기 가능
=====목표=====
업무자동화 프로그램
* 엑셀파일 - pdf 파일(주로 table 자료)을 읽어서 엑셀에 작성
* 함수와 macro를 이용하듯이 파이썬으로 엑셀을 활용하고 싶습니다. ( ex : 회사 재고의 수입된 날짜와 로트 별로 집계 금액 산출)
* 항목별 책정된 금액을 재고 별로 할당하는 시스템. 예를 들자면 총 자금 100만원 중 50만원을 'A' 항목에 책정하고 그 금액은 'a1','a2','a3' 재고에만 할당시켜서 자동으로 매출매입현황을 파악할 수 있는 엑셀 환경을 파이썬으로 구축하고 싶습니다.
* 관심있는 특정 키워드를 포함한 뉴스기사 서칭
* '3'의 내용을 보고할 목적으로 이메일 전송
====실행화면====
실행화면을 넣어주세요.
====코드====
<source lang='python'>
from openpyxl import load_workbook
import pandas as pd
from pandas import Series, DataFrame
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
import os
import warnings
warnings.filterwarnings("ignore")
 
def sort():
    ws1['A1'].value = '년'
    ws1['B1'].value = '월'
    ws1['C1'].value = '품목명'
    ws1['D1'].value = '수량'
    ws1['E1'].value = '단가'
    ws1['F1'].value = '공급가액'
    ws1['G1'].value = '부가세'
    ws1['H1'].value = '합계'
    ws1['I1'].value = '거래처명'
    ws1['J1'].value = '적요'
 
wb1 = load_workbook('testing.xlsx', data_only = True)
ws1 = wb1['Sheet1']
wb1.remove(wb1['Sheet1'])
ws1 = wb1.create_sheet('Sheet1')
ws1 = wb1['Sheet1']
 
sort()
 
user_input = ''
user_input = input('몇 월 까지의 매출 자료를 불러옵니까? : ')
for month in range(1,int(user_input)+1):
    wb2 = load_workbook(str(str(month).zfill(2))+'매출.xlsx',data_only = True)
    ws2 = wb2['판매현황']
    for row1 in ws2.rows:
        if '계' and '일자' not in row1[0].value and '-' in row1[0].value :
            devision = [str(row1[0].value).split('/')[0], str(row1[0].value).split('/')[1],str(row1[1].value).split(' [')[0]]
            for num in range(2,9):
                devision.append(str(row1[num].value))
            ws1.append(devision)
#반복문으로 입력되게 수정
           
wb1.remove(wb1['Sheet2'])
ws1_2 = wb1.create_sheet('Sheet2')
user_input = ''
user_input = input('몇 월, 몇 일의 재고 자료를 불러옵니까?(mmdd): ')
 
wb2 = load_workbook(user_input+'재고.xlsx',data_only = True)
ws2 = wb2['재고현황']
ws1_2 = wb1['Sheet2']


====지역====
for row2 in ws2.rows:
=====쉬움=====
    ws1_2.append([str(row2[1].value),str(row2[3].value)])
시작지역
=====중간=====
=====어려움=====


====상점====
ws1_2.delete_rows(1)
상점은 지역마다 1~2개씩 있고, 좀 떨어져 있음. 중간에 방랑상인을 만날 수 있음
ws1_2.delete_rows(int(ws1_2.max_row))
====무기====
ws1_2.delete_rows(int(ws1_2.max_row))
바닥에 떨어져 있는 것을 주울 수도 있고, 상점에서도 살 수 있음
====자원====
숨겨져 있는 곳을 발견해서 랜덤으로 얻음.혹은 특정 몹에게서 얻음.이것들로 상점에서 교환 가능
====체크포인트====
심각한 부상을 입을 경우,가까이 있는 체크포인트에서 시작
체크포인트는 수동적으로 하며,자원을 소량 얻음
====비밀 퀘스트====
???
====github====
https://github.com/animicibal22534/explore/tree/master


===마카===
wb1.save('testing.xlsx')
 
df = pd.read_excel('testing.xlsx', sheet_name = 'Sheet2')
df2 = pd.read_excel('testing.xlsx', sheet_name = 'Sheet1')
df2 = pd.merge(df2, df, how = 'left', on = '품목명')
df2.to_excel('testing_2.xlsx', index = False)
 
#vlookup 함수를 문자열로 사용하면 pivot_table로 활용할 때 값이 수식을 불러들여 NaN 값이 발생해서 pandas에서 merge를 활용해 vlookup을 구현, DataFrame을 엑셀로 저장
 
table_1 = pd.pivot_table(df2, index=['품목명','재고수량','거래처명'], columns=['년','월'], values=['수량'], aggfunc='sum')
table_2 = pd.pivot_table(df2, index=['품목명','재고수량'], columns=['년','월'], values=['수량'], aggfunc='sum')
writer = pd.ExcelWriter( 'ERP 매출 재고 통합자료.xlsx', engine = 'xlsxwriter')
table_2.to_excel(writer, sheet_name = 'Sheet1')
table_1.to_excel(writer, sheet_name = '거래처 포함')
writer.save()
 
#pandas의 pivot_table을 사용하여 엑셀의 피벗테이블을 구현
 
wb3 = excel.Workbooks.Open(str(os.path.dirname(os.path.realpath(__file__)))+'\\'+'ERP 매출 재고 통합자료.xlsx')
 
#다른 PC에서도 프로그램을 사용하므로 경로 입력을 현재 파일의 절대 경로를 문자열로 입력하고  파일 이름을 추가 해줌
 
ws3_1 = wb3.Worksheets("Sheet1")
ws3_2 = wb3.Worksheets("거래처 포함")
ws3_1.Columns.AutoFit()
ws3_2.Columns.AutoFit()
wb3.Save()
excel.Application.Quit()
 
#서식을 조작하여 열의 너비를 자동으로 맞추기 위해 추가한 코드
 
</source>
====댓글====
* 김왼손: 완성되면 바로 써먹을수 있겠는데요? 대단합니다. :)
 
===Kim KY===
====제목====
제목을 정해주세요.
====설명====
====설명====
마인크래프트 활용이나 디스코드 봇을만들고싶어요
장비가동률을 기반으로 한 장비별 전문화 아이템 산출
====실행화면====
실행화면을 넣어주세요.
====코드====
====코드====
<source lang='python'>
<source lang='python'>
print('Hello Python!')
# 파이썬 시작하기
a = input('program_number?')
i = input('연월일(yyyy.mm.dd)?')
year = i[0:4]
month = i[5:7]
date = i[8:]
 
print('='*50)
print('program_number #' + a)
print('Life is short, You need Python')
print(f'연도 : {year}년')
print(f'날짜 : {month}월 {date}일')
print('='*50)
 
</source>
</source>
====댓글====
* 김왼손: 뭔가 전문적인 느낌이 드는 주제네요. :)


===Min-Ku Lee===
===김매매===
====설명====
====제목====
저는 시내버스 기사인데요, 버스의 배차표를 작성하는 프로그램을 만들고 싶어요.
제목을 정해주세요.
=====코딩경력=====
====수준====
20년전 학교에서 배운게 전부이며 전/현직 직업은 코딩과 관련 없는 직업 (비쥬얼베이직6.0, C, ASP, JSP를 배웠으나 (전혀)기억나지 않음)
구글에 파이썬 예제라고 치면 나오는 300문제 다 풀 수 있음
=====개요=====
====목표====
시내버스 배차 프로그램
1.김매매: 휴대폰 배터리 상태와 온도 알림 어플
=====목적=====
2. fps게임할때 화면을 확대해 스코프 없이도 줌을 할수 있는 프로그램(모바일 포함)
현재 엑셀로 작성/관리되는 배차표를 자동화하고 DB로 저장함
3. 버튼 하나로 음악을 재생, 정지를 해 게임 로딩시간을 지루하지 않게 하는 프로그램
=====현황=====
4. 휴대폰 게임 할때 버튼 위치를 옮길 수 없을때 임의로 지정한 곳을 터치하면 버튼이 인식되는 어플
배차표를 팀장이 수기로 작성하여 공지하면, 팀원은 해당 배차표를 확인하고 운행
왠만하면 모바일로 갈거임
* 배차표는 팀장이 엑셀로 작성하고 관리하며 보통 1주일 단위로 배차를 공지함
====실행화면====
* 배차 순번에 따라 운행 횟수가 달라짐(예: 첫차~4번차 = 4바퀴 / 5번차~막차= 3바퀴)
실행화면을 넣어주세요.
* 변수(차량고장, 사고 등)가 발생하면 당일 이후 배차를 전부 재 수기로 수정해야 함
* 기사 입사일 순번으로 고정 차량이 지급되며, 나머지 기사는 스페어 기사임 (예: 차량이 10대/ 기사가 17명일 경우, 위로 10명은 고정차/ 뒤 7명은 임의 차량을 탐)
* 팀원(기사)은 배차가 곧 월급 및 근무시간(운행횟수)와 직접 연계 됨
* 따라서, 배차표를 민감하게 생각하고 불만이 많음 (누구는 3바퀴 타고, 나는 4바퀴타고 등)
=====내용=====
버스와 기사를 매칭해서 일별 배차표 작성
* Admin(팀장)만 배차표를 작성 할 수 있음.
* 배차표 열람권한은 팀원만 해도 되고, 전체공개를 해도 무관
* 일별 차량과 기사를 맵핑하여 일일 배차표를 자동으로 생성하고 작성기간 임의생성 가능(예: 한달 배차 또는 1주일 배차 등)
* 배차 순번과 차량을 공평하고 공정하게 생성(스페어 기사 고려)
* 변수 발생에 따른 임의 수정 기능 필요.(임의 수정 시 이후 배차표는 자동생성)
* Admin의 열람기능 필요.(예: 팀원 별 근무일수, 4바퀴/3바퀴 운행 횟수 등 <- 팀원 불만 해소)
====코드====
====코드====
<source lang='python'>
<source lang='python'>
print('Hello Python!')
#'국민 갓겜 가위바위보를 만들었습니다.'
 
print('게임을 시작합니다. 시작하려면 아무키나 입력하시고\n 종료하시려면 "종료"를 입력해 주세요')
skill=input()
list=['가위', '바위', '보']
win='제가 이겼군요 하핳'
lose='제가 졌군요ㅠㅠ'
tie='비겼네요 다시'
winc=0
losec=0
tiec=0
scissors=0
rock=0
paper=0
while skill!='종료':
    print('안 내면 진 거 가위바위보')
    skill=input()
    if skill=='가위':
        scissors+=1
        import random
        resurt=random.choice(list)
        print(resurt)
        if resurt=='가위':
            print(tie)
            tiec+=1
            print('\n')
        elif resurt=='바위':
            print(win)
            winc+=1
            print('\n')
        elif resurt=='보':
            print(lose)
            losec+=1
            print('\n')
    elif skill=='바위':
        rock+=1
        import random
        resurt=random.choice(list)
        print(resurt)
        if resurt=='가위':
            print(lose)
            losec+=1
            print('\n')
        elif resurt=='바위':
            print(tie)
            tiec+=1
            print('\n')
        elif resurt=='보':
            print(win)
            winc+=1
            print('\n')
    elif skill=='보':
        paper+=1
        import random
        resurt=random.choice(list)
        print(resurt)
        if resurt=='가위':
            print(win)
            winc+=1
            print('\n')
        elif resurt=='바위':
            print(lose)
            losec+=1
            print('\n')
        elif resurt=='보':
            print(tie)
            tiec+=1
            print('\n')
    else:
        if skill!='종료':
            print('이상한거 내지 말고 재대로 내봐요')
            print('\n')
    continue
print('게임이 종료돠었습니다.')
print('승리 :',winc)
print('패배 :',losec)
print('무승부 :',tiec)
print('\n')
print('가위를 낸 횟수 :',scissors)
print('바위를 낸 횟수 :',rock)
print('보를 낸 횟수 :',paper)
print('수고하셨습니다.')
input('창을 닫으시려면 아무 키나 입력하세요')
</source>
</source>
====댓글====
* 김왼손: 훌륭한 가위바위보 게임입니다. :)


===white tree===
===ckstmznf===
====제목====
제목을 정해주세요.
====설명====
====설명====
디스코드 봇을 만들고싶어요 음악,알림등 기능이 있는봇
GUI를 이용해서 나를 소개하는 프로그램 만들기
====실행화면====
실행화면을 넣어주세요.
====참고영상====
https://youtu.be/OtqWefBqbxA
====1일차(부제 : 기획)====
지난주 밖에 나가야 해서 참여를 못했지만---귀찮이즘이---PyQt5의 강의 영상은 꾸준히 보아 학습하였다.
오늘부터 시작을 한다. 먼저 기획을 한다면
기본 메뉴 ┌기본 프로필
              |─할수 있는 언어
              |─사용 할수 있는 소프트 웨어
            └기타 내용
====코드====
====코드====
<source lang='python'>
<source lang='python'>
import discord
import sys
import asyncio
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
 
class Exam(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        x = 15
 
        btn_gibon = QPushButton("기본 메뉴 입니다.", self)
        btn_gibon.resize(btn_gibon.sizeHint())
        # btn_gibon.setToolTip("저의 기본 정보를 볼수 있는 메뉴입니다.")
        btn_gibon.move(50,x)
        x += 70


client = discord.Client()
        btn_gibon = QPushButton("기본 정보", self)
        btn_gibon.resize(btn_gibon.sizeHint())
        btn_gibon.setToolTip("저의 기본 정보를 볼수 있는 메뉴입니다.")
        btn_gibon.move(50,x)
        x += 70


token = "봇 토큰"
        btn_gibon = QPushButton("할수 있는 언어", self)
        btn_gibon.resize(btn_gibon.sizeHint())
        btn_gibon.setToolTip("제가 할수 있는 언어들입니다.")
        btn_gibon.move(50,x)
        x += 70


@client.event
        btn_gibon = QPushButton("사용 할수 있는 소프트 웨어", self)
async def on_ready():
        btn_gibon.resize(btn_gibon.sizeHint())
    print('Logged in as')
        btn_gibon.setToolTip("제가 사용할수 있는 소프트 웨어들 입니다.")
    print(client.user.name)
        btn_gibon.move(50,x)
    print(client.user.id)
        x += 70
    print('------')
    await client.change_presence(status=discord.Status.online, activity=discord.Game('정상 작동'))


@client.event
        btn_gibon = QPushButton("그 밖의 내용", self)
async def on_message(message):
        btn_gibon.resize(btn_gibon.sizeHint())
    if message.content.startswith('!test'):
        btn_gibon.setToolTip("그 밖의 기타 내용 입니다.")
         await message.channel.send('test')
        btn_gibon.move(50,x)
       
        self.setGeometry(500,500,400,400)
         self.setWindowTitle("기본 메뉴")
        self.show()


@client.event
async def on_message(message):
    if message.content.startswith("!1"):
        embed = discord.Embed(title="안녕하세요!", description="저는 테스트중인 봇입니다.", color=0x00ff00)
        embed.add_field(name="미완성", value="현제 제작중", inline=True)
        embed.add_field(name="미완성", value="현제 제작중", inline=True)
        await message.channel.send(embed=embed)


client.run(token)
app = QApplication(sys.argv)
w = Exam()
sys.exit(app.exec_())
</source>
</source>
====발전 내용====
=====1일차=====
1일차 기획을 한 기본 메뉴들을 만들었다. 내가 지금 하고있는게 정석인지 안니지는 모르겠지만...
====댓글====
* 김왼손: 자기소개 프로그램이라니.. 기대됩니다. :)
===Yoon===
====제목====
제목을 정해주세요.
====설명====
간단한 게임들을 만들어보고 싶어요.
====실행화면====
실행화면을 넣어주세요.
====코드====
일단은 Python 기초강의 영상보면서 공부중입니다.
<br>
2020.05.06 : 미운코딩새끼 28강까지 정리 완료
<br>
2020.05.07 : 미운코딩새끼 46강까지 정리 완료
<br>
2020.05.08 : 미운코딩새끼 완료
<br>
https://www.notion.so/Python-414973d8d54a43c7a9495d201babed29
<br>
코드 적어본것 깃허브
<br>
https://github.com/YoonJeong-Choi/PythonPreschool
<br>
2020.05.09~10 : snake game 시작, 도움 - https://python.bakyeono.net/chapter-12-1.html
<br>
~ 2020.05.15 : snake game 재시작, 점수, 속도 기능 추가
<br>
~ 2020.05.19 : 메인화면 시작, 종료 버튼 추가
<source lang='python'>
import pygame
import random # 랜덤으로 사과 띄움
import time
from datetime import datetime
from datetime import timedelta
from tkinter import *
# import tkinter.messagebox


===안기웅===
pygame.init() # pygame 초기화
====About Me====
안녕하세요. 비전공자 딸바보 아빠입니다.<br>
저는 전산쟁이 9년차이고요.<br>
프로그래밍은 깊게 안들어가봤어요.<br>
저는 저희 아기 사진 블로그를 만들고 싶습니다.<br>
현재 장고를 공부하고 있습니다.<br>
제 포트폴리오는 아래와 같습니다.
<p>
* 게시판: http://ankiwoong.pythonanywhere.com
* 클론코딩: https://ankiwoong.github.io
* Git: https://github.com/ankiwoong
* 공부블로그: https://developer-ankiwoong.tistory.com
</p>


====Django Introduction====
SCREEN_WIDTH = 440 # 화면 너비
* MVC(Model - View - Controller)
SCREEN_HEIGHT = 440 # 화면 높이
* MVT(Model - View - Template)
BLOCK_SIZE = 20 # 블록 크기(네모 한칸 크기)
* Model : models.py
# 화면의 가로세로가 400이고 블록의 크기가 20이기 때문에 가로, 세로는 20칸씩 블록이 들어갈 수 있다.
* View : views.py
* Template : settings.py
* URL 정의 : urls.py
* 로직 정의 : views.py


====Django order====
# 화면의 테두리부분 영역
* 프로젝트 생성
EDGE = []
* APP 생성
for w in range(0, 22) :
* Database 갱신
    EDGE.append((0, w))
* Setting 수정
    EDGE.append((21, w))
* 관리자 생성
    EDGE.append((w, 0))
* 부트스트랩 적용({% load static %})
    EDGE.append((w, 21))


====Basic Setting====
# 시작 버튼 영역
* 가상 환경 설정
START = []
<source lang='python'>
for s in range(0, 8) :
python -m venv venv
    START.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 2 + BLOCK_SIZE // 2))
</source>
    START.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 2 + BLOCK_SIZE // 2 + BLOCK_SIZE))
* django 설치
    START.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 2 + BLOCK_SIZE // 2 + BLOCK_SIZE * 2))
<source lang='python'>
 
pip install django
# 종료 버튼 영역
</source>
EXIT = []
* django 버전 확인
for s in range(0, 8) :
<source lang='python'>
    EXIT.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 3 * 2 + BLOCK_SIZE // 2))
python -m django --version
    EXIT.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 3 * 2 + BLOCK_SIZE // 2 + BLOCK_SIZE))
</source>
    EXIT.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 3 * 2 + BLOCK_SIZE // 2 + BLOCK_SIZE * 2))
 
# 색
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
SNAKEGREEN = (29, 139, 21)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
BROWN = (124, 56, 0)
LIGHTGRAY = (234, 234, 234)
DARKGRAY = (140, 140, 140)
 
# 점수
score = 0
# pygeme.display.set_mode((화면 너비, 화면 높이)) 화면 객체 반환
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))


====Git Setting====
pygame.display.set_caption('SnakeGame') # title 설정
<p>
* gitignore 설정
https://developer-ankiwoong.tistory.com/837
* git 생성
https://github.com/ankiwoong/python_kindergarten
* git 연결
<source lang='bash'>
git remote add orign https https://github.com/ankiwoong/python_kindergarten.git
</source>
<source lang='bash'>
git remote -v
</source>
</p>


====Project====
# 화면
* 프로젝트 생성
# 시작 화면
<source lang='python'>
def draw_main(screen) :
django-admin startproject anjia .
    background = pygame.Rect((0, 0), (SCREEN_WIDTH, SCREEN_HEIGHT))
</source>
    pygame.draw.rect(screen, WHITE, background)
    # 시작버튼
    for start in START :
        startButton = pygame.Rect((start[0], start[1]), (BLOCK_SIZE, BLOCK_SIZE))
        pygame.draw.rect(screen, GREEN, startButton)
    # 시작글씨
    font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE * 2) # 폰트 설정
    text = font.render('start!', True, BLACK) # 글자 설정 render('출력', True, 글자색, 배경색)
    textRect = text.get_rect()
    textRect.center = (int(((SCREEN_WIDTH // 4) + (BLOCK_SIZE * 5.5))), ((SCREEN_HEIGHT // 2) + (BLOCK_SIZE * 2)))
    screen.blit(text, textRect)
    # 제목
    title_font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE * 3) # 폰트 설정
    title_text = title_font.render('Snake Game', True, SNAKEGREEN) # 글자 설정 render('출력', True, 글자색, 배경색)
    title_textRect = title_text.get_rect()
    title_textRect.center = (int(((SCREEN_WIDTH // 4) + (BLOCK_SIZE * 5.5))), (SCREEN_HEIGHT // 3))
    screen.blit(title_text, title_textRect)
    # 종료버튼
    for exit in EXIT :
        exitButton = pygame.Rect((exit[0], exit[1]), (BLOCK_SIZE, BLOCK_SIZE))
        pygame.draw.rect(screen, LIGHTGRAY, exitButton)
    # 종료글씨
    exit_font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE * 2) # 폰트 설정
    exit_text = exit_font.render('exit', True, DARKGRAY) # 글자 설정 render('출력', True, 글자색, 배경색)
    exit_textRect = exit_text.get_rect()
    exit_textRect.center = (int(((SCREEN_WIDTH // 4) + (BLOCK_SIZE * 5.5))), (SCREEN_HEIGHT // 3 * 2  + BLOCK_SIZE * 2))
    screen.blit(exit_text, exit_textRect)


* runserver 테스트
# 게임 배경
<source lang='python'>
def draw_background(screen) :
python manage.py runserver
    # 화면 전체에 강과 땅을 그려준다.
</source>
    # pygame.Rect((x, y), (사각형 너비, 사각형 높이))
    background = pygame.Rect((0, 0), (SCREEN_WIDTH, SCREEN_HEIGHT))
    # pygame.draw.rect(사각형을 그릴 화면, 색, 사각형 정보)
    pygame.draw.rect(screen, BROWN, background)
    # 테두리는 파란색으로 칠해준다.
    for edge in EDGE :
        edges = pygame.Rect((edge[0] * BLOCK_SIZE, edge[1] * BLOCK_SIZE), (BLOCK_SIZE, BLOCK_SIZE))
        pygame.draw.rect(screen, BLUE, edges)


<gallery>
Runserver.png|테스트 화면
</gallery>


* App 생성
# 블록을 그리는 함수 이 함수로 뱀이나 사과같은것들을 그려준다.
<source lang='python'>
def draw_block(screen, color, position) :
python manage.py startapp blog
    # position[n] * BLOCK_SIZE는 블록의 위치를 나타낸다.
</source>
    # 화면크기가 400*400, 블록이 20*20이기 때문에 화면은 가로, 세로 20칸이 된다. x, y를 이를 이용해 설정한것
    block = pygame.Rect((position[0] * BLOCK_SIZE, position[1] * BLOCK_SIZE), (BLOCK_SIZE, BLOCK_SIZE))
    pygame.draw.rect(screen, color, block)


* Settings 수정
<source lang='python'>
ALLOWED_HOSTS = ['192.168.56.101', 'localhost', '127.0.0.1']


INSTALLED_APPS = [
# 블록 위치 = 뱀이 처음 나올 위치
    'django.contrib.admin',
block_position = [9, 9]
    'django.contrib.auth',
# 마지막으로 블록을 움직인인 때 = 마지막으로 버튼을 누른 때
    'django.contrib.contenttypes',
# datetime.now()는 현재 시간을 알려준다.
    'django.contrib.sessions',
last_moved_time = datetime.now()
    'django.contrib.messages',
# 처음 블록의 방향은 아래
    'django.contrib.staticfiles',
block_direction = 'down'
    'blog',                              # blog app 추가
]


DATABASES = {
# 방향 키 입력에 따라 블록의 방향 dictionary
     'default': {
DIRECTION_ON_KEY = {
        'ENGINE': 'django.db.backends.sqlite3',
     pygame.K_UP : 'up',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    pygame.K_DOWN : 'down',
     }
    pygame.K_LEFT : 'left',
     pygame.K_RIGHT : 'right'
}
}


LANGUAGE_CODE = 'ko-kr'        # 언어 : 한국
# 뱀
class Snake :
    color = GREEN
    # speed = 0.3
    def __init__(self) :
        self.positions = [(11, 11)] # 뱀의 위치. 뱀이 길어질수록 이 배열도 길어질것이다.
        self.direction = 'down' # 뱀의 방향
        self.speed = 0.3
 
    def draw(self, screen) :
        # 뱀그리기. 사과를 먹을수록 길어져야한다.
        # 여러 블록으로 이루어져있기 때문에 반복문을 돌며 그린다.
        for position in self.positions:
            draw_block(screen, self.color, position)
    # 뱀이 움직이면 머리가 움직인것에 따라 꼬리까지 따라가게 만드는 함수
    def crawl(self) :
        # 뱀의 머리는 인스턴스 변수인 positions[0] 위치이다.
        head_position = self.positions[0]
        # x, y 변수에 머리의 x, y좌표를 넣어준다.
        x, y = head_position
        # 만약 현재 뱀이 움직이는 방향이 아래라면
        if self.direction == 'down' :
            # 뱀의 머리 위치를 한칸 아래로 바꿔주고,
            # 기존 뱀의 위치 중 꼬리가 있던 부분 직전까지 더해준다.
            # 이렇게하면 머리의 위치를 앞에 추가해줌으로써
            # 머리부터 꼬리까지 각자 블럭의 앞에 있던 칸으로 따라간다.
            self.positions = [(x, y + 1)] + self.positions[:-1]
        elif self.direction == 'up' :
            self.positions = [(x, y - 1)] + self.positions[:-1]
        elif self.direction == 'left' :
            self.positions = [(x - 1, y)] + self.positions[:-1]
        elif self.direction == 'right' :
            self.positions = [(x + 1, y)] + self.positions[:-1]
    # 뱀의 방향을 바꾸는 함수
    def turn(self, direction) :
         self.direction = direction
    # 뱀을 키워주는 함수
    def grow(self) :
        # 뱀 꼬리의 뒤에 한칸 붙여준다.
        x, y = self.positions[-1]
        if self.direction == 'up' :
            self.positions.append((x, y - 1))
        elif self.direction == 'down' :
            self.positions.append((x, y + 1))
        elif self.direction == 'left' :
            self.positions.append((x - 1, y))
        elif self.direction == 'right' :
            self.positions.append((x + 1, y))
        # 뱀의 속도를 높여준다.
        if len(self.positions) > 15  and len(self.positions) < 25  :
            self.speed = 0.2
        elif len(self.positions) > 25 :
            self.speed = 0.1       
 
# 사과
class Apple :
    color = RED
    def __init__(self, position = (7, 7)) :
        self.position = position # 사과 위치
 
    def draw(self, screen) :
        # 사과 그리기
        draw_block(screen, self.color, self.position)   
 
# 게임판 : 뱀과 사과를 그려준다
class Board :
    width = 20
    height = 20
   
    def __init__(self) :
        self.snake = Snake()
        self.apple = Apple()
 
    def draw(self, screen) :
        self.apple.draw(screen) # 게임판 위의 사과 그리기
        self.snake.draw(screen) # 게임판 위의 뱀 그리기
    # 사과 만들기 - 사과에 사과만들기를하면 snake인스턴스를 못쓴다.
    def put_new_apple(self) :
        # 0 부터 20까지 랜덤으로 수를 정해 사과 위치를 정한다.
        self.apple = Apple((random.randint(1, 20), random.randint(1, 20)))
        # 뱀의 몸과 겹치면 사과를 다시만든다.
        for position in self.snake.positions :
            if self.apple.position == position :
                self.put_new_apple()
                break
    # 시간이 지나면 process_turn 메소드가 실행되며 저절로 뱀이 움직인다.
    def process_turn(self) :
        self.snake.crawl()
        # 뱀머리가 몸이나 벽에 부딛히면 게임이 끝난다.
        if self.snake.positions[0] in self.snake.positions[1:] or self.snake.positions[0] in EDGE:
            play = False
            return play
           
        # 움직이다가 사과 == 뱀머리 이면 뱀을 길게만들고 새 사과를 만든다.
        if self.snake.positions[0] == self.apple.position:
            self.snake.grow()
            self.put_new_apple()
            return 1
        return 1
    # 점수를 표시해주는 메소드.
    def write_score(self, screen) :
        score = 'score : {}'.format(len(self.snake.positions) - 1)
        # 상단에 점수표시
        font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE) # 폰트 설정
        text = font.render(score, True, BLACK, WHITE) # 글자 설정 render('출력', True, 글자색, 배경색)
        textRect = text.get_rect()
        textRect.center = (SCREEN_WIDTH // 2, BLOCK_SIZE // 2)
        screen.blit(text, textRect)   
 
class Play_Again :
    replay = True   
    def __init__ (self, replay) :
        # 윈도우 창 생성
        replay_window = Tk()
        # 윈도우 창 타이틀 지정
        replay_window.title('Game Over')
        # 윈도우 창의 크기 지정
        replay_window.geometry('230x100')
        # 윈도우 창 크기변경 가능?
        replay_window.resizable(0, 0)
        # 라벨
        show_text = Label(replay_window, text='~Game Over~\n다시하시겠습니까?').place(x = 60, y = 15)
        # 버튼
        replay_btn = Button(replay_window, text='Play Again', command = lambda: (self.Play(replay), replay_window.destroy())).place(x = 40, y = 60)
        exit_btn = Button(replay_window, text='Exit', command = lambda: (self.End(replay), replay_window.destroy())).place(x = 150, y = 60)
        # 윈도우 창 유지
        replay_window.mainloop()
       
    def Play(self, replay) :
        self.replay = True
        return self.replay
 
    def End(self, replay) :
        self.replay = False
        return self.replay
 
# 게임 화면
def play_game(play, last_moved_time) :
    board = Board()
    while play :
        # pygame.event.get() 발생한 이벤트 목록을 읽는다.
        events = pygame.event.get()
           
        # 반복문을 이용하여 이벤트 목록을 본다.
        for event in events :
            # 종료 이벤트가 발생하면 종료한다.
            if event.type == pygame.QUIT :
                # exit()
                pygame.quit()
            # 어떤 버튼을 눌렀다면 아래처럼 행동한다.
            if event.type == pygame.KEYDOWN :
                # 만약 눌린 버튼이 화살표키라면 블록의 방향을 화살표 키에 맞게 바꾼다.
                if event.key in DIRECTION_ON_KEY :
                    # dictionary
                    board.snake.turn(DIRECTION_ON_KEY[event.key])
           
        # datetime.now() - last_moved_time을 이용하여 마지막으로 버튼을 누른지 0.3초가 지났다면
        # timedelta() 두 날짜(일,주 등등)나 시간(초, 분 등등)의 차이를 알려준다.
        if timedelta(seconds = board.snake.speed) <= datetime.now() - last_moved_time :
            play = board.process_turn()
            last_moved_time = datetime.now() # 마지막으로 움직인 시간 알려줌
               
        draw_background(screen) # 배경그리기
        board.draw(screen) # 화면판에 게임판그리기
        board.write_score(screen)
               
        # 화면 새로고침
        pygame.display.update()
           
# 처음시작?
first = True
# 재시작?
replay = True
# 게임실행
play = True
 
while replay :
    if first == True :
        screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        draw_main(screen)
        pygame.display.update()
        events = pygame.event.get()
        for event in events :
            # 마우스 up 이벤트
            if event.type == pygame.MOUSEBUTTONUP :
                # start 버튼 범위
                if pygame.mouse.get_pos()[0] in range(START[0][0], START[-1][0]) and pygame.mouse.get_pos()[1] in range(START[0][1], START[-1][1]) :
                    first = False
                    play_game(play, last_moved_time)
                    play = False
                # exit 버튼 범위
                if pygame.mouse.get_pos()[0] in range(EXIT[0][0], EXIT[-1][0]) and pygame.mouse.get_pos()[1] in range(EXIT[0][1], EXIT[-1][1]) :
                    play = False
                    replay = False
                    first = False
    else :
        play_game(play, last_moved_time)
        play = False
    # 종료버튼을 누르면 게임종료
    if not play and not replay and not first :
        break
    if not play and replay:
        # 게임이 종료되면 play == False가 되며 while을 빠져나온다.
        play_again = Play_Again(replay)
        replay = play_again.replay
        if replay :
            # 만약 재시작을 한다고 했다면 play = True가 되며 다시 게임이 시작된다.
            play = True
            continue
        # 하지만 재시작을 하지 않는다 했다면 반복문은 종료된다.
        break
 
# 게임도 종료된다. exit()
pygame.quit()


TIME_ZONE = 'Asia/Seoul'        # 타임존 : 한국 시간(기본 : UTC(세계표준시))
</source>
</source>
<br>
<br>
====댓글====
* 김왼손: 스네이크 게임은 아주 유명하죠. 좋은 시작입니다. :)


* 데이터베이스에 변경 필요 사항 추출
===어쭈구저쭈구===
====제목====
제목을 정해주세요.
====설명====
컴퓨터와 턴제로 싸우는 게임 만들기
====실행화면====
실행화면을 넣어주세요.
====목표====
자바나 코틀린 배우면 모바일로 만들고 싶습니다
====코드====
=====pyght=====
<source lang='python'>
<source lang='python'>
python manage.py makemigrations
from random import choice
</source>
from time import sleep as wait
from os import system
import Setting
import wizard
import worrior
import condition
 
jobs = ['마법사', '전사', '암살자', '언데드', '무작위']
levels = ['하', '중', '상', '최상']
 
player_con = []
enemy_con = []
 
# 플레이어 상태 변수
 
player_fireturn = 0
player_poisonturn = 0
player_bloodturn = 0
player_thirstyturn = 0
player_recover_up = 0
player_recover_down = 0
player_faintturn = 0
player_harmoniousturn = 0
player_reproduceturn = 0
player_barrier = 0
player_barrierturn = 0
player_undying = 0
 
# 적 상태 변수
 
enemy_fireturn = 0
enemy_poisonturn = 0
enemy_bloodturn = 0
enemy_thirstyturn = 0
enemy_recover_up = 0
enemy_recover_down = 0
enemy_faintturn = 0
enemy_harmoniousturn = 0
enemy_reproduceturn = 0
enemy_barrier = 0
enemy_barrierturn = 0
enemy_undying = 0
 
# 직업 정하기
print("당신의 직업을 정해주세요. -> 마법사, 전사, 암살자, 언데드, 무작위")
 
while True:
    player_job = input()
    if player_job in jobs:
        if player_job == '무작위':
            jobs.remove('무작위')
            player_job = choice(jobs)
            jobs.append('무작위')
        print('당신의 직업은 {}입니다.'.format(player_job))
        break
    else:
        print('다시 선택해 주십시오.')
 
#마법사 전용 변수
if player_job == '마법사':
    player_wizard_get_mana = 4
    player_up_wizard_igmagicdefence = 1
 
print('상대의 직업을 정해주세요. -> 마법사, 전사, 암살자, 언데드, 무작위')
 
while True:
    enemy_job = input()
    if enemy_job in jobs:
        if enemy_job == '무작위':
            jobs.remove('무작위')
            enemy_job = choice(jobs)
            jobs.append('무작위')
        print('적의 직업은 {}입니다.'.format(enemy_job))
        break
    else:
        print('다시 선택해 주십시오.')
 
print('----------------------------------------------------\n')
print("난이도를 정해주세요. -> 하, 중, 상, 최상")
 
if enemy_job == '마법사':
    enemy_wizard_get_mana = 4
    enemy_up_wizard_igmagicdefence = 1
 
# 난이도 정하기
 
while True:
    level = input()
    if level in levels:
        print('난이도는 {}입니다.'.format(level))
        break
    else:
        print('다시 선택해 주십시오.')
 
 
player, enemy, player_acts, enemy_acts= Setting.set(player_job, enemy_job, level)
 
player_att, player_rest, player_check, player_skill1, player_skill2, player_skill3, player_skill4, player_skill5 = Setting.skillset(player_job)
enemy_att, enemy_rest, enemy_check, enemy_skill1, enemy_skill2, enemy_skill3, enemy_skill4, enemy_skill5 = Setting.skillset(enemy_job)
 
player_first_hp = player['체력']
enemy_first_hp = enemy['체력']
 
#wait(5)
system('cls')
 
while True:
 
    wait(0.5)
 
    # 체력, 마나 재생
    player_get_hp, player_get_mana = condition.recover(player['체력재생력'], player['마나재생력'], player_con, player_job)
    player['체력'] += player_get_hp
    player['마나'] += player_get_mana
 
    #마법사 패시브
    if player_job == '마법사':
        player['주문력'] += 2
        if player['주문력'] >= 300 and player_up_wizard_igmagicdefence >= 1:
            print('마법관통력 증가')
            player['마법관통력'] += 25
            player_up_wizard_igmagicdefence -= 1
        if player_wizard_get_mana == 0:
            print('안정 발동')
            player['마나'] += 35
            player['주문력'] += 5
            player_wizard_get_mana = 3
        else:
            player_wizard_get_mana -= 1
       
           
    # 잃은 피해 계산
    player_lost_hp = player_first_hp - player['체력']
    enemy_lost_hp = enemy_first_hp - enemy['체력']
    if player_lost_hp < 0:
        player_lost_hp = 0
    if enemy_lost_hp < 0:
        enemy_lost_hp = 0


* 데이터베이스에 변경사항 반영
    # 플레이어_화염
<source lang='python'>
    if player_fireturn >= 1:
python manage.py migrate
        if '화염' in player_con:
</source>
            pass
        else:
            player_con.append('화염')
    if player_fireturn == 0:
        if '화염' in player_con:
            player_con.remove('화염')
        else:
            pass


* 관리자 생성
    # 플레이어_중독
<source lang='python'>
    if player_poisonturn >= 1:
python manage.py createsuperuser
        if '중독' in player_con:
</source>
            pass
        else:
            player_con.append('중독')
    if player_poisonturn == 0:
        if '중독' in player_con:
            player_con.remove('중독')
        else:
            pass


* Admin 확인
    # 플레이어_출혈
<source lang='html'>
    if player_bloodturn >= 1:
http://127.0.0.1:8000/admin/
        if '출혈' in player_con:
</source>
            pass
        else:
            player_con.append('출혈')
    if player_bloodturn == 0:
        if '출혈' in player_con:
            player_con.remove('출혈')
        else:
            pass


<gallery>
    # 플레이어_갈증
Admin Site.png|Admin Login
    if player_thirstyturn >= 1:
</gallery>
        if '갈증' in player_con:
            pass
        else:
            player_con.append('갈증')
    if player_thirstyturn == 0:
        if '갈증' in player_con:
            player_con.remove('갈증')
        else:
            pass


* anjia > urls.py
    # 플레이어_재생
<source lang='python'>
    if player_reproduceturn >= 1:
from django.contrib import admin
        if '재생' in player_con:
from django.urls import path
            pass
from django.conf.urls import include
        else:
from django.views.generic import RedirectView
            player_con.append('재생')
from django.conf import settings
    if player_reproduceturn == 0:
from django.conf.urls.static import static
        if '재생' in player_con:
            player_con.remove('재생')
        else:
            pass


urlpatterns = [
    # 플레이어_조화
    path('admin/', admin.site.urls),
    if player_harmoniousturn >= 1:
    # 주소창에 blog를 입력시 blog.urls가 처리
        if '조화' in player_con:
    path('blog/', include('blog.urls')),
            pass
     # 기본주소로 처리시 blog로 넘겨준다.
        else:
    path('', RedirectView.as_view(url='/blog/', permanent=True)),
            player_con.append('조화')
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)    # 정적 파일 처리
     if player_harmoniousturn == 0:
</source>
        if '조화' in player_con:
            player_con.remove('조화')
        else:
            pass


* blog > urls.py
    # 플레이어_불사
<source lang='python'>
    if player_undying >= 1:
from django.urls import path
        if '불사' not in player_con:
from blog import views
            player_con.append('불사')
    if player_undying == 0:
        if '불사' in player_con:
            player_con.remove('불사')


urlpatterns = [
    # 사이트 명이 입력이 안될시 index라는 것으로 처리 한다.
    # blog > views.py
    path('', views.index, name='index'),
]
</source>


* blog > views.py
    # 플레이어_방어막
<source lang='python'>
    if player_barrierturn >= 1:
from django.shortcuts import render
        if '방어막' in player_con:
            pass
        else:
            player_con.append('방어막')
    if player_barrierturn == 0:
        player_barrier = 0
        if '방어막' in player_con:
            player_con.remove('방어막')
        else:
            pass


# Create your views here.
    #플레이어_치료증폭:
    if player_recover_up >= 1:
        if '치료증폭' in player_con:
            pass
        else:
            player_con.append('치료증폭')
        player_recover_up -= 1


# index 처리
    #플레이어_치료감소
    if player_recover_down >= 1:
        if '치료감소' in player_con:
            pass
        else:
            player_con.append('치료감소')
        player_recover_down -= 1


    #플레이어_기절
    if player_faintturn >= 1:
        if '기절' in player_con:
            pass
        else:
            player_con.append('기절')
        player_faintturn -= 1


def index(req):
    if '기절' not in player_con:
    context = {
        while True:
            # 플레이어 선택
            print('다음 것중에 하나를 선택해주세요')
            print(player_acts)
            player_choice = input()
            if player_choice not in player_acts:
                print('다시 선택해 주세요')
            else:
                break


     }
        if player_choice == '공격':
            if player_job == '전사':
                enemy['체력'], enemy_faintturn = player_att(enemy['체력'], player['공격력'], enemy['방어력'], player['물리관통력'], enemy_faintturn)
            elif player_job == '암살자':
                enemy['체력'] = player_att(enemy['체력'], player['공격력'], player['주문력'], enemy['방어력'], player['물리관통력'])
            else:
                enemy['체력'] = player_att(enemy['체력'], player['공격력'], enemy['방어력'], player['물리관통력'])
        if player_choice == '휴식':
            player['체력'], player['마나'] = player_rest(player['체력'], player['마나'], player['체력재생력'], player['마나재생력'], player_con)
        if player_choice == '상태확인':
            player_check(player, player_con)
        if player_job == '마법사':
            if player_choice == '메테오':
                enemy['체력'], player['마나'], enemy_fireturn = player_skill1(enemy['체력'], player['주문력'], enemy['마법저항력'], player['마법관통력'], player['마나'], enemy_fireturn)
                player['주문력'] += 5
            if player_choice == '치유':
                player['체력'], player['방어력'], player['마법저항력'], player['마나'] = player_skill2(player['체력'], player['주문력'], player['방어력'], player['마법저항력'], player['마나'])
                player['주문력'] += 5
            if player_choice == '저주':
                enemy_poisonturn, enemy_thirstyturn, enemy_recover_down, enemy['방어력'], enemy['마법저항력'], player['마나'] = player_skill4(enemy_poisonturn, enemy_thirstyturn, enemy_recover_down, enemy['방어력'], enemy['마법저항력'], player['마나'])
                player['주문력'] += 5
            if player_choice == '파괴':
                enemy['체력'], player['주문력'], player['마나'] = player_skill5(enemy['체력'], enemy_lost_hp, player['주문력'], enemy['마법저항력'], player['마법관통력'], player['마나'])
                player['주문력'] += 5
        if player_job == '전사':
            if player_choice == '의지':
                player['공격력'], player['방어력'], player['마나'] = player_skill1(player['공격력'], player['방어력'], player['마나'])
            if player_choice == '강타':
                enemy['체력'], player['마나'] = player_skill2(enemy['체력'], player['공격력'], enemy['방어력'], player['물리관통력'], enemy_con, player['마나'])
            if player_choice == '포효':
              enemy_faintturn, player['마나'] = player_skill4(enemy_faintturn, enemy_con, player['방어력'], player['마나'])
            if player_choice == '결집':
                player['체력'], player['방어력'], player['마법저항력'], player_recover_up, player['마나'] = player_skill5(player['체력'], player_first_hp, enemy_first_hp, player['방어력'], player['마법저항력'], player_con, player_recover_up, player['마나'])
        if player_job == '암살자':
            if player_choice == '기습':
                enemy['체력'], player['마나'] = player_skill1(enemy['체력'], player['공격력'], player['주문력'], enemy['방어력'], player['물리관통력'], player['마나'])
            if player_choice == '칼춤':
                enemy_bloodturn, player_reproduceturn, player['마나'] = player_skill3(enemy_bloodturn, player_reproduceturn, player['주문력'], player['마나'])
            if player_choice == '불검':
                enemy['체력'], enemy_bloodturn, enemy_fireturn, enemy_recover_down, player['마나'] = player_skill4(enemy_bloodturn, enemy_fireturn, enemy_recover_down, enemy['체력'], player['공격력'], enemy['방어력'], enemy_first_hp, player['물리관통력'], player['마나'])
            if player_choice == '혼돈':
                enemy_faintturn, player['공격력'], player['주문력'], player['마나'] = player_skill5(enemy_faintturn, player['공격력'], player['주문력'], player['마나'])
     else:
        print('플레이어가 기절중입니다!')


     return render(req, 'index.html', context=context)
     player_lost_hp = player_first_hp - player['체력']
</source>
    enemy_lost_hp = enemy_first_hp - enemy['체력']
    if player_lost_hp < 0:
        player_lost_hp = 0
    if enemy_lost_hp < 0:
        enemy_lost_hp = 0


* templates > index.html
<source lang='html'>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>TEST BLOG</title>
  </head>
  <body>
    <h1>Hello My TEST BLOG</h1>
  </body>
</html>
</source>


<gallery>
TEST Site.png|index test
</gallery>


* Static
    # 플레이어_화염
anjia > settings.py
    if player_fireturn >= 1:
<source lang='python'>
        player['체력'], player_fireturn = condition.fire(player['체력'], player_first_hp, player_fireturn)
# STATIC File
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
</source>


* Bootstrap
    # 플레이어_중독
https://colorlib.com/wp/free-bootstrap-blog-templates/
    if player_poisonturn >= 1:
        player['체력'], player_poisonturn = condition.poison(player['체력'], player_lost_hp, player_poisonturn)


* templates > index.html
    # 플레이어_출혈
{{글 숨김 | index.html}}
     if player_bloodturn >= 1:
<source lang='html'>
        player['체력'], player_bloodturn = condition.blood(player['체력'], player_bloodturn)
<!DOCTYPE html>
<html lang="zxx" class="no-js">
  <head>
     <!-- Mobile Specific Meta -->
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <!-- Favicon-->
    <link rel="shortcut icon" href="img/fav.png" />
    <!-- Author Meta -->
    <meta name="author" content="colorlib" />
    <!-- Meta Description -->
    <meta name="description" content="" />
    <!-- Meta Keyword -->
    <meta name="keywords" content="" />
    <!-- meta character set -->
    <meta charset="UTF-8" />
    <!-- Site Title -->
    <title>Blogger</title>
    {% load static %}
    <link
      href="https://fonts.googleapis.com/css?family=Poppins:100,200,400,300,500,600,700"
      rel="stylesheet"
    />
    <!--
    CSS
    ============================================= -->
    <link rel="stylesheet" href="{% static 'css/linearicons.css' %}" />
    <link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" />
    <link rel="stylesheet" href="{% static 'css/bootstrap.css' %}" />
    <link rel="stylesheet" href="{% static 'css/owl.carousel.css' %}" />
    <link rel="stylesheet" href="{% static 'css/main.css' %}" />
  </head>
  <body>
    <!-- Start Header Area -->
    <header class="default-header">
      <nav class="navbar navbar-expand-lg navbar-light">
        <div class="container">
          <a class="navbar-brand" href="index.html">
            <img src="{% static 'img/logo.png' %}" alt="" />
          </a>
          <button
            class="navbar-toggler"
            type="button"
            data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent"
            aria-expanded="false"
            aria-label="Toggle navigation"
          >
            <span class="navbar-toggler-icon"></span>
          </button>


          <div
    # 플레이어_갈증
            class="collapse navbar-collapse justify-content-end align-items-center"
    if player_thirstyturn >= 1:
            id="navbarSupportedContent"
        player['마나'], player_thirstyturn = condition.thirsty(player['마나'], player_thirstyturn)
          >
            <ul class="navbar-nav">
              <li><a href="#home">Home</a></li>
              <li><a href="#news">News</a></li>
              <li><a href="#travel">Travel</a></li>
              <li><a href="#fashion">fashion</a></li>
              <li><a href="#team">team</a></li>
              <!-- Dropdown -->
              <li class="dropdown">
                <a
                  class="dropdown-toggle"
                  href="#"
                  id="navbardrop"
                  data-toggle="dropdown"
                >
                  Pages
                </a>
                <div class="dropdown-menu">
                  <a class="dropdown-item" href="single.html">Single</a>
                  <a class="dropdown-item" href="category.html">Category</a>
                  <a class="dropdown-item" href="search.html">Search</a>
                  <a class="dropdown-item" href="archive.html">Archive</a>
                  <a class="dropdown-item" href="generic.html">Generic</a>
                  <a class="dropdown-item" href="elements.html">Elements</a>
                </div>
              </li>
            </ul>
          </div>
        </div>
      </nav>
    </header>
    <!-- End Header Area -->


     <!-- start banner Area -->
     # 플레이어_재생
     <section
     if player_reproduceturn >= 1:
      class="banner-area relative"
        player['체력'], player_reproduceturn = condition.reproduce(player['체력'], player_first_hp, player_lost_hp, player_reproduceturn, player_con, player_job)
      id="home"
      data-parallax="scroll"
      data-image-src="{% static 'img/header-bg.jpg' %}"
    >
      <div class="overlay-bg overlay"></div>
      <div class="container">
        <div class="row fullscreen">
          <div
            class="banner-content d-flex align-items-center col-lg-12 col-md-12"
          >
            <h1>
              A Discount Toner Cartridge <br />
              Is Better Than Ever.
            </h1>
          </div>
          <div
            class="head-bottom-meta d-flex justify-content-between align-items-end col-lg-12"
          >
            <div class="col-lg-6 flex-row d-flex meta-left no-padding">
              <p><span class="lnr lnr-heart"></span> 15 Likes</p>
              <p><span class="lnr lnr-bubble"></span> 02 Comments</p>
            </div>
            <div
              class="col-lg-6 flex-row d-flex meta-right no-padding justify-content-end"
            >
              <div class="user-meta">
                <h4 class="text-white">Mark wiens</h4>
                <p>12 Dec, 2017 11:21 am</p>
              </div>
              <img
                class="img-fluid user-img"
                src="{% static 'img/user.jpg' %}"
                alt=""
              />
            </div>
          </div>
        </div>
      </div>
    </section>
    <!-- End banner Area -->


     <!-- Start category Area -->
     # 플레이어_조화
     <section class="category-area section-gap" id="news">
     if player_harmoniousturn >= 1:
      <div class="container">
         player['마나'], player_harmoniousturn = condition.harmonious(player['마나'], player_harmoniousturn, player_con, player_job)
        <div class="row d-flex justify-content-center">
          <div class="menu-content pb-70 col-lg-8">
            <div class="title text-center">
              <h1 class="mb-10">Latest News from all categories</h1>
              <p>
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
                eiusmod tempor incididunt ut labore et dolore magna aliqua.
              </p>
            </div>
          </div>
        </div>
         <div class="active-cat-carusel">
          <div class="item single-cat">
            <img src="{% static 'img/c1.jpg' %}" alt="" />
            <p class="date">10 Jan 2018</p>
            <h4><a href="#">It S Hurricane Season Visiting Hilton</a></h4>
          </div>
          <div class="item single-cat">
            <img src="{% static 'img/c2.jpg' %}" alt="" />
            <p class="date">10 Jan 2018</p>
            <h4><a href="#">What Makes A Hotel Boutique</a></h4>
          </div>
          <div class="item single-cat">
            <img src="{% static 'img/c3.jpg' %}" alt="" />
            <p class="date">10 Jan 2018</p>
            <h4><a href="#">Les Houches The Hidden Gem Valley</a></h4>
          </div>
        </div>
      </div>
    </section>
    <!-- End category Area -->


     <!-- Start travel Area -->
     # 플레이어_불사
     <section class="travel-area section-gap" id="travel">
     if player_undying >= 1:
      <div class="container">
         player_undying -= 1
         <div class="row d-flex justify-content-center">
         if player['체력'] <= 0:
          <div class="menu-content pb-70 col-lg-8">
             player['체력'] = int(player_first_hp / 10) + (player['주문력'] * 5)
            <div class="title text-center">
             print('불사 발동')
              <h1 class="mb-10">Hot topics from Travel Section</h1>
              <p>
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
                eiusmod tempor incididunt ut labore et dolore magna aliqua.
              </p>
            </div>
          </div>
        </div>
         <div class="row">
          <div class="col-lg-6 travel-left">
            <div class="single-travel media pb-70">
              <img
                class="img-fluid d-flex mr-3"
                src="{% static 'img/t1.jpg' %}"
                alt=""
              />
              <div class="dates">
                <span>20</span>
                <p>Dec</p>
              </div>
              <div class="media-body align-self-center">
                <h4 class="mt-0">
                  <a href="#">Addiction When Gambling Becomes A Problem</a>
                </h4>
                <p>
                  inappropriate behavior Lorem ipsum dolor sit amet,
                  consectetur.
                </p>
                <div class="meta-bottom d-flex justify-content-between">
                  <p><span class="lnr lnr-heart"></span> 15 Likes</p>
                  <p><span class="lnr lnr-bubble"></span> 02 Comments</p>
                </div>
              </div>
             </div>
            <div class="single-travel media">
              <img
                class="img-fluid d-flex mr-3"
                src="{% static 'img/t3.jpg' %}"
                alt=""
              />
              <div class="dates">
                <span>20</span>
                <p>Dec</p>
              </div>
              <div class="media-body align-self-center">
                <h4 class="mt-0">
                  <a href="#">Addiction When Gambling Becomes A Problem</a>
                </h4>
                <p>
                  inappropriate behavior Lorem ipsum dolor sit amet,
                  consectetur.
                </p>
                <div class="meta-bottom d-flex justify-content-between">
                  <p><span class="lnr lnr-heart"></span> 15 Likes</p>
                  <p><span class="lnr lnr-bubble"></span> 02 Comments</p>
                </div>
              </div>
            </div>
          </div>
          <div class="col-lg-6 travel-right">
            <div class="single-travel media pb-70">
              <img
                class="img-fluid d-flex mr-3"
                src="{% static 'img/t2.jpg' %}"
                alt=""
              />
              <div class="dates">
                <span>20</span>
                <p>Dec</p>
              </div>
              <div class="media-body align-self-center">
                <h4 class="mt-0">
                  <a href="#">Addiction When Gambling Becomes A Problem</a>
                </h4>
                <p>
                  inappropriate behavior Lorem ipsum dolor sit amet,
                  consectetur.
                </p>
                <div class="meta-bottom d-flex justify-content-between">
                  <p><span class="lnr lnr-heart"></span> 15 Likes</p>
                  <p><span class="lnr lnr-bubble"></span> 02 Comments</p>
                </div>
              </div>
            </div>
             <div class="single-travel media">
              <img
                class="img-fluid d-flex mr-3"
                src="{% static 'img/t4.jpg' %}"
                alt=""
              />
              <div class="dates">
                <span>20</span>
                <p>Dec</p>
              </div>
              <div class="media-body align-self-center">
                <h4 class="mt-0">
                  <a href="#">Addiction When Gambling Becomes A Problem</a>
                </h4>
                <p>
                  inappropriate behavior Lorem ipsum dolor sit amet,
                  consectetur.
                </p>
                <div class="meta-bottom d-flex justify-content-between">
                  <p><span class="lnr lnr-heart"></span> 15 Likes</p>
                  <p><span class="lnr lnr-bubble"></span> 02 Comments</p>
                </div>
              </div>
            </div>
          </div>
          <a
            href="#"
            class="primary-btn load-more pbtn-2 text-uppercase mx-auto mt-60"
            >Load More
          </a>
        </div>
      </div>
    </section>
    <!-- End travel Area -->


     <!-- Start fashion Area -->
     # 적_불사
     <section class="fashion-area section-gap" id="fashion">
     if enemy_undying >= 1:
      <div class="container">
         if enemy['체력'] <= 0:
         <div class="row d-flex justify-content-center">
             enemy['체력'] = int(enemy_first_hp / 10) + (enemy['주문력'] * 5)
          <div class="menu-content pb-70 col-lg-8">
             print('적 불사 발동')
            <div class="title text-center">
              <h1 class="mb-10">Fashion News This Week</h1>
              <p>
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
                eiusmod tempor incididunt ut labore et dolore magna aliqua.
              </p>
            </div>
          </div>
        </div>
        <div class="row">
          <div class="col-lg-3 col-md-6 single-fashion">
            <img class="img-fluid" src="{% static 'img/f1.jpg' %}" alt="" />
            <p class="date">10 Jan 2018</p>
            <h4><a href="#">Addiction When Gambling Becomes A Problem</a></h4>
            <p>
              inappropriate behavior ipsum dolor sit amet, consectetur.
             </p>
            <div class="meta-bottom d-flex justify-content-between">
              <p><span class="lnr lnr-heart"></span> 15 Likes</p>
              <p><span class="lnr lnr-bubble"></span> 02 Comments</p>
            </div>
          </div>
          <div class="col-lg-3 col-md-6 single-fashion">
            <img class="img-fluid" src="{% static 'img/f2.jpg' %}" alt="" />
            <p class="date">10 Jan 2018</p>
            <h4><a href="#">Addiction When Gambling Becomes A Problem</a></h4>
            <p>
              inappropriate behavior ipsum dolor sit amet, consectetur.
            </p>
            <div class="meta-bottom d-flex justify-content-between">
              <p><span class="lnr lnr-heart"></span> 15 Likes</p>
              <p><span class="lnr lnr-bubble"></span> 02 Comments</p>
            </div>
          </div>
          <div class="col-lg-3 col-md-6 single-fashion">
            <img class="img-fluid" src="{% static 'img/f3.jpg' %}" alt="" />
             <p class="date">10 Jan 2018</p>
            <h4><a href="#">Addiction When Gambling Becomes A Problem</a></h4>
            <p>
              inappropriate behavior ipsum dolor sit amet, consectetur.
            </p>
            <div class="meta-bottom d-flex justify-content-between">
              <p><span class="lnr lnr-heart"></span> 15 Likes</p>
              <p><span class="lnr lnr-bubble"></span> 02 Comments</p>
            </div>
          </div>
          <div class="col-lg-3 col-md-6 single-fashion">
            <img class="img-fluid" src="{% static 'img/f4.jpg' %}" alt="" />
            <p class="date">10 Jan 2018</p>
            <h4><a href="#">Addiction When Gambling Becomes A Problem</a></h4>
            <p>
              inappropriate behavior ipsum dolor sit amet, consectetur.
            </p>
            <div class="meta-bottom d-flex justify-content-between">
              <p><span class="lnr lnr-heart"></span> 15 Likes</p>
              <p><span class="lnr lnr-bubble"></span> 02 Comments</p>
            </div>
          </div>
          <a
            href="#"
            class="primary-btn load-more pbtn-2 text-uppercase mx-auto mt-60"
            >Load More
          </a>
        </div>
      </div>
    </section>
    <!-- End fashion Area -->


    <!-- Start team Area -->
    <section class="team-area section-gap" id="team">
      <div class="container">
        <div class="row d-flex justify-content-center">
          <div class="menu-content pb-70 col-lg-8">
            <div class="title text-center">
              <h1 class="mb-10">About Blogger Team</h1>
              <p>Who are in extremely love with eco friendly system.</p>
            </div>
          </div>
        </div>
        <div class="row justify-content-center d-flex align-items-center">
          <div class="col-lg-6 team-left">
            <p>
              inappropriate behavior is often laughed off as “boys will be
              boys,” women face higher conduct standards especially in the
              workplace. That’s why it’s crucial that, as women, our behavior on
              the job is beyond reproach. inappropriate behavior is often
              laughed off as “boys will be boys,” women face higher conduct
              standards especially in the workplace. That’s why it’s crucial
              that.
            </p>
            <p>
              inappropriate behavior is often laughed off as “boys will be
              boys,” women face higher conduct standards especially in the
              workplace. That’s why it’s crucial that, as women.
            </p>
          </div>
          <div class="col-lg-6 team-right d-flex justify-content-center">
            <div class="row active-team-carusel">
              <div class="single-team">
                <div class="thumb">
                  <img
                    class="img-fluid"
                    src="{% static 'img/team1.jpg' %}"
                    alt=""
                  />
                  <div class="align-items-center justify-content-center d-flex">
                    <a href="#"><i class="fa fa-facebook"></i></a>
                    <a href="#"><i class="fa fa-twitter"></i></a>
                    <a href="#"><i class="fa fa-linkedin"></i></a>
                  </div>
                </div>
                <div class="meta-text mt-30 text-center">
                  <h4>Dora Walker</h4>
                  <p>Senior Core Developer</p>
                </div>
              </div>
              <div class="single-team">
                <div class="thumb">
                  <img
                    class="img-fluid"
                    src="{% static 'img/team2.jpg' %}"
                    alt=""
                  />
                  <div class="align-items-center justify-content-center d-flex">
                    <a href="#"><i class="fa fa-facebook"></i></a>
                    <a href="#"><i class="fa fa-twitter"></i></a>
                    <a href="#"><i class="fa fa-linkedin"></i></a>
                  </div>
                </div>
                <div class="meta-text mt-30 text-center">
                  <h4>Lena Keller</h4>
                  <p>Creative Content Developer</p>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>
    <!-- End team Area -->


     <!-- start footer Area -->
     # 플레이어_치료증폭
     <footer class="footer-area section-gap">
     if player_recover_up == 0:
      <div class="container">
         if '치료증폭' in player_con:
         <div class="row">
            player_con.remove('치료증폭')
          <div class="col-lg-3 col-md-12">
            <div class="single-footer-widget">
              <h6>Top Products</h6>
              <ul class="footer-nav">
                <li><a href="#">Managed Website</a></li>
                <li><a href="#">Manage Reputation</a></li>
                <li><a href="#">Power Tools</a></li>
                <li><a href="#">Marketing Service</a></li>
              </ul>
            </div>
          </div>
          <div class="col-lg-6 col-md-12">
            <div class="single-footer-widget newsletter">
              <h6>Newsletter</h6>
              <p>
                You can trust us. we only send promo offers, not a single spam.
              </p>
              <div id="mc_embed_signup">
                <form
                  target="_blank"
                  novalidate="true"
                  action="https://spondonit.us12.list-manage.com/subscribe/post?u=1462626880ade1ac87bd9c93a&amp;id=92a4423d01"
                  method="get"
                  class="form-inline"
                >
                  <div class="form-group row" style="width: 100%;">
                    <div class="col-lg-8 col-md-12">
                      <input
                        name="EMAIL"
                        placeholder="Enter Email"
                        onfocus="this.placeholder = ''"
                        onblur="this.placeholder = 'Enter Email '"
                        required=""
                        type="email"
                      />
                      <div style="position: absolute; left: -5000px;">
                        <input
                          name="b_36c4fd991d266f23781ded980_aefe40901a"
                          tabindex="-1"
                          value=""
                          type="text"
                        />
                      </div>
                    </div>


                    <div class="col-lg-4 col-md-12">
    # 플레이어_치료감소
                      <button class="nw-btn primary-btn">
    if player_recover_down == 0:
                        Subscribe<span class="lnr lnr-arrow-right"></span>
        if '치료감소' in player_con:
                      </button>
            player_con.remove('치료감소')
                    </div>
                  </div>
                  <div class="info"></div>
                </form>
              </div>
            </div>
          </div>
          <div class="col-lg-3 col-md-12">
            <div class="single-footer-widget mail-chimp">
              <h6 class="mb-20">Instragram Feed</h6>
              <ul class="instafeed d-flex flex-wrap">
                <li><img src="{% static 'img/i1.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i2.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i3.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i4.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i5.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i6.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i7.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i8.jpg' %}" alt="" /></li>
              </ul>
            </div>
          </div>
        </div>


        <div class="row footer-bottom d-flex justify-content-between">
    # 플레이어_기절
          <!-- Link back to Colorlib can't be removed. Template is licensed under CC BY 3.0. -->
    if player_faintturn == 0:
          <p class="col-lg-8 col-sm-12 footer-text">
        if '기절' in player_con:
             Copyright &copy;
             player_con.remove('기절')
            <script>
              document.write(new Date().getFullYear());
            </script>
            All rights reserved | This template is made with
            <i class="fa fa-heart-o" aria-hidden="true"></i> by
            <a href="https://colorlib.com" target="_blank">Colorlib</a>
          </p>
          <!-- Link back to Colorlib can't be removed. Template is licensed under CC BY 3.0. -->
          <div class="col-lg-4 col-sm-12 footer-social">
            <a href="#"><i class="fa fa-facebook"></i></a>
            <a href="#"><i class="fa fa-twitter"></i></a>
            <a href="#"><i class="fa fa-dribbble"></i></a>
            <a href="#"><i class="fa fa-behance"></i></a>
          </div>
        </div>
      </div>
    </footer>
    <!-- End footer Area -->


     <script src="{% static 'js/vendor/jquery-2.2.4.min.js' %}"></script>
     if player['체력'] <= 0 or enemy['체력'] <= 0:
    <script
        print('게임이 끝났습니다!')
      src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"
        if player['체력'] <= 0:
      integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4"
            print('----------------------------------------------------\n')
      crossorigin="anonymous"
            player_check(player, player_con)
    ></script>
            print('----------------------------------------------------\n')
    <script src="{% static 'js/vendor/bootstrap.min.js' %}"></script>
            print('적이 이겼습니다!')
    <script src="{% static 'js/jquery.ajaxchimp.min.js' %}"></script>
            break
    <script src="{% static 'js/parallax.min.js' %}"></script>
        else:
    <script src="{% static 'js/owl.carousel.min.js' %}"></script>
            print('----------------------------------------------------\n')
    <script src="{% static 'js/jquery.magnific-popup.min.js' %}"></script>
            print('적의 스탯 ')
    <script src="{% static 'js/jquery.sticky.js' %}"></script>
            print('체력 : {},  마나 : {}'.format(enemy['체력'], enemy['마나']))
    <script src="{% static 'js/main.js' %}"></script>
            print('공격력 : {},  주문력 : {}'.format(enemy['공격력'], enemy['주문력']))
  </body>
            print('방어력 : {},  마법저항력 : {}'.format(enemy['방어력'], enemy['마법저항력']))
</html>
            print('물리관통력 : {},  마법관통력 : {}'.format(enemy['물리관통력'], enemy['마법관통력']))
</source>
            print('체력재생력 : {},  마나재생력 : {}'.format(enemy['체력재생력'], enemy['마나재생력']))
{{글 숨김 끝}}
            print('적의 상태 : ', enemy_con)
            print('----------------------------------------------------\n')
            print('당신이 이겼습니다!')
            break


<gallery>
    print('----------------------------------------------------\n')
Bootstrap Main TEST.png | Bootstrap 적용
</gallery>


* templates > single.html
    # 체력, 마나 재생
{{글 숨김 | single.html}}
    enemy_get_hp, enemy_get_mana = condition.recover(enemy['체력재생력'], enemy['마나재생력'], enemy_con, enemy_job)
<source lang='html'>
     enemy['체력'] += enemy_get_hp
<!DOCTYPE html>
     enemy['마나'] += enemy_get_mana
<html lang="zxx" class="no-js">
  <head>
    <!-- Mobile Specific Meta -->
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
     />
    <!-- Favicon-->
    <link rel="shortcut icon" href="img/fav.png" />
     <!-- Author Meta -->
    <meta name="author" content="colorlib" />
    <!-- Meta Description -->
    <meta name="description" content="" />
    <!-- Meta Keyword -->
    <meta name="keywords" content="" />
    <!-- meta character set -->
    <meta charset="UTF-8" />
    <!-- Site Title -->
    <title>Blogger</title>


     {% load static %}
     #마법사 패시브
     <link
     if enemy_job == '마법사':
      href="https://fonts.googleapis.com/css?family=Poppins:100,200,400,300,500,600,700"
        enemy['주문력'] += 2
      rel="stylesheet"
         if enemy['주문력'] >= 200 and enemy_up_wizard_igmagicdefence == 1:
    />
            enemy['마법관통력'] += 25
    <!--
            enemy_up_wizard_igmagicdefence -= 1
         CSS
         if enemy_wizard_get_mana == 0:
        ============================================= -->
             print('안정 발동')
    <link rel="stylesheet" href="{% static 'css/linearicons.css' %}" />
             enemy['마나'] += 35
    <link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" />
             enemy['주문력'] += 5
    <link rel="stylesheet" href="{% static 'css/bootstrap.css' %}" />
             enemy_wizard_get_mana = 3
    <link rel="stylesheet" href="{% static 'css/owl.carousel.css' %}" />
        else:
    <link rel="stylesheet" href="{% static 'css/main.css' %}" />
             enemy_wizard_get_mana -= 1
  </head>
  <body>
    <!-- Start Header Area -->
    <header class="default-header">
      <nav class="navbar navbar-expand-lg navbar-light">
         <div class="container">
          <a class="navbar-brand" href="index.html">
             <img src="{% static 'img/logo.png' %}" alt="" />
          </a>
          <button
             class="navbar-toggler"
             type="button"
             data-toggle="collapse"
            data-target="#navbarSupportedContent"
             aria-controls="navbarSupportedContent"
            aria-expanded="false"
            aria-label="Toggle navigation"
          >
            <span class="navbar-toggler-icon"></span>
          </button>


          <div
    # 적_화염
            class="collapse navbar-collapse justify-content-end align-items-center"
    if enemy_fireturn >= 1:
            id="navbarSupportedContent"
        if '화염' in enemy_con:
          >
            pass
            <ul class="navbar-nav scrollable-menu">
        else:
              <li><a href="#home">Home</a></li>
            enemy_con.append('화염')
              <li><a href="#news">News</a></li>
    if enemy_fireturn == 0:
              <li><a href="#travel">Travel</a></li>
        if '화염' in enemy_con:
              <li><a href="#fashion">fashion</a></li>
            enemy_con.remove('화염')
              <li><a href="#team">team</a></li>
        else:
              <!-- Dropdown -->
             pass
              <li class="dropdown">
                <a
                  class="dropdown-toggle"
                  href="#"
                  id="navbardrop"
                  data-toggle="dropdown"
                >
                  Pages
                </a>
                <div class="dropdown-menu">
                  <a class="dropdown-item" href="single.html">Single</a>
                  <a class="dropdown-item" href="category.html">Category</a>
                  <a class="dropdown-item" href="search.html">Search</a>
                  <a class="dropdown-item" href="archive.html">Archive</a>
                  <a class="dropdown-item" href="generic.html">Generic</a>
                  <a class="dropdown-item" href="elements.html">Elements</a>
                </div>
              </li>
             </ul>
          </div>
        </div>
      </nav>
    </header>
    <!-- End Header Area -->


     <!-- Start top-section Area -->
     # 적_중독
     <section class="top-section-area section-gap">
     if enemy_poisonturn >= 1:
      <div class="container">
         if '중독' in enemy_con:
         <div class="row justify-content-between align-items-center d-flex">
            pass
          <div class="col-lg-8 top-left">
        else:
            <h1 class="text-white mb-20">Post Details</h1>
             enemy_con.append('중독')
             <ul>
    if enemy_poisonturn == 0:
              <li>
        if '중독' in enemy_con:
                <a href="index.html">Home</a
            enemy_con.remove('중독')
                ><span class="lnr lnr-arrow-right"></span>
         else:
              </li>
            pass
              <li>
                <a href="category.html">Category</a
                ><span class="lnr lnr-arrow-right"></span>
              </li>
              <li><a href="single.html">Fashion</a></li>
            </ul>
          </div>
         </div>
      </div>
    </section>
    <!-- End top-section Area -->


     <!-- Start post Area -->
     # 적_출혈
     <div class="post-wrapper pt-100">
     if enemy_bloodturn >= 1:
      <!-- Start post Area -->
         if '출혈' in enemy_con:
      <section class="post-area">
             pass
         <div class="container">
        else:
          <div class="row justify-content-center">
            enemy_con.append('출혈')
             <div class="col-lg-8">
    if enemy_bloodturn == 0:
              <div class="single-page-post">
        if '출혈' in enemy_con:
                <img
            enemy_con.remove('출혈')
                  class="img-fluid"
        else:
                  src="{% static 'img/single.jpg' %}"
            pass
                  alt=""
                />
                <div class="top-wrapper">
                  <div class="row d-flex justify-content-between">
                    <h2 class="col-lg-8 col-md-12 text-uppercase">
                      A Discount Toner Cartridge Is Better Than Ever
                    </h2>
                    <div
                      class="col-lg-4 col-md-12 right-side d-flex justify-content-end"
                    >
                      <div class="desc">
                        <h2>Mark wiens</h2>
                        <h3>12 Dec ,2017 11:21 am</h3>
                      </div>
                      <div class="user-img">
                        <img src="{% static 'img/user.jpg' %}" alt="" />
                      </div>
                    </div>
                  </div>
                </div>
                <div class="tags">
                  <ul>
                    <li><a href="#">lifestyle</a></li>
                    <li><a href="#">Art</a></li>
                    <li><a href="#">Technology</a></li>
                    <li><a href="#">Fashion</a></li>
                  </ul>
                </div>
                <div class="single-post-content">
                  <p>
                    MCSE boot camps have its supporters and its detractors. Some
                    people do not understand why you should have to spend money
                    on boot camp when you can get the MCSE study materials
                    yourself at a fraction of the camp price. However, who has
                    the willpower to actually sit through a self-imposed MCSE
                    training.
                  </p>
                  <p>
                    MCSE boot camps have its supporters and its detractors. Some
                    people do not understand why you should have to spend money
                    on boot camp when you can get the MCSE study materials
                    yourself at a fraction of the camp price. However, who has
                    the willpower to actually sit through a self-imposed MCSE
                    training. who has the willpower to actually sit through a
                    self-imposed MCSE training.
                  </p>


                  <blockquote>
    # 적_갈증
                    Ea possunt paria non esse. Pudebit te, inquam, illius
    if enemy_thirstyturn >= 1:
                    tabulae, quam Cleanthes sane commode verbis depingere
        if '갈증' in enemy_con:
                    solebat. Urgent tamen et nihil remittunt. An vero displicuit
            pass
                    ea, quae tributa est animi virtutibus tanta praestantia?
        else:
                    Sint ista Graecorum; Cur igitur, cum de re conveniat, non
            enemy_con.append('갈증')
                    malumus usitate loqui? Huius ego nunc auctoritatem sequens
    if enemy_thirstyturn == 0:
                    idem faciam. <cite>Wise Man</cite>
        if '갈증' in enemy_con:
                  </blockquote>
            enemy_con.remove('갈증')
        else:
            pass


                  <p>
    # 적_재생
                    MCSE boot camps have its supporters and its detractors. Some
    if enemy_reproduceturn >= 1:
                    people do not understand why you should have to spend money
        if '재생' in enemy_con:
                    on boot camp when you can get the MCSE study materials
            pass
                    yourself at a fraction of the camp price. However, who has
        else:
                    the willpower to actually sit through a self-imposed MCSE
            enemy_con.append('재생')
                    training.
    if enemy_reproduceturn == 0:
                  </p>
        if '재생' in enemy_con:
                  <p>
            enemy_con.remove('재생')
                    MCSE boot camps have its supporters and its detractors. Some
        else:
                    people do not understand why you should have to spend money
            pass
                    on boot camp when you can get the MCSE study materials
                    yourself at a fraction of the camp price. However, who has
                    the willpower to actually sit through a self-imposed MCSE
                    training. who has the willpower to actually sit through a
                    self-imposed MCSE training.
                  </p>
                </div>
                <div class="bottom-wrapper">
                  <div class="row">
                    <div class="col-lg-4 single-b-wrap col-md-12">
                      <i class="fa fa-heart-o" aria-hidden="true"></i>
                      lily and 4 people like this
                    </div>
                    <div class="col-lg-4 single-b-wrap col-md-12">
                      <i class="fa fa-comment-o" aria-hidden="true"></i> 06
                      comments
                    </div>
                    <div class="col-lg-4 single-b-wrap col-md-12">
                      <ul class="social-icons">
                        <li>
                          <a href="#"
                            ><i class="fa fa-facebook" aria-hidden="true"></i
                          ></a>
                        </li>
                        <li>
                          <a href="#"
                            ><i class="fa fa-twitter" aria-hidden="true"></i
                          ></a>
                        </li>
                        <li>
                          <a href="#"
                            ><i class="fa fa-dribbble" aria-hidden="true"></i
                          ></a>
                        </li>
                        <li>
                          <a href="#"
                            ><i class="fa fa-behance" aria-hidden="true"></i
                          ></a>
                        </li>
                      </ul>
                    </div>
                  </div>
                </div>


                <!-- Start nav Area -->
    # 적_조화
                <section class="nav-area pt-50 pb-100">
    if enemy_harmoniousturn >= 1:
                  <div class="container">
        if '조화' in enemy_con:
                    <div class="row justify-content-between">
            pass
                      <div
        else:
                        class="col-sm-6 nav-left justify-content-start d-flex"
            enemy_con.append('조화')
                      >
    if enemy_harmoniousturn == 0:
                        <div class="thumb">
        if '조화' in enemy_con:
                          <img src="{% static 'img/prev.jpg' %}" alt="" />
            enemy_con.remove('조화')
                        </div>
        else:
                        <div class="details">
            pass
                          <p>Prev Post</p>
                          <h4 class="text-uppercase">
                            <a href="#">A Discount Toner</a>
                          </h4>
                        </div>
                      </div>
                      <div
                        class="col-sm-6 nav-right justify-content-end d-flex"
                      >
                        <div class="details">
                          <p>Prev Post</p>
                          <h4 class="text-uppercase">
                            <a href="#">A Discount Toner</a>
                          </h4>
                        </div>
                        <div class="thumb">
                          <img src="{% static 'img/next.jpg' %}" alt="" />
                        </div>
                      </div>
                    </div>
                  </div>
                </section>
                <!-- End nav Area -->


                <!-- Start comment-sec Area -->
    # 적_불사
                <section class="comment-sec-area pt-80 pb-80">
    if enemy_undying >= 1:
                  <div class="container">
        if '불사' not in enemy_con:
                    <div class="row flex-column">
            enemy_con.append('불사')
                      <h5 class="text-uppercase pb-80">05 Comments</h5>
    if enemy_undying == 0:
                      <br />
        if '불사' in enemy_con:
                      <div class="comment-list">
            enemy_con.remove('불사')
                        <div
                          class="single-comment justify-content-between d-flex"
                        >
                          <div class="user justify-content-between d-flex">
                            <div class="thumb">
                              <img
                                src="{% static 'img/asset/c1.jpg' %}"
                                alt=""
                              />
                            </div>
                            <div class="desc">
                              <h5><a href="#">Emilly Blunt</a></h5>
                              <p class="date">December 4, 2017 at 3:12 pm</p>
                              <p class="comment">
                                Never say goodbye till the end comes!
                              </p>
                            </div>
                          </div>
                          <div class="reply-btn">
                            <a href="" class="btn-reply text-uppercase"
                              >reply</a
                            >
                          </div>
                        </div>
                      </div>
                      <div class="comment-list left-padding">
                        <div
                          class="single-comment justify-content-between d-flex"
                        >
                          <div class="user justify-content-between d-flex">
                            <div class="thumb">
                              <img
                                src="{% static 'img/asset/c2.jpg' %}"
                                alt=""
                              />
                            </div>
                            <div class="desc">
                              <h5><a href="#">Emilly Blunt</a></h5>
                              <p class="date">December 4, 2017 at 3:12 pm</p>
                              <p class="comment">
                                Never say goodbye till the end comes!
                              </p>
                            </div>
                          </div>
                          <div class="reply-btn">
                            <a href="" class="btn-reply text-uppercase"
                              >reply</a
                            >
                          </div>
                        </div>
                      </div>
                      <div class="comment-list left-padding">
                        <div
                          class="single-comment justify-content-between d-flex"
                        >
                          <div class="user justify-content-between d-flex">
                            <div class="thumb">
                              <img
                                src="{% static 'img/asset/c3.jpg' %}"
                                alt=""
                              />
                            </div>
                            <div class="desc">
                              <h5><a href="#">Emilly Blunt</a></h5>
                              <p class="date">December 4, 2017 at 3:12 pm</p>
                              <p class="comment">
                                Never say goodbye till the end comes!
                              </p>
                            </div>
                          </div>
                          <div class="reply-btn">
                            <a href="" class="btn-reply text-uppercase"
                              >reply</a
                            >
                          </div>
                        </div>
                      </div>
                      <div class="comment-list">
                        <div
                          class="single-comment justify-content-between d-flex"
                        >
                          <div class="user justify-content-between d-flex">
                            <div class="thumb">
                              <img
                                src="{% static 'img/asset/c4.jpg' %}"
                                alt=""
                              />
                            </div>
                            <div class="desc">
                              <h5><a href="#">Emilly Blunt</a></h5>
                              <p class="date">December 4, 2017 at 3:12 pm</p>
                              <p class="comment">
                                Never say goodbye till the end comes!
                              </p>
                            </div>
                          </div>
                          <div class="reply-btn">
                            <a href="" class="btn-reply text-uppercase"
                              >reply</a
                            >
                          </div>
                        </div>
                      </div>
                      <div class="comment-list">
                        <div
                          class="single-comment justify-content-between d-flex"
                        >
                          <div class="user justify-content-between d-flex">
                            <div class="thumb">
                              <img
                                src="{% static 'img/asset/c5.jpg' %}"
                                alt=""
                              />
                            </div>
                            <div class="desc">
                              <h5><a href="#">Emilly Blunt</a></h5>
                              <p class="date">December 4, 2017 at 3:12 pm</p>
                              <p class="comment">
                                Never say goodbye till the end comes!
                              </p>
                            </div>
                          </div>
                          <div class="reply-btn">
                            <a href="" class="btn-reply text-uppercase"
                              >reply</a
                            >
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </section>
                <!-- End comment-sec Area -->


                <!-- Start commentform Area -->
    # 적_방어막
                <section class="commentform-area pb-120 pt-80 mb-100">
    if enemy_barrierturn >= 1:
                  <div class="container">
        if '방어막' in player_con:
                    <h5 class="text-uppercas pb-50">Leave a Reply</h5>
            pass
                    <div class="row flex-row d-flex">
        else:
                      <div class="col-lg-6">
            enemy_con.append('방어막')
                        <input
    if enemy_barrierturn == 0:
                          name="name"
        enemy_barrier = 0
                          placeholder="Enter your name"
        if '방어막' in player_con:
                          onfocus="this.placeholder = ''"
            enemy_con.remove('방어막')
                          onblur="this.placeholder = 'Enter your name'"
        else:
                          class="common-input mb-20 form-control"
             pass
                          required=""
                          type="text"
                        />
                        <input
                          name="email"
                          placeholder="Enter your email"
                          onfocus="this.placeholder = ''"
                          onblur="this.placeholder = 'Enter your email'"
                          class="common-input mb-20 form-control"
                          required=""
                          type="email"
                        />
                        <input
                          name="Subject"
                          placeholder="Subject"
                          onfocus="this.placeholder = ''"
                          onblur="this.placeholder = 'Enter your Subject'"
                          class="common-input mb-20 form-control"
                          required=""
                          type="text"
                        />
                      </div>
                      <div class="col-lg-6">
                        <textarea
                          class="form-control mb-10"
                          name="message"
                          placeholder="Messege"
                          onfocus="this.placeholder = ''"
                          onblur="this.placeholder = 'Messege'"
                          required=""
                        ></textarea>
                        <a class="primary-btn mt-20" href="#">Comment</a>
                      </div>
                    </div>
                  </div>
                </section>
                <!-- End commentform Area -->
              </div>
            </div>
             <div class="col-lg-4 sidebar-area">
              <div class="single_widget search_widget">
                <div id="imaginary_container">
                  <div class="input-group stylish-input-group">
                    <input
                      type="text"
                      class="form-control"
                      placeholder="Search"
                    />
                    <span class="input-group-addon">
                      <button type="submit">
                        <span class="lnr lnr-magnifier"></span>
                      </button>
                    </span>
                  </div>
                </div>
              </div>


              <div class="single_widget about_widget">
    #적_치료증폭:
                <img src="{% static 'img/asset/s-img.jpg' %}" alt="" />
    if enemy_recover_up >= 1:
                <h2 class="text-uppercase">Adele Gonzalez</h2>
        if '치료증폭' in enemy_con:
                <p>
            pass
                  MCSE boot camps have its supporters and its detractors. Some
        else:
                  people do not understand why you should have to spend money
            enemy_con.append('치료증폭')
                </p>
        enemy_recover_up -= 1
                <div class="social-link">
                  <a href="#"
                    ><button class="btn">
                      <i class="fa fa-facebook" aria-hidden="true"></i> Like
                    </button></a
                  >
                  <a href="#"
                    ><button class="btn">
                      <i class="fa fa-twitter" aria-hidden="true"></i> follow
                    </button></a
                  >
                </div>
              </div>
              <div class="single_widget cat_widget">
                <h4 class="text-uppercase pb-20">post categories</h4>
                <ul>
                  <li>
                    <a href="#">Technology <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Lifestyle <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Fashion <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Art <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Food <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Architecture <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Adventure <span>37</span></a>
                  </li>
                </ul>
              </div>


              <div class="single_widget recent_widget">
                <h4 class="text-uppercase pb-20">Recent Posts</h4>
                <div class="active-recent-carusel">
                  <div class="item">
                    <img src="{% static 'img/asset/slider.jpg' %}" alt="" />
                    <p class="mt-20 title text-uppercase">
                      Home Audio Recording <br />
                      For Everyone
                    </p>
                    <p>
                      02 Hours ago
                      <span>
                        <i class="fa fa-heart-o" aria-hidden="true"></i> 06
                        <i class="fa fa-comment-o" aria-hidden="true"></i
                        >02</span
                      >
                    </p>
                  </div>
                  <div class="item">
                    <img src="{% static 'img/asset/slider.jpg' %}" alt="" />
                    <p class="mt-20 title text-uppercase">
                      Home Audio Recording <br />
                      For Everyone
                    </p>
                    <p>
                      02 Hours ago
                      <span>
                        <i class="fa fa-heart-o" aria-hidden="true"></i> 06
                        <i class="fa fa-comment-o" aria-hidden="true"></i
                        >02</span
                      >
                    </p>
                  </div>
                  <div class="item">
                    <img src="{% static 'img/asset/slider.jpg' %}" alt="" />
                    <p class="mt-20 title text-uppercase">
                      Home Audio Recording <br />
                      For Everyone
                    </p>
                    <p>
                      02 Hours ago
                      <span>
                        <i class="fa fa-heart-o" aria-hidden="true"></i> 06
                        <i class="fa fa-comment-o" aria-hidden="true"></i
                        >02</span
                      >
                    </p>
                  </div>
                </div>
              </div>


              <div class="single_widget cat_widget">
    #적_치료감소
                <h4 class="text-uppercase pb-20">post archive</h4>
    if enemy_recover_down >= 1:
                <ul>
        if '치료감소' in enemy_con:
                  <li>
            pass
                    <a href="#">Dec'17 <span>37</span></a>
        else:
                  </li>
            enemy_con.append('치료감소')
                  <li>
        enemy_recover_down -= 1
                    <a href="#">Nov'17 <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Oct'17 <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Sept'17 <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Aug'17 <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Jul'17 <span>37</span></a>
                  </li>
                  <li>
                    <a href="#">Jun'17 <span>37</span></a>
                  </li>
                </ul>
              </div>
              <div class="single_widget tag_widget">
                <h4 class="text-uppercase pb-20">Tag Clouds</h4>
                <ul>
                  <li><a href="#">Lifestyle</a></li>
                  <li><a href="#">Art</a></li>
                  <li><a href="#">Adventure</a></li>
                  <li><a href="#">Food</a></li>
                  <li><a href="#">Technology</a></li>
                  <li><a href="#">Fashion</a></li>
                  <li><a href="#">Adventure</a></li>
                  <li><a href="#">Food</a></li>
                  <li><a href="#">Technology</a></li>
                </ul>
              </div>
            </div>
          </div>
        </div>
      </section>
      <!-- End post Area -->
    </div>
    <!-- End post Area -->


     <!-- start footer Area -->
     #적_기절
     <footer class="footer-area section-gap">
     if enemy_faintturn >= 1:
      <div class="container">
         if '기절' in enemy_con:
         <div class="row">
             pass
          <div class="col-lg-3 col-md-12">
        else:
             <div class="single-footer-widget">
             enemy_con.append('기절')
              <h6>Top Products</h6>
        enemy_faintturn -= 1
              <ul class="footer-nav">
                <li><a href="#">Managed Website</a></li>
                <li><a href="#">Manage Reputation</a></li>
                <li><a href="#">Power Tools</a></li>
                <li><a href="#">Marketing Service</a></li>
              </ul>
             </div>
          </div>
          <div class="col-lg-6 col-md-12">
            <div class="single-footer-widget newsletter">
              <h6>Newsletter</h6>
              <p>
                You can trust us. we only send promo offers, not a single spam.
              </p>
              <div id="mc_embed_signup">
                <form
                  target="_blank"
                  novalidate="true"
                  action="https://spondonit.us12.list-manage.com/subscribe/post?u=1462626880ade1ac87bd9c93a&amp;id=92a4423d01"
                  method="get"
                  class="form-inline"
                >
                  <div class="form-group row" style="width: 100%;">
                    <div class="col-lg-8 col-md-12">
                      <input
                        name="EMAIL"
                        placeholder="Enter Email"
                        onfocus="this.placeholder = ''"
                        onblur="this.placeholder = 'Enter Email '"
                        required=""
                        type="email"
                      />
                      <div style="position: absolute; left: -5000px;">
                        <input
                          name="b_36c4fd991d266f23781ded980_aefe40901a"
                          tabindex="-1"
                          value=""
                          type="text"
                        />
                      </div>
                    </div>


                    <div class="col-lg-4 col-md-12">
                      <button class="nw-btn primary-btn">
                        Subscribe<span class="lnr lnr-arrow-right"></span>
                      </button>
                    </div>
                  </div>
                  <div class="info"></div>
                </form>
              </div>
            </div>
          </div>
          <div class="col-lg-3 col-md-12">
            <div class="single-footer-widget mail-chimp">
              <h6 class="mb-20">Instragram Feed</h6>
              <ul class="instafeed d-flex flex-wrap">
                <li><img src="{% static 'img/i1.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i2.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i3.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i4.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i5.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i6.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i7.jpg' %}" alt="" /></li>
                <li><img src="{% static 'img/i8.jpg' %}" alt="" /></li>
              </ul>
            </div>
          </div>
        </div>


        <div class="row footer-bottom d-flex justify-content-between">
    # 적 상태
          <!-- Link back to Colorlib can't be removed. Template is licensed under CC BY 3.0. -->
    print('적의 스탯 ')
          <p class="col-lg-8 col-sm-12 footer-text">
    print('체력 : {},  마나 : {}'.format(enemy['체력'], enemy['마나']))
            Copyright &copy;
    print('공격력 : {},  주문력 : {}'.format(enemy['공격력'], enemy['주문력']))
            <script>
    print('방어력 : {},  마법저항력 : {}'.format(enemy['방어력'], enemy['마법저항력']))
              document.write(new Date().getFullYear());
    print('물리관통력 : {},  마법관통력 : {}'.format(enemy['물리관통력'], enemy['마법관통력']))
            </script>
     print('체력재생력 : {},  마나재생력 : {}'.format(enemy['체력재생력'], enemy['마나재생력']))
            All rights reserved | This template is made with
     print('적의 상태 : ', enemy_con)
            <i class="fa fa-heart-o" aria-hidden="true"></i> by
            <a href="https://colorlib.com" target="_blank">Colorlib</a>
          </p>
          <!-- Link back to Colorlib can't be removed. Template is licensed under CC BY 3.0. -->
          <div class="col-lg-4 col-sm-12 footer-social">
            <a href="#"><i class="fa fa-facebook"></i></a>
            <a href="#"><i class="fa fa-twitter"></i></a>
            <a href="#"><i class="fa fa-dribbble"></i></a>
            <a href="#"><i class="fa fa-behance"></i></a>
          </div>
        </div>
      </div>
     </footer>
     <!-- End footer Area -->


     <script src="{% static 'js/vendor/jquery-2.2.4.min.js' %}"></script>
     if '기절' not in enemy_con:
    <script
        enemy_choice = choice(enemy_acts)
      src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"
        print(enemy_choice)
      integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4"
        if enemy_choice == '공격':
      crossorigin="anonymous"
            if enemy_job == '전사':
    ></script>
                player['체력'], player_faintturn = enemy_att(player['체력'], enemy['공격력'], player['방어력'], enemy['물리관통력'], player_faintturn)
    <script src="{% static 'js/vendor/bootstrap.min.js' %}"></script>
            elif enemy_job == '암살자':
    <script src="{% static 'js/jquery.ajaxchimp.min.js' %}"></script>
                player['체력'] = enemy_att(player['체력'], enemy['공격력'], enemy['주문력'], player['방어력'], enemy['물리관통력'])
    <script src="{% static 'js/parallax.min.js' %}"></script>
            else:
    <script src="{% static 'js/owl.carousel.min.js' %}"></script>
                player['체력'] = enemy_att(player['체력'], enemy['공격력'], player['방어력'], enemy['물리관통력'])
    <script src="{% static 'js/jquery.magnific-popup.min.js' %}"></script>
        if enemy_choice == '휴식':
    <script src="{% static 'js/jquery.sticky.js' %}"></script>
            enemy['체력'], enemy['마나'] = enemy_rest(enemy['체력'], enemy['마나'], enemy['체력재생력'], enemy['마나재생력'], enemy_con)
    <script src="{% static 'js/main.js' %}"></script>
        if enemy_job == '마법사':
  </body>
            if enemy_choice == '메테오':
</html>
                player['체력'], enemy['마나'], player_fireturn = enemy_skill1(player['체력'], enemy['주문력'], player['마법저항력'], enemy['마법관통력'], enemy['마나'], player_fireturn)
</source>
                enemy['주문력'] += 5
{{글 숨김 끝}}
            if enemy_choice == '치유':
                enemy['체력'], enemy['방어력'], enemy['마법저항력'], enemy['마나'] = enemy_skill2(enemy['체력'], enemy['주문력'], enemy['방어력'], enemy['마법저항력'], enemy['마나'])
                enemy['주문력'] += 5
            if enemy_choice == '저주':
                player_poisonturn, player_thirstyturn, player_recover_down, player['방어력'], player['마법저항력'], enemy['마나'] = enemy_skill4(player_poisonturn, player_thirstyturn, player_recover_down, player['방어력'], player['마법저항력'], enemy['마나'])
                enemy['주문력'] += 5
            if enemy_choice == '파괴':
                player['체력'], enemy['주문력'], enemy['마나'] = enemy_skill5(player['체력'], player_lost_hp, enemy['주문력'], player['마법저항력'], enemy['마법관통력'], enemy['마나'])
                enemy['주문력'] += 5
        if enemy_job == '전사':
            if enemy_choice == '의지':
                enemy['공격력'], enemy['방어력'], enemy['마나'] = enemy_skill1(enemy['공격력'], enemy['방어력'], enemy['마나'])
            if enemy_choice == '강타':
                player['체력'], enemy['마나'] = enemy_skill2(player['체력'], enemy['공격력'], player['방어력'], enemy['물리관통력'], player_con, enemy['마나'])
            if enemy_choice == '포효':
              player_faintturn, enemy['마나'] = enemy_skill4(player_faintturn, player_con, enemy['방어력'], enemy['마나'])
            if enemy_choice == '결집':
                enemy['체력'], enemy['방어력'], enemy['마법저항력'], enemy_recover_up, enemy['마나'] = enemy_skill5(enemy['체력'], enemy_first_hp, player_first_hp, enemy['방어력'], enemy['마법저항력'], enemy_con, enemy_recover_up, enemy['마나'])
        if enemy_job == '암살자':
            if enemy_choice == '기습':
                player['체력'], enemy['마나'] = enemy_skill1(player['체력'], enemy['공격력'], enemy['주문력'], player['방어력'], enemy['물리관통력'], enemy['마나'])
            if enemy_choice == '칼춤':
                player_bloodturn, enemy_reproduceturn, enemy['마나'] = enemy_skill3(player_bloodturn, enemy_reproduceturn, enemy['주문력'], enemy['마나'])
            if enemy_choice == '불검':
                player['체력'], player_bloodturn, player_fireturn, player_recover_down, enemy['마나'] = enemy_skill4(player_bloodturn, player_fireturn, player_recover_down, player['체력'], enemy['공격력'], player['방어력'], player_first_hp, enemy['물리관통력'], enemy['마나'])
            if enemy_choice == '혼돈':
                player_faintturn, enemy['공격력'], enemy['주문력'], enemy['마나'] = enemy_skill5(player_faintturn, enemy['공격력'], enemy['주문력'], enemy['마나'])


<gallery>
    # 적_화염
Bootstrap Post Details TEST.png | Bootstrap  적용
    if enemy_fireturn >= 1:
</gallery>
        enemy['체력'], enemy_fireturn = condition.fire(enemy['체력'], enemy_first_hp, enemy_fireturn)


* Pillow 설치
    # 적_중독
<source lang='python'>
    if enemy_poisonturn >= 1:
pip install Pillow
        enemy['체력'], enemy_poisonturn = condition.poison(enemy['체력'], enemy_lost_hp, enemy_poisonturn)
</source>


* blog > models.py
    # 적_출혈
<source lang='python'>
    if enemy_bloodturn >= 1:
from django.db import models
        enemy['체력'], enemy_bloodturn = condition.blood(enemy['체력'], enemy_bloodturn)
from django.urls import reverse


# Create your models here.
    # 적_갈증
# 글의 분류(일상, 유머, 정보)
    if enemy_thirstyturn >= 1:
        enemy['마나'], enemy_thirstyturn = condition.thirsty(enemy['마나'], enemy_thirstyturn)


    # 적_재생
    if enemy_reproduceturn >= 1:
        enemy['체력'], enemy_reproduceturn = condition.reproduce(enemy['체력'], enemy_first_hp, enemy_lost_hp, enemy_reproduceturn, enemy_con, enemy_job)


class Category(models.Model):
    # 적_조화
     # 분류 : 최대길이 50자
     if enemy_harmoniousturn >= 1:
    name = models.CharField(max_length=50, help_text="분류를 입력하세요.")
        enemy['마나'], enemy_harmoniousturn = condition.harmonious(enemy['마나'], enemy_harmoniousturn, enemy_con, enemy_job)


     def __str__(self):
     # 적_불사
        return self.name
    if enemy_undying >= 1:
        enemy_undying -= 1
        if enemy['체력'] <= 0:
            enemy['체력'] = int(enemy_first_hp / 10) + (enemy['주문력'] * 5)
            print('적 불사 발동')


# 블로그 글(제목, 작성일, 대표이미지, 내용, 분류)
    # 플레이어_불사
    if player_undying >= 1:
        if player['체력'] <= 0:
            player['체력'] = int(player_first_hp / 10) + (player['주문력'] * 5)
            print('불사 발동')




class Post(models.Model):
     # 적_치료증폭
     # 글 제목 : 최대길이 200자
     if enemy_recover_up == 0:
     title = models.CharField(max_length=200)
        if '치료증폭' in enemy_con:
    # 대표 이미지 : 비어있어도 됨
            enemy_con.remove('치료증폭')
    title_image = models.ImageField(blank=True)
    # 글 내용 : 내용의 글자수는 정해지지 않으므로 TextField
    content = models.TextField()
    # 작성일 : 사용자가 입력하지 않고 현재 날짜를 받아옴
    createDate = models.DateTimeField(auto_now_add=True)
    # 수정일 : 사용자가 입력하지 않고 현재 날짜를 받아옴
    updateDate = models.DateTimeField(auto_now_add=True)
    # 분류 : 다대다 관계정의
    category = models.ManyToManyField(category, help_text='분류를 입력하세요.')


     def __str__(self):
     # 적_치료감소
         return self.title
    if enemy_recover_down == 0:
         if '치료감소' in enemy_con:
            enemy_con.remove('치료감소')


     # 1번 글의 경우 -> single/1
     # 적_기절
    if enemy_faintturn == 0:
        if '기절' in enemy_con:
          enemy_con.remove('기절')


     def get_absolute_url(self):
     #게임종료
         return reverse('single'. args=[str(self.id)])
    if player['체력'] <= 0 or enemy['체력'] <= 0:
        print('게임이 끝났습니다!')
        if player['체력'] <= 0:
            print('----------------------------------------------------\n')
            player_check(player, player_con)
            print('----------------------------------------------------\n')
            print('적이 이겼습니다!')
            break
         else:
            print('----------------------------------------------------\n')
            print('적의 스탯 ')
            print('체력 : {},  마나 : {}'.format(enemy['체력'], enemy['마나']))
            print('공격력 : {},  주문력 : {}'.format(enemy['공격력'], enemy['주문력']))
            print('방어력 : {},  마법저항력 : {}'.format(enemy['방어력'], enemy['마법저항력']))
            print('물리관통력 : {},  마법관통력 : {}'.format(enemy['물리관통력'], enemy['마법관통력']))
            print('체력재생력 : {},  마나재생력 : {}'.format(enemy['체력재생력'], enemy['마나재생력']))
            print('적의 상태 : ', enemy_con)
            print('----------------------------------------------------\n')
            print('당신이 이겼습니다!')
            break
    print('----------------------------------------------------\n')
</source>
</source>
=====condition=====
<source lang='python'>
# 화염 : 자신의 턴 끝날때마다 자신의 기본체력의 3%만큼 고정피해를 입습니다.


* anjia > settings.py
def fire(hp, first_hp, nowturn):
<source lang='python'>
    player_new_hp = hp - int(first_hp /  100 * 3)
# ImageField 사용
    turn = nowturn - 1
MEDIA_URL = '/media/'
    return player_new_hp, turn
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
</source>


* anjia > urls.py
# 중독 : 자신의 턴 끝날때마다 자신의 잃은체력의 5%만큼 고정피해를 입습니다.
<source lang='python'>
"""anjia URL Configuration


The `urlpatterns` list routes URLs to views. For more information please see:
def poison(hp, lost_hp, nowturn):
    https://docs.djangoproject.com/en/3.0/topics/http/urls/
     player_new_hp = hp - int(lost_hp / 20)
Examples:
     turn = nowturn - 1
Function views
     return player_new_hp, turn
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import: from other_app.views import Home
     2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
     1. Import the include() function: from django.urls import include, path
     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
from django.views.generic import RedirectView
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    path('admin/', admin.site.urls),
    # 주소창에 blog를 입력시 blog.urls가 처리
    path('blog/', include('blog.urls')),
    # 기본주소로 처리시 blog로 넘겨준다.
    path('', RedirectView.as_view(url='/blog/', permanent=True)),
]


urlpatterns += static(settings.STATIC_URL,
# 출혈 : 자신의 턴 끝날때마다 자신의 현재체력의 5%만큼 고정피해를 입습니다.
                      document_root=settings.STATIC_ROOT)  # 정적 파일 처리
urlpatterns += static(settings.MEDIA_URL,
                      document_root=settings.MEDIA_ROOT)  # ImageField 처리
</source>


===지용근===
def blood(hp, nowturn):
====설명====
    player_new_hp = hp - int(hp /  20)
궁극적으로 2D도트게임을 만들고 싶은데 거기에 관련된 프로그램중 기초적인 걸 만들고 싶습니다
    turn = nowturn - 1
====코드====
    return player_new_hp, turn
<source lang='python'>
print('Hello Python!')
</source>


===DR.블랙팬텀X===
# 갈증 : 자신의 턴 끝날때마다 (현재마나의 5% + 7)만큼 마나를 잃습니다.
====설명====
분수를 소수로 바꿔주는 계산기입니다


====코드====
def thirsty(mana, nowturn):
<source lang='python'>
    player_new_mana = mana - int(mana /  20 + 7)  
print('Hello Python!')
    turn = nowturn - 1
</source>
    return player_new_mana, turn


===뚱이곰===
# 조화 : 자신의 턴 끝날때마다 (현재마나의 5% + 7)만큼 마나를 얻습니다.
====설명====
특정 키워드(예, 여행)에 해당하는 블로그 전체를 검색하여 내용 중 명사/형용사를 모두 추출하여 빈도를 계산하는 프로그램입니다
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===삼선짭뽕===
def harmonious(mana, nowturn, player_con, player_job):
====설명====
    plus_hp, plus_mp = recover(0, int(mana / 20 + 7), player_con, player_job)  
사용자의 상황에 알맞는 식사메뉴를 추천해주는 프로그램 (현재있는재료/조리시간/조리복잡도/조리기구유무를 고려)
    player_new_mana = mana + plus_mp
====코드====
    turn = nowturn - 1
<source lang='python'>
    return player_new_mana, turn
print('Hello Python!')
</source>


===태 현===
# 재생 : 자신의 턴 끝날때마다 (기본체력의 3% + 잃은체력의 5%)만큼 체력을 얻습니다.
====설명====
마침 한입에 쏙 파이썬을 1회독하고 다음에는 무엇을 할까 고민중이었는데 공지가 떠서 책에서 배운 내용을 기반으로 할 수 있는 프로그램을 만들고 싶습니다! 그리고 제 전공인 생명 정보관련해서 이용할 수 있는 프로그램이면 더 좋을 거 같습니다!
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===이상원===
def reproduce(hp, first_hp, lost_hp, nowturn, player_con, player_job):
====설명====
    plus_hp, plus_mp = recover(int(first_hp * 0.03 + lost_hp / 20), 0, player_con, player_job)
윈도우용 캘린더
    player_new_hp = hp + plus_hp
====코드====
    turn = nowturn - 1
<source lang='python'>
    return player_new_hp, turn
print('Hello Python!')
</source>


===Sungyou===
====설명====
저널 내 여러 논문들의 figure들을 crawling해서 원하는 데이터만 선택적으로 저장하고, 이 데이터를 tensorflow를 사용하여 phase나 regime diagram 만들기 + ANN 으로 화학공정 내 output을 바탕으로 fuel의 chemical composition 예측하기
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===박태현===
# 기절 : 기절에 걸린 적은 자신의 턴에 아무것도 할 수 없습니다.
====설명====
   
파이썬으로 나 만의 웹페이지 (  서버  ) 를 만들어 내 사이트를 대상으로 각종 웹 공격 ( ARP 스푸핑,brute force, SQL 인젝션 등등.. ) 을 경험 해보고싶습니다. 나만의 사이트를 파이썬으로  웹페이지를 만드는 것 까지를 목표로 두고 싶습니다.
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===zoey===
# 침묵 : 걸린 상대는 스킬을 사용할 수 없습니다. (패시브 제외)
====설명====
스케줄러나 일기장 혹은 간단한 게임 만들어 보고 싶어요. 더 구체적으로 생각해볼게요
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===donghyuk shin===
====설명====
음악 추천시스템을 만들어보고 싶습니다.
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===감귤===
# 무장해제 : 걸린 상대는 기본공격을 사용할 수 없습니다.
====설명====
Pandas로 데이터 전처리하기/ 텐서플로우 이용하여 자료 분석하기! 꿈이 인공지능 연구쪽이기도 하고, 과제 만들때 되게 도움이 많이될거 같습니다.C언어는 다뤄본적 있으나, 파이썬은 제대로 알고있지 않고, 텐서플로우 라이브러리만 살짝 다뤄보는 수업만 들은 상태라.. 유아반에 넣었습니다.
* 공공데이터포털에서 받아온 Excel 파일을 받아오기
* 받아온 Excel 파일을 Pandas를 이용, 러닝할수 있는 형태로 전처리
* TensorFlow를 이용해 구하고자 하는 종속함수와 독립함수의 관계 구하기
* 임의로 독립변수를 입력, 그에 맞는 종속변수 구하기
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===양셔류===
====설명====
간단한 쳇봇 만들어보고싶습니다.
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===모토===
# 치료감소 : 자신이 받는 모든 회복에 대해서 40%만큼 감소합니다.
====설명====
가족들 만을 위한 인스타그램
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===어쭈구저쭈구===
====설명====
텍스트 게임으로 컴퓨터와 턴제로 싸우는게임만들기. 여러가지 직업 파일을 만들고 나는 직업을 선택. (리그 오브 레전드 챔피언 개념) 상대는 랜덤 나와 상대는 체력, 공격력, 주문력, 방어력, 마나 등으로 이루어져있으며 직업에 따라 각각 패시브1개, 스킬5개로 이루어져있음. 상대는 쉬움, 보통, 어려움으로 구성되고 난이도가 높을수록 체력 공격력 등이 높게 시작.


+ 이거 너무 길어질거같습니다;; 게임 시작 설정만 해도 기네요
# 치료증폭 : 자신이 받는 모든 회복에 대해서 40%만큼 증가합니다.


====코드====
=====pyght=====
<source lang='python'>
import random
import Setting
import wizard
import worrior


jobs = ['마법사', '전사', '암살자']
def recover(hp, mana, con, partjob):
levels = ['', '', '상', '최상']
    re_hp = hp
    re_mana = mana
    if '치료감소' in con:
        re_hp = int(re_hp * 0.6)
        re_mana = int(re_mana * 0.6)
    if '치료증폭' in con:
        re_hp = int(re_hp * 1.4)
        re_mana = int(re_mana * 1.4)
    if partjob == 1 or partjob == '전사':
        re_hp = int(re_hp * 1.3)
        re_mana = int(re_mana * 1.3)
    return re_hp, re_mana


# 직업 정하기
# 방어막 : 자신이 입은 피해만큼 흡수해주는 방어막을 생성해줍니다. (방어막은 방어력과 마법저항력의 영향을 받지 않습니다. 또한, '흔적'을 제외한 다른 상태효과에 영향을 받지 않습니다.)
print("당신의 직업을 정해주세요. -> 마법사, 전사, 암살자")


while True:
def barrier(player_barrier, get_barrier, nowturn):
     player_job = input()
     new_barrier = player_barrier + get_barrier
     if player_job in jobs:
     turn = nowturn - 1
        print('당신의 직업은 {}입니다.'.format(player_job))
     return new_barrier, turn
        break
     else:
        print('다시 선택해 주십시오.')


# 흔적 : 받는 피해가 30% 증가합니다.


enemy_job = random.choice(jobs)
def trace(player_traceturn, player_con):
print("적의 직업은 {}입니다.".format(enemy_job))
     pass
print('----------------------------------------------------\n')
print("난이도를 정해주세요. -> 하, 중, 상, 최상")
# 난이도 정하기
while True:
    level = input()
    if level in levels:
        print('난이도는 {}입니다.'.format(level))
        break
     else:
        print('다시 선택해 주십시오.')


player, enemy = Setting.set(player_job, enemy_job, level)
# 불사 : 플레이어가 치명적인 공격을 받아 죽으면, 체력이 '기본체력의 10% + 주문력의 500%'인 상태로 부활합니다.
</source>
</source>
=====Setting=====
=====Setting=====
<source lang='python'>
<source lang='python'>
1,935번째 줄: 1,580번째 줄:
import worrior
import worrior
import assassin
import assassin


def set(player_job, enemy_job, level):
def set(player_job, enemy_job, level):
1,940번째 줄: 1,586번째 줄:
     if player_job == "마법사":
     if player_job == "마법사":
         print(''' -------------------------------------------------------------------------------
         print(''' -------------------------------------------------------------------------------
패시브 : \n마법사는 턴마다 1만큼 주문력을 얻습니다. 스킬을 사용하면 5의 주문력을 얻습니다. 주문력이 200이상이 되면 마법관통력을 15만큼얻습니다.\n
패시브 : \n마법사는 자신의 턴 시작할때마다 2만큼 주문력을 얻습니다. 스킬을 사용하면 5의 주문력을 얻습니다. 주문력이 300이상이 되면 마법관통력을 15만큼얻습니다.\n
메테오 : \n마법사가 적에게 (주문력의 230%)의 피해를 마법피해를 입힙니다. 상대는 2턴동안 '화염'효과를 받습니다.(마나: 75)\n
메테오 : \n마법사가 적에게 (주문력의 230%)의 피해를 마법피해를 입힙니다. 상대는 2턴동안 '화염'효과를 받습니다.(마나: 65)\n
치유 : \n마법사가 (주문력의 100%) + 40 만큼 회복하고 방어력과 마법저항력을 6만큼 얻습니다. 만약 체력이 1000이하라면 (주문력의 30%)만큼 더 회복됩니다. (마나 : 90)\n  
치유 : \n마법사가 (주문력의 100%) + 200 만큼 회복하고 방어력과 마법저항력을 6만큼 얻습니다. 만약 체력이 1500이하라면 (주문력의 120% + 300)만큼 더 회복됩니다. (마나 : 85)\n  
안정 : \n4턴마다 마나를 50 얻습니다. (패시브)\n
안정 : \n4턴마다 마나를 35 얻습니다. (패시브)\n
저주 : \n상대를 저주하여 4턴동안 '중독', '갈증', '침묵' 효과를 줍니다. 또한 방어력과 마법저항력을 5만큼 감소시킵니다. (마나 : 130)\n
저주 : \n상대를 저주하여 4턴동안 '중독', '갈증', '치료감소' 효과를 줍니다. 또한 방어력과 마법저항력을 6만큼 감소시킵니다. (마나 : 125)\n
파괴 : \n상대에게 (주문력의 350% + 상대잃은체력의 25%)만큼 마법피해를 입힙니다. 이 스킬은 마법저항력의 50%를 무시합니다. 이 스킬후 마법사는 (주문력의 5% + 상대잃은체력 3%)만큼 주문력을 얻습니다. (마나 450)\n
파괴 : \n상대에게 (주문력의 450% + 상대잃은체력의 35%)만큼 마법피해를 입힙니다. 이 스킬후 마법사는 ('파괴'로 입힌피해량의 5% + 30)만큼 주문력을 얻습니다. (마나 420)\n
-------------------------------------------------------------------------------''')
-------------------------------------------------------------------------------''')
         a = wizard.wizard
         a = wizard.wizard
        c = wizard.acts
     elif player_job == "전사":
     elif player_job == "전사":
         print(''' -------------------------------------------------------------------------------
         print(''' -------------------------------------------------------------------------------
패시브 : \n전사는 적을 기본공격하면 20%확률로 2턴동안 기절시킵니다. \n
패시브 : \n전사는 적을 기본공격하면 20%확률로 2턴동안 기절시킵니다. \n
의지 : \n자신의 공격력과 방어력을 각각 10, 6만큼 얻습니다. (마나 : 80) \n
의지 : \n자신의 공격력과 방어력을 각각 10, 4만큼 얻습니다. (마나 : 40) \n
강타 : \n상대를 강하게 내리쳐 (공격력의 200%)만큼 물리피해를 입힙니다. 만약 상대가 기절중이라면 (공격력의 150%)만큼 추가 물리피해를 입힙니다. (마나 : 80) \n
강타 : \n상대를 강하게 내리쳐 (공격력의 200%)만큼 물리피해를 입힙니다. 만약 상대가 기절중이라면 (공격력의 150%)만큼 추가 물리피해를 입힙니다. (마나 : 80) \n
재생 : \n전사의 기본회복량은 150% 입니다. (패시브)\n
재생 : \n전사의 기본회복량은 130% 입니다. (패시브)\n
포효 : \n상대를 3턴동안 기절시킵니다. (마나 : 140)\n
포효 : \n상대를 3턴동안 기절시킵니다. 만약 적이 '기절'효과를 받고있는 상태면 (방어력의 20%)만큼 마나를 돌려받습니다.(마나 : 120)\n
결집 : \n자신의 체력을 (자신 기본체력의 10% + 상대 기본체력의 10%)만큼 회복시킵니다. 또한 방어력과 마법저항력을 15만큼 얻습니다. hp가 700이하면 (공격력의 200%)만큼 더 회복합니다. (마나 : 400)\n
결집 : \n자신의 체력을 (자신 기본체력의 20% + 상대 기본체력의 20%)만큼 회복시킵니다. 또한 방어력과 마법저항력을 30만큼 얻습니다. hp가 2000이하면 '치료증폭'효과를 8턴동안 받습니다. (마나 : 370)\n
-------------------------------------------------------------------------------''')
-------------------------------------------------------------------------------''')
         a = worrior.worrior
         a = worrior.worrior
        c = worrior.acts
     elif player_job == '암살자':
     elif player_job == '암살자':
         print(''' -------------------------------------------------------------------------------
         print(''' -------------------------------------------------------------------------------
패시브 : \n기본공격시 25%확률로 치명타가 터집니다. 치명타는 (공격력의 200%)만큼 물리피해를 줍니다. \n
패시브 : \n기본공격시 25%확률로 치명타가 터집니다. 치명타는 (공격력의 200%)만큼 물리피해를 줍니다. \n
기습 : \n적에게  (공격력의 130% + 주문력 300%)에 해당하는 물리피해를 입힙니다. 25%확률로 고정피해를 입힙니다. (마나 : 80) \n
기습 : \n적에게  (공격력의 190% + 주문력 300%)에 해당하는 물리피해를 입힙니다. 25%확률로 고정피해를 입힙니다. (마나 : 80) \n
암살 : \n만약 상대의 피가 (500 + 주문력의 300%)이하일때 기본공격을 하면 상대가 즉사합니다. (패시브)  
암살 : \n만약 상대의 피가 (500 + 주문력의 300%)이하일때 기본공격을 하면 상대가 즉사합니다. (패시브)  
칼춤 : 상대에게 '출혈' 효과를 3턴동안 부여합니다. (마나 : 60) \n
칼춤 : \n상대에게 '출혈' 효과를 (3 + 주문력의 1%)턴동안 부여합니다. 암살자는 (3 + 주문력의 1%)턴동안 '재생'효과를 받습니다. (마나 : 60) \n
불검 : \n상대에게 4턴동안 '화염', '치료감소' 효과를 부여하고 (공격력의 200% + 상대최대체력의 5%)만큼 물리피해를 줍니다. (마나 : 140) \n
불검 : \n상대에게 3턴동안 '출혈', 화염', '치료감소' 효과를 부여하고 (공격력의 280% + 상대기본체력의 5%)만큼 물리피해를 줍니다. (마나 : 145) \n  
혼돈 : \n4턴 동안 적을 기절시킵니다. 암살자는 공격력과 주문력을 각각 50만큼 얻습니다. (마나 : 360) \n
혼돈 : \n5턴 동안 적을 기절시킵니다. 암살자는 공격력을 (150), 주문력을 (100)만큼 얻습니다. (마나 : 300) \n
-------------------------------------------------------------------------------''')
-------------------------------------------------------------------------------''')
         a = assassin.assassin
         a = assassin.assassin
        c = assassin.acts
     # 적에게 기본 스탯 대입
     # 적에게 기본 스탯 대입
     if enemy_job == "마법사":
     if enemy_job == "마법사":
         b = wizard.wizard
         b = wizard.enemy_wizard
        d = wizard.enemy_acts
     elif enemy_job == '전사':
     elif enemy_job == '전사':
         b = worrior.worrior
         b = worrior.enemy_worrior
        d = worrior.enemy_acts
     elif enemy_job == '암살자':
     elif enemy_job == '암살자':
         b = assassin.assassin
         b = assassin.enemy_assassin
     return a, b
        d = assassin.enemy_acts
</source>
     return a, b ,c ,d
 


=====wizard=====
# 스킬 대입
<source lang='python'>
def skillset(job):
wizard = {'체력': 2460, '공격력': 142, '주문력': 70, '방어력': 40, '마법저항력': 60, '마나': 400, '물리관통력': 0, '마법관통력': 15, '체력재생력': 6, '마나재생력': 4}
    if job == '마법사':
        return wizard.att, wizard.rest, wizard.check, wizard.meteor, wizard.hill, None, wizard.curse, wizard.destroy
    if job == '전사':
        return worrior.att, worrior.rest, worrior.check, worrior.determination, worrior.glow, None, worrior.shout, worrior.gather
    if job == '암살자':
        return assassin.att, assassin.rest, assassin.check, assassin.ambush, None, assassin.knifedance, assassin.fireknife, assassin.chaos
</source>
</source>
=====worrior=====
=====worrior=====
<source lang='python'>
<source lang='python'>
worrior = {'체력': 3200, '공격력': 189, '주문력': 0, '방어력': 80, '마법저항력': 60, '마나': 280, '물리관통력': 10, '마법관통력': 0, '체력재생력': 8, '마나재생력': 4}
from condition import recover
from random import choice
 
# 전사 기본스탯
worrior = {'체력': 5430, '공격력': 382, '주문력': 0, '방어력': 140, '마법저항력': 120, '마나': 320, '물리관통력': 0, '마법관통력': 0, '체력재생력': 12, '마나재생력': 6}
enemy_worrior = {'체력': 5430, '공격력': 382, '주문력': 0, '방어력': 140, '마법저항력': 120, '마나': 320, '물리관통력': 0, '마법관통력': 0, '체력재생력': 12, '마나재생력': 6}
 
acts = ['공격', '휴식', '상태확인', '의지', '강타', '포효', '결집']
enemy_acts = ['공격', '휴식', '의지', '강타', '포효', '결집', '공격', '공격', '휴식', '휴식']
twenty = [0, 0, 0, 0, 1]
 
def att(enemy_hp, player_attack, enemy_defence, player_ig_defence, enemy_faintturn):
    new_enemy_faintturn = enemy_faintturn
    new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
    will_faint = choice(twenty)
    if will_faint == 1:
        new_enemy_faintturn += 2
        print('패시브 발동')
    return new_enemy_hp, new_enemy_faintturn
 
def rest(player_hp, player_mana, player_rehp, player_remana, player_con):
    new_player_plushp, new_player_plusmana = recover(player_rehp * 4, player_remana * 3, player_con, 1)
    new_player_hp = player_hp + new_player_plushp
    new_player_mana = player_mana + new_player_plusmana
    return new_player_hp, new_player_mana
 
def check(player, player_con):
    print('플레이어의 스탯 ')
    print('체력 : {},  마나 : {}'.format(player['체력'], player['마나']))
    print('공격력 : {},  주문력 : {}'.format(player['공격력'], player['주문력']))
    print('방어력 : {},  마법저항력 : {}'.format(player['방어력'], player['마법저항력']))
    print('물리관통력 : {},  마법관통력 : {}'.format(player['물리관통력'], player['마법관통력']))
    print('체력재생력 : {},  마나재생력 : {}'.format(player['체력재생력'], player['마나재생력']))
    print('나의 상태 : ', player_con)
 
# 패시브 : 전사는 적을 기본공격하면 20%확률로 2턴동안 기절시킵니다.
 
 
# 의지 : 자신의 공격력과 방어력을 각각 10, 4만큼 얻습니다. (마나 : 40)
 
def determination(player_attack, player_defence, player_mana):
    if player_mana >= 40:
        new_player_attack = player_attack + 10
        new_player_defence = player_defence + 4
        new_player_mana = player_mana - 40
        return new_player_attack, new_player_defence, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(40 - player_mana))
        return player_attack, player_defence, player_mana
 
# 강타 : 상대를 강하게 내리쳐 (공격력의 200%)만큼 물리피해를 입힙니다. 만약 상대가 기절중이라면 (공격력의 150%)만큼 추가 물리피해를 입힙니다.  (마나 : 80)
 
def glow(enemy_hp, player_attack, enemy_defence, player_ig_defence, enemy_con, player_mana):
    if player_mana >= 80:
        new_enemy_hp = int(enemy_hp - (player_attack * 2 * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
        if '기절' in enemy_con:
            print('추가 피해')
            new_enemy_hp -= int(player_attack * 1.5 * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100))))
        new_player_mana = player_mana - 80
        return new_enemy_hp, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(80 - player_mana))
        return enemy_hp, player_mana
 
# 끈질김 : 전사의 기본회복량은 130% 입니다. (패시브)
 
 
# 포효 : 상대를 3턴동안 기절시킵니다. 만약 적이 '기절'효과를 받고있는 상태면 (방어력의 20%)만큼 마나를 돌려받습니다. (마나 : 120)
 
def shout(enemy_faintturn, enemy_con, player_defence, player_mana):
    if player_mana >= 120:
        new_player_mana = player_mana - 120
        new_enemy_faintturn = enemy_faintturn + 3
        if '기절' in  enemy_con:
            new_player_mana += int(player_defence * 0.2)
            print('마나를 {}만큼 돌려받았습니다.'.format(int(player_defence * 0.2)))
        return new_enemy_faintturn, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(120 - player_mana))
        return enemy_faintturn, player_mana
       
# 결집 : 자신의 체력을 (자신 기본체력의 20% + 상대 기본체력의 20%)만큼 회복시킵니다. 또한 방어력과 마법저항력을 30만큼 얻습니다. hp가 2000이하면 '치료증폭'효과를 8턴동안 받습니다. (마나 : 370)
def gather(player_hp, player_first_hp, enemy_first_hp, player_defence, player_magicdefence, player_con, player_recover_up, player_mana):
    if player_mana >= 370:
        player_plus_hp, gabage = recover(int((player_first_hp + enemy_first_hp) * 0.2), 0, player_con, 1)
        new_player_hp = player_hp + player_plus_hp
        new_player_defence = player_defence + 30
        new_player_magicdefence = player_magicdefence + 30
        new_player_recover_up = player_recover_up
        if player_hp <= 2000:
            new_player_recover_up += 8
        new_player_mana = player_mana - 370
        return new_player_hp, new_player_defence, new_player_magicdefence, new_player_recover_up, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(370 - player_mana))
        return player_hp, player_defence, player_magicdefence, player_recover_up, player_mana
</source>
</source>
=====assassin=====
=====assassin=====
<source lang='python'>
<source lang='python'>
assassin = {'체력': 2760, '공격력': 222, '주문력': 50, '방어력': 40, '마법저항력': 20, '마나': 300, '물리관통력': 30, '마법관통력': 0, '체력재생력': 6, '마나재생력': 4}
from random import choice
from condition import recover
 
# 암살자 기본스탯
assassin = {'체력': 3660, '공격력': 492, '주문력': 0, '방어력': 85, '마법저항력': 45, '마나': 320, '물리관통력': 25, '마법관통력': 0, '체력재생력': 7, '마나재생력': 6}
enemy_assassin = {'체력': 3660, '공격력': 492, '주문력': 0, '방어력': 85, '마법저항력': 45, '마나': 320, '물리관통력': 25, '마법관통력': 0, '체력재생력': 7, '마나재생력': 6}
critical = [0, 0, 0, 1]
 
acts = ['공격', '휴식', '상태확인', '기습', '칼춤', '불검', '혼돈']
enemy_acts = ['공격', '휴식', '기습', '칼춤', '불검', '혼돈', '공격', '공격']
 
def att(enemy_hp, player_attack, player_magic, enemy_defence, player_ig_defence):
    if enemy_hp <= (500 + player_magic * 3):
        print('암살 발동')
        return -99999
    iscritical = choice(critical)
    if iscritical == 0:
        new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
    else:
        new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100))) * 2))
        print('치명타 발동')
       
    return new_enemy_hp
 
def rest(player_hp, player_mana, player_rehp, player_remana, player_con):
    new_player_plushp, new_player_plusmana = recover(player_rehp * 4, player_remana * 3, player_con, 0)
    new_player_hp = player_hp + new_player_plushp
    new_player_mana = player_mana + new_player_plusmana
    return new_player_hp, new_player_mana
 
def check(player, player_con):
    print('플레이어의 스탯 ')
    print('체력 : {},  마나 : {}'.format(player['체력'], player['마나']))
    print('공격력 : {},  주문력 : {}'.format(player['공격력'], player['주문력']))
    print('방어력 : {},  마법저항력 : {}'.format(player['방어력'], player['마법저항력']))
    print('물리관통력 : {},  마법관통력 : {}'.format(player['물리관통력'], player['마법관통력']))
    print('체력재생력 : {},  마나재생력 : {}'.format(player['체력재생력'], player['마나재생력']))
    print('나의 상태 : ', player_con)
 
# 패시브 : 기본공격시 25%확률로 치명타가 터집니다. 치명타는 (공격력의 200%)만큼 물리피해를 줍니다. 치명타가 터지면 '방어막'을 (공격력의 100%)만큼 3턴동안 얻습니다.
 
 
# 기습 : 적에게  (공격력의 190% + 주문력 200%)에 해당하는 물리피해를 입힙니다. 25%확률로 고정피해를 입힙니다. (마나 : 80)
 
def ambush(enemy_hp, player_attack, player_magic, enemy_defence, player_ig_defence, player_mana):
    if player_mana >= 80:
        iscritical = choice(critical)
        if iscritical == 0:
            print('고정피해')
            new_enemy_hp = int(enemy_hp - ((player_attack * 1.9 + player_magic * 3) * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
        if iscritical == 1:
            new_enemy_hp = enemy_hp - int(player_attack * 1.9 + player_magic * 3)
        new_player_mana = player_mana - 80
        return new_enemy_hp, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(80 - player_mana))
        return enemy_hp, player_mana
 
# 암살 : 만약 상대의 피가 (500 + 주문력의 300%)이하일때 기본공격을 하면 상대를 즉사시킵니다. (패시브)
 
 
# 칼춤 : 상대에게 '출혈' 효과를 (3 + 주문력의 1%)턴동안 부여합니다. 암살자는 (3 + 주문력의 1%)턴동안 '재생'효과를 받습니다. (마나 : 60)
 
def knifedance(enemy_bloodturn, player_reproduceturn, player_magic, player_mana):
    if player_mana >= 60:
        new_enemy_bloodturn = enemy_bloodturn + int(player_magic * 0.01 + 3)
        new_player_reproduceturn = player_reproduceturn + int(player_magic * 0.01 + 3)
        new_player_mana = player_mana - 60
        return new_enemy_bloodturn, new_player_reproduceturn, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(60 - player_mana))
        return enemy_bloodturn, player_reproduceturn, player_mana
       
 
 
# 불검 : 상대에게 3턴동안 '출혈', 화염', '치료감소' 효과를 부여하고 (공격력의 280% + 상대기본체력의 5%)만큼 물리피해를 줍니다. (마나 : 145)
 
def fireknife(enemy_bloodturn, enemy_fireturn, enemy_recover_down, enemy_hp, player_attack, enemy_defence, enemy_first_hp, player_ig_defence, player_mana):
    if player_mana >= 145:
        new_enemy_hp = int(enemy_hp - ((player_attack * 2.8 + enemy_first_hp * 0.05) * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
        new_enemy_bloodturn = enemy_bloodturn + 3
        new_enemy_fireturn = enemy_fireturn + 3
        new_enemy_recover_down = enemy_recover_down + 3
        new_player_mana = player_mana - 145
        return new_enemy_hp, new_enemy_bloodturn, new_enemy_fireturn, new_enemy_recover_down, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(140 - player_mana))
        return enemy_hp, enemy_bloodturn, enemy_fireturn, enemy_recover_down, player_mana
 
# 혼돈 : 5턴 동안 적을 기절시킵니다. 암살자는 공격력을 (150), 주문력을 (100)만큼 얻습니다. (마나 : 300)
 
def chaos(enemy_faintturn, player_attack, player_magic, player_mana):
    if player_mana >= 300:
        new_enemy_faintturn = enemy_faintturn + 5
        new_player_attack = player_attack + 150
        new_player_magic = player_magic + 100
        new_player_mana = player_mana - 330
        return new_enemy_faintturn, new_player_attack, new_player_magic, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(300 - player_mana))
        return enemy_faintturn, player_attack, player_magic, player_mana
</source>
</source>
=====wizard=====
<source lang='python'>
from condition import recover
# 마법사 기본스탯
wizard = {'체력': 3860, '공격력': 295, '주문력': 130, '방어력': 80, '마법저항력': 160, '마나': 420, '물리관통력': 0, '마법관통력': 15, '체력재생력': 10, '마나재생력': 7}
enemy_wizard = {'체력': 3860, '공격력': 295, '주문력': 130, '방어력': 80, '마법저항력': 160, '마나': 420, '물리관통력': 0, '마법관통력': 15, '체력재생력': 10, '마나재생력': 7}
acts = ['공격', '휴식', '상태확인', '메테오', '치유', '저주', '파괴']
enemy_acts = ['공격', '휴식', '메테오', '치유', '저주', '파괴']
def att(enemy_hp, player_attack, enemy_defence, player_ig_defence):
    new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
    return new_enemy_hp
def rest(player_hp, player_mana, player_rehp, player_remana, player_con):
    new_player_plushp, new_player_plusmana = recover(player_rehp * 4, player_remana * 3, player_con, 0)
    new_player_hp = player_hp + new_player_plushp
    new_player_mana = player_mana + new_player_plusmana
    return new_player_hp, new_player_mana
def check(player, player_con):
    print('플레이어의 스탯 ')
    print('체력 : {},  마나 : {}'.format(player['체력'], player['마나']))
    print('공격력 : {},  주문력 : {}'.format(player['공격력'], player['주문력']))
    print('방어력 : {},  마법저항력 : {}'.format(player['방어력'], player['마법저항력']))
    print('물리관통력 : {},  마법관통력 : {}'.format(player['물리관통력'], player['마법관통력']))
    print('체력재생력 : {},  마나재생력 : {}'.format(player['체력재생력'], player['마나재생력']))
    print('나의 상태 : ', player_con)
# 패시브 : 마법사는 자신의 턴 시작할때마다 2만큼 주문력을 얻습니다. 스킬을 사용하면 5의 주문력을 얻습니다. 주문력이 300이상이 되면 마법관통력을 (25)만큼얻습니다.
# 메테오 : 마법사가 적에게 (주문력의 230%)의 피해를 마법피해를 입힙니다. 상대는 2턴동안 '화염'효과를 받습니다.(마나: 65)
def meteor(enemy_hp, player_mag, enemy_magicdefence, player_ig_magicdefence, player_mana, enemy_fire):
    if player_mana >= 65:
        new_enemy_hp = int(enemy_hp - (player_mag * 2.3 * (1 - (enemy_magicdefence / (enemy_magicdefence  + 100) * (1 - player_ig_magicdefence /100)))))
        new_player_mana = player_mana - 65
        new_enemy_fire = enemy_fire + 2
        return new_enemy_hp, new_player_mana, new_enemy_fire
    else:
        print('마나가 {}만큼 부족합니다.'.format(65 - player_mana))
        return enemy_hp, player_mana, enemy_fire


====현황====
직업의 특성 및 스킬 계획 ( 자잘한 밸런스 패치 )


플레이어와 적에게 해당하는 직업의 스탯을 적용하기 구현 중
# 치유 : 마법사가 (주문력의 100%) + 200 만큼 회복하고 방어력과 마법저항력을 6만큼 얻습니다. 만약 체력이 1500이하라면 (주문력의 120% + 300)만큼 더 회복됩니다. (마나 : 85)


'기절', '침묵', '치유감소' 등 효과 계획
def hill(player_hp, player_magic, player_defence, player_magicdefence, player_mana):
    if player_mana >= 85:
        new_player_hp = player_hp + player_magic + 200
        if player_hp <= 1500:
            new_player_hp += int(player_magic * 1.2 + 300)
        new_player_defence = player_defence + 6
        new_player_magicdefence = player_magicdefence + 6
        new_player_mana = player_mana - 85
        return new_player_hp, new_player_defence, new_player_magicdefence, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(85 - player_mana))
        return player_hp, player_defence, player_magicdefence, player_mana


# 안정 : 4턴마다 마나를 35 얻습니다. (패시브)
# 저주 : 상대를 저주하여 4턴동안 '중독', '갈증', '치료감소' 효과를 줍니다. 또한 방어력과 마법저항력을 6만큼 감소시킵니다. (마나 : 125)
def curse(enemy_poison, enemy_thirsty, enemy_recover_down, enemy_defence, enemy_magicdefence, player_mana):
    if player_mana >= 125:
        new_enemy_posionturn = enemy_poison + 4
        new_enemy_thirstyturn = enemy_thirsty + 4
        new_enemy_recover_down = enemy_recover_down + 4
        new_enemy_defence = enemy_defence - 6
        new_enemy_magicdefence = enemy_magicdefence - 6
        new_player_mana = player_mana - 125
        return new_enemy_posionturn, new_enemy_thirstyturn, new_enemy_recover_down, new_enemy_defence, new_enemy_magicdefence, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(125 - player_mana))
        return enemy_poison, enemy_thirsty, enemy_recover_down, enemy_defence, enemy_magicdefence, player_mana
# 파괴 : 상대에게 (주문력의 450% + 상대잃은체력의 35%)만큼 마법피해를 입힙니다. 마법사는 ('파괴'로 입힌피해량의 5% + 30)만큼 주문력을 얻습니다. (마나 420)
def destroy(enemy_hp, enemy_lost_hp, player_magic, enemy_magicdefence, player_ig_magicdefence, player_mana):
    if player_mana >= 420:
        first_hp = enemy_hp
        new_enemy_hp = int(enemy_hp - ((enemy_lost_hp * 0.4 + player_magic * 3.5) * (1 - (enemy_magicdefence / (enemy_magicdefence  + 100) * (1 - player_ig_magicdefence /100)))))
        damaged = enemy_hp - new_enemy_hp
        new_player_magic = player_magic + int(damaged / 20 + 20)
        print('마법사가 주문력을 {}만큼 얻었습니다!'.format(int(damaged / 20 + 20)))
        new_player_mana = player_mana - 420
        return new_enemy_hp, new_player_magic, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(420 - player_mana))
        return enemy_hp, player_magic, player_mana
</source>
=====undead=====
<source lang='python'>
<source lang='python'>
기본 공격 공식 = def att(enemy_hp, player_attack, enemy_defence, player_ig_defence):
from condition import recover
                      new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
 
                      return new_enemy_hp
 
</source>
# 언데드 기본스탯
wizard = {'체력': 4460, '공격력': 312, '주문력': 170, '방어력': 80, '마법저항력': 80, '마나': 340, '물리관통력': 0, '마법관통력': 20, '체력재생력': 9, '마나재생력': 8}
enemy_wizard = {'체력': 4460, '공격력': 312, '주문력': 170, '방어력': 80, '마법저항력':80, '마나': 340, '물리관통력': 0, '마법관통력': 20, '체력재생력': 9, '마나재생력': 8}
 
acts = ['공격', '휴식', '상태확인', '메테오', '치유', '저주', '파괴']
enemy_acts = ['공격', '휴식', '메테오', '치유', '저주', '파괴']
 
def att(enemy_hp, player_attack, enemy_defence, player_ig_defence):
    new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
    return new_enemy_hp
 
def rest(player_hp, player_mana, player_rehp, player_remana, player_con):
    new_player_plushp, new_player_plusmana = recover(player_rehp * 4, player_remana * 3, player_con, 0)
    new_player_hp = player_hp + new_player_plushp
    new_player_mana = player_mana + new_player_plusmana
    return new_player_hp, new_player_mana
 
def check(player, player_con):
    print('플레이어의 스탯 ')
    print('체력 : {},  마나 : {}'.format(player['체력'], player['마나']))
    print('공격력 : {},  주문력 : {}'.format(player['공격력'], player['주문력']))
    print('방어력 : {},  마법저항력 : {}'.format(player['방어력'], player['마법저항력']))
    print('물리관통력 : {},  마법관통력 : {}'.format(player['물리관통력'], player['마법관통력']))
    print('체력재생력 : {},  마나재생력 : {}'.format(player['체력재생력'], player['마나재생력']))
    print('나의 상태 : ', player_con)
 
 
# 패시브 : 언데드의 체력이 1000이하면 각성합니다. 각성시 자신의 스킬을 강화시키고, 주문력과 마나를 각각 100, 200만큼 얻습니다. 각성시 언데드의 체력이 1000이 넘어도 각성상태는 유지합니다.
 
 
# 지속적인 두려움 : 게임 시작시 (400 + 상대기본체력의 20%)만큼 고정피해를 입힙니다. 자신의 턴 시작할때마다 상대에게 (주문력의 30% + 20)만큼 마법피해를 입힙니다. 각성 시 (주문력의 10% + 20)만큼 추가고정피해를 입힙니다. (패시브)


리그 오브 레전드 공식을 참고했습니다. 마법피해도 이와 같습니다.


enemy_hp = 상대 체력
# 흡수 : 상대에게 (주문력의 200%)만큼 마법피해를 입히고 3턴동안 '중독'시킵니다. 자신의 체력을 (주문력의 200%)만큼 회복시키고 3턴동안 '재생'효과를 얻습니다. 각성 시 (주문력의 200%)만큼 추가마법피해를 입힙니다. (마나 : 90)
def absorb(enemy_hp, player_hp, player_mag, enemy_magicdefence, player_ig_magicdefence, enemy_poisonturn, player_reproduceturn, player_mana, is_stronger):
    if player_mana >= 90:
        new_enemy_hp = int(enemy_hp - (player_mag * 2 * (1 - (enemy_magicdefence / (enemy_magicdefence  + 100) * (1 - player_ig_magicdefence /100)))))


player_attack = 플레이어 공격력
# 균형 : 자신에게 걸린 '화염', '중독', '출혈', '갈증'효과를 없애고, '재생', '치료증폭'효과를 5턴동안 얻습니다. 각성 시 '조화'효과를 3턴동안 얻습니다. (마나 : 80)


enemy_hp = 상대 방어력


player_ig_defence =플레이어 물리관통력
# 불멸 : 자신에게 '불사' 효과를 3턴동안 부여합니다. 각성 시 '불사' 효과를 6턴동안 부여합니다. (마나 : 160)


new_enemy_hp = 함수 후 남은 상대 체력


===박상순===
# 죽음 : 적에게 (500 + 주문력의 300%)만큼 고정피해를 입힙니다. 각성 시 (상대현재체력의 40%)만큼 추가 고정피해를 입힙니다. (마나 : 350)
====설명====
</source>
단어간 유사도 측정, 쇼핑몰 가격, 상품정보 웹 크롤링, 상품 웹 스토어 (쿠팡) 자동 등록
====class====
====코드====
<source lang='python'>
<source lang='python'>
print('Hello Python!')
class champion:
    def __init__(self, job, level, stat):
        self.job = job
        self.level = level
</source>
</source>
====패치노트====
=====2020.05.16=====
'언데드'직업 계획
'불사', '조화', '재생' 효과 추가
잃은 체력이 -가 되는 버그 해결
상대를 이제 정할수 있음
자신의 직업을 이제 무작위로 고를수있음


===야호===
마법사 :
====설명====
 
간단한 게임?, 인공지능 만들기?(내가 말하면 대답해주고 웹검색도 해주는...)(딥러닝과머신러닝을 좀 배우고 싶은데...)\n(파이썬을 예전에 공부 했었는데 지금은 좀 많이 까먹어서 유아반에 입학했습니다.)
안정 마나회복 : 50 -> 35
====코드====
 
====간단한 게임====
저주 감소한 방어력, 마법저항력 : 5 -> 6
=====설명=====
 
텍스트 게임 (스팀에 있는 'Slay the Spire'이라는 게임과 비슷한 게임)
파괴 소모마나 : 400 -> 420
직업을 고를 수 있고 게임 난이도를 자신이 설정할 수 있으며 게임난이도에 따라 적의 스탯이 좋아진다.
게임을 플레이 하는 사람의 직업은 고를 수 있으며 적의 직업은 랜덤모듈을 사용해 랜덤으로 골라지도록 한다
직업별로 패시브 스킬 1개씩 존재하며 일반 스킬도 2~3가지 있음


직업(캐릭터) : (미정)
파괴 피해량 : (주문력의 350% + 상대잃은체력의 60%) -> (주문력의 350% + 상대잃은체력의 40%)


난이도 종류 : 쉬움,보통,어려움
전사 :  


=====기초 설정=====
기본 체력 : 5140 -> 5430
<source lang='python'>


</source>
결집 체력회복 : (기본체력 30% + 상대기본체력의 30%) -> (기본체력 20% + 상대기본체력의 20%)


===weelsun===
암살자:
====설명====
구글알리미와 같은 설정한 키워드에 따라 자동으로 뉴스스크래핑해주고, 스크래핑된 기사마다 핵심문장 찾아서 정리해주는 프로그램을 만들고 싶어요.
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===김인수===
기본 방어력 : 80 -> 85
====설명====
pyautogui로 UI가 구현된 매크로프로그램을 하나 만들고싶습니다. ex) 출석체크, 로그인, 프로그램 실행, 등등
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===Eddy (구구달스)===
치명타확률 : 40% -> 25%
====설명====
네트워크/보안 정책 자동 설정 프로그램
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===김지수===
기습 고정피해확률 : 40% -> 25%
====설명====
=====수준=====
한입에 쏙 파이썬 2/3 수강, 아직 익숙치 않아서 코드를 따라하면서 매우 낮은 수준의 엑셀 읽고 쓰기 가능
=====목표=====
업무자동화 프로그램
* 엑셀파일 - pdf 파일(주로 table 자료)을 읽어서 엑셀에 작성
* 함수와 macro를 이용하듯이 파이썬으로 엑셀을 활용하고 싶습니다. ( ex : 회사 재고의 수입된 날짜와 로트 별로 집계 금액 산출)
* 항목별 책정된 금액을 재고 별로 할당하는 시스템. 예를 들자면 총 자금 100만원 중 50만원을 'A' 항목에 책정하고 그 금액은 'a1','a2','a3' 재고에만 할당시켜서 자동으로 매출매입현황을 파악할 수 있는 엑셀 환경을 파이썬으로 구축하고 싶습니다.
* 관심있는 특정 키워드를 포함한 뉴스기사 서칭
* '3'의 내용을 보고할 목적으로 이메일 전송
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===Hwayoung Yoon===
기습 피해량 : (공격력의 240% + 주문력 300%) -> (공격력의 190% + 주문력 200%)
====설명====
나에게 맞는 전공을 선택하는 테스트, 합격 확률 예측 프로그램 만들기
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===TimeSquare===
혼돈 기절: 4 -> 5
====설명====
파이썬을 이용하여 통신을 주고받고 최종적으로 채팅 프로그램을 하나 구현해보고 싶습니다
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===MR===
혼돈 소모마나 : 330 -> 300
====설명====
챗봇과 매크로, 웹사이트/관리자페이지 만들고싶어요.
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===용용===
=====2020.05.23=====
====설명====
게임 종료시 자신의 상태가 제대로 표시되지않는 버그 수정
파이썬으로 만든 나만의 웹페이지를 만들고 싶어요! ( 장고나 플라스크 공부해보고싶어요)
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===JT===
'갈증' 효과가 오히려 증가하는 버그 수정
====설명====
데이터 프로세싱과 Visualization 툴을 만들고 싶습니다.
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===Kim KY===
마법사 :
====설명====
장비가동률을 기반으로 한 장비별 전문화 아이템 산출
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===이원권===
마법사 패시브 - 증가하는 마법관통력 : 15 -> 25
====설명====
업무 자동화(일단위 분석)-자세하게 회사 DB 오류 일단위 오류 검출 기능
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===아콰초코===
치유 회복량 : (주문력의 100% + 120) -> (주문력의 100% + 200)
====설명====
예전에 적어놨던 메모를 자동으로 불러오는 프로그램
====코드====
<source lang='python'>
print('Hello Python!')
</source>


===GreenElf===
치유 추가회복량 : (주문력의 120%) -> (주문력의 120% + 300)
====설명====
유트브에서 볼려던 영상을 기억할 수 있도록 저장,유트브를 얼마나 볼지 설정,표시
vs studio code 사용 dev ed 참고함(코딩계 퓨디파이)단점:영어
<source lang='python'>
import tkinter as tk
from tkinter import filedialog , Text
import os
import webbrowser


root = tk.Tk()
저주 마나 소모량 : 120 -> 125
root.title("유트브 핼퍼.1.0")
canvas=tk.Canvas(root,height=250,width=300,bg="red")
canvas.pack()


파괴 피해량 : (주문력의 400% + 상대잃은체력의 40%) -> (주문력의 450% + 상대잃은체력의 35%)


frame= tk.Frame(root,bg="white")
암살자 :
frame.place(relwidth=0.85,relheight=0.85)


wirte = tk.Button(root,text="볼 영상",padx=10,pady=5,fg="black")
기본체력 : 3460 -> 3660
wirte.pack()


timer= tk.Button(root,text="알람",padx=10,pady=5,fg="black")
공격력 : 482 -> 492
timer.pack()


칼춤 출혈 및 재생 턴 : (2 + 주문력의 1%) -> (3 + 주문력의 1%)


칼춤 마나 소모량 : 50 -> 60


기타 :


root.mainloop()
조화 마나 회복량 : (현재마나의 5% + 10) -> (현재마나의 5% + 7)


class 파일 추가


====하고싶은말====
구현할것이 아직 많이 남았네요 ㄷ
직업들을 클래스와 상속을 이용해 다시 만들고싶지만 시간이 너무 오래걸릴거같네요


</source>
====댓글====
* 김왼손: 설정이 아주 탄탄하네요. 노력에 박수를 보냅니다. :)


===_ Starry8004===
===야호===
====제목====
제목을 정해주세요.
====설명====
====설명====
웹 크롤링
pygame을 이용한 간단한 슈팅게임
====실행화면====
실행화면을 넣어주세요.
====코드====
====코드====
<source lang='python'>
<source lang='python'>
print('안녕 토끼야!')
import pygame
from bs4 import BeautifulSoup
import random
from urllib.request import urlopen
form time import sleep
 
BLACK = (0, 0, 0)
RED = (255, 0, 0)
pad_width = 480
pad_height = 640
fight_width = 36
fight_height = 38
enemy_width = 26
enemy_height = 20
 
def drawScore(count):
    global gamepad
    font = pygame.font.SysFont(None, 20)
    text = font.render('Enemy Kills: ' + str(count), True, (255, 255, 255))
    gamepad.blit(text, (0, 0))


response = urlopen('https://www.naver.com/')
def drawPassed(count):
soup = BeautifulSoup(response, 'html.parser')
    global gamepad
i = 1
    font = pygame.font.SysFont(None, 20)
f = open("새파일.txt", 'w')
    text = font.render('Enemy Passed: ' + str(count), True, RED)
for anchor in soup.select("span.keyword"):
    gamepad.blit(text, (360, 0))
     data = (str(i) + "위 : " + anchor.get_txt() + "\n"
 
i=i+1
def dispMessage(text):
f.write(data)
    global gamepad
f.close()
    textfont = pygame.font.Font('freesansblod.ttf', 80)
    text = textfont.render(text, True, RED)
    textpos = text.get_rect()
    textpos.center = (pad_width/2, pad_height/2)
    gamepad.blit(text, textpos)
    pygame.display.update()
    sleep(2)
    runGame()
 
def crash():
     global gamepad
    dispMessage('Crashed^-^;')
 
def gameover():
    global gamepad
    dispMessage('Game Over')
 
def drawObject(obj, x, y):
    global gamepad
    gamepad.blit(obj, (x,y))
 
def runGame():
    global gamepad, clock, fighter, enemy, bullet
</source>
</source>
아직 미완..
====댓글====
* 김왼손: 오.. 완성되면 저도 플레이 해보고 싶네요. :)


===Funnyjo===
===JT===
====수준====
====제목====
대학교때 두학기 정도 수업을 들었고 비전공자입니다.. 파이썬 한입에쏙 반정도 들었습니다.
제목을 정해주세요.
====설명====
====설명====
자동화 프로그램을 만들어 보고싶습니다. 아두이노를 이용해서나 엑셀을 통해서여!
데이터 프로세싱과 Visualization 툴을 만들고 싶습니다.
=====목표1=====
데이터를 읽어와서 분석을 위한 데이터 프로세싱을 실행한다.
=====목표2=====
준비된 데이터를 다양한 그래프 형태로 도식화한다.
=====목표3=====
API를 통해 직접적으로 데이터를 불러들여온다.
====실행화면====
실행화면을 넣어주세요.
====코드====
====코드====
=====코드: 목표1=====
<source lang='python'>
print('Hello Python!')
</source>
=====코드: 목표2=====
<source lang='python'>
<source lang='python'>
print('Hello Python!')
print('Hello Python!')
</source>
</source>
 
=====코드: 목표3=====
 
 
===ckstmznf===
====설명====
GUI를 이용해서 나를 소개하는 프로그램 만들기
====코드====
<source lang='python'>
<source lang='python'>
print('Hello Python!')
print('Hello Python!')
</source>
</source>
====댓글====
* 김왼손: 어떤 프로그램이 나올지 기대됩니다. :)

2020년 5월 28일 (목) 23:44 기준 최신판

1 파이썬 유치원[ | ]

파이썬 유치원은 유튜브 채널 김왼손의 왼손코딩에서 구독자와 함께 진행하는 프로젝트입니다. 프로젝트 기간 동안 스스로 학습하면서 나만의 프로그램을 만들어 봅니다. 파이썬 유치원 1기는 2020년 5월 1일부터 31일까지 한달 동안 진행합니다.

파이썬 유치원에는 강의가 없습니다. 사실 강의만 들어서는 머리에 남는 게 없습니다. 직접 만들어 봐야 합니다. 모든 분야가 그렇겠지만 코딩은 더욱 그렇습니다. 이제 강의는 그만 듣고 직접 만들어 봅시다. 모든 정보는 유튜브와 구글에 있으니까요. 파이썬 유치원에서는 방향과 방법을 함께 고민합니다. 유치원 선생님은 아이가 하고 싶은 대로 자유롭게 두면서 아이가 흥미를 잃지 않게, 다치지 않게 옆에서 도와줍니다. 파이썬 유치원에서의 김왼손은 그런 역할입니다.

파이썬 유치원의 모든 진행 상황은 유튜브 채널 김왼손의 왼손코딩에서 공유합니다. 매주 토요일 저녁 유튜브 라이브에서 어떻게 하고 있는지 함께 살펴보고 어려움이 있다면 함께 고민합니다. 각자의 진행 내용은 제타위키의 파이썬 유치원 문서에서 공유합니다. 진행 내용을 공유하고 서로 의견을 나눌 수 있습니다.

파이썬 유치원 유아반은 파이썬이나 코딩을 배워본 적은 있지만 잘 하지 못하는 분들을 대상으로 합니다.

2 제타위키 사용법[ | ]


3 유아반 친구들[ | ]

3.1 맨탈 와르르맨션(맨탈 붕괴)[ | ]

3.1.1 제목[ | ]

탐험의 땅,익스(EXplore)

3.1.2 설명[ | ]

파이게임으로 화면 반복하는 스토리형 탐험게임 만들기(게임명:EXS.the island of traveling(WIDTH:900,HEIGHT:600)

3.1.3 실행화면[ | ]

실행화면을 넣어주세요.

3.1.4 난이도[ | ]

총 12스테이지가 있으며,4개 마다 난이도가 달라짐

3.1.4.1 easy[ | ]

쉬운 적들이 나타남 상점에 약한 무기가 나옴

3.1.4.2 medium[ | ]

중간 적들이 나타남 상점에 포션이 등장,괜찮은 무기가 등장

3.1.4.3 hard[ | ]

어려운 적들 등장(???도 등장) 상점에 강력한 무기가 등장

3.1.5 게임 요소[ | ]

3.1.5.1 본인[ | ]
3.1.5.2[ | ]

난이도에 따라서 달라짐(우측 상단에서 확인 가능)

3.1.5.3 상점[ | ]
3.1.5.3.1 HP포션[ | ]

HP를 일정량 회복할 수 있고,버프를 주는 것도 있다.

3.1.5.3.2 무기[ | ]

공격력을 높여주는 아이템.몬스터를 시원하게 날릴 수 있음.

3.1.5.3.3 방어구[ | ]

플레이어를 방어 해주며, 방어구가 있으면 적이 곤란해 할 수 있다.

3.1.5.4 여관[ | ]

들어가면 돈을 내고 쉴 수 있다.(HP풀 회복)

3.1.5.5 (이스터 에그?)[ | ]

쉿,비밀

3.1.6 코드[ | ]

https://github.com/animicibal22534?tab=repositories

3.1.7 업데이트[ | ]

가이드 완료(일러스트 몇개 완성)

3.1.8 댓글[ | ]

  • 김왼손: pygame 쉽지 않던데 대단하네요. :)

3.2 김민재[ | ]

3.2.1 제목[ | ]

스스로 척척 계산기

3.2.2 설명[ | ]

파이참을 이용해 계산기 기능과 디자인, 형태까지 만드는 코드

3.2.3 실행화면[ | ]

실행화면을 넣어주세요.

3.2.4 코드[ | ]

# This Python file uses the following encoding: utf-8
# -*- coding: utf-8 -*-

from tkinter import *

def press(value):
    global calc
    global value1
    if value == 'C':
        expression_field.delete(0, "end")
        calc = 0.0
    elif value == '=':
        equalpress()
    else:
        value1 = expression_field.get()
        value1 = value1 + value
        expression_field.delete(0, "end")
        expression_field.insert(0, value1)

def equalpress():
    calc = expression_field.get()
    total = str(eval(calc))
    expression_field.delete(0, END)
    expression_field.insert(0, total)
    calc = ""

window = Tk()
window.title("계산기")

equa = ""
equation = StringVar()
calc = StringVar()
expression_field = Entry(window, width="32", bg="white") #색깔
expression_field.grid(row=0, column=0, columnspan=4)

text_list = ['789/', '456*', '123-', '0.=+']
for r, text in enumerate(text_list):
    for c, t in enumerate(text):
        Button(window, text=t, command=lambda t=t: press(t), height=1, width=7).grid(row=r+1, column=c)

Button(window, text="C", command=lambda: press('C'), height=1, width=7).grid(row=1, column=4)

window.mainloop()

3.2.5 댓글[ | ]

  • 김왼손: 와.. 대부분의 계산기 기능이 만들어졌네요. 계산기는 인터넷에 공개되어 있는 코드가 많을텐데 한번 참고해 보면 어떨까요? :)
  • 김민재: 왼손님이 지적해 주신것(코드를 줄여봐라)를 한번 해봤어요. 저는 모르겠었는데 지식인의 도움을 받아서 완성했습니다!
  • 김민재: 계산기 디자인은 '#색깔' 한곳만 바꿔주면 디자인이 달라집니다!
  • Projects.Kinder : 와~ 반복되었던 버튼에 대한 코드들이 다 사라졌네요!! :) 대단하세요~~ 참고해서 제가 만든 구구단을 업그레이드 해봐야겠어요~~

3.3 김지수[ | ]

3.3.1 제목[ | ]

제목을 정해주세요.

3.3.2 설명[ | ]

3.3.2.1 수준[ | ]

한입에 쏙 파이썬 2/3 수강, 아직 익숙치 않아서 코드를 따라하면서 매우 낮은 수준의 엑셀 읽고 쓰기 가능

3.3.2.2 목표[ | ]

업무자동화 프로그램

  • 엑셀파일 - pdf 파일(주로 table 자료)을 읽어서 엑셀에 작성
  • 함수와 macro를 이용하듯이 파이썬으로 엑셀을 활용하고 싶습니다. ( ex : 회사 재고의 수입된 날짜와 로트 별로 집계 금액 산출)
  • 항목별 책정된 금액을 재고 별로 할당하는 시스템. 예를 들자면 총 자금 100만원 중 50만원을 'A' 항목에 책정하고 그 금액은 'a1','a2','a3' 재고에만 할당시켜서 자동으로 매출매입현황을 파악할 수 있는 엑셀 환경을 파이썬으로 구축하고 싶습니다.
  • 관심있는 특정 키워드를 포함한 뉴스기사 서칭
  • '3'의 내용을 보고할 목적으로 이메일 전송

3.3.3 실행화면[ | ]

실행화면을 넣어주세요.

3.3.4 코드[ | ]

from openpyxl import load_workbook
import pandas as pd
from pandas import Series, DataFrame
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
import os
import warnings 
warnings.filterwarnings("ignore")

def sort():
    ws1['A1'].value = '년'
    ws1['B1'].value = '월'
    ws1['C1'].value = '품목명'
    ws1['D1'].value = '수량'
    ws1['E1'].value = '단가'
    ws1['F1'].value = '공급가액'
    ws1['G1'].value = '부가세'
    ws1['H1'].value = '합계'
    ws1['I1'].value = '거래처명'
    ws1['J1'].value = '적요'

wb1 = load_workbook('testing.xlsx', data_only = True)
ws1 = wb1['Sheet1']
wb1.remove(wb1['Sheet1'])
ws1 = wb1.create_sheet('Sheet1')
ws1 = wb1['Sheet1']

sort()

user_input = '' 
user_input = input('몇 월 까지의 매출 자료를 불러옵니까? : ')
for month in range(1,int(user_input)+1):
    wb2 = load_workbook(str(str(month).zfill(2))+'매출.xlsx',data_only = True)
    ws2 = wb2['판매현황']
    for row1 in ws2.rows:
        if '계' and '일자' not in row1[0].value and '-' in row1[0].value :
            devision = [str(row1[0].value).split('/')[0], str(row1[0].value).split('/')[1],str(row1[1].value).split(' [')[0]]
            for num in range(2,9):
                devision.append(str(row1[num].value))
            ws1.append(devision)
 
#반복문으로 입력되게 수정
            
wb1.remove(wb1['Sheet2'])
ws1_2 = wb1.create_sheet('Sheet2')
user_input = '' 
user_input = input('몇 월, 몇 일의 재고 자료를 불러옵니까?(mmdd): ')

wb2 = load_workbook(user_input+'재고.xlsx',data_only = True)
ws2 = wb2['재고현황']
ws1_2 = wb1['Sheet2']

for row2 in ws2.rows:
    ws1_2.append([str(row2[1].value),str(row2[3].value)])

ws1_2.delete_rows(1)
ws1_2.delete_rows(int(ws1_2.max_row))
ws1_2.delete_rows(int(ws1_2.max_row))

wb1.save('testing.xlsx')

df = pd.read_excel('testing.xlsx', sheet_name = 'Sheet2')
df2 = pd.read_excel('testing.xlsx', sheet_name = 'Sheet1')
df2 = pd.merge(df2, df, how = 'left', on = '품목명')
df2.to_excel('testing_2.xlsx', index = False)

#vlookup 함수를 문자열로 사용하면 pivot_table로 활용할 때 값이 수식을 불러들여 NaN 값이 발생해서 pandas에서 merge를 활용해 vlookup을 구현, DataFrame을 엑셀로 저장

table_1 = pd.pivot_table(df2, index=['품목명','재고수량','거래처명'], columns=['년','월'], values=['수량'], aggfunc='sum')
table_2 = pd.pivot_table(df2, index=['품목명','재고수량'], columns=['년','월'], values=['수량'], aggfunc='sum')
writer = pd.ExcelWriter( 'ERP 매출 재고 통합자료.xlsx', engine = 'xlsxwriter')
table_2.to_excel(writer, sheet_name = 'Sheet1')
table_1.to_excel(writer, sheet_name = '거래처 포함')
writer.save()

#pandas의 pivot_table을 사용하여 엑셀의 피벗테이블을 구현

wb3 = excel.Workbooks.Open(str(os.path.dirname(os.path.realpath(__file__)))+'\\'+'ERP 매출 재고 통합자료.xlsx')

#다른 PC에서도 프로그램을 사용하므로 경로 입력을 현재 파일의 절대 경로를 문자열로 입력하고  파일 이름을 추가 해줌

ws3_1 = wb3.Worksheets("Sheet1")
ws3_2 = wb3.Worksheets("거래처 포함")
ws3_1.Columns.AutoFit()
ws3_2.Columns.AutoFit()
wb3.Save()
excel.Application.Quit()

#서식을 조작하여 열의 너비를 자동으로 맞추기 위해 추가한 코드

3.3.5 댓글[ | ]

  • 김왼손: 완성되면 바로 써먹을수 있겠는데요? 대단합니다. :)

3.4 Kim KY[ | ]

3.4.1 제목[ | ]

제목을 정해주세요.

3.4.2 설명[ | ]

장비가동률을 기반으로 한 장비별 전문화 아이템 산출

3.4.3 실행화면[ | ]

실행화면을 넣어주세요.

3.4.4 코드[ | ]

# 파이썬 시작하기
a = input('program_number?')
i = input('연월일(yyyy.mm.dd)?')
year = i[0:4]
month = i[5:7]
date = i[8:]

print('='*50)
print('program_number #' + a)
print('Life is short, You need Python')
print(f'연도 : {year}년')
print(f'날짜 : {month}{date}일')
print('='*50)

3.4.5 댓글[ | ]

  • 김왼손: 뭔가 전문적인 느낌이 드는 주제네요. :)

3.5 김매매[ | ]

3.5.1 제목[ | ]

제목을 정해주세요.

3.5.2 수준[ | ]

구글에 파이썬 예제라고 치면 나오는 300문제 다 풀 수 있음

3.5.3 목표[ | ]

1.김매매: 휴대폰 배터리 상태와 온도 알림 어플 2. fps게임할때 화면을 확대해 스코프 없이도 줌을 할수 있는 프로그램(모바일 포함) 3. 버튼 하나로 음악을 재생, 정지를 해 게임 로딩시간을 지루하지 않게 하는 프로그램 4. 휴대폰 게임 할때 버튼 위치를 옮길 수 없을때 임의로 지정한 곳을 터치하면 버튼이 인식되는 어플 왠만하면 모바일로 갈거임

3.5.4 실행화면[ | ]

실행화면을 넣어주세요.

3.5.5 코드[ | ]

#'국민 갓겜 가위바위보를 만들었습니다.'

print('게임을 시작합니다. 시작하려면 아무키나 입력하시고\n 종료하시려면 "종료"를 입력해 주세요')
skill=input()
list=['가위', '바위', '보']
win='제가 이겼군요 하핳'
lose='제가 졌군요ㅠㅠ'
tie='비겼네요 다시'
winc=0
losec=0
tiec=0
scissors=0
rock=0
paper=0
while skill!='종료':
    print('안 내면 진 거 가위바위보')
    skill=input()
    if skill=='가위':
        scissors+=1
        import random
        resurt=random.choice(list)
        print(resurt)
        if resurt=='가위':
            print(tie)
            tiec+=1
            print('\n')
        elif resurt=='바위':
            print(win)
            winc+=1
            print('\n')
        elif resurt=='보':
            print(lose)
            losec+=1
            print('\n')
    elif skill=='바위':
        rock+=1
        import random
        resurt=random.choice(list)
        print(resurt)
        if resurt=='가위':
            print(lose)
            losec+=1
            print('\n')
        elif resurt=='바위':
            print(tie)
            tiec+=1
            print('\n')
        elif resurt=='보':
            print(win)
            winc+=1
            print('\n')
    elif skill=='보':
        paper+=1
        import random
        resurt=random.choice(list)
        print(resurt)
        if resurt=='가위':
            print(win)
            winc+=1
            print('\n')
        elif resurt=='바위':
            print(lose)
            losec+=1
            print('\n')
        elif resurt=='보':
            print(tie)
            tiec+=1
            print('\n')
    else:
        if skill!='종료':
            print('이상한거 내지 말고 재대로 내봐요')
            print('\n')
    continue
print('게임이 종료돠었습니다.')
print('승리 :',winc)
print('패배 :',losec)
print('무승부 :',tiec)
print('\n')
print('가위를 낸 횟수 :',scissors)
print('바위를 낸 횟수 :',rock)
print('보를 낸 횟수 :',paper)
print('수고하셨습니다.')
input('창을 닫으시려면 아무 키나 입력하세요')

3.5.6 댓글[ | ]

  • 김왼손: 훌륭한 가위바위보 게임입니다. :)

3.6 ckstmznf[ | ]

3.6.1 제목[ | ]

제목을 정해주세요.

3.6.2 설명[ | ]

GUI를 이용해서 나를 소개하는 프로그램 만들기

3.6.3 실행화면[ | ]

실행화면을 넣어주세요.

3.6.4 참고영상[ | ]

https://youtu.be/OtqWefBqbxA

3.6.5 1일차(부제 : 기획)[ | ]

지난주 밖에 나가야 해서 참여를 못했지만---귀찮이즘이---PyQt5의 강의 영상은 꾸준히 보아 학습하였다. 오늘부터 시작을 한다. 먼저 기획을 한다면 기본 메뉴 ┌기본 프로필

             |─할수 있는 언어
             |─사용 할수 있는 소프트 웨어
            └기타 내용

3.6.6 코드[ | ]

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

class Exam(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        x = 15

        btn_gibon = QPushButton("기본 메뉴 입니다.", self)
        btn_gibon.resize(btn_gibon.sizeHint())
        # btn_gibon.setToolTip("저의 기본 정보를 볼수 있는 메뉴입니다.")
        btn_gibon.move(50,x)
        x += 70

        btn_gibon = QPushButton("기본 정보", self)
        btn_gibon.resize(btn_gibon.sizeHint())
        btn_gibon.setToolTip("저의 기본 정보를 볼수 있는 메뉴입니다.")
        btn_gibon.move(50,x)
        x += 70

        btn_gibon = QPushButton("할수 있는 언어", self)
        btn_gibon.resize(btn_gibon.sizeHint())
        btn_gibon.setToolTip("제가 할수 있는 언어들입니다.")
        btn_gibon.move(50,x)
        x += 70

        btn_gibon = QPushButton("사용 할수 있는 소프트 웨어", self)
        btn_gibon.resize(btn_gibon.sizeHint())
        btn_gibon.setToolTip("제가 사용할수 있는 소프트 웨어들 입니다.")
        btn_gibon.move(50,x)
        x += 70

        btn_gibon = QPushButton("그 밖의 내용", self)
        btn_gibon.resize(btn_gibon.sizeHint())
        btn_gibon.setToolTip("그 밖의 기타 내용 입니다.")
        btn_gibon.move(50,x)
        
        self.setGeometry(500,500,400,400)
        self.setWindowTitle("기본 메뉴")
        self.show()


app = QApplication(sys.argv)
w = Exam()
sys.exit(app.exec_())

3.6.7 발전 내용[ | ]

3.6.7.1 1일차[ | ]

1일차 기획을 한 기본 메뉴들을 만들었다. 내가 지금 하고있는게 정석인지 안니지는 모르겠지만...

3.6.8 댓글[ | ]

  • 김왼손: 자기소개 프로그램이라니.. 기대됩니다. :)

3.7 Yoon[ | ]

3.7.1 제목[ | ]

제목을 정해주세요.

3.7.2 설명[ | ]

간단한 게임들을 만들어보고 싶어요.

3.7.3 실행화면[ | ]

실행화면을 넣어주세요.

3.7.4 코드[ | ]

일단은 Python 기초강의 영상보면서 공부중입니다.
2020.05.06 : 미운코딩새끼 28강까지 정리 완료
2020.05.07 : 미운코딩새끼 46강까지 정리 완료
2020.05.08 : 미운코딩새끼 완료
https://www.notion.so/Python-414973d8d54a43c7a9495d201babed29
코드 적어본것 깃허브
https://github.com/YoonJeong-Choi/PythonPreschool
2020.05.09~10 : snake game 시작, 도움 - https://python.bakyeono.net/chapter-12-1.html
~ 2020.05.15 : snake game 재시작, 점수, 속도 기능 추가
~ 2020.05.19 : 메인화면 시작, 종료 버튼 추가

import pygame
import random # 랜덤으로 사과 띄움
import time
from datetime import datetime
from datetime import timedelta
from tkinter import *
# import tkinter.messagebox

pygame.init() # pygame 초기화

SCREEN_WIDTH = 440 # 화면 너비
SCREEN_HEIGHT = 440 # 화면 높이
BLOCK_SIZE = 20 # 블록 크기(네모 한칸 크기)
# 화면의 가로세로가 400이고 블록의 크기가 20이기 때문에 가로, 세로는 20칸씩 블록이 들어갈 수 있다.

# 화면의 테두리부분 영역
EDGE = []
for w in range(0, 22) :
    EDGE.append((0, w))
    EDGE.append((21, w))
    EDGE.append((w, 0))
    EDGE.append((w, 21))

# 시작 버튼 영역
START = []
for s in range(0, 8) :
    START.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 2 + BLOCK_SIZE // 2))
    START.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 2 + BLOCK_SIZE // 2 + BLOCK_SIZE))
    START.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 2 + BLOCK_SIZE // 2 + BLOCK_SIZE * 2))

# 종료 버튼 영역
EXIT = []
for s in range(0, 8) :
    EXIT.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 3 * 2 + BLOCK_SIZE // 2))
    EXIT.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 3 * 2 + BLOCK_SIZE // 2 + BLOCK_SIZE))
    EXIT.append((SCREEN_WIDTH // 22 * 7 + BLOCK_SIZE * s, SCREEN_HEIGHT // 3 * 2 + BLOCK_SIZE // 2 + BLOCK_SIZE * 2))

# 색
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
SNAKEGREEN = (29, 139, 21)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
BROWN = (124, 56, 0)
LIGHTGRAY = (234, 234, 234)
DARKGRAY = (140, 140, 140)

# 점수
score = 0
# pygeme.display.set_mode((화면 너비, 화면 높이)) 화면 객체 반환
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

pygame.display.set_caption('SnakeGame') # title 설정

# 화면
# 시작 화면
def draw_main(screen) :
    background = pygame.Rect((0, 0), (SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.draw.rect(screen, WHITE, background)
    # 시작버튼
    for start in START :
        startButton = pygame.Rect((start[0], start[1]), (BLOCK_SIZE, BLOCK_SIZE))
        pygame.draw.rect(screen, GREEN, startButton)
    # 시작글씨
    font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE * 2) # 폰트 설정
    text = font.render('start!', True, BLACK) # 글자 설정 render('출력', True, 글자색, 배경색)
    textRect = text.get_rect()
    textRect.center = (int(((SCREEN_WIDTH // 4) + (BLOCK_SIZE * 5.5))), ((SCREEN_HEIGHT // 2) + (BLOCK_SIZE * 2)))
    screen.blit(text, textRect)
    # 제목
    title_font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE * 3) # 폰트 설정
    title_text = title_font.render('Snake Game', True, SNAKEGREEN) # 글자 설정 render('출력', True, 글자색, 배경색)
    title_textRect = title_text.get_rect()
    title_textRect.center = (int(((SCREEN_WIDTH // 4) + (BLOCK_SIZE * 5.5))), (SCREEN_HEIGHT // 3))
    screen.blit(title_text, title_textRect)
    # 종료버튼
    for exit in EXIT :
        exitButton = pygame.Rect((exit[0], exit[1]), (BLOCK_SIZE, BLOCK_SIZE))
        pygame.draw.rect(screen, LIGHTGRAY, exitButton)
    # 종료글씨
    exit_font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE * 2) # 폰트 설정
    exit_text = exit_font.render('exit', True, DARKGRAY) # 글자 설정 render('출력', True, 글자색, 배경색)
    exit_textRect = exit_text.get_rect()
    exit_textRect.center = (int(((SCREEN_WIDTH // 4) + (BLOCK_SIZE * 5.5))), (SCREEN_HEIGHT // 3 * 2  + BLOCK_SIZE * 2))
    screen.blit(exit_text, exit_textRect)

# 게임 배경
def draw_background(screen) :
    # 화면 전체에 강과 땅을 그려준다.
    # pygame.Rect((x, y), (사각형 너비, 사각형 높이))
    background = pygame.Rect((0, 0), (SCREEN_WIDTH, SCREEN_HEIGHT))
    # pygame.draw.rect(사각형을 그릴 화면, 색, 사각형 정보)
    pygame.draw.rect(screen, BROWN, background)
    # 테두리는 파란색으로 칠해준다.
    for edge in EDGE :
        edges = pygame.Rect((edge[0] * BLOCK_SIZE, edge[1] * BLOCK_SIZE), (BLOCK_SIZE, BLOCK_SIZE))
        pygame.draw.rect(screen, BLUE, edges)


# 블록을 그리는 함수 이 함수로 뱀이나 사과같은것들을 그려준다.
def draw_block(screen, color, position) :
    # position[n] * BLOCK_SIZE는 블록의 위치를 나타낸다.
    # 화면크기가 400*400, 블록이 20*20이기 때문에 화면은 가로, 세로 20칸이 된다. x, y를 이를 이용해 설정한것
    block = pygame.Rect((position[0] * BLOCK_SIZE, position[1] * BLOCK_SIZE), (BLOCK_SIZE, BLOCK_SIZE))
    pygame.draw.rect(screen, color, block)


# 블록 위치 = 뱀이 처음 나올 위치
block_position = [9, 9]
# 마지막으로 블록을 움직인인 때 = 마지막으로 버튼을 누른 때
# datetime.now()는 현재 시간을 알려준다.
last_moved_time = datetime.now()
# 처음 블록의 방향은 아래
block_direction = 'down'

# 방향 키 입력에 따라 블록의 방향 dictionary
DIRECTION_ON_KEY = {
    pygame.K_UP : 'up',
    pygame.K_DOWN : 'down',
    pygame.K_LEFT : 'left',
    pygame.K_RIGHT : 'right'
}

# 뱀
class Snake :
    color = GREEN
    # speed = 0.3
    def __init__(self) :
        self.positions = [(11, 11)] # 뱀의 위치. 뱀이 길어질수록 이 배열도 길어질것이다.
        self.direction = 'down' # 뱀의 방향
        self.speed = 0.3

    def draw(self, screen) :
        # 뱀그리기. 사과를 먹을수록 길어져야한다.
        # 여러 블록으로 이루어져있기 때문에 반복문을 돌며 그린다.
        for position in self.positions:
            draw_block(screen, self.color, position)
    # 뱀이 움직이면 머리가 움직인것에 따라 꼬리까지 따라가게 만드는 함수
    def crawl(self) :
        # 뱀의 머리는 인스턴스 변수인 positions[0] 위치이다.
        head_position = self.positions[0]
        # x, y 변수에 머리의 x, y좌표를 넣어준다.
        x, y = head_position
        # 만약 현재 뱀이 움직이는 방향이 아래라면
        if self.direction == 'down' :
            # 뱀의 머리 위치를 한칸 아래로 바꿔주고,
            # 기존 뱀의 위치 중 꼬리가 있던 부분 직전까지 더해준다.
            # 이렇게하면 머리의 위치를 앞에 추가해줌으로써
            # 머리부터 꼬리까지 각자 블럭의 앞에 있던 칸으로 따라간다.
            self.positions = [(x, y + 1)] + self.positions[:-1]
        elif self.direction == 'up' :
            self.positions = [(x, y - 1)] + self.positions[:-1]
        elif self.direction == 'left' :
            self.positions = [(x - 1, y)] + self.positions[:-1]
        elif self.direction == 'right' :
            self.positions = [(x + 1, y)] + self.positions[:-1]
    # 뱀의 방향을 바꾸는 함수
    def turn(self, direction) :
        self.direction = direction
    # 뱀을 키워주는 함수
    def grow(self) :
        # 뱀 꼬리의 뒤에 한칸 붙여준다.
        x, y = self.positions[-1]
        if self.direction == 'up' :
            self.positions.append((x, y - 1))
        elif self.direction == 'down' :
            self.positions.append((x, y + 1))
        elif self.direction == 'left' :
            self.positions.append((x - 1, y))
        elif self.direction == 'right' :
            self.positions.append((x + 1, y))
        # 뱀의 속도를 높여준다.
        if len(self.positions) > 15  and len(self.positions) < 25  :
            self.speed = 0.2
        elif len(self.positions) > 25 :
            self.speed = 0.1        

# 사과
class Apple :
    color = RED
    def __init__(self, position = (7, 7)) :
        self.position = position # 사과 위치

    def draw(self, screen) :
        # 사과 그리기
        draw_block(screen, self.color, self.position)    

# 게임판 : 뱀과 사과를 그려준다
class Board :
    width = 20
    height = 20
    
    def __init__(self) :
        self.snake = Snake()
        self.apple = Apple()

    def draw(self, screen) :
        self.apple.draw(screen) # 게임판 위의 사과 그리기
        self.snake.draw(screen) # 게임판 위의 뱀 그리기
    # 사과 만들기 - 사과에 사과만들기를하면 snake인스턴스를 못쓴다.
    def put_new_apple(self) :
        # 0 부터 20까지 랜덤으로 수를 정해 사과 위치를 정한다.
        self.apple = Apple((random.randint(1, 20), random.randint(1, 20)))
        # 뱀의 몸과 겹치면 사과를 다시만든다.
        for position in self.snake.positions :
            if self.apple.position == position :
                self.put_new_apple()
                break
    # 시간이 지나면 process_turn 메소드가 실행되며 저절로 뱀이 움직인다.
    def process_turn(self) :
        self.snake.crawl()
        # 뱀머리가 몸이나 벽에 부딛히면 게임이 끝난다.
        if self.snake.positions[0] in self.snake.positions[1:] or self.snake.positions[0] in EDGE:
            play = False
            return play
            
        # 움직이다가 사과 == 뱀머리 이면 뱀을 길게만들고 새 사과를 만든다.
        if self.snake.positions[0] == self.apple.position:
            self.snake.grow()
            self.put_new_apple()
            return 1
        return 1
    # 점수를 표시해주는 메소드.
    def write_score(self, screen) :
        score = 'score : {}'.format(len(self.snake.positions) - 1)
        # 상단에 점수표시
        font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE) # 폰트 설정
        text = font.render(score, True, BLACK, WHITE) # 글자 설정 render('출력', True, 글자색, 배경색)
        textRect = text.get_rect()
        textRect.center = (SCREEN_WIDTH // 2, BLOCK_SIZE // 2)
        screen.blit(text, textRect)    

class Play_Again :
    replay = True    
    def __init__ (self, replay) :
        # 윈도우 창 생성
        replay_window = Tk()
        # 윈도우 창 타이틀 지정
        replay_window.title('Game Over')
        # 윈도우 창의 크기 지정
        replay_window.geometry('230x100')
        # 윈도우 창 크기변경 가능?
        replay_window.resizable(0, 0)
        # 라벨
        show_text = Label(replay_window, text='~Game Over~\n다시하시겠습니까?').place(x = 60, y = 15)
        # 버튼
        replay_btn = Button(replay_window, text='Play Again', command = lambda: (self.Play(replay), replay_window.destroy())).place(x = 40, y = 60)
        exit_btn = Button(replay_window, text='Exit', command = lambda: (self.End(replay), replay_window.destroy())).place(x = 150, y = 60)
        # 윈도우 창 유지
        replay_window.mainloop()
        
    def Play(self, replay) : 
        self.replay = True
        return self.replay

    def End(self, replay) :
        self.replay = False
        return self.replay

# 게임 화면
def play_game(play, last_moved_time) :
    board = Board()
    while play :
        # pygame.event.get() 발생한 이벤트 목록을 읽는다.
        events = pygame.event.get()
            
        # 반복문을 이용하여 이벤트 목록을 본다.
        for event in events :
            # 종료 이벤트가 발생하면 종료한다.
            if event.type == pygame.QUIT :
                # exit()
                pygame.quit()
            # 어떤 버튼을 눌렀다면 아래처럼 행동한다.
            if event.type == pygame.KEYDOWN :
                # 만약 눌린 버튼이 화살표키라면 블록의 방향을 화살표 키에 맞게 바꾼다.
                if event.key in DIRECTION_ON_KEY :
                    # dictionary
                    board.snake.turn(DIRECTION_ON_KEY[event.key])
            
        # datetime.now() - last_moved_time을 이용하여 마지막으로 버튼을 누른지 0.3초가 지났다면
        # timedelta() 두 날짜(일,주 등등)나 시간(초, 분 등등)의 차이를 알려준다.
        if timedelta(seconds = board.snake.speed) <= datetime.now() - last_moved_time :
            play = board.process_turn()
            last_moved_time = datetime.now() # 마지막으로 움직인 시간 알려줌
                
        draw_background(screen) # 배경그리기
        board.draw(screen) # 화면판에 게임판그리기
        board.write_score(screen)
                
        # 화면 새로고침
        pygame.display.update()
            
# 처음시작?
first = True
# 재시작?
replay = True
# 게임실행
play = True

while replay :
    if first == True :
        screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        draw_main(screen)
        pygame.display.update()
        events = pygame.event.get()
        for event in events :
            # 마우스 up 이벤트
            if event.type == pygame.MOUSEBUTTONUP :
                # start 버튼 범위
                if pygame.mouse.get_pos()[0] in range(START[0][0], START[-1][0]) and pygame.mouse.get_pos()[1] in range(START[0][1], START[-1][1]) :
                    first = False
                    play_game(play, last_moved_time)
                    play = False
                # exit 버튼 범위
                if pygame.mouse.get_pos()[0] in range(EXIT[0][0], EXIT[-1][0]) and pygame.mouse.get_pos()[1] in range(EXIT[0][1], EXIT[-1][1]) :
                    play = False
                    replay = False
                    first = False
    else :
        play_game(play, last_moved_time)
        play = False
    # 종료버튼을 누르면 게임종료
    if not play and not replay and not first :
        break
    if not play and replay:
        # 게임이 종료되면 play == False가 되며 while을 빠져나온다.
        play_again = Play_Again(replay)
        replay = play_again.replay
        if replay :
            # 만약 재시작을 한다고 했다면 play = True가 되며 다시 게임이 시작된다.
            play = True
            continue
        # 하지만 재시작을 하지 않는다 했다면 반복문은 종료된다.
        break
   
# 게임도 종료된다. exit()
pygame.quit()



3.7.5 댓글[ | ]

  • 김왼손: 스네이크 게임은 아주 유명하죠. 좋은 시작입니다. :)

3.8 어쭈구저쭈구[ | ]

3.8.1 제목[ | ]

제목을 정해주세요.

3.8.2 설명[ | ]

컴퓨터와 턴제로 싸우는 게임 만들기

3.8.3 실행화면[ | ]

실행화면을 넣어주세요.

3.8.4 목표[ | ]

자바나 코틀린 배우면 모바일로 만들고 싶습니다

3.8.5 코드[ | ]

3.8.5.1 pyght[ | ]
from random import choice
from time import sleep as wait
from os import system 
import Setting
import wizard
import worrior
import condition

jobs = ['마법사', '전사', '암살자', '언데드', '무작위']
levels = ['하', '중', '상', '최상']

player_con = []
enemy_con = []

# 플레이어 상태 변수

player_fireturn = 0
player_poisonturn = 0
player_bloodturn = 0
player_thirstyturn = 0
player_recover_up = 0
player_recover_down = 0
player_faintturn = 0
player_harmoniousturn = 0
player_reproduceturn = 0
player_barrier = 0
player_barrierturn = 0
player_undying = 0

# 적 상태 변수

enemy_fireturn = 0
enemy_poisonturn = 0
enemy_bloodturn = 0
enemy_thirstyturn = 0
enemy_recover_up = 0
enemy_recover_down = 0
enemy_faintturn = 0
enemy_harmoniousturn = 0
enemy_reproduceturn = 0
enemy_barrier = 0
enemy_barrierturn = 0
enemy_undying = 0

# 직업 정하기
print("당신의 직업을 정해주세요. -> 마법사, 전사, 암살자, 언데드, 무작위")

while True:
    player_job = input()
    if player_job in jobs:
        if player_job == '무작위':
            jobs.remove('무작위')
            player_job = choice(jobs)
            jobs.append('무작위')
        print('당신의 직업은 {}입니다.'.format(player_job))
        break
    else:
        print('다시 선택해 주십시오.')

#마법사 전용 변수
if player_job == '마법사':
    player_wizard_get_mana = 4
    player_up_wizard_igmagicdefence = 1

print('상대의 직업을 정해주세요. -> 마법사, 전사, 암살자, 언데드, 무작위')

while True:
    enemy_job = input()
    if enemy_job in jobs:
        if enemy_job == '무작위':
            jobs.remove('무작위')
            enemy_job = choice(jobs)
            jobs.append('무작위')
        print('적의 직업은 {}입니다.'.format(enemy_job))
        break
    else:
        print('다시 선택해 주십시오.')

print('----------------------------------------------------\n')
print("난이도를 정해주세요. -> 하, 중, 상, 최상")

if enemy_job == '마법사':
    enemy_wizard_get_mana = 4
    enemy_up_wizard_igmagicdefence = 1

# 난이도 정하기

while True:
    level = input()
    if level in levels:
        print('난이도는 {}입니다.'.format(level))
        break
    else:
        print('다시 선택해 주십시오.')


player, enemy, player_acts, enemy_acts= Setting.set(player_job, enemy_job, level)

player_att, player_rest, player_check, player_skill1, player_skill2, player_skill3, player_skill4, player_skill5 = Setting.skillset(player_job)
enemy_att, enemy_rest, enemy_check, enemy_skill1, enemy_skill2, enemy_skill3, enemy_skill4, enemy_skill5 = Setting.skillset(enemy_job)

player_first_hp = player['체력']
enemy_first_hp = enemy['체력']

#wait(5)
system('cls')

while True:

    wait(0.5)

    # 체력, 마나 재생
    player_get_hp, player_get_mana = condition.recover(player['체력재생력'], player['마나재생력'], player_con, player_job)
    player['체력'] += player_get_hp
    player['마나'] += player_get_mana

    #마법사 패시브
    if player_job == '마법사':
        player['주문력'] += 2
        if player['주문력'] >= 300 and player_up_wizard_igmagicdefence >= 1:
            print('마법관통력 증가')
            player['마법관통력'] += 25
            player_up_wizard_igmagicdefence -= 1
        if player_wizard_get_mana == 0:
            print('안정 발동')
            player['마나'] += 35
            player['주문력'] += 5
            player_wizard_get_mana = 3
        else:
            player_wizard_get_mana -= 1
        
            
    # 잃은 피해 계산
    player_lost_hp = player_first_hp - player['체력']
    enemy_lost_hp = enemy_first_hp - enemy['체력']
    if player_lost_hp < 0:
        player_lost_hp = 0
    if enemy_lost_hp < 0:
        enemy_lost_hp = 0

    # 플레이어_화염
    if player_fireturn >= 1:
        if '화염' in player_con:
            pass
        else:
            player_con.append('화염')
    if player_fireturn == 0:
        if '화염' in player_con:
            player_con.remove('화염')
        else:
            pass

    # 플레이어_중독
    if player_poisonturn >= 1:
        if '중독' in player_con:
            pass
        else:
            player_con.append('중독')
    if player_poisonturn == 0:
        if '중독' in player_con:
            player_con.remove('중독')
        else:
            pass

    # 플레이어_출혈
    if player_bloodturn >= 1:
        if '출혈' in player_con:
            pass
        else:
            player_con.append('출혈')
    if player_bloodturn == 0:
        if '출혈' in player_con:
            player_con.remove('출혈')
        else:
            pass

    # 플레이어_갈증
    if player_thirstyturn >= 1:
        if '갈증' in player_con:
            pass
        else:
            player_con.append('갈증')
    if player_thirstyturn == 0:
        if '갈증' in player_con:
            player_con.remove('갈증')
        else:
            pass

    # 플레이어_재생
    if player_reproduceturn >= 1:
        if '재생' in player_con:
            pass
        else:
            player_con.append('재생')
    if player_reproduceturn == 0:
        if '재생' in player_con:
            player_con.remove('재생')
        else:
            pass

    # 플레이어_조화
    if player_harmoniousturn >= 1:
        if '조화' in player_con:
            pass
        else:
            player_con.append('조화')
    if player_harmoniousturn == 0:
        if '조화' in player_con:
            player_con.remove('조화')
        else:
            pass

    # 플레이어_불사
    if player_undying >= 1:
        if '불사' not in player_con:
            player_con.append('불사')
    if player_undying == 0:
        if '불사' in player_con:
            player_con.remove('불사')


    # 플레이어_방어막
    if player_barrierturn >= 1:
        if '방어막' in player_con:
            pass
        else:
            player_con.append('방어막')
    if player_barrierturn == 0:
        player_barrier = 0
        if '방어막' in player_con:
            player_con.remove('방어막')
        else:
            pass

    #플레이어_치료증폭:
    if player_recover_up >= 1:
        if '치료증폭' in player_con:
            pass
        else:
            player_con.append('치료증폭')
        player_recover_up -= 1

    #플레이어_치료감소
    if player_recover_down >= 1:
        if '치료감소' in player_con:
            pass
        else:
            player_con.append('치료감소')
        player_recover_down -= 1

    #플레이어_기절
    if player_faintturn >= 1:
        if '기절' in player_con:
            pass
        else:
            player_con.append('기절')
        player_faintturn -= 1

    if '기절' not in player_con:
        while True:
            # 플레이어 선택
            print('다음 것중에 하나를 선택해주세요')
            print(player_acts)
            player_choice = input()
            if player_choice not in player_acts:
                print('다시 선택해 주세요')
            else:
                break

        if player_choice == '공격':
            if player_job == '전사':
                enemy['체력'], enemy_faintturn = player_att(enemy['체력'], player['공격력'], enemy['방어력'], player['물리관통력'], enemy_faintturn)
            elif player_job == '암살자':
                enemy['체력'] = player_att(enemy['체력'], player['공격력'], player['주문력'], enemy['방어력'], player['물리관통력'])
            else:
                enemy['체력'] = player_att(enemy['체력'], player['공격력'], enemy['방어력'], player['물리관통력'])
        if player_choice == '휴식':
            player['체력'], player['마나'] = player_rest(player['체력'], player['마나'], player['체력재생력'], player['마나재생력'], player_con)
        if player_choice == '상태확인':
            player_check(player, player_con)
        if player_job == '마법사':
            if player_choice == '메테오':
                enemy['체력'], player['마나'], enemy_fireturn = player_skill1(enemy['체력'], player['주문력'], enemy['마법저항력'], player['마법관통력'], player['마나'], enemy_fireturn)
                player['주문력'] += 5
            if player_choice == '치유':
                player['체력'], player['방어력'], player['마법저항력'], player['마나'] = player_skill2(player['체력'], player['주문력'], player['방어력'], player['마법저항력'], player['마나'])
                player['주문력'] += 5
            if player_choice == '저주':
                enemy_poisonturn, enemy_thirstyturn, enemy_recover_down, enemy['방어력'], enemy['마법저항력'], player['마나'] = player_skill4(enemy_poisonturn, enemy_thirstyturn, enemy_recover_down, enemy['방어력'], enemy['마법저항력'], player['마나'])
                player['주문력'] += 5
            if player_choice == '파괴':
                enemy['체력'], player['주문력'], player['마나'] = player_skill5(enemy['체력'], enemy_lost_hp, player['주문력'], enemy['마법저항력'], player['마법관통력'], player['마나'])
                player['주문력'] += 5
        if player_job == '전사':
            if player_choice == '의지':
                player['공격력'], player['방어력'], player['마나'] = player_skill1(player['공격력'], player['방어력'], player['마나'])
            if player_choice == '강타':
                enemy['체력'], player['마나'] = player_skill2(enemy['체력'], player['공격력'], enemy['방어력'], player['물리관통력'], enemy_con, player['마나'])
            if player_choice == '포효':
               enemy_faintturn, player['마나'] = player_skill4(enemy_faintturn, enemy_con, player['방어력'], player['마나'])
            if player_choice == '결집':
                player['체력'], player['방어력'], player['마법저항력'], player_recover_up, player['마나'] = player_skill5(player['체력'], player_first_hp, enemy_first_hp, player['방어력'], player['마법저항력'], player_con, player_recover_up, player['마나'])
        if player_job == '암살자':
            if player_choice == '기습':
                enemy['체력'], player['마나'] = player_skill1(enemy['체력'], player['공격력'], player['주문력'], enemy['방어력'], player['물리관통력'], player['마나'])
            if player_choice == '칼춤':
                enemy_bloodturn, player_reproduceturn, player['마나'] = player_skill3(enemy_bloodturn, player_reproduceturn, player['주문력'], player['마나'])
            if player_choice == '불검':
                enemy['체력'], enemy_bloodturn, enemy_fireturn, enemy_recover_down, player['마나'] = player_skill4(enemy_bloodturn, enemy_fireturn, enemy_recover_down, enemy['체력'], player['공격력'], enemy['방어력'], enemy_first_hp, player['물리관통력'], player['마나'])
            if player_choice == '혼돈':
                enemy_faintturn, player['공격력'], player['주문력'], player['마나'] = player_skill5(enemy_faintturn, player['공격력'], player['주문력'], player['마나'])
    else:
        print('플레이어가 기절중입니다!')

    player_lost_hp = player_first_hp - player['체력']
    enemy_lost_hp = enemy_first_hp - enemy['체력']
    if player_lost_hp < 0:
        player_lost_hp = 0
    if enemy_lost_hp < 0:
        enemy_lost_hp = 0



    # 플레이어_화염
    if player_fireturn >= 1:
        player['체력'], player_fireturn = condition.fire(player['체력'], player_first_hp, player_fireturn)

    # 플레이어_중독
    if player_poisonturn >= 1:
        player['체력'], player_poisonturn = condition.poison(player['체력'], player_lost_hp, player_poisonturn)

    # 플레이어_출혈
    if player_bloodturn >= 1:
        player['체력'], player_bloodturn = condition.blood(player['체력'], player_bloodturn)

    # 플레이어_갈증
    if player_thirstyturn >= 1:
        player['마나'], player_thirstyturn = condition.thirsty(player['마나'], player_thirstyturn)

    # 플레이어_재생
    if player_reproduceturn >= 1:
        player['체력'], player_reproduceturn = condition.reproduce(player['체력'], player_first_hp, player_lost_hp, player_reproduceturn, player_con, player_job)

    # 플레이어_조화
    if player_harmoniousturn >= 1:
        player['마나'], player_harmoniousturn = condition.harmonious(player['마나'], player_harmoniousturn, player_con, player_job)

    # 플레이어_불사
    if player_undying >= 1:
        player_undying -= 1
        if player['체력'] <= 0:
            player['체력'] = int(player_first_hp / 10) + (player['주문력'] * 5)
            print('불사 발동')

    # 적_불사
    if enemy_undying >= 1:
        if enemy['체력'] <= 0:
            enemy['체력'] = int(enemy_first_hp / 10) + (enemy['주문력'] * 5)
            print('적 불사 발동')


    # 플레이어_치료증폭
    if player_recover_up == 0:
        if '치료증폭' in player_con:
            player_con.remove('치료증폭')

    # 플레이어_치료감소
    if player_recover_down == 0:
        if '치료감소' in player_con:
            player_con.remove('치료감소')

    # 플레이어_기절
    if player_faintturn == 0:
        if '기절' in player_con:
            player_con.remove('기절')

    if player['체력'] <= 0 or enemy['체력'] <= 0:
        print('게임이 끝났습니다!')
        if player['체력'] <= 0:
            print('----------------------------------------------------\n')
            player_check(player, player_con)
            print('----------------------------------------------------\n')
            print('적이 이겼습니다!')
            break
        else:
            print('----------------------------------------------------\n')
            print('적의 스탯 ')
            print('체력 : {},  마나 : {}'.format(enemy['체력'], enemy['마나']))
            print('공격력 : {},  주문력 : {}'.format(enemy['공격력'], enemy['주문력']))
            print('방어력 : {},  마법저항력 : {}'.format(enemy['방어력'], enemy['마법저항력']))
            print('물리관통력 : {},  마법관통력 : {}'.format(enemy['물리관통력'], enemy['마법관통력']))
            print('체력재생력 : {},  마나재생력 : {}'.format(enemy['체력재생력'], enemy['마나재생력']))
            print('적의 상태 : ', enemy_con)
            print('----------------------------------------------------\n')
            print('당신이 이겼습니다!')
            break

    print('----------------------------------------------------\n')

    # 체력, 마나 재생
    enemy_get_hp, enemy_get_mana = condition.recover(enemy['체력재생력'], enemy['마나재생력'], enemy_con, enemy_job)
    enemy['체력'] += enemy_get_hp
    enemy['마나'] += enemy_get_mana

    #마법사 패시브
    if enemy_job == '마법사':
        enemy['주문력'] += 2
        if enemy['주문력'] >= 200 and enemy_up_wizard_igmagicdefence == 1:
            enemy['마법관통력'] += 25
            enemy_up_wizard_igmagicdefence -= 1
        if enemy_wizard_get_mana == 0:
            print('안정 발동')
            enemy['마나'] += 35
            enemy['주문력'] += 5
            enemy_wizard_get_mana = 3
        else:
            enemy_wizard_get_mana -= 1

    # 적_화염
    if enemy_fireturn >= 1:
        if '화염' in enemy_con:
            pass
        else:
            enemy_con.append('화염')
    if enemy_fireturn == 0:
        if '화염' in enemy_con:
            enemy_con.remove('화염')
        else:
            pass

    # 적_중독
    if enemy_poisonturn >= 1:
        if '중독' in enemy_con:
            pass
        else:
            enemy_con.append('중독')
    if enemy_poisonturn == 0:
        if '중독' in enemy_con:
            enemy_con.remove('중독')
        else:
            pass

    # 적_출혈
    if enemy_bloodturn >= 1:
        if '출혈' in enemy_con:
            pass
        else:
            enemy_con.append('출혈')
    if enemy_bloodturn == 0:
        if '출혈' in enemy_con:
            enemy_con.remove('출혈')
        else:
            pass

    # 적_갈증
    if enemy_thirstyturn >= 1:
        if '갈증' in enemy_con:
            pass
        else:
            enemy_con.append('갈증')
    if enemy_thirstyturn == 0:
        if '갈증' in enemy_con:
            enemy_con.remove('갈증')
        else:
            pass

    # 적_재생
    if enemy_reproduceturn >= 1:
        if '재생' in enemy_con:
            pass
        else:
            enemy_con.append('재생')
    if enemy_reproduceturn == 0:
        if '재생' in enemy_con:
            enemy_con.remove('재생')
        else:
            pass

    # 적_조화
    if enemy_harmoniousturn >= 1:
        if '조화' in enemy_con:
            pass
        else:
            enemy_con.append('조화')
    if enemy_harmoniousturn == 0:
        if '조화' in enemy_con:
            enemy_con.remove('조화')
        else:
            pass

    # 적_불사
    if enemy_undying >= 1:
        if '불사' not in enemy_con:
            enemy_con.append('불사')
    if enemy_undying == 0:
        if '불사' in enemy_con:
            enemy_con.remove('불사')

    # 적_방어막
    if enemy_barrierturn >= 1:
        if '방어막' in player_con:
            pass
        else:
            enemy_con.append('방어막')
    if enemy_barrierturn == 0:
        enemy_barrier = 0
        if '방어막' in player_con:
            enemy_con.remove('방어막')
        else:
            pass

    #적_치료증폭:
    if enemy_recover_up >= 1:
        if '치료증폭' in enemy_con:
            pass
        else:
            enemy_con.append('치료증폭')
        enemy_recover_up -= 1


    #적_치료감소
    if enemy_recover_down >= 1:
        if '치료감소' in enemy_con:
            pass
        else:
            enemy_con.append('치료감소')
        enemy_recover_down -= 1

    #적_기절
    if enemy_faintturn >= 1:
        if '기절' in enemy_con:
            pass
        else:
            enemy_con.append('기절')
        enemy_faintturn -= 1


    # 적 상태
    print('적의 스탯 ')
    print('체력 : {},  마나 : {}'.format(enemy['체력'], enemy['마나']))
    print('공격력 : {},  주문력 : {}'.format(enemy['공격력'], enemy['주문력']))
    print('방어력 : {},  마법저항력 : {}'.format(enemy['방어력'], enemy['마법저항력']))
    print('물리관통력 : {},  마법관통력 : {}'.format(enemy['물리관통력'], enemy['마법관통력']))
    print('체력재생력 : {},  마나재생력 : {}'.format(enemy['체력재생력'], enemy['마나재생력']))
    print('적의 상태 : ', enemy_con)

    if '기절' not in enemy_con:
        enemy_choice = choice(enemy_acts)
        print(enemy_choice)
        if enemy_choice == '공격':
            if enemy_job == '전사':
                player['체력'], player_faintturn = enemy_att(player['체력'], enemy['공격력'], player['방어력'], enemy['물리관통력'], player_faintturn)
            elif enemy_job == '암살자':
                player['체력'] = enemy_att(player['체력'], enemy['공격력'], enemy['주문력'], player['방어력'], enemy['물리관통력'])
            else:
                player['체력'] = enemy_att(player['체력'], enemy['공격력'], player['방어력'], enemy['물리관통력'])
        if enemy_choice == '휴식':
            enemy['체력'], enemy['마나'] = enemy_rest(enemy['체력'], enemy['마나'], enemy['체력재생력'], enemy['마나재생력'], enemy_con)
        if enemy_job == '마법사':
            if enemy_choice == '메테오':
                player['체력'], enemy['마나'], player_fireturn = enemy_skill1(player['체력'], enemy['주문력'], player['마법저항력'], enemy['마법관통력'], enemy['마나'], player_fireturn)
                enemy['주문력'] += 5
            if enemy_choice == '치유':
                enemy['체력'], enemy['방어력'], enemy['마법저항력'], enemy['마나'] = enemy_skill2(enemy['체력'], enemy['주문력'], enemy['방어력'], enemy['마법저항력'], enemy['마나'])
                enemy['주문력'] += 5
            if enemy_choice == '저주':
                player_poisonturn, player_thirstyturn, player_recover_down, player['방어력'], player['마법저항력'], enemy['마나'] = enemy_skill4(player_poisonturn, player_thirstyturn, player_recover_down, player['방어력'], player['마법저항력'], enemy['마나'])
                enemy['주문력'] += 5
            if enemy_choice == '파괴':
                player['체력'], enemy['주문력'], enemy['마나'] = enemy_skill5(player['체력'], player_lost_hp, enemy['주문력'], player['마법저항력'], enemy['마법관통력'], enemy['마나'])
                enemy['주문력'] += 5
        if enemy_job == '전사':
            if enemy_choice == '의지':
                enemy['공격력'], enemy['방어력'], enemy['마나'] = enemy_skill1(enemy['공격력'], enemy['방어력'], enemy['마나'])
            if enemy_choice == '강타':
                player['체력'], enemy['마나'] = enemy_skill2(player['체력'], enemy['공격력'], player['방어력'], enemy['물리관통력'], player_con, enemy['마나'])
            if enemy_choice == '포효':
               player_faintturn, enemy['마나'] = enemy_skill4(player_faintturn, player_con, enemy['방어력'], enemy['마나'])
            if enemy_choice == '결집':
                enemy['체력'], enemy['방어력'], enemy['마법저항력'], enemy_recover_up, enemy['마나'] = enemy_skill5(enemy['체력'], enemy_first_hp, player_first_hp, enemy['방어력'], enemy['마법저항력'], enemy_con, enemy_recover_up, enemy['마나'])
        if enemy_job == '암살자':
            if enemy_choice == '기습':
                player['체력'], enemy['마나'] = enemy_skill1(player['체력'], enemy['공격력'], enemy['주문력'], player['방어력'], enemy['물리관통력'], enemy['마나'])
            if enemy_choice == '칼춤':
                player_bloodturn, enemy_reproduceturn, enemy['마나'] = enemy_skill3(player_bloodturn, enemy_reproduceturn, enemy['주문력'], enemy['마나'])
            if enemy_choice == '불검':
                player['체력'], player_bloodturn, player_fireturn, player_recover_down, enemy['마나'] = enemy_skill4(player_bloodturn, player_fireturn, player_recover_down, player['체력'], enemy['공격력'], player['방어력'], player_first_hp, enemy['물리관통력'], enemy['마나'])
            if enemy_choice == '혼돈':
                player_faintturn, enemy['공격력'], enemy['주문력'], enemy['마나'] = enemy_skill5(player_faintturn, enemy['공격력'], enemy['주문력'], enemy['마나'])

    # 적_화염
    if enemy_fireturn >= 1:
        enemy['체력'], enemy_fireturn = condition.fire(enemy['체력'], enemy_first_hp, enemy_fireturn)

    # 적_중독
    if enemy_poisonturn >= 1:
        enemy['체력'], enemy_poisonturn = condition.poison(enemy['체력'], enemy_lost_hp, enemy_poisonturn)

    # 적_출혈
    if enemy_bloodturn >= 1:
        enemy['체력'], enemy_bloodturn = condition.blood(enemy['체력'], enemy_bloodturn)

    # 적_갈증
    if enemy_thirstyturn >= 1:
        enemy['마나'], enemy_thirstyturn = condition.thirsty(enemy['마나'], enemy_thirstyturn)

    # 적_재생
    if enemy_reproduceturn >= 1:
        enemy['체력'], enemy_reproduceturn = condition.reproduce(enemy['체력'], enemy_first_hp, enemy_lost_hp, enemy_reproduceturn, enemy_con, enemy_job)

    # 적_조화
    if enemy_harmoniousturn >= 1:
        enemy['마나'], enemy_harmoniousturn = condition.harmonious(enemy['마나'], enemy_harmoniousturn, enemy_con, enemy_job)

    # 적_불사
    if enemy_undying >= 1:
        enemy_undying -= 1
        if enemy['체력'] <= 0:
            enemy['체력'] = int(enemy_first_hp / 10) + (enemy['주문력'] * 5)
            print('적 불사 발동')

    # 플레이어_불사
    if player_undying >= 1:
        if player['체력'] <= 0:
            player['체력'] = int(player_first_hp / 10) + (player['주문력'] * 5)
            print('불사 발동')


    # 적_치료증폭
    if enemy_recover_up == 0:
        if '치료증폭' in enemy_con:
            enemy_con.remove('치료증폭')

    # 적_치료감소
    if enemy_recover_down == 0:
        if '치료감소' in enemy_con:
            enemy_con.remove('치료감소')

    # 적_기절
    if enemy_faintturn == 0:
        if '기절' in enemy_con:
           enemy_con.remove('기절')

    #게임종료
    if player['체력'] <= 0 or enemy['체력'] <= 0:
        print('게임이 끝났습니다!')
        if player['체력'] <= 0:
            print('----------------------------------------------------\n')
            player_check(player, player_con)
            print('----------------------------------------------------\n')
            print('적이 이겼습니다!')
            break
        else:
            print('----------------------------------------------------\n')
            print('적의 스탯 ')
            print('체력 : {},  마나 : {}'.format(enemy['체력'], enemy['마나']))
            print('공격력 : {},  주문력 : {}'.format(enemy['공격력'], enemy['주문력']))
            print('방어력 : {},  마법저항력 : {}'.format(enemy['방어력'], enemy['마법저항력']))
            print('물리관통력 : {},  마법관통력 : {}'.format(enemy['물리관통력'], enemy['마법관통력']))
            print('체력재생력 : {},  마나재생력 : {}'.format(enemy['체력재생력'], enemy['마나재생력']))
            print('적의 상태 : ', enemy_con)
            print('----------------------------------------------------\n')
            print('당신이 이겼습니다!')
            break
    print('----------------------------------------------------\n')
3.8.5.2 condition[ | ]
# 화염 : 자신의 턴 끝날때마다 자신의 기본체력의 3%만큼 고정피해를 입습니다.

def fire(hp, first_hp, nowturn):
    player_new_hp = hp - int(first_hp /  100 * 3)
    turn = nowturn - 1
    return player_new_hp, turn

# 중독 : 자신의 턴 끝날때마다 자신의 잃은체력의 5%만큼 고정피해를 입습니다.

def poison(hp, lost_hp, nowturn):
    player_new_hp = hp - int(lost_hp /  20)
    turn = nowturn - 1
    return player_new_hp, turn


# 출혈 : 자신의 턴 끝날때마다 자신의 현재체력의 5%만큼 고정피해를 입습니다.

def blood(hp, nowturn):
    player_new_hp = hp - int(hp /  20)
    turn = nowturn - 1
    return player_new_hp, turn

# 갈증 : 자신의 턴 끝날때마다 (현재마나의 5% + 7)만큼 마나를 잃습니다.

def thirsty(mana, nowturn):
    player_new_mana = mana - int(mana /  20 + 7) 
    turn = nowturn - 1
    return player_new_mana, turn

# 조화 : 자신의 턴 끝날때마다 (현재마나의 5% + 7)만큼 마나를 얻습니다.

def harmonious(mana, nowturn, player_con, player_job):
    plus_hp, plus_mp = recover(0, int(mana / 20 + 7), player_con, player_job) 
    player_new_mana = mana + plus_mp
    turn = nowturn - 1
    return player_new_mana, turn

# 재생 : 자신의 턴 끝날때마다 (기본체력의 3% + 잃은체력의 5%)만큼 체력을 얻습니다. 

def reproduce(hp, first_hp, lost_hp, nowturn, player_con, player_job):
    plus_hp, plus_mp = recover(int(first_hp * 0.03 + lost_hp / 20), 0, player_con, player_job) 
    player_new_hp = hp + plus_hp
    turn = nowturn - 1
    return player_new_hp, turn


# 기절 : 기절에 걸린 적은 자신의 턴에 아무것도 할 수 없습니다.
    

# 침묵 : 걸린 상대는 스킬을 사용할 수 없습니다. (패시브 제외)


# 무장해제 : 걸린 상대는 기본공격을 사용할 수 없습니다.


# 치료감소 : 자신이 받는 모든 회복에 대해서 40%만큼 감소합니다.


# 치료증폭 : 자신이 받는 모든 회복에 대해서 40%만큼 증가합니다.


def recover(hp, mana, con, partjob):
    re_hp = hp
    re_mana = mana
    if '치료감소' in con:
        re_hp = int(re_hp * 0.6)
        re_mana = int(re_mana * 0.6)
    if '치료증폭' in con:
        re_hp = int(re_hp * 1.4)
        re_mana = int(re_mana * 1.4)
    if partjob == 1 or partjob == '전사':
        re_hp = int(re_hp * 1.3)
        re_mana = int(re_mana * 1.3)
    return re_hp, re_mana

# 방어막 : 자신이 입은 피해만큼 흡수해주는 방어막을 생성해줍니다. (방어막은 방어력과 마법저항력의 영향을 받지 않습니다. 또한, '흔적'을 제외한 다른 상태효과에 영향을 받지 않습니다.)

def barrier(player_barrier, get_barrier, nowturn):
    new_barrier = player_barrier + get_barrier
    turn = nowturn - 1
    return new_barrier, turn

# 흔적 : 받는 피해가 30% 증가합니다. 

def trace(player_traceturn, player_con):
    pass

# 불사 : 플레이어가 치명적인 공격을 받아 죽으면, 체력이 '기본체력의 10% + 주문력의 500%'인 상태로 부활합니다.
3.8.5.3 Setting[ | ]
import wizard
import worrior
import assassin


def set(player_job, enemy_job, level):
    # 플레이어에게 기본 스탯 대입
    if player_job == "마법사":
        print(''' -------------------------------------------------------------------------------
패시브 : \n마법사는 자신의 턴 시작할때마다 2만큼 주문력을 얻습니다. 스킬을 사용하면 5의 주문력을 얻습니다. 주문력이 300이상이 되면 마법관통력을 15만큼얻습니다.\n
메테오 : \n마법사가 적에게 (주문력의 230%)의 피해를 마법피해를 입힙니다. 상대는 2턴동안 '화염'효과를 받습니다.(마나: 65)\n
치유 : \n마법사가 (주문력의 100%) + 200 만큼 회복하고 방어력과 마법저항력을 6만큼 얻습니다. 만약 체력이 1500이하라면 (주문력의 120% + 300)만큼 더 회복됩니다. (마나 : 85)\n 
안정 : \n4턴마다 마나를 35 얻습니다. (패시브)\n
저주 : \n상대를 저주하여 4턴동안 '중독', '갈증', '치료감소' 효과를 줍니다. 또한 방어력과 마법저항력을 6만큼 감소시킵니다. (마나 : 125)\n
파괴 : \n상대에게 (주문력의 450% + 상대잃은체력의 35%)만큼 마법피해를 입힙니다. 이 스킬후 마법사는 ('파괴'로 입힌피해량의 5% + 30)만큼 주문력을 얻습니다. (마나 420)\n
-------------------------------------------------------------------------------''')
        a = wizard.wizard
        c = wizard.acts
    elif player_job == "전사":
        print(''' -------------------------------------------------------------------------------
패시브 : \n전사는 적을 기본공격하면 20%확률로 2턴동안 기절시킵니다. \n
의지 : \n자신의 공격력과 방어력을 각각 10, 4만큼 얻습니다. (마나 : 40) \n
강타 : \n상대를 강하게 내리쳐 (공격력의 200%)만큼 물리피해를 입힙니다. 만약 상대가 기절중이라면 (공격력의 150%)만큼 추가 물리피해를 입힙니다. (마나 : 80) \n
재생 : \n전사의 기본회복량은 130% 입니다. (패시브)\n
포효 : \n상대를 3턴동안 기절시킵니다. 만약 적이 '기절'효과를 받고있는 상태면 (방어력의 20%)만큼 마나를 돌려받습니다.(마나 : 120)\n
결집 : \n자신의 체력을 (자신 기본체력의 20% + 상대 기본체력의 20%)만큼 회복시킵니다. 또한 방어력과 마법저항력을 30만큼 얻습니다. hp가 2000이하면 '치료증폭'효과를 8턴동안 받습니다. (마나 : 370)\n
-------------------------------------------------------------------------------''')
        a = worrior.worrior
        c = worrior.acts
    elif player_job == '암살자':
        print(''' -------------------------------------------------------------------------------
패시브 : \n기본공격시 25%확률로 치명타가 터집니다. 치명타는 (공격력의 200%)만큼 물리피해를 줍니다. \n
기습 : \n적에게  (공격력의 190% + 주문력 300%)에 해당하는 물리피해를 입힙니다. 25%확률로 고정피해를 입힙니다. (마나 : 80) \n
암살 : \n만약 상대의 피가 (500 + 주문력의 300%)이하일때 기본공격을 하면 상대가 즉사합니다. (패시브) 
칼춤 : \n상대에게 '출혈' 효과를 (3 + 주문력의 1%)턴동안 부여합니다. 암살자는 (3 + 주문력의 1%)턴동안 '재생'효과를 받습니다. (마나 : 60) \n
불검 : \n상대에게 3턴동안 '출혈', 화염', '치료감소' 효과를 부여하고 (공격력의 280% + 상대기본체력의 5%)만큼 물리피해를 줍니다. (마나 : 145) \n 
혼돈 : \n5턴 동안 적을 기절시킵니다. 암살자는 공격력을 (150), 주문력을 (100)만큼 얻습니다. (마나 : 300) \n
-------------------------------------------------------------------------------''')
        a = assassin.assassin
        c = assassin.acts
    # 적에게 기본 스탯 대입
    if enemy_job == "마법사":
        b = wizard.enemy_wizard
        d = wizard.enemy_acts
    elif enemy_job == '전사':
        b = worrior.enemy_worrior
        d = worrior.enemy_acts
    elif enemy_job == '암살자':
        b = assassin.enemy_assassin
        d = assassin.enemy_acts
    return a, b ,c ,d


# 스킬 대입
def skillset(job):
    if job == '마법사':
        return wizard.att, wizard.rest, wizard.check, wizard.meteor, wizard.hill, None, wizard.curse, wizard.destroy
    if job == '전사':
        return worrior.att, worrior.rest, worrior.check, worrior.determination, worrior.glow, None, worrior.shout, worrior.gather
    if job == '암살자':
        return assassin.att, assassin.rest, assassin.check, assassin.ambush, None, assassin.knifedance, assassin.fireknife, assassin.chaos
3.8.5.4 worrior[ | ]
from condition import recover
from random import choice

# 전사 기본스탯
worrior = {'체력': 5430, '공격력': 382, '주문력': 0, '방어력': 140, '마법저항력': 120, '마나': 320, '물리관통력': 0, '마법관통력': 0, '체력재생력': 12, '마나재생력': 6}
enemy_worrior = {'체력': 5430, '공격력': 382, '주문력': 0, '방어력': 140, '마법저항력': 120, '마나': 320, '물리관통력': 0, '마법관통력': 0, '체력재생력': 12, '마나재생력': 6}

acts = ['공격', '휴식', '상태확인', '의지', '강타', '포효', '결집']
enemy_acts = ['공격', '휴식', '의지', '강타', '포효', '결집', '공격', '공격', '휴식', '휴식']
twenty = [0, 0, 0, 0, 1]

def att(enemy_hp, player_attack, enemy_defence, player_ig_defence, enemy_faintturn):
    new_enemy_faintturn = enemy_faintturn
    new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
    will_faint = choice(twenty)
    if will_faint == 1:
        new_enemy_faintturn += 2
        print('패시브 발동')
    return new_enemy_hp, new_enemy_faintturn

def rest(player_hp, player_mana, player_rehp, player_remana, player_con):
    new_player_plushp, new_player_plusmana = recover(player_rehp * 4, player_remana * 3, player_con, 1)
    new_player_hp = player_hp + new_player_plushp
    new_player_mana = player_mana + new_player_plusmana
    return new_player_hp, new_player_mana

def check(player, player_con):
    print('플레이어의 스탯 ')
    print('체력 : {},  마나 : {}'.format(player['체력'], player['마나']))
    print('공격력 : {},  주문력 : {}'.format(player['공격력'], player['주문력']))
    print('방어력 : {},  마법저항력 : {}'.format(player['방어력'], player['마법저항력']))
    print('물리관통력 : {},  마법관통력 : {}'.format(player['물리관통력'], player['마법관통력']))
    print('체력재생력 : {},  마나재생력 : {}'.format(player['체력재생력'], player['마나재생력']))
    print('나의 상태 : ', player_con)

# 패시브 : 전사는 적을 기본공격하면 20%확률로 2턴동안 기절시킵니다.


# 의지 : 자신의 공격력과 방어력을 각각 10, 4만큼 얻습니다. (마나 : 40)

def determination(player_attack, player_defence, player_mana):
    if player_mana >= 40:
        new_player_attack = player_attack + 10
        new_player_defence = player_defence + 4
        new_player_mana = player_mana - 40
        return new_player_attack, new_player_defence, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(40 - player_mana))
        return player_attack, player_defence, player_mana

# 강타 : 상대를 강하게 내리쳐 (공격력의 200%)만큼 물리피해를 입힙니다. 만약 상대가 기절중이라면 (공격력의 150%)만큼 추가 물리피해를 입힙니다.  (마나 : 80)

def glow(enemy_hp, player_attack, enemy_defence, player_ig_defence, enemy_con, player_mana):
    if player_mana >= 80:
        new_enemy_hp = int(enemy_hp - (player_attack * 2 * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
        if '기절' in enemy_con:
            print('추가 피해')
            new_enemy_hp -= int(player_attack * 1.5 * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100))))
        new_player_mana = player_mana - 80
        return new_enemy_hp, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(80 - player_mana))
        return enemy_hp, player_mana

# 끈질김 : 전사의 기본회복량은 130% 입니다. (패시브)


# 포효 : 상대를 3턴동안 기절시킵니다. 만약 적이 '기절'효과를 받고있는 상태면 (방어력의 20%)만큼 마나를 돌려받습니다. (마나 : 120)

def shout(enemy_faintturn, enemy_con, player_defence, player_mana):
    if player_mana >= 120:
        new_player_mana = player_mana - 120
        new_enemy_faintturn = enemy_faintturn + 3
        if '기절' in  enemy_con:
            new_player_mana += int(player_defence * 0.2)
            print('마나를 {}만큼 돌려받았습니다.'.format(int(player_defence * 0.2)))
        return new_enemy_faintturn, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(120 - player_mana))
        return enemy_faintturn, player_mana
        
# 결집 : 자신의 체력을 (자신 기본체력의 20% + 상대 기본체력의 20%)만큼 회복시킵니다. 또한 방어력과 마법저항력을 30만큼 얻습니다. hp가 2000이하면 '치료증폭'효과를 8턴동안 받습니다. (마나 : 370)
def gather(player_hp, player_first_hp, enemy_first_hp, player_defence, player_magicdefence, player_con, player_recover_up, player_mana):
    if player_mana >= 370:
        player_plus_hp, gabage = recover(int((player_first_hp + enemy_first_hp) * 0.2), 0, player_con, 1)
        new_player_hp = player_hp + player_plus_hp
        new_player_defence = player_defence + 30
        new_player_magicdefence = player_magicdefence + 30
        new_player_recover_up = player_recover_up
        if player_hp <= 2000:
            new_player_recover_up += 8
        new_player_mana = player_mana - 370
        return new_player_hp, new_player_defence, new_player_magicdefence, new_player_recover_up, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(370 - player_mana))
        return player_hp, player_defence, player_magicdefence, player_recover_up, player_mana
3.8.5.5 assassin[ | ]
from random import choice
from condition import recover

# 암살자 기본스탯
assassin = {'체력': 3660, '공격력': 492, '주문력': 0, '방어력': 85, '마법저항력': 45, '마나': 320, '물리관통력': 25, '마법관통력': 0, '체력재생력': 7, '마나재생력': 6}
enemy_assassin = {'체력': 3660, '공격력': 492, '주문력': 0, '방어력': 85, '마법저항력': 45, '마나': 320, '물리관통력': 25, '마법관통력': 0, '체력재생력': 7, '마나재생력': 6}
critical = [0, 0, 0, 1]

acts = ['공격', '휴식', '상태확인', '기습', '칼춤', '불검', '혼돈']
enemy_acts = ['공격', '휴식', '기습', '칼춤', '불검', '혼돈', '공격', '공격']

def att(enemy_hp, player_attack, player_magic, enemy_defence, player_ig_defence):
    if enemy_hp <= (500 + player_magic * 3):
        print('암살 발동')
        return -99999
    iscritical = choice(critical)
    if iscritical == 0:
        new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
    else:
        new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100))) * 2))
        print('치명타 발동')
        
    return new_enemy_hp

def rest(player_hp, player_mana, player_rehp, player_remana, player_con):
    new_player_plushp, new_player_plusmana = recover(player_rehp * 4, player_remana * 3, player_con, 0)
    new_player_hp = player_hp + new_player_plushp
    new_player_mana = player_mana + new_player_plusmana
    return new_player_hp, new_player_mana

def check(player, player_con):
    print('플레이어의 스탯 ')
    print('체력 : {},  마나 : {}'.format(player['체력'], player['마나']))
    print('공격력 : {},  주문력 : {}'.format(player['공격력'], player['주문력']))
    print('방어력 : {},  마법저항력 : {}'.format(player['방어력'], player['마법저항력']))
    print('물리관통력 : {},  마법관통력 : {}'.format(player['물리관통력'], player['마법관통력']))
    print('체력재생력 : {},  마나재생력 : {}'.format(player['체력재생력'], player['마나재생력']))
    print('나의 상태 : ', player_con)

# 패시브 : 기본공격시 25%확률로 치명타가 터집니다. 치명타는 (공격력의 200%)만큼 물리피해를 줍니다. 치명타가 터지면 '방어막'을 (공격력의 100%)만큼 3턴동안 얻습니다. 


# 기습 : 적에게  (공격력의 190% + 주문력 200%)에 해당하는 물리피해를 입힙니다. 25%확률로 고정피해를 입힙니다. (마나 : 80)

def ambush(enemy_hp, player_attack, player_magic, enemy_defence, player_ig_defence, player_mana):
    if player_mana >= 80:
        iscritical = choice(critical)
        if iscritical == 0:
            print('고정피해')
            new_enemy_hp = int(enemy_hp - ((player_attack * 1.9 + player_magic * 3) * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
        if iscritical == 1:
            new_enemy_hp = enemy_hp - int(player_attack * 1.9 + player_magic * 3)
        new_player_mana = player_mana - 80
        return new_enemy_hp, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(80 - player_mana))
        return enemy_hp, player_mana

# 암살 : 만약 상대의 피가 (500 + 주문력의 300%)이하일때 기본공격을 하면 상대를 즉사시킵니다. (패시브) 


# 칼춤 : 상대에게 '출혈' 효과를 (3 + 주문력의 1%)턴동안 부여합니다. 암살자는 (3 + 주문력의 1%)턴동안 '재생'효과를 받습니다. (마나 : 60) 

def knifedance(enemy_bloodturn, player_reproduceturn, player_magic, player_mana):
    if player_mana >= 60:
        new_enemy_bloodturn = enemy_bloodturn + int(player_magic * 0.01 + 3)
        new_player_reproduceturn = player_reproduceturn + int(player_magic * 0.01 + 3)
        new_player_mana = player_mana - 60
        return new_enemy_bloodturn, new_player_reproduceturn, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(60 - player_mana))
        return enemy_bloodturn, player_reproduceturn, player_mana
        


# 불검 : 상대에게 3턴동안 '출혈', 화염', '치료감소' 효과를 부여하고 (공격력의 280% + 상대기본체력의 5%)만큼 물리피해를 줍니다. (마나 : 145) 

def fireknife(enemy_bloodturn, enemy_fireturn, enemy_recover_down, enemy_hp, player_attack, enemy_defence, enemy_first_hp, player_ig_defence, player_mana):
    if player_mana >= 145:
        new_enemy_hp = int(enemy_hp - ((player_attack * 2.8 + enemy_first_hp * 0.05) * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
        new_enemy_bloodturn = enemy_bloodturn + 3
        new_enemy_fireturn = enemy_fireturn + 3
        new_enemy_recover_down = enemy_recover_down + 3
        new_player_mana = player_mana - 145
        return new_enemy_hp, new_enemy_bloodturn, new_enemy_fireturn, new_enemy_recover_down, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(140 - player_mana))
        return enemy_hp, enemy_bloodturn, enemy_fireturn, enemy_recover_down, player_mana

# 혼돈 : 5턴 동안 적을 기절시킵니다. 암살자는 공격력을 (150), 주문력을 (100)만큼 얻습니다. (마나 : 300)

def chaos(enemy_faintturn, player_attack, player_magic, player_mana):
    if player_mana >= 300:
        new_enemy_faintturn = enemy_faintturn + 5
        new_player_attack = player_attack + 150
        new_player_magic = player_magic + 100
        new_player_mana = player_mana - 330
        return new_enemy_faintturn, new_player_attack, new_player_magic, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(300 - player_mana))
        return enemy_faintturn, player_attack, player_magic, player_mana
3.8.5.6 wizard[ | ]
from condition import recover


# 마법사 기본스탯
wizard = {'체력': 3860, '공격력': 295, '주문력': 130, '방어력': 80, '마법저항력': 160, '마나': 420, '물리관통력': 0, '마법관통력': 15, '체력재생력': 10, '마나재생력': 7}
enemy_wizard = {'체력': 3860, '공격력': 295, '주문력': 130, '방어력': 80, '마법저항력': 160, '마나': 420, '물리관통력': 0, '마법관통력': 15, '체력재생력': 10, '마나재생력': 7}

acts = ['공격', '휴식', '상태확인', '메테오', '치유', '저주', '파괴']
enemy_acts = ['공격', '휴식', '메테오', '치유', '저주', '파괴']

def att(enemy_hp, player_attack, enemy_defence, player_ig_defence):
    new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
    return new_enemy_hp

def rest(player_hp, player_mana, player_rehp, player_remana, player_con):
    new_player_plushp, new_player_plusmana = recover(player_rehp * 4, player_remana * 3, player_con, 0)
    new_player_hp = player_hp + new_player_plushp
    new_player_mana = player_mana + new_player_plusmana
    return new_player_hp, new_player_mana

def check(player, player_con):
    print('플레이어의 스탯 ')
    print('체력 : {},  마나 : {}'.format(player['체력'], player['마나']))
    print('공격력 : {},  주문력 : {}'.format(player['공격력'], player['주문력']))
    print('방어력 : {},  마법저항력 : {}'.format(player['방어력'], player['마법저항력']))
    print('물리관통력 : {},  마법관통력 : {}'.format(player['물리관통력'], player['마법관통력']))
    print('체력재생력 : {},  마나재생력 : {}'.format(player['체력재생력'], player['마나재생력']))
    print('나의 상태 : ', player_con)

# 패시브 : 마법사는 자신의 턴 시작할때마다 2만큼 주문력을 얻습니다. 스킬을 사용하면 5의 주문력을 얻습니다. 주문력이 300이상이 되면 마법관통력을 (25)만큼얻습니다.


# 메테오 : 마법사가 적에게 (주문력의 230%)의 피해를 마법피해를 입힙니다. 상대는 2턴동안 '화염'효과를 받습니다.(마나: 65) 

def meteor(enemy_hp, player_mag, enemy_magicdefence, player_ig_magicdefence, player_mana, enemy_fire):
    if player_mana >= 65:
        new_enemy_hp = int(enemy_hp - (player_mag * 2.3 * (1 - (enemy_magicdefence / (enemy_magicdefence  + 100) * (1 - player_ig_magicdefence /100)))))
        new_player_mana = player_mana - 65
        new_enemy_fire = enemy_fire + 2
        return new_enemy_hp, new_player_mana, new_enemy_fire
    else:
        print('마나가 {}만큼 부족합니다.'.format(65 - player_mana))
        return enemy_hp, player_mana, enemy_fire


# 치유 : 마법사가 (주문력의 100%) + 200 만큼 회복하고 방어력과 마법저항력을 6만큼 얻습니다. 만약 체력이 1500이하라면 (주문력의 120% + 300)만큼 더 회복됩니다. (마나 : 85)

def hill(player_hp, player_magic, player_defence, player_magicdefence, player_mana):
    if player_mana >= 85:
        new_player_hp = player_hp + player_magic + 200
        if player_hp <= 1500:
            new_player_hp += int(player_magic * 1.2 + 300)
        new_player_defence = player_defence + 6
        new_player_magicdefence = player_magicdefence + 6
        new_player_mana = player_mana - 85
        return new_player_hp, new_player_defence, new_player_magicdefence, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(85 - player_mana))
        return player_hp, player_defence, player_magicdefence, player_mana 

# 안정 : 4턴마다 마나를 35 얻습니다. (패시브)


# 저주 : 상대를 저주하여 4턴동안 '중독', '갈증', '치료감소' 효과를 줍니다. 또한 방어력과 마법저항력을 6만큼 감소시킵니다. (마나 : 125)

def curse(enemy_poison, enemy_thirsty, enemy_recover_down, enemy_defence, enemy_magicdefence, player_mana):
    if player_mana >= 125:
        new_enemy_posionturn = enemy_poison + 4
        new_enemy_thirstyturn = enemy_thirsty + 4
        new_enemy_recover_down = enemy_recover_down + 4
        new_enemy_defence = enemy_defence - 6
        new_enemy_magicdefence = enemy_magicdefence - 6
        new_player_mana = player_mana - 125
        return new_enemy_posionturn, new_enemy_thirstyturn, new_enemy_recover_down, new_enemy_defence, new_enemy_magicdefence, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(125 - player_mana))
        return enemy_poison, enemy_thirsty, enemy_recover_down, enemy_defence, enemy_magicdefence, player_mana


# 파괴 : 상대에게 (주문력의 450% + 상대잃은체력의 35%)만큼 마법피해를 입힙니다. 마법사는 ('파괴'로 입힌피해량의 5% + 30)만큼 주문력을 얻습니다. (마나 420) 

def destroy(enemy_hp, enemy_lost_hp, player_magic, enemy_magicdefence, player_ig_magicdefence, player_mana):
    if player_mana >= 420:
        first_hp = enemy_hp
        new_enemy_hp = int(enemy_hp - ((enemy_lost_hp * 0.4 + player_magic * 3.5) * (1 - (enemy_magicdefence / (enemy_magicdefence  + 100) * (1 - player_ig_magicdefence /100)))))
        damaged = enemy_hp - new_enemy_hp
        new_player_magic = player_magic + int(damaged / 20 + 20)
        print('마법사가 주문력을 {}만큼 얻었습니다!'.format(int(damaged / 20 + 20)))
        new_player_mana = player_mana - 420
        return new_enemy_hp, new_player_magic, new_player_mana
    else:
        print('마나가 {}만큼 부족합니다.'.format(420 - player_mana))
        return enemy_hp, player_magic, player_mana
3.8.5.7 undead[ | ]
from condition import recover


# 언데드 기본스탯
wizard = {'체력': 4460, '공격력': 312, '주문력': 170, '방어력': 80, '마법저항력': 80, '마나': 340, '물리관통력': 0, '마법관통력': 20, '체력재생력': 9, '마나재생력': 8}
enemy_wizard = {'체력': 4460, '공격력': 312, '주문력': 170, '방어력': 80, '마법저항력':80, '마나': 340, '물리관통력': 0, '마법관통력': 20, '체력재생력': 9, '마나재생력': 8}

acts = ['공격', '휴식', '상태확인', '메테오', '치유', '저주', '파괴']
enemy_acts = ['공격', '휴식', '메테오', '치유', '저주', '파괴']

def att(enemy_hp, player_attack, enemy_defence, player_ig_defence):
    new_enemy_hp = int(enemy_hp - (player_attack * (1 - (enemy_defence / (enemy_defence  + 100) * (1 - player_ig_defence /100)))))
    return new_enemy_hp

def rest(player_hp, player_mana, player_rehp, player_remana, player_con):
    new_player_plushp, new_player_plusmana = recover(player_rehp * 4, player_remana * 3, player_con, 0)
    new_player_hp = player_hp + new_player_plushp
    new_player_mana = player_mana + new_player_plusmana
    return new_player_hp, new_player_mana

def check(player, player_con):
    print('플레이어의 스탯 ')
    print('체력 : {},  마나 : {}'.format(player['체력'], player['마나']))
    print('공격력 : {},  주문력 : {}'.format(player['공격력'], player['주문력']))
    print('방어력 : {},  마법저항력 : {}'.format(player['방어력'], player['마법저항력']))
    print('물리관통력 : {},  마법관통력 : {}'.format(player['물리관통력'], player['마법관통력']))
    print('체력재생력 : {},  마나재생력 : {}'.format(player['체력재생력'], player['마나재생력']))
    print('나의 상태 : ', player_con)


# 패시브 : 언데드의 체력이 1000이하면 각성합니다. 각성시 자신의 스킬을 강화시키고, 주문력과 마나를 각각 100, 200만큼 얻습니다. 각성시 언데드의 체력이 1000이 넘어도 각성상태는 유지합니다.


# 지속적인 두려움 : 게임 시작시 (400 + 상대기본체력의 20%)만큼 고정피해를 입힙니다. 자신의 턴 시작할때마다 상대에게 (주문력의 30% + 20)만큼 마법피해를 입힙니다. 각성 시 (주문력의 10% + 20)만큼 추가고정피해를 입힙니다. (패시브)


# 흡수 : 상대에게 (주문력의 200%)만큼 마법피해를 입히고 3턴동안 '중독'시킵니다. 자신의 체력을 (주문력의 200%)만큼 회복시키고 3턴동안 '재생'효과를 얻습니다. 각성 시 (주문력의 200%)만큼 추가마법피해를 입힙니다. (마나 : 90)
def absorb(enemy_hp, player_hp, player_mag, enemy_magicdefence, player_ig_magicdefence, enemy_poisonturn, player_reproduceturn, player_mana, is_stronger):
    if player_mana >= 90:
        new_enemy_hp = int(enemy_hp - (player_mag * 2 * (1 - (enemy_magicdefence / (enemy_magicdefence  + 100) * (1 - player_ig_magicdefence /100)))))

# 균형 : 자신에게 걸린 '화염', '중독', '출혈', '갈증'효과를 없애고, '재생', '치료증폭'효과를 5턴동안 얻습니다. 각성 시 '조화'효과를 3턴동안 얻습니다. (마나 : 80)


# 불멸 : 자신에게 '불사' 효과를 3턴동안 부여합니다. 각성 시 '불사' 효과를 6턴동안 부여합니다. (마나 : 160)


# 죽음 : 적에게 (500 + 주문력의 300%)만큼 고정피해를 입힙니다. 각성 시 (상대현재체력의 40%)만큼 추가 고정피해를 입힙니다. (마나 : 350)

3.8.6 class[ | ]

class champion:
    def __init__(self, job, level, stat):
        self.job = job
        self.level = level

3.8.7 패치노트[ | ]

3.8.7.1 2020.05.16[ | ]

'언데드'직업 계획

'불사', '조화', '재생' 효과 추가

잃은 체력이 -가 되는 버그 해결

상대를 이제 정할수 있음

자신의 직업을 이제 무작위로 고를수있음

마법사 :

안정 마나회복 : 50 -> 35

저주 감소한 방어력, 마법저항력 : 5 -> 6

파괴 소모마나 : 400 -> 420

파괴 피해량 : (주문력의 350% + 상대잃은체력의 60%) -> (주문력의 350% + 상대잃은체력의 40%)

전사 :

기본 체력 : 5140 -> 5430

결집 체력회복 : (기본체력 30% + 상대기본체력의 30%) -> (기본체력 20% + 상대기본체력의 20%)

암살자:

기본 방어력 : 80 -> 85

치명타확률 : 40% -> 25%

기습 고정피해확률 : 40% -> 25%

기습 피해량 : (공격력의 240% + 주문력 300%) -> (공격력의 190% + 주문력 200%)

혼돈 기절: 4 -> 5

혼돈 소모마나 : 330 -> 300

3.8.7.2 2020.05.23[ | ]

게임 종료시 자신의 상태가 제대로 표시되지않는 버그 수정

'갈증' 효과가 오히려 증가하는 버그 수정

마법사 :

마법사 패시브 - 증가하는 마법관통력 : 15 -> 25

치유 회복량 : (주문력의 100% + 120) -> (주문력의 100% + 200)

치유 추가회복량 : (주문력의 120%) -> (주문력의 120% + 300)

저주 마나 소모량 : 120 -> 125

파괴 피해량 : (주문력의 400% + 상대잃은체력의 40%) -> (주문력의 450% + 상대잃은체력의 35%)

암살자 :

기본체력 : 3460 -> 3660

공격력 : 482 -> 492

칼춤 출혈 및 재생 턴 : (2 + 주문력의 1%) -> (3 + 주문력의 1%)

칼춤 마나 소모량 : 50 -> 60

기타 :

조화 마나 회복량 : (현재마나의 5% + 10) -> (현재마나의 5% + 7)

class 파일 추가

3.8.8 하고싶은말[ | ]

구현할것이 아직 많이 남았네요 ㄷ 직업들을 클래스와 상속을 이용해 다시 만들고싶지만 시간이 너무 오래걸릴거같네요

3.8.9 댓글[ | ]

  • 김왼손: 설정이 아주 탄탄하네요. 노력에 박수를 보냅니다. :)

3.9 야호[ | ]

3.9.1 제목[ | ]

제목을 정해주세요.

3.9.2 설명[ | ]

pygame을 이용한 간단한 슈팅게임

3.9.3 실행화면[ | ]

실행화면을 넣어주세요.

3.9.4 코드[ | ]

import pygame
import random
form time import sleep

BLACK = (0, 0, 0)
RED = (255, 0, 0)
pad_width = 480
pad_height = 640
fight_width = 36
fight_height = 38
enemy_width = 26
enemy_height = 20

def drawScore(count):
    global gamepad
    font = pygame.font.SysFont(None, 20)
    text = font.render('Enemy Kills: ' + str(count), True, (255, 255, 255))
    gamepad.blit(text, (0, 0))

def drawPassed(count):
    global gamepad
    font = pygame.font.SysFont(None, 20)
    text = font.render('Enemy Passed: ' + str(count), True, RED)
    gamepad.blit(text, (360, 0))

def dispMessage(text):
    global gamepad
    textfont = pygame.font.Font('freesansblod.ttf', 80)
    text = textfont.render(text, True, RED)
    textpos = text.get_rect()
    textpos.center = (pad_width/2, pad_height/2)
    gamepad.blit(text, textpos)
    pygame.display.update()
    sleep(2)
    runGame()

def crash():
    global gamepad
    dispMessage('Crashed^-^;')

def gameover():
    global gamepad
    dispMessage('Game Over')

def drawObject(obj, x, y):
    global gamepad
    gamepad.blit(obj, (x,y))

def runGame():
    global gamepad, clock, fighter, enemy, bullet

아직 미완..

3.9.5 댓글[ | ]

  • 김왼손: 오.. 완성되면 저도 플레이 해보고 싶네요. :)

3.10 JT[ | ]

3.10.1 제목[ | ]

제목을 정해주세요.

3.10.2 설명[ | ]

데이터 프로세싱과 Visualization 툴을 만들고 싶습니다.

3.10.2.1 목표1[ | ]

데이터를 읽어와서 분석을 위한 데이터 프로세싱을 실행한다.

3.10.2.2 목표2[ | ]

준비된 데이터를 다양한 그래프 형태로 도식화한다.

3.10.2.3 목표3[ | ]

API를 통해 직접적으로 데이터를 불러들여온다.

3.10.3 실행화면[ | ]

실행화면을 넣어주세요.

3.10.4 코드[ | ]

3.10.4.1 코드: 목표1[ | ]
print('Hello Python!')
3.10.4.2 코드: 목표2[ | ]
print('Hello Python!')
3.10.4.3 코드: 목표3[ | ]
print('Hello Python!')

3.10.5 댓글[ | ]

  • 김왼손: 어떤 프로그램이 나올지 기대됩니다. :)