파이썬 유치원 (유아반)

1 파이썬 유치원

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

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

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

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

2 제타위키 사용법


3 유아반 친구들

3.1 김민재

3.1.1 설명

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

3.1.2 코드

from tkinter import *

window = Tk()
window.title("계산기")
equa = ""
equation = StringVar()


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


def equalpress():
    calc = expression_field.get()
    total = str(eval(calc))

    expression_field.delete(0, END)

    expression_field.insert(0, total)

    calc = ""


calc = StringVar()

expression_field = Entry(window, width="50", bg="white")

expression_field.grid(row=0, column=0, columnspan=4)


expression_field.grid(row=0, column=0, columnspan=4)

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

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

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

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

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

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

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

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

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

window.mainloop()
#일단은 숫자 셋팅 완료!!("여기까지 오느라 힘들었따;;;;")

3.1.3 방명록

  • 김왼손: 멋지네요. :)


3.2 김지수

3.2.1 설명

3.2.1.1 수준

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

3.2.1.2 목표

업무자동화 프로그램

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

3.2.2 코드

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.2.3 방명록

  • 김왼손: 멋지네요. :)


3.3 Kim KY

3.3.1 설명

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

3.3.2 코드

# 파이썬 시작하기
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.3.3 방명록

  • 김왼손: 멋지네요. :)


3.4 김매매

3.4.1 수준

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

3.4.2 목표

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

3.4.3 코드

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

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.4.4 방명록

  • 김왼손: 멋지네요. :)


3.5 JT

3.5.1 설명

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

3.5.1.1 목표1

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

3.5.1.2 목표2

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

3.5.1.3 목표3

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

3.5.2 코드

3.5.2.1 코드: 목표1
print('Hello Python!')
3.5.2.2 코드: 목표2
print('Hello Python!')
3.5.2.3 코드: 목표3
print('Hello Python!')

3.5.3 방명록

  • 김왼손: 멋지네요. :)


3.6 ckstmznf

3.6.1 설명

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

3.6.2 참고영상

https://youtu.be/OtqWefBqbxA

3.6.3 1일차(부제 : 기획)

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

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

3.6.4 코드

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.5 발전 내용

3.6.5.1 1일차

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

3.6.6 방명록

  • 김왼손: 멋지네요. :)


3.7 Yoon

3.7.1 설명

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

3.7.2 코드

일단은 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 재시작, 점수, 속도 기능 추가

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))

# 색
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
BROWN = (124, 56, 0)

# 점수
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)
    # 시작버튼
    # startButton = pygame.Rect((SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2), (BLOCK_SIZE * 11, BLOCK_SIZE * 3))
    # pygame.draw.rect(screen, GREEN, startButton)
    # 시작글씨
    font = pygame.font.Font('freesansbold.ttf', BLOCK_SIZE * 3) # 폰트 설정
    text = font.render('start!', True, BLACK) # 글자 설정 render('출력', True, 글자색, 배경색)
    textRect = text.get_rect()
    textRect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
    screen.blit(text, 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) # 게임판 위의 뱀 그리기
    # 사과 만들기
    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
        print(replay)
        return self.replay

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

# 재시작?
replay = True
# 게임실행
play = True


"""반복문 + 게임판을 함수에 넣고 시작버튼을 누르면 반복되고, 종료를 누르면 종료되도록?"""
while replay :
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

    # 게임판 인스턴스 생성
    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_main(screen)
        draw_background(screen) # 배경그리기
        board.draw(screen) # 화면판에 게임판그리기
        board.write_score(screen)
        
        # 화면 새로고침
        pygame.display.update()
    if not play :
        # 게임이 종료되면 play == False가 되며 while을 빠져나온다.
        play_again = Play_Again(replay)
        replay = play_again.replay
        if replay :
            # 만약 재시작을 한다고 했다면 play = True가 되며 다시 게임이 시작된다.
            play = True
            continue
        # 하지만 재시작을 하지 않는다 했다면 반복문은 종료된다.
        break
# 게임도 종료된다.
pygame.quit()



3.7.3 방명록

  • 김왼손: 멋지네요. :)
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}