루덴스코드 Blog

Julian Meyer 라는 13세 소년이 만든 pygame 에 대한 튜토리얼이다. 이 게임은 기본적인 슈팅게임의 기본을 담고 있다. 방법을 익혀두면 다양하게 게임을 만들거나 응용이 가능하다. Beginning Game Programming for Teens with Python 이라는 이름으로 과정과 소스가 모두 인터넷에 공개되어 있다. 2.7 버젼으로 된 것을 최신 버젼인 3.6 버젼으로 수정했고, 일부 코드를 이해하기 쉽게 고쳤다.



STEP 0. 파이썬 & pygame 설치, 그래픽파일과 음악파일 준비


이 글은 윈도우 사용자를 위해 쓰였다. 리눅스나 맥은 가지고 있지 않은 관계로 설치해보질 못했으면 과정이 크게 다르지 않으리라는 것은 알지만 여기에 그 내용을 기록하지 않는다. 또한 원글과는 달리 최신 버젼인 파이썬 3.6 을 설치하여 사용하였다. 파이게임은 이글을 쓰는 당시에 있는 버젼인 1.9.3 을 설치하였다. 파이게임의 설치방법은


pip install pygame


으로 설치한다. 혹시 파이썬 설치방법을 모르는 사람은 다른 글을 통해 익히기 바란다.(가까운 시일내 파이썬 기본 강의를 올릴 예정이며 그때 파이썬 설치에 대해서 자세히 기록할 예정)


게임에 사용되는 배경음악과 그래픽 파일은 여기에서 다운로드하여 사용한다. 


[음악과 그래픽 다운로드]


이후의 과정은 최대한 설명은 생략하고 소스 중심으로 방법만 기술한다.



STEP 1. 토끼 보이기


다음의 코드를 사용한다.


# 1 - Import library
import pygame
from pygame.locals import *

# 2 - Initialize the game
pygame.init()
width, height = 640, 480
screen=pygame.display.set_mode((width, height))

# 3 - Load images
player = pygame.image.load("resources/images/dude.png")

# 4 - keep looping through
while 1:
    # 5 - clear the screen before drawing it again
    screen.fill(0)
    # 6 - draw the screen elements
    screen.blit(player, (100,100))
    # 7 - update the screen
    pygame.display.flip()
    # 8 - loop through the events
    for event in pygame.event.get():
        # check if the event is the X button 
        if event.type==pygame.QUIT:
            # if it is quit the game
            pygame.quit() 
            exit(0) 




STEP 2. 장면추가하기


다음 내용을 #3의 마지막 부분에 넣는다.


grass = pygame.image.load("resources/images/grass.png")
castle = pygame.image.load("resources/images/castle.png")


다음 코드를 #6 의 처음 부분에 추가한다.


for x in range(int(width/grass.get_width()+1)): for y in range(int(height/grass.get_height()+1)): screen.blit(grass,(x*100,y*100)) screen.blit(castle,(0,30)) screen.blit(castle,(0,135)) screen.blit(castle,(0,240)) screen.blit(castle,(0,345 ))


STEP 3. 토끼전사가 움직이게 하기


#2 의 마지막 부분에 다음 코드를 넣는다.

keys = [False, False, False, False]
playerpos=[100,100]


#6 에서 

    screen.blit(player, (100,100))

screen.blit(player, playerpos)

으로 바꾼다.

#8의 마지막 부분에서 for event.type==pygame.QUIT: 블럭 다음에 아래 코드를 넣는다.


        if event.type == pygame.KEYDOWN:
            if event.key==K_w:
                keys[0]=True
            elif event.key==K_a:
                keys[1]=True
            elif event.key==K_s:
                keys[2]=True
            elif event.key==K_d:
                keys[3]=True
        if event.type == pygame.KEYUP:
            if event.key==pygame.K_w:
                keys[0]=False
            elif event.key==pygame.K_a:
                keys[1]=False
            elif event.key==pygame.K_s:
                keys[2]=False
            elif event.key==pygame.K_d:
                keys[3]=False


파일의 마지막 부분에 아래 내용을 추가한다.


    # 9 - Move player
    if keys[0]:
        playerpos[1]-=5
    elif keys[2]:
        playerpos[1]+=5
    if keys[1]:
        playerpos[0]-=5
    elif keys[3]:
        playerpos[0]+=5


여기까지 코드를 실행시켜보면 키보드로 WASD 를 누를때 고양이전사가 움직인다.


STEP 4. 고양이전사 방향전환하기


atan2() 라는 수학함수를 사용한다. atan2 함수는 math 라이브러리를 사용한다.


#1 의 끝 부분에 다음을 추가한다.


import math

#6 의 마지막줄을 다음 내용으로 교체(수정)한다.

    # 6.1 - Set player position and rotation
    position = pygame.mouse.get_pos()
    angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
    playerrot = pygame.transform.rotate(player, 360-angle*57.29)
    playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
    screen.blit(playerrot, playerpos1) 


STEP 5. 발사 !


#2 의 마지막 부분에 다음 코드를 추가한다.

acc=[0,0]
arrows=[]


#3 의 마지막 부분에 화살 이미지를 넣는 코드를 추가한다.

arrow = pygame.image.load("resources/images/bullet.png")

#8 마지막 부분에 새로운 이벤트 핸들러를 추가한다.
        if event.type==pygame.MOUSEBUTTONDOWN:
            position=pygame.mouse.get_pos()
            acc[1]+=1
            arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])


#6.1 바로 다음에 아래 코드를 추가한다.

    # 6.2 - Draw arrows
    for bullet in arrows:
        index=0
        velx=math.cos(bullet[0])*10
        vely=math.sin(bullet[0])*10
        bullet[1]+=velx
        bullet[2]+=vely
        if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
            arrows.pop(index)
        index+=1
        for projectile in arrows:
            arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
            screen.blit(arrow1, (projectile[1], projectile[2]))


STEP 6. 오소리 출현

#2 마지막 부분에 아래 코드 추가

badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=194


#3 마지막 부분에 다음 코드 추가

badguyimg1 = pygame.image.load("resources/images/badguy.png")
badguyimg=badguyimg1


#6.2 다음에 아래 코드 추가

    # 6.3 - Draw badgers
    if badtimer==0:
        badguys.append([640, random.randint(50,430)])
        badtimer=100-(badtimer1*2)
        if badtimer1>=35:
            badtimer1=35
        else:
            badtimer1+=5
    index=0
    for badguy in badguys:
        if badguy[0]<-64:
            badguys.pop(index)
        badguy[0]-=7
        index+=1
    for badguy in badguys:
        screen.blit(badguyimg, badguy)


랜덤함수 사용을 위해서 다음 코드를 #1 의 끝 부분에 추가

import random

#4 의 while 문 바로 다음에 badtimer 를 감소시키는 코드 추가
    badtimer-=1

#6.3 의 첫번째 for 반복문 안에서 index+=1 바로 앞에 아래 코드를 추가
        # 6.3.1 - Attack castle
        badrect=pygame.Rect(badguyimg.get_rect())
        badrect.top=badguy[1]
        badrect.left=badguy[0]
        if badrect.left<64:
            healthvalue -= random.randint(5,20)
            badguys.pop(index)
        # 6.3.3 - Next bad guy


STEP 7. 오소리와 화살이 만날때


#6.3.1 아래에 다음 코드를 추가

        #6.3.2 - Check for collisions
        index1=0
        for bullet in arrows:
            bullrect=pygame.Rect(arrow.get_rect())
            bullrect.left=bullet[1]
            bullrect.top=bullet[2]
            if badrect.colliderect(bullrect):
                acc[0]+=1
                badguys.pop(index)
                arrows.pop(index1)
            index1+=1


STEP 8. 체력바와 시간 나타내기


#7 의 시작전에 아래 코드를 추가

# 6.4 - Draw clock font = pygame.font.Font(None, 24) survivedtext = font.render(str(int(90000-pygame.time.get_ticks()))+":"+str(int((90000-pygame.time.get_ticks())/1000%60)).zfill(2), True, (0,0,0)) textRect = survivedtext.get_rect() textRect.topright=[635,5] screen.blit(survivedtext, textRect)


#3 의 끝부분에 다음 코드를 추가

healthbar = pygame.image.load("resources/images/healthbar.png")
health = pygame.image.load("resources/images/health.png")


#6.4 다음에 아래 코드를 추가

    # 6.5 - Draw health bar
    screen.blit(healthbar, (5,5))
    for health1 in range(healthvalue):
        screen.blit(health, (health1+8,8))


STEP 9. WIN / LOSE


아래 코드를 마지막 부분에 추가

    #10 - Win/Lose check
    if pygame.time.get_ticks()>=90000:
        running=0
        exitcode=1
    if healthvalue<=0:
        running=0
        exitcode=0
    if acc[1]!=0:
        accuracy=acc[0]*1.0/acc[1]*100
    else:
        accuracy=0
# 11 - Win/lose display        
if exitcode==0:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,0,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(gameover, (0,0))
    screen.blit(text, textRect)
else:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(youwin, (0,0))
    screen.blit(text, textRect)
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
    pygame.display.flip()


#3 의 마지막 부분에 아래 코드를 추가

gameover = pygame.image.load("resources/images/gameover.png")
youwin = pygame.image.load("resources/images/youwin.png")


#4의 아래 내용을 수정한다.

[수정전]

# 4 - keep looping through
while 1:
    badtimer-=1

[수정후]

# 4 - keep looping through
running = 1
exitcode = 0
while running:
    badtimer-=1


STEP 10. 배경음악과 효과음악


#2 마지막 부분에 추가

pygame.mixer.init()

#3의 마지막 부분에 추가
# 3.1 - Load audio
hit = pygame.mixer.Sound("resources/audio/explode.wav")
enemy = pygame.mixer.Sound("resources/audio/enemy.wav")
shoot = pygame.mixer.Sound("resources/audio/shoot.wav")
hit.set_volume(0.05)
enemy.set_volume(0.05)
shoot.set_volume(0.05)
pygame.mixer.music.load('resources/audio/moonlight.wav')
pygame.mixer.music.play(-1, 0.0)
pygame.mixer.music.set_volume(0.25)


#6.3.1 의 if badrect.left<64: 다음에 아래 코드 추가

# section 6.3.1 after if badrect.left<64:
hit.play()


#6.3.2 의 if badrect.colliderect(bullrect): 다음에 아래 코드 추가

# section 6.3.2 after if badrect.colliderect(bullrect):
enemy.play()


#8 의 if event.type==pygame.MOUSEBUTTONDOWN: 다음에 아래 코드 추가

# section 8, after if event.type==pygame.MOUSEBUTTONDOWN:
shoot.play()


Comment +0


◆ 함수 

함수는 재사용 가능한 프로그램의 조각을 말합니다. 이것은 특정 명령어들을 묶어서 이름을 짓고, 그 이름을 프로그램 어디에서건 사용함으로써 그 명령어들을 몇번이고 다시 실행할 수 있게 하는 것입니다. 이를 보고 함수를 호출한다고 합니다. 


def say_hello():

    # block belonging to the function

    print('hello world')

    # End of function


say_hello() # call the function

say_hello() # call the function again



◆ 함수와 매개변수


함수를 정의할 때 매개 변수를 지정할 수 있습니다. 매개 변수란 함수로 넘겨지는 값들의 이름입니다. 매개 변수는 변수와 거의 같이 취급되지만, 매개 변수의 값들은 함수가 호출되어질 때 넘겨받은 값들로 채워지며 함수가 실행되는 시점에서는 이미 할당이 완료되어 있다는 점이 다릅니다.


매개 변수는 함수를 정의할 때 괄호 안에서 쉼표로 구분합니다. 함수를 호출할 때에는, 동일한 방법으로 함수에 값을 넘겨줍니다. 함수를 정의할 때 주어진 이름을 매개 변수라 부르고, 함수에 넘겨준 값들을 인자라 합니다.


def print_max(a, b):

    if a > b:

        print(a, 'is maximum')

    elif a == b:

        print(a, 'is equal to', b)

    else:

        print(b, 'is maximum')

# directly pass literal values

print_max(3, 4)

x = 5

y = 7

# pass variables as arguments

print_max(x, y)



◆ 지역변수

함수 안에서 변수를 선언하고 사용할 경우, 함수 밖에 있는 같은 이름의 변수들과 함수 안에 있는 변수들과는 서로 연관이 없습니다. 이러한 변수들을 함수의 지역(local) 변수라고 하며, 그 범위를 변수의 스코프(scope) 라고 부릅니다. 모든 변수들은 변수가 정의되는 시점에서의 블록을 스코프로 가지게 됩니다.



x = 50

def func(x):

    print('x is', x)

    x = 2

    print('Changed local x to', x)


func(x)

print('x is still', x)



◆ 전역변수


함수나 클래스 내부에서 상위 블록에서 선언된 변수의 값을 변경하고 싶을 경우, 파이썬에게 이 변수를 앞으로 지역 변수가 아닌 전역(global) 변수로 사용할 것임을 알려 줍니다. 이때 global을 이용합니다. global 문을 사용하지 않으면, 함수 외부에서 선언된 변수의 값을 함수 내부에서 변경할 수 없습니다.


x = 50


def func():

    global x

    print('x is', x)

    x = 2

    print('Changed global x to', x)


func()

print('Value of x is', x)


# 함수 내부에서 global 로 변수가 전역변수임을 알린다.

# 4번째 줄이 없으면 에러 발생



◆ 기본 인수값

함수를 호출할 때 인수를 선택적으로 넘겨주게 하여 사용자가 값을 넘겨주지 않으면 자동으로 기본값을 사용하도록 하는 것이 편할 때가 있습니다. 이런 경우, 기본 인수값을 지정하면 됩니다. 함수를 선언할 때 원하는 매개 변수 뒤에 대입 연산자 (=)와 기본값을 입력하여 기본 인수값을 지정합니다.


이 때, 기본 인수값은 반드시 상수이어야 합니다. 좀 더 정확히 말하자면, 불변값이어야 합니다. 


def say(message='HI ', times=1):

    print(message * times)


say('Hello')

say('World', 5)

say()

# say( , 10)



◆ 키워드 인수

여러 개의 매개 변수를 가지고 있는 함수를 호출할 때, 그 중 몇 개만 인수를 넘겨주고 싶을 때가 있습니다. 이때 매개 변수의 이름을 지정하여 직접 값을 넘겨줄 수 있는데 이것을 키워드 인수 라 부릅니다. 함수 선언시 지정된 매개 변수의 순서대로 값을 넘겨주는 것 대신, 매개 변수의 이름 (키워드) 를 사용하여 각각의 매개 변수에 인수를 넘겨 주도록 지정해 줍니다.


키워드 인수를 사용하는 데 두가지 장점이 있습니다. 첫째로, 인수의 순서를 신경쓰지 않고도 함수를 쉽게 호출할 수 있는 점입니다. 둘째로는, 특정한 매개 변수에만 값을 넘기도록 하여 나머지는 자동으로 기본 인수값으로 채워지게 할 수 있습니다.


def func(a, b=5, c=10):

    print('a is', a, 'and b is', b, 'and c is', c)


func(3, 7)

func(25, c=24)

func(c=50, a=100)


func(1,2,3)

func(a=1,b=2,c=3)

func(c=3,a=1,b=2)




◆ VarArgs 매개변수

함수에 임의의 개수의 매개 변수를 지정해주어야 할 때가 있습니다. 이때 VarArgs 매개 변수를 사용합니다. 아래 예제와 같이 별 기호를 사용하여 임의의(Variable) 개수의 인수(Arguments) 를 표현합니다.


def total(initial=5, *numbers, **keywords):

    count = initial   

    for number in numbers:

        count += number

    for key in keywords:   

        count += keywords[key]

    return count


print(total(10, 1, 2, 3, vegetables=50, fruits=100))




◆ return 문

return 문은 함수로부터 되돌아(return) 나올 때, 즉 함수를 빠져 나올 때 사용됩니다. 이 때 return 값 처럼 값을 지정해 주면, 함수가 종료될 때 그 값을 반환하도록 할 수 있습니다.


def maximum(x, y):

    if x > y:

       return x

    elif x == y:

       return 'The numbers are equal'

    else:

       return y


print(maximum(2, 3))



◆ DocString : 설명문자열

파이썬은 설명(Documentation) 문자열(String) 이라고 불리우는, 짧게 줄여서 DocStrings라 불리우는 편리한 기능을 가지고 있습니다. DocString은 여러분이 만든 프로그램을 알아보기 쉽게 해 주고, 또 후에 프로그램에 대한 설명서를 작성할 때 유용하게 사용될 수 있는 중요한 도구입니다. 아래 예제와 같이, DocString은 프로그램이 실행중일 때도 읽어올 수 있습니다.


def print_max(x, y):

    '''Prints the maximum of two numbers.

    

    The two values must be integers.'''

    x = int(x)

    y = int(y)

    if x > y:

        print(x, 'is maximum')

    else:

        print(y, 'is maximum')


print_max(3, 5)

print(print_max.__doc__)



◆ 파이썬 turtle 모듈 사용하기

1. 사용하려는 모듈 가져오기 (import)

import turtle

2. 캔버스생성

t = turtle.Pen()

3. 거북이 움직이기

t.forward(거리)

t.backward(거리)

t.left(각도)

t.right(각도)

t.reset()

t.clear()

t.up()

t.down()


4. 사각형을 그려보자


import turtle


t = turtle.Pen()


t.forward(100)

t.left(90)

t.forward(100)

t.left(90)

t.forward(100)

t.left(90)

t.forward(100)


5. 다음 코드를 실행해보자



import turtle


t = turtle.Pen()


for i in range(0,36):

    t.forward(100)

    t.left(50)



터틀그래픽 기본 자료 https://docs.python.org/3.6/library/turtle.html



Comment +0



◆ 학점 프로그램을 만든다면 ?


점수

학점

점수에 따른 학점의 기준을 만든다

) 95점 이상 A+, 60점 미만 F

첫번째 줄의 점수를 판단

) 96점은 95점 이상이므로 A+

다음 줄로 계속 이동하면서 를 반복

) 51점은 60점 미만이므로 F

더 이상 점수가 없을 때 프로그램 종료

96

 ?

51

 ?

69

 ?

15

 ?


프로그램을 만들 때 조건과 반복은 필수


◆ 조건문이란?

조건에 따라 특정한 동작을 하게 하는 것


if 문은 조건을 판별할 때 사용됩니다. if (만약) 조건이 참이라면, if 블록의 명령문을 실행하며 else (아니면) 면 else 블록의 명령문을 실행합니다. 이 때 else 조건절은 생략이 가능합니다.


if True:

    print('Yes, it is true’)



number = 23

guess = int(input('Enter an integer : '))

if guess == number:

    # New block starts here

    print('Congratulations, you guessed it.')

    print('(but you do not win any prizes!)')

    # New block ends here

elif guess < number:

    # Another block

    print('No, it is a little higher than that')

    # You can do whatever you want in a block ...

else:

    print('No, it is a little lower than that')

    # you must have guessed > number to reach here

print('Done')

# This last statement is always executed,

# after the if statement is executed.



◆ 반복문 : while 

while 문은 특정 조건이 참일 경우 계속해서 블록의 명령문들을 반복하여 실행할 수 있도록 합니다. while 문은 *반복문*의 한 예입니다. 또한 while 문에는 else 절이 따라올 수 있습니다.

 

number = 23

running = True

while running:

    guess = int(input('Enter an integer : '))

    if guess == number:

        print ('Congratulations, you guessed it.')

        # this causes the while loop to stop

        running = False

    elif guess < number:

        print ('No, it is a little higher than that.')

    else:

        print ('No, it is a little lower than that.')

else:

    print ('The while loop is over.')

       # Do anything else you want to do here

print ('Done')



◆ for 루프

for..in 문은 객체의 열거형(Sequence)을 따라서 반복하여 실행할 때 사용되는 파이썬에 내장된 또 하나의 반복문으로, 열거형에 포함된 각 항목을 하나씩 거쳐가며 실행합니다. 열거형에 대해서는 이후에 좀 더 자세히 다룰 것입니다. 일단 여기서는, 열거형이란 여러 항목이 나열된 어떤 목록을 의미한다고 생각하시기 바랍니다.


for i in range(1, 5):

    print (i)

else:

    print ('The for loop is over')



◆ break 문

break 문은 루프 문을 강제로 빠져나올 때, 즉 아직 루프 조건이 `False`가 되지 않았거나 열거형의 끝까지 루프가 도달하지 않았을 경우에 루프 문의 실행을 강제로 정지시키고 싶을 때 사용됩니다.


중요한 점은 만약 여러분이 break 문을 써서 for 루프나 while 루프를 빠져나왔을 경우, 루프에 딸린 else 블록은 실행되지 않습니다.


while True:

    s = input('Enter something : ')

    if s == 'quit':

        break

    print ('Length of the string is', len(s))

print ('Done')


◆ continue 문

continue 문은 현재 실행중인 루프 블록의 나머지 명령문들을 실행하지 않고 곧바로 다음 루프로 넘어가도록 합니다.


while True:

    s = input('Enter something : ')

    if s == 'quit':

        break

    if len(s) < 3:

        print('Too small')

        continue

    print('Input is of sufficient length')

        # Do other kinds of processing here...


HW : 

1. 하나의 숫자를 입력받은 후 1) 짝수인지 여부와 2) 3의 배수인지 여부를 출력

2. 로또 번호 출력기 만들기

2.1. 5개의 로또번호를 만든다.

2.2. 5개의 숫자를 입력받은 후 번호가 맞는지 확인하는 것을 반복한다. 

2.3. 5개 번호가 다 맞으면 5개 번호와 시행횟수를 출력한다.

3. 숫자를 입력받은 후 그 숫자만큼 * 을 출력하는 프로그램

3.1. ******** (한줄로 출력)


 3.2.

 3.3

 3.4

 3.4

3.5 

 3.6

*

**

***

****

*****

    *

   **

  ***

 ****

*****


*****

****

***

**

*

*****

 ****

  ***

   **

    *

    *

   ***

  *****

 *******

*********

*********

 *******

  *****

   ***

    *



 

Comment +0


◆ 주석 - # 문자 뒤에 따라오는 짧은 문장


print('hello world') # Note that print is a statement

# Note that print is a statement


◆ 리터럴 상수

- 5

- 1.23

- ‘This is a book’

- “Sting”


◆ 숫자형

- 정수형 : 5

- long 형이 없다


import sys


t1 = sys.maxsize

# t1 = sys.maxint


t2 = t1+1 #int범위를 넘으면 long 자동 형 변환

t3 = t2**10


print(t1)

print(t2)

print(t3)


print(type(t1))

print(type(t2))

print(type(t3))


- 소수점 숫자형 : 4.16, 52.3E-3 (= )


◆ 문자열


◆ 작은 따옴표(‘’)와 큰 따옴표(“”)


◆ 따옴표 세 개


◆ 문자열 수정은 불가


◆ format()

str_format.py


age = 26

name = 'Python'


print('{0} was {1} years old'.format(name, age))

print('{0} is easy'.format(name))



◆ format() 대신 문자열 더하기


print(name + ' is ' + str(age) + ' years old')


※ 위의 형식보다는 format()을 사용하는 것을 추천


◆ 중괄호 숫자 생략 가능


age = 19

name = 'Baram'


print('{} was {} years old'.format(name, age))

print('Why is {} playing with that python?'.format(name))



◆ format() 의 또 다른 사용법


# 소수점 이하 셋째 자리까지 부동 소숫점 숫자 표기 (0.333)

print('{0:.3f}'.format(1.0/3))

# 밑줄(_)로 11칸을 채우고 가운데 정렬(^)하기 (___hello___)

print('{0:_^11}'.format('hello'))

# 사용자 지정 키워드를 이용해  표기

print('{name} wrote {book}'.format(name='Baram', book='Easy Arduino'))



◆ print() 사용시 줄바꿈을 막으려면,


print("Hello ", end='')

print("World")



◆ 특수(Escape) 문자

\'

"'"

'"'

\"

\\

\n

\t


◆ 순문자열 

r"Newlines are indicated by \n“


◆ 변수


- 식별자의 첫 문자는 알파벳 문자 (ASCII 대/소문자 혹은 유니코드 문자)이거나 밑줄 (_)


- 나머지는 문자 (ASCII 대/소문자 혹은 유니코드 문자), 밑줄 (_), 또는 숫자 (0-9)


- 식별자는 대/소문자를 구분. 예를 들어, myname 과 myName 은 다르다.


- 올바른 식별자 이름은 i, name_2_3 등과 같고, 올바르지 않은 식별자 이름은 2things, this is spaced out, my-name, >a1b2_c3 등입니다.



◆ 명시적 행간결합


s = ' Hello \

World'


print(s)


◆ 들여쓰기 – 4칸 들여쓰기


◆ 연산자


>>> 2 + 3

5

>>> 3 * 5

15

>>>



+ (덧셈 연산자)

- (뺄셈 연산자)

* (곱셈 연산자)

** (거듭제곱 연산자)

/ (나눗셈 연산자)

% (나머지 연산자)

<< (왼쪽 시프트 연산자)

>> (오른쪽 시프트 연산자)

& (비트 AND 연산자)

| (비트 OR 연산자)

^ (비트 XOR 연산자)

~ (비트 반전 연산자)

< (작음)

> (큼)

<= (작거나 같음)

>= (크거나 같음)

== (같음)

!= (같지 않음)

not (불리언 NOT 연산자)

and (불리언 AND 연산자)

or (불리언 OR 연산자)


◆ 연산 및 할당 연산자


a = a*3 은

a *= 3 과 동일


◆ 연산순서


● lambda

● if – else

● or

● and

● not x

● in, not in, is, is not, <, ⇐, >, >=, !=, ==

● |

● ^

● &

● <<, >>

● +, -

● *, /, //, %

● +x, -x, ~x

● **

● x[index], x[index:index], x(arguments…​), x.attribute

● (expressions…​), [expressions…​], {key: value…​}, {expressions…​}



◆ ( ) 이용한 연산순서 변경

● 2 + 3 * 4 + 5

● 2 + 3 * (4 + 5)

● 2 + (3 * (4 + 5))





Comment +0


파이썬은 배우기 쉽고, 강력한 프로그래밍 언어입니다. 파이썬은 효율적인 고수준 데이터 구조를 갖추고 있으며, 간단하지만 효과적인 객체 지향 프로그래밍 접근법 또한 갖추고 있습니다. 우아한 문법과 동적 타이핑, 그리고 인터프리팅 환경을 갖춘 파이썬은 다양한 분야, 다양한 플랫폼에서 사용될 수 있는 최적의 스크립팅, RAD(rapid application development - 빠른 프로그램 개발) 언어입니다.


◆ 파이썬이라는 이름의 유래

파이썬의 창시자 귀도 반 로섬(Guido van Rossum)이 BBC에서 방영되던 "Monty Python’s Flying Circus"라는 TV 프로그램의 이름을 따서 지었습니다. 사실 귀도는 뱀이라는 긴 몸으로 다른 동물의 몸을 휘감아 으깨어 부수고 먹어치우는 동물을 딱히 좋아하지는 않는다고 합니다.


◆ 파이썬의 특징


● 단순함(Simple)

● 쉬움(Easy to Learn)

● 오픈 소스(Free and Open Source)

● 고수준 언어(High-level Language)

● 이식성(Portable)

● 인터프리터 언어(Interpreted)

● 객체 지향 언어(Object Oriented)

● 확장성(Extensible)

● 포함성(Embeddable)

● 확장 가능한 라이브러리(Extensive Libraries)


요약 - 흥미진진하고 강력한 언어. 재미있고 쉽게 프로그램을 작성할 수 있음


◆ Python 2.x 에서 Python 3.x 으로 바뀌면서 생긴 변화들


1. python 3.x – 변수가 객체로 처리


2. print에서 ( ) 필수 사용

Python 2

Python 3

print ‘hello’

print(’hello’)


3. str 과 unicode 통일됨

Python 2

Python 3

print( type('hello') )

print( type(u'hello') )

# <type 'str'>

# <type 'unicode'>

print( type('hello') )

print( type(u'hello') )

# <class 'str'>

# <class 'str'>


모든 문자열은 별도로 지정하지 않아도 유니코드로 설정됨


4. int 나누기 결과가 float 으로 저장

Python 2

Python 3

print( 1/4 )

print( type(1/4) )

# 0

# <type 'int'>

print( 1/4 )

print( type(1/4) )

# 0.25

# <class 'float'>



5. long → int로 통일


Python 2

Python 3

print( 2**30 )

print( type(2**30) )

print( 2**100 )

print( type(2**100) )

# 1073741824

# <type 'int'>

# 1267650600228229401496703205376

# <type 'long'>

print( 2**30 )

print( type(2**30) )

print( 2**100 )

print( type(2**100) )

# 1073741824

# <class 'int'>

# 1267650600228229401496703205376

# <class 'int'>


◆ 개발환경 구성 - 윈도우 환경에서의 설치


https://www.python.org/downloads/ 의 최신버전의 설치 프로그램을 설치

설치 방법은 다른 소프트웨어를 설치 할 때와 동일 


주의: 혹시 설치 도중 기본으로 설치하도록 표시된 "추가 기능"을 선택하지 않을 것인지 물어도, 선택을 해제하지 마세요.



◆ 개발환경 구성 – 아톰 IDE 설치


공식 홈페이지 http://atom.io 에 들어가면 상단에 윈도우즈용 다운로드 버튼이 나타납니다.

인스톨 파일을 다운받았다면 실행시켜서 설치하면 되겠습니다. 설치시와 실행시, 외부와의 커넥션이 있으므로 방화벽이 있는 시스템의 경우 통신을 허락해주어야 합니다.


◆ 명령 프롬프트 사용하기

파이썬을 윈도우의 명령 프롬프트 상에서 사용하기 위해 PATH 환경 변수를 설정


윈도우 2000, XP, 2003의 경우, “제어판 → 시스템 → 고급 → 환경 변수”로 들어가세요. “시스템 변수” 목록에 있는 “PATH”를 선택한 뒤, “편집” 버튼을 누르고 파이썬을 설치한 폴더(디렉토리)가 있는지 확인하세요. 만약 없다면 디렉토리를 PATH 에 추가해서 넣어주세요. 


그 이전 버전의 윈도우를 사용하시는 분들은, C:\AUTOEXEC.BAT`를 열고 맨 뒷줄에 `PATH=%PATH%;C:\Python35 이라고 마지막에 한 줄 추가한 뒤 시스템을 재시작하세요. 윈도우 NT의 경우, AUTOEXEC.NT 파일을 편집하세요.



◆ 파이썬 실행

PATH 환경변수가 제대로 설정되어 있다면, 파이썬 인터프리터를 명령 프롬프트 상에서도 실행하실 수 있습니다.


윈도우 환경에서 터미널 창을 열기 위해서는, 시작 메뉴를 누르고 실행 버튼을 클릭하세요. 나타나는 대화상자에 “cmd” 를 입력하시고 enter 키를 입력하세요.


이제, “python” 을 입력하고 파이썬 프롬프트가 잘 실행되는지 확인하세요.


잘 되면, print(‘Hi Baram’)를 넣어 보세요. 파이썬 프로그램을 마칠때는 exit()를 입력하고 엔터를 치면 됩니다.



◆ Linux 에서의 설치


GNU/Linux 사용자의 경우, 파이썬이 이미 설치되어 있을 것입니다.


확인하시려면, 터미널 프로그램을 열거나 혹은 Alt+F2 키를 입력한 뒤 “gnome-terminal”을 입력하여 터미널을 실행하세요. 만약 이 두 방법으로 터미널을 실행시킬 수 없으면, 여러분이 설치한 리눅스 배포판의 설명서를 참조하세요. 이제, “python”을 입력하고 문제가 없는지 확인하세요.


다음과 같이 입력하면 시스템에 설치된 파이썬의 버전을 확인할 수 있습니다.


$ python -V

Python 3.5.3 (버젼에 따라 다르게 나올 수 있습니다.)



◆ “Hello World” 프로그램 작성

파이썬에서 프로그램을 실행하는 방법은 두 가지가 있습니다. 첫째는 대화형 인터프리터 프롬프트를 이용하는 방법과, 둘째는 소스 파일을 이용하는 것입니다. 지금부터 두 방법 모두 알아보도록 하겠습니다.


1. 인터프리터 프롬프트에서의 실행


     print("Hello World“)


2. 편집기 사용, 소스파일 실행


PyCharm Community 또는 atom 사용


PyCharm 설치 후 hello.py 저장, 실행


hello.py 이름으로 파일을 만들고 내용으로


print('Hello World')


를 넣습니다. 명령어입력창으로 가서 python hello.py를 칩니다.




Comment +0

1. Capture video from camera


import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
# Capture frame-by-frame
ret, frame = cap.read()

# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()



2. Saving a video

저장을 위해 필요한 코덱이 미리 설치되어 있어야 한다. 모니터화면을 동영상으로 저장하는 oCam 을 설치하면 Xvid 코덱이 설치된다. 일반 동영상플레이어 설치시 설치되는 Xvid 코덱은 읽기용 코덱이라 여기에서 사용되는 것과 다르다. Xvid 쓰기용 코덱을 설치한다. ( http://goo.gl/v63QJ5 )


import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)

# write the flipped frame
out.write(frame)

cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()



3. Playing video from file


import numpy as np
import cv2

cap = cv2.VideoCapture('output.avi')

while(cap.isOpened()):
ret, frame = cap.read()

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


Comment +0

두번째 장에서는 이미지를 다룬다.

cv2.imread(), cv2.imshow() , cv2.imwrite() 세 함수를 사용해본다.


1. 이미지 읽기 : cv2.imread()


import numpy as np

import cv2


img = cv2.imread('promini.png',0)


cv2.imshow('image',img)

cv2.waitKey(0)

cv2.destroyAllWindows()


img = cv2.imread('promini.png',0) : 회색(gray)으로 이미지 읽기

img = cv2.imread('promini.png',1) : 원색으로 이미지 읽기



2. 이미지 디스플레이 : cv2.imshow()


import numpy as np

import cv2


img = cv2.imread('promini.png',0)


cv2.namedWindow('image', cv2.WINDOW_NORMAL)

cv2.imshow('image',img)

cv2.waitKey(0)

cv2.destroyAllWindows()


cv2.namedWindow('image', cv2.WINDOW_NORMAL) : 윈도우 사이즈 조절 가능



3. 이미지 쓰기 :  , cv2.imwrite()


import numpy as np
import cv2

img = cv2.imread('promini.png',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('prominigrey.png',img)
    cv2.destroyAllWindows()





Comment +0

오픈CV 를 사용해 보려고 Python 을 시작한다. OpenCV 도 Python 도 잘 모른다. 하지만 둘다 그리 어렵지는 않으리라는 생각을 하면서 우선 OpenCV-Python tutorial 의 내용을 따라하기로 한다.


파이썬의 버젼은 2.7 대의 구버젼과 3.0 대의 신버젼이 있다. 신버젼이 오히려 많이 사용되지 않고 있다. 예전 버젼으로 나온 많은 라이브러리가 사용되지 않기 때문이고, 문법적으로 상당한 변화가 있다. 언젠가는 바뀌겠지라고 생각을 하지만 정말 바뀔지는 모르겠다. 굳이 100 원짜리 연필로 가능한 낙서를 10만원짜리 만년필로 대체할 필요는 없고, 2.7 대에서 굳이 큰 문제없이 - 문제가 전혀없는 것은 아니지만 - 사용하는 것을 3.0 대로 바꾸면서 파이썬을 사용하려는 사람이 얼마나 될지 모르겠다. 어쩌면 게임에서 지금까지 모은 모든 보호장비와 무기를 벗어던지고 근육만 두꺼운 신캐릭으로 바꾸라고 할때 처음 시작하는 사람이라면 당연히 가진 장비가 없으니 초기치가 든든한 신캐릭을 쓰겠지만 이미 많은 투자를 통해 무기와 방어구를 제대로 갖춰둔 사람이 그 모든 장비를 버릴수 있을까?


그래서 OpenCV 를 사용하기 위해서 Python 은 2.7 버젼을 사용한다.


1. Python2.7 버젼대를 다운 받고,

2. 에디터로 PyCharm Community 버젼 (무료)을 다운받아 설치한다.

3. PyCharm 을 실행시키고, New Project 를 만들어본다. 

4. File >> Setting >> Project >> Project Interpreter 에서 기존에 설치된 플러그인들을 최신버젼으로 설치한다. 

5. 설치시 에러가 나면 에러가 난 부분을 잘 찾아 읽어본다. Microsoft Visual C++ Compiler Package for Python 2.7 을 설치하라는 메시지가 있으면 그곳에 나온 링크를 따라가서 파일을 다운받아 설치한다.  (링크 : https://goo.gl/E9EAkI )

6. + 키를 눌러 numpy, matplotlib 를 검색한 후 찾아서 설치한다. 

7. OpenCV 를 다운받아서 설치한다. ( http://goo.gl/ZnEZiW )

8. PC 의 opencv/build/python/2.7/ 아래 폴더(32비트와 64비트 두가지 폴더가 있음)에서 cv2.pyd 파일을 C:/Python27/lib/site-packeges 에 복사한다.

9. 완성. 제대로 되었는지 확인하기 위해


import cv2

print cv2.__version__


결과로 버젼값이 화면에 나오면 완성


python, opencv 로 구글검색하면 나오는 사이트 OpenCV Python Tutorial 을 시작한다. (https://goo.gl/pFZA0g)



Comment +0