728x90
반응형
SMALL

 

파이썬 turtle 모듈의 setup() 함수는 터틀 그래픽 창의 크기위치를 설정하는 데 사용됩니다. 이를 통해 그래픽 창의 크기를 지정하거나, 화면에서 창이 나타나는 위치를 조절할 수 있습니다.

setup() 함수 기본 구조

turtle.setup(width, height, startx, starty)
  • width: 창의 너비 (기본값은 50%의 화면 너비).
  • height: 창의 높이 (기본값은 75%의 화면 높이).
  • startx: 창의 시작 x 좌표 (화면에서 창이 나타나는 위치).
  • starty: 창의 시작 y 좌표 (화면에서 창이 나타나는 위치).

이제 다양한 setup() 함수의 예제를 살펴보겠습니다.

1. 기본 창(윈도우) 크기 설정

 
import turtle
 
# 창의 크기를 800x600으로 설정
turtle.setup(800, 600)
# 터틀 객체 생성 및 간단한 작업
t = turtle.Turtle()
t.forward(100)
turtle.done()
  • 설명: 창의 너비를 800 픽셀, 높이를 600 픽셀로 설정하여 시작합니다.

 

2. 창의 크기와 위치 설정

 
import turtle
 
# 창의 크기를 800x600으로 설정하고, 화면의 좌측 상단에 배치
turtle.setup(800, 600, 0, 0)
 
# 터틀 객체 생성 및 간단한 작업
t = turtle.Turtle()
t.circle(50)
turtle.done()
  • 설명: 창의 너비는 800, 높이는 600으로 설정하고, 화면의 (0, 0) 위치(왼쪽 상단)에 창을 배치합니다.

3. 화면 중앙에 창 배치

import turtle
 
# 창의 크기를 500x500으로 설정하고 화면 중앙에 배치
turtle.setup(500, 500, None, None)
# 터틀 객체 생성 및 간단한 작업
t = turtle.Turtle()
t.forward(150)
turtle.done()
  • 설명: 창의 크기를 500x500으로 설정한 뒤, startx, starty를 None으로 지정하여 화면 중앙에 창을 배치합니다.

4. 화면 오른쪽 아래에 창 배치

import turtle
 
# 창의 크기를 400x400으로 설정하고, 화면의 오른쪽 아래에 배치
turtle.setup(400, 400, 800, 400)
 
# 터틀 객체 생성 및 간단한 작업
t = turtle.Turtle()
t.right(45)
t.forward(200)
turtle.done()
  • 설명: 화면의 오른쪽 아래(800, 400) 위치에 창을 배치하고, 창의 크기는 400x400으로 설정합니다.

5. 터틀 창 최대화

 
import turtle
 
# 화면의 전체 크기를 사용하여 창을 설정
screen = turtle.Screen()
screen.setup(width=1.0, height=1.0)
# width, height를 1.0으로 설정하면 최대화
# 터틀 객체 생성 및 간단한 작업
t = turtle.Turtle()
t.circle(100)
turtle.done()
  • 설명: 창의 너비와 높이를 1.0으로 설정하면 창이 전체 화면을 차지하게 됩니다.

6. 창을 화면 상단 중앙에 배치

import turtle
 
# 창의 크기를 600x400으로 설정하고 화면 상단 중앙에 배치
 
turtle.setup(600, 400, None, 0)
 
# 터틀 객체 생성 및 간단한 작업
t = turtle.Turtle()
t.goto(-50, 50)
t.goto(50, -50)
turtle.done()
  • 설명: 창의 크기를 600x400으로 설정하고, starty=0을 통해 화면의 상단 중앙에 창을 배치합니다.

7. 창의 크기를 특정 비율로 설정

 
import turtle
 
# 화면의 80% 너비와 50% 높이로 창 크기 설정
screen = turtle.Screen()
screen.setup(width=0.8, height=0.5)
 
# 화면의 비율로 크기를 설정
# 터틀 객체 생성 및 간단한 작업
t = turtle.Turtle()
t.circle(70)
turtle.done()
  • 설명: width=0.8, height=0.5를 설정하여 화면 너비의 80%, 높이의 50%로 창의 크기를 설정합니다.

8. setup() 없이 창 크기 변경하기

import turtle
 
# 창 크기 초기값
turtle.screensize(500, 500)
# 터틀 객체 생성 및 간단한 작업
t = turtle.Turtle()
t.forward(100)
turtle.done()
  • 설명: setup() 함수 대신, screensize()를 사용하여 창의 크기를 조정할 수 있습니다.

요약

  • setup() 함수를 통해 터틀 그래픽 창의 크기와 위치를 자유롭게 설정할 수 있습니다.
  • 절대적인 크기 값이나 비율로 창의 크기를 지정할 수 있으며, 창의 시작 위치도 설정 가능합니다.
  • 다양한 창 설정을 통해 창의 배치나 크기를 원하는 대로 조절할 수 있습니다.
 
 
728x90
반응형
LIST
728x90
반응형
SMALL

 

onclick()과 onscreenclick()은 Python의 turtle 모듈에서 화면 클릭 이벤트를 처리하기 위한 함수들이지만, 동작 방식에 약간의 차이점이 있습니다.

  1. onclick(fun, btn=1, add=None)
    • 역할: 터틀 객체에 특정 클릭 이벤트를 연결하는 함수입니다.
    • 적용 대상: 이 함수는 개별 터틀 객체에 사용됩니다. 즉, 화면에서 해당 터틀을 클릭했을 때 특정 동작을 수행하도록 설정하는 함수입니다.
    • 파라미터:
      • fun: 호출할 함수. 함수는 두 개의 인수(x, y 좌표)를 받아야 합니다.
      • btn: 클릭할 버튼 (기본값은 1로, 왼쪽 마우스 버튼).
      • add: None이면 이전 설정을 덮어쓰고, True이면 이벤트를 추가합니다.
    • 사용 예시:
       
      import turtle
      t = turtle.Turtle() t.onclick(lambda x, y: print("터틀이 클릭되었습니다:", x, y))
  2. onscreenclick(fun, btn=1, add=None)
    • 역할: 터틀 객체와 상관없이 전체 화면에서의 클릭 이벤트를 처리하는 함수입니다.
    • 적용 대상: 화면 어디를 클릭하든 작동하며, 특정 터틀이 아닌 화면 전반의 클릭을 처리합니다.
    • 파라미터:
      • fun: 호출할 함수. 마찬가지로 두 개의 인수(x, y 좌표)를 받아야 합니다.
      • btn: 클릭할 버튼 (기본값은 1로, 왼쪽 마우스 버튼).
      • add: None이면 이전 설정을 덮어쓰고, True이면 이벤트를 추가합니다.
    • 사용 예시:
      import turtle
      turtle.onscreenclick(lambda x, y: print("화면이 클릭되었습니다:", x, y))

차이점 요약

  • onclick(): 특정 터틀 객체를 클릭했을 때 발생하는 이벤트 처리.
  • onscreenclick(): 전체 화면에서 클릭할 때 발생하는 이벤트 처리. 특정 터틀 객체에 종속되지 않고, 화면을 클릭하는 모든 경우에 반응.

이 차이를 이해하고 사용하면 터틀 그래픽을 더 유연하게 제어할 수 있습니다.

728x90
반응형
LIST
728x90
반응형
SMALL

이동 관련 함수

  1. turtle.forward(distance): 앞으로 이동
  2. turtle.backward(distance): 뒤로 이동
  3. turtle.right(angle): 시계 방향 회전
  4. turtle.left(angle): 반시계 방향 회전
  5. turtle.goto(x, y): 특정 좌표로 이동
  6. turtle.setx(x): x축 좌표 설정
  7. turtle.sety(y): y축 좌표 설정
  8. turtle.setheading(angle): 거북이의 방향 설정
  9. turtle.home(): 시작점으로 돌아감
  10. turtle.circle(radius, extent=None, steps=None): 원 또는 호 그리기
  11. turtle.setpos(x, y): 좌표 설정 (goto와 동일)
  12. turtle.setposition(x, y): 좌표 설정 (goto와 동일)
  13. turtle.towards(x, y): 특정 좌표로 가는 각도 반환
  14. turtle.xcor(): 현재 x좌표 반환
  15. turtle.ycor(): 현재 y좌표 반환
  16. turtle.distance(x, y): 특정 좌표까지의 거리 반환
  17. turtle.shearfactor(shear=None): 기울기 설정 및 반환
  18. turtle.seth(angle): 방향을 특정 각도로 설정
  19. turtle.get_shapepoly(): 현재 모양의 다각형 좌표 반환
  20. turtle.settiltangle(angle): 거북이 모양의 기울기 각도 설정

그리기 관련 함수

  1. turtle.pendown(): 선 그리기 시작
  2. turtle.penup(): 선 그리기 중지
  3. turtle.pensize(width): 선의 두께 설정
  4. turtle.pencolor(color): 선 색상 설정
  5. turtle.fillcolor(color): 채우기 색상 설정
  6. turtle.begin_fill(): 도형 채우기 시작
  7. turtle.end_fill(): 도형 채우기 끝
  8. turtle.dot(size=None, color=None): 점 그리기
  9. turtle.write(arg, move=False, align='left', font=('Arial', 8, 'normal')): 텍스트 쓰기
  10. turtle.stamp(): 현재 거북이 모양을 도장처럼 찍음
  11. turtle.begin_poly(): 다각형 그리기 시작
  12. turtle.end_poly(): 다각형 그리기 끝
  13. turtle.get_poly(): 현재 그려진 다각형 반환
  14. turtle.filling(): 현재 채우기 모드 상태 확인
  15. turtle.clearstamp(stampid): 특정 도장 지우기
  16. turtle.clearstamps(n=None): n개 또는 모든 도장 지우기
  17. turtle.ondrag(fun, btn=1): 드래그 이벤트 처리
  18. turtle.onclick(fun, btn=1): 클릭 이벤트 처리
  19. turtle.onrelease(fun, btn=1): 클릭 해제 이벤트 처리
  20. turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None): 거북이 크기 설정
  21. turtle.resizemode(rmode): 리사이즈 모드 설정
  22. turtle.tilt(angle): 거북이 모양 기울기 설정
  23. turtle.tiltangle(angle=None): 기울기 각도 설정/반환
  24. turtle.getpen(): 현재 펜 객체 반환
  25. turtle.getscreen(): 현재 화면 객체 반환
  26. turtle.colormode(cmode=None): 색상 모드 설정 (1.0 또는 255)
  27. turtle.getcanvas(): Tkinter 캔버스 객체 반환
  28. turtle.fill(True/False): 채우기 여부 설정

상태 관련 함수

  1. turtle.speed(speed): 거북이 속도 설정
  2. turtle.position(): 현재 좌표 반환
  3. turtle.heading(): 현재 방향 반환
  4. turtle.xcor(): x 좌표 반환
  5. turtle.ycor(): y 좌표 반환
  6. turtle.distance(x, y): 특정 좌표까지의 거리 계산
  7. turtle.isdown(): 펜이 내려갔는지 여부 확인
  8. turtle.isvisible(): 거북이가 보이는지 확인
  9. turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None): 거북이 크기 설정
  10. turtle.degrees(): 각도 단위를 도로 설정
  11. turtle.radians(): 각도 단위를 라디안으로 설정
  12. turtle.tiltangle(angle=None): 기울기 각도 설정 및 반환
  13. turtle.write_docstringdict(): 함수의 docstring 사전 저장
  14. turtle.ondrag(fun, btn=1): 드래그 이벤트 설정
  15. turtle.delay(): 터틀 움직임 지연 시간 설정 및 반환

모양 관련 함수

  1. turtle.shape(name): 거북이 모양 설정 ('arrow', 'turtle', 'circle', 'square', 'triangle', 'classic')
  2. turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None): 모양의 크기 조절
  3. turtle.get_shapepoly(): 현재 모양의 다각형 좌표 반환
  4. turtle.fillcolor(color): 도형의 채우기 색상 설정
  5. turtle.shape(name): 거북이의 모양 설정
  6. turtle.stamp(): 거북이 모양을 도장처럼 찍음
  7. turtle.clearstamp(stampid): 특정 도장 지우기
  8. turtle.clearstamps(n=None): n개 또는 모든 도장 지우기
  9. turtle.tilt(angle): 거북이 모양 회전
  10. turtle.tiltangle(angle): 기울기 각도 설정 및 반환
  11. turtle.get_shapepoly(): 현재 모양의 다각형 좌표 반환
  12. turtle.fill(True/False): 도형 채우기 여부 설정

화면 관련 함수

  1. turtle.bgcolor(color): 배경 색상 설정
  2. turtle.bgpic(picname): 배경 이미지 설정
  3. turtle.clear(): 화면의 그림 지우기
  4. turtle.clearscreen(): 화면 전체 초기화
  5. turtle.reset(): 모든 설정 초기화
  6. turtle.hideturtle(): 거북이 숨기기
  7. turtle.showturtle(): 거북이 보이기
  8. turtle.tracer(n=None, delay=None): 애니메이션 속도 조절
  9. turtle.update(): 화면 업데이트
  10. turtle.screensize(canvwidth=None, canvheight=None): 화면 크기 설정
  11. turtle.setup(width=0.5, height=0.75, startx=None, starty=None): 화면 창의 크기 설정
  12. turtle.title(title): 창 제목 설정
  13. turtle.window_width(): 창의 너비 반환
  14. turtle.window_height(): 창의 높이 반환
  15. turtle.delay(): 움직임 지연 설정
  16. turtle.exitonclick(): 클릭 시 창 닫기
  17. turtle.listen(): 이벤트 리스너 활성화
  18. turtle.mainloop(): 이벤트 루프 실행

이벤트 처리 및 기타 함수

  1. turtle.onclick(fun, btn=1): 클릭 이벤트 처리
  2. turtle.ondrag(fun, btn=1): 드래그 이벤트 처리
  3. turtle.onrelease(fun, btn=1): 마우스 버튼 해제 이벤트 처리
  4. turtle.onkey(fun, key): 특정 키보드 이벤트 처리
  5. turtle.listen(): 이벤트 리스너 활성화
  6. turtle.delay(delay=None): 애니메이션 지연 시간 설정
  7. turtle.bye(): 창 닫기
  8. turtle.mode(mode=None): 거북이 모드 설정 ('standard', 'logo')
  9. turtle.colormode(cmode=None): 색상 모드 설정 (1.0 또는 255)
  10. turtle.getcanvas(): Tkinter Canvas 객체 가져오기
  11. turtle.getshapes(): 사용할 수 있는 모든 모양 리스트 가져오기
  12. turtle.shearfactor(shear=None): 기울기 설정 및 반환
728x90
반응형
LIST
728x90
반응형
SMALL
# 원본 리스트 (내부에 리스트가 포함됨)
original_list = [1, [2, 3], 4]

# 깊은 복사 함수 정의
def deep_copy(obj):
    if isinstance(obj, list):
        # 리스트의 경우 요소를 새 리스트로 복사
        new_list = []
        for item in obj:
            new_list.append(deep_copy(item))  # 재귀적으로 요소를 복사
        return new_list
    else:
        # 리스트가 아닌 경우 (기본 자료형 등), 그대로 반환
        return obj

# 깊은 복사 수행
deep_copy_list = deep_copy(original_list)

# 원본과 복사본 출력
print("Original list:", original_list)
print("Deep copy:", deep_copy_list)

# 리스트 요소 변경 (깊이 1)
original_list[1][0] = 'A'

# 변경 후 출력
print("After deep copy, original list:", original_list)
print("After deep copy, deep copy:", deep_copy_list)

결과 설명:

  • deep_copy() 함수는 재귀적으로 리스트의 요소를 탐색하면서 모든 요소를 새로운 객체로 복사합니다.
  • 이 함수는 리스트를 인자로 받고, 리스트 내부의 모든 요소가 기본 자료형이 될 때까지 재귀적으로 호출하여 복사를 수행합니다.
  • original_list의 [2, 3] 부분은 새로운 리스트로 복사되어 deep_copy_list와 독립적인 객체가 됩니다.
  • 따라서 original_list를 변경해도 deep_copy_list에는 어떠한 영향도 미치지 않습니다.

실행 결과:

Original list: [1, [2, 3], 4]
Deep copy: [1, [2, 3], 4]
After deep copy, original list: [1, ['A', 3], 4]
After deep copy, deep copy: [1, [2, 3], 4]

이 예제에서는 copy 모듈을 사용하지 않고도 깊은 복사를 수행하는 간단한 방법을 구현했습니다. 하지만 파이썬의 copy.deepcopy() 함수는 이러한 복잡한 작업을 대신 처리해 주기 때문에 실제 프로덕션 환경에서는 copy 모듈을 사용하는 것이 좋습니다.

728x90
반응형
LIST
728x90
반응형
SMALL

파이썬에서 객체를 복사할 때 얕은 복사(shallow copy)와 깊은 복사(deep copy)의 개념이 중요합니다. 이 두 가지 복사 방법은 객체의 중첩 구조와 상호작용 방식에 따라 다릅니다.

 

얕은 복사 (Shallow Copy)

얕은 복사는 객체를 복사할 때, 원본 객체의 요소들을 새로운 객체에 복사하지만, 요소들이 참조하는 객체들은 원본과 동일한 객체를 참조합니다. 즉, 복사된 객체와 원본 객체는 같은 객체를 공유하게 됩니다.

파이썬에서는 copy 모듈의 copy() 함수나 객체의 copy() 메서드를 사용하여 얕은 복사를 수행할 수 있습니다.

 

import copy

# 원본 리스트
original_list = [1, [2, 3], 4]

# 얕은 복사
shallow_copy = copy.copy(original_list)

# 원본과 복사본 출력
print("Original list:", original_list)
print("Shallow copy:", shallow_copy)

# 리스트 요소 변경 (깊이 1)
original_list[1][0] = 'A'

# 변경 후 출력
print("After shallow copy, original list:", original_list)
print("After shallow copy, shallow copy:", shallow_copy)

결과 설명:

  • original_list는 [1, [2, 3], 4]로 초기화됩니다.
  • shallow_copy는 copy.copy(original_list)를 통해 얕은 복사가 수행됩니다.
  • original_list의 두 번째 요소인 [2, 3]는 내부 리스트입니다.
  • original_list[1][0]을 'A'로 변경하면, original_list와 shallow_copy 모두에 영향을 미칩니다.
  • 이는 얕은 복사에서는 내부 리스트가 동일한 객체를 참조하기 때문에 발생하는 현상입니다.

실행 결과:

Original list: [1, [2, 3], 4]
Shallow copy: [1, [2, 3], 4]
After shallow copy, original list: [1, ['A', 3], 4]
After shallow copy, shallow copy: [1, ['A', 3], 4]

 

깊은 복사 (Deep Copy)

깊은 복사는 객체와 그 객체가 참조하는 모든 객체들까지 완전히 새로운 객체로 복사하는 방법입니다. 따라서 원본 객체와 복사된 객체는 완전히 독립적인 객체가 됩니다.

깊은 복사는 copy 모듈의 deepcopy() 함수나 객체의 copy.deepcopy() 메서드를 사용하여 수행할 수 있습니다.

 

import copy

# 원본 리스트
original_list = [1, [2, 3], 4]

# 깊은 복사
deep_copy = copy.deepcopy(original_list)

# 원본과 복사본 출력
print("Original list:", original_list)
print("Deep copy:", deep_copy)

# 리스트 요소 변경 (깊이 1)
original_list[1][0] = 'A'

# 변경 후 출력
print("After deep copy, original list:", original_list)
print("After deep copy, deep copy:", deep_copy)

결과 설명:

  • original_list는 [1, [2, 3], 4]로 초기화됩니다.
  • deep_copy는 copy.deepcopy(original_list)를 통해 깊은 복사가 수행됩니다.
  • original_list[1][0]을 'A'로 변경하더라도, deep_copy에는 어떠한 영향도 미치지 않습니다.
  • 이는 깊은 복사에서는 내부 리스트까지 새로운 객체로 복사하기 때문에 발생하는 현상입니다.

실행 결과:

Original list: [1, [2, 3], 4]
Deep copy: [1, [2, 3], 4]
After deep copy, original list: [1, ['A', 3], 4]
After deep copy, deep copy: [1, [2, 3], 4]

요약

  • 얕은 복사는 객체의 내용을 새로운 객체에 복사하지만, 내부 객체들은 원본과 동일한 객체를 참조합니다.
  • 깊은 복사는 객체와 그 객체가 참조하는 모든 객체들까지 새로운 객체로 복사하여 완전히 독립적인 복사본을 생성합니다.
  • 객체의 중첩 구조가 복잡할 때는 깊은 복사를 사용하여 예기치 않은 부작용을 방지하는 것이 좋습니다.
728x90
반응형
LIST
728x90
반응형
SMALL

파이썬에서 리스트 슬라이싱(slicing)은 리스트의 부분 집합을 추출하는 강력하고 유연한 방법입니다. 리스트 슬라이스는 다음과 같은 문법을 따릅니다:

 

list[start:end:step]

여기서 각 부분은 다음과 같습니다:

  • start: 슬라이스의 시작 인덱스입니다. 이 위치의 요소는 포함됩니다.
  • end: 슬라이스의 종료 인덱스입니다. 이 위치의 요소는 포함되지 않습니다.
  • step (선택적): 슬라이스에서 요소를 가져오는 간격입니다. 기본값은 1입니다.

 

이제 몇 가지 예제를 통해 리스트 슬라이싱을 살펴보겠습니다.

예제 1: 기본적인 슬라이스

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 인덱스 2부터 5까지 (인덱스 5는 포함되지 않음)
slice1 = my_list[2:5]
print(slice1)  # 출력: [3, 4, 5]

my_list[2:5]는 인덱스 2부터 4까지의 요소를 포함합니다. 즉, [3, 4, 5]가 출력됩니다.

 

 

예제 2: 음수 인덱스 사용

음수 인덱스는 리스트의 끝에서부터 요소를 나타냅니다.

 

# 끝에서 4번째 요소부터 끝까지
slice2 = my_list[-4:]
print(slice2)  # 출력: [7, 8, 9, 10]

my_list[-4:]는 끝에서 4번째 요소부터 끝까지의 요소를 포함합니다. 따라서 [7, 8, 9, 10]이 출력됩니다.

 

예제 3: 간격(step) 사용

간격을 설정하여 일정한 간격으로 요소를 가져올 수 있습니다.

# 인덱스 1부터 8까지, 2씩 건너뛰기
slice3 = my_list[1:8:2]
print(slice3)  # 출력: [2, 4, 6, 8]

my_list[1:8:2]는 인덱스 1부터 7까지의 요소를 2씩 건너뛰며 가져옵니다. 따라서 [2, 4, 6, 8]이 출력됩니다.

 

예제 4: 리스트 전체 복사

슬라이스를 사용하여 리스트 전체를 복사할 수도 있습니다.

# 리스트 전체 복사
copy_of_list = my_list[:]
print(copy_of_list)  # 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

my_list[:]는 리스트 전체를 복사하여 새로운 리스트를 생성합니다. 따라서 my_list와 동일한 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]이 출력됩니다.

728x90
반응형
LIST
728x90
반응형
SMALL

bgm.wav
5.62MB
gunsound.mp3
0.04MB

from tkinter import *
import pygame

class GameSound:
	def __init__(self):
		window = Tk() # 윈도우 생성
		window.title("게임사운드") # 제목을 설정
		window.geometry("640x480") # 윈도우 크기 설정
		window.resizable(0,0)        
		
		
		self.canvas = Canvas(window, bg = "white")
		self.canvas.pack(expand=True,fill=BOTH)
		window.bind("<KeyPress>",self.keyPressHandler)
		window.bind("<KeyRelease>",self.keyReleaseHandler)

		#pygame 에서 music vs sound
		# music: 배경음악 재생을 위해 사용
		# sound: 효과음을 위해 사용

        #BG sound.
		pygame.init()
		pygame.mixer.music.load("bgm.wav") #Loading File Into Mixer
		pygame.mixer.music.play(-1) #Playing It In The Whole Device
		self.canvas.create_text(320,400,font="Times 15 italic bold",text="Sound Example")

		#Effect sound
		self.sounds = pygame.mixer
		self.sounds.init()
		self.s_effect1 = self.sounds.Sound("gunsound.mp3")
				
		while True:
			#
			window.after(33)
			window.update()

	def keyReleaseHandler(self, event):
		if event.keycode in self.keys:
		    self.keys.remove(event.keycode)

	def keyPressHandler(self, event):		
		self.s_effect1.play()
		self.keys.add(event.keycode)

GameSound()

 

코드 설명

  • pygame 모듈을 사용하기 위해 pygame을 import 한다.(line 2)
  • pygame을 사용하기 위해서는 pygame.init()함수를 호출해야한다.(line 21)
  • 위 코드에서 music.load(), music.play() 함수를 이용하여 배경음악을 무한반복 재생한다.(line 22, 23)
  • effect sound를 위해 sounds 를 초기화 한다.(line 28)
  • 이펙트 사운드 'gunsound.mp3'  파일을 읽고 sound 객체를 반환한다. sound 객체는 이펙트 사운드는 게임중 재생 및 멈춤을 컨트롤할 수 있다.
  • line 41에서 이펙트 사운드를 재생한다.

위 코드만으로 간단히 게임에서 필요한 음악 재생은 가능하며 좀 더 다양한 기능을 구현하기 위해서는 아래의 링크를 참조하기 바랍니다.

 

 

https://www.pygame.org/docs/ref/music.html

 

pygame.mixer.music — pygame v2.6.0 documentation

Resets playback of the current music to the beginning. If pause() has previously been used to pause the music, the music will remain paused. Note rewind() supports a limited number of file types and notably WAV files are NOT supported. For unsupported file

www.pygame.org

 

https://www.pygame.org/docs/ref/mixer.html

 

pygame.mixer — pygame v2.6.0 documentation

begin sound playback play(loops=0, maxtime=0, fade_ms=0) -> Channel Begin playback of the Sound (i.e., on the computer's speakers) on an available Channel. This will forcibly select a Channel, so playback may cut off a currently playing sound if necessary.

www.pygame.org

 

728x90
반응형
LIST
728x90
반응형
SMALL

아래의 음성 인식과 오디오 패키지를 설치한다.

 

pip install SpeechRecognition

pip install pyaudio

 

설치된 패키지를 활용한 파이썬 코드는 아래와 같다

import speech_recognition as sr

r = sr.Recognizer()
	
with sr.Microphone() as source:
    r.adjust_for_ambient_noise(source, duration=0.2)
    while True:
        try:
            print('listen...')

            #listens for the user's input
            user_audio = r.listen(source)

            # Using google to recognize audio
            #text = r.recognize_google(user_audio) # 영어
            text = r.recognize_google(user_audio, language='ko-KR') # 한글

            print("Did you say: ",text)

        except sr.RequestError as e:
            print("Could not request results; {0}".format(e))

        except sr.UnknownValueError:
            print("unknown error occurred")

 

음성인식 패키지는 모두 아래와 같이 13개의 음성인식 엔진 또는 API을 지원하고 4개가 오프라인으로 동작이 가능하다.

 

Speech recognition engine/API support:

 

추가로 오프라인 음성인식중 CMU Sphinx 를 사용해보자

pip install PocketSphinx

를 추가로 설치해야됨

 

그리고 위 코드에서 인식 부분을 r.recognize_sphinx(audio) 로 수정하면 완료된다.

(참고로 한국어 인식은 지원X)

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

대용량 파일을 읽기 위해서는 다양한 방법들이 있는데, 그중에서 메모리 매핑을 통하여 빠르게 접급하는 방법에 대해서 알아 보자.

 

먼저 예제 코드는 아래와 같다.

import mmap

def process(data):
	# 데이터 처리 로직
    pass

with open('large_file.txt', 'r+b') as f:
    mm = mmap.mmap(f.fileno(), 0)
    while True:
        line = mm.readline()
        if not line:
            break
        # 각 줄에 대한 처리
        process(line)
    mm.close()

 

첫줄에 mmap 를 사용할 것이라고 선언(import) 을 하는데 mmap 는 메모리 매핑(memory mapping)을 수행하는 모듈입니다. 장점은 메모리에 매핑된 데이터를 디스크에서 직접 읽어오기 때문에 디스크에서 메모리로 데이터 복사가 없습니다. 그러므로 대용량 처리를 가능하게 합니다.

 

그리고 open() 함수를 이용하여 파일 열기를 수행합니다.

 

다음으로 mmap()와 fileno() 함수를 이용하는데 이는 파일이 가지고 있는 식별자 즉 id(또는 파일 디스크립터)를 메모리에 연결시킵니다.

** 디스크립터(식별자 또는 id)는 파일이 열 때 운영체제로 부터 자동으로 할당되어짐

 

이제 디스크에 저장된 파일과 메모리 연결이 완료되었으니 readline()을 이용하여 한줄씩 접근하고 처리합니다.

 

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

프로세스 (Process)

  • 프로세스는 독립적으로 실행되는 프로그램의 인스턴스입니다. 각 프로세스는 별도의 메모리 공간과 리소스를 가진다.
  • 장점:
    • GIL의 영향을 받지 않아, 진정한 병렬 처리가 가능합니다.( GIL은 Global Interpreter Lock의 약어로, 여러 개의 스레드가 파이썬 바이트코드를 한번에 하나만 사용할 수 있게 락을 거는 것을 의미한다, 바이트 코드(Byte code)는 고급 언어로 작성된 소스 코드를 가상머신 이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다.)
    • 프로세스 간의 격리로 인해 하나의 프로세스에서 발생한 오류가 다른 프로세스에 영향을 주지 않습니다.(상호독립적으로 구성)
  • 단점:
    • 프로세스 간 통신(IPC, Inter-Process Communication)이 상대적으로 복잡하고 느립니다.
    • 메모리 사용량이 더 많습니다.

스레드 (Thread)

  • 정의: 스레드는 동일한 프로세스 내에서 실행되는 가벼운 단위입니다. 스레드들은 같은 메모리 공간을 공유합니다.
  • 장점:
    • 메모리 공유로 인한 효율적인 자원 사용.
    • 스레드 간 통신이 빠르고 간단합니다.
  • 단점:
    • GIL(Global Interpreter Lock)로 인해, 진정한 병렬 처리가 어렵습니다. (특히 CPU 바운드 작업에서)
    • 하나의 스레드에서 발생한 오류가 전체 프로세스에 영향을 줄 수 있습니다.

 

멀티스레딩 예지

import threading
import time

def print_numbers():
    for i in range(1, 6):
        print(f"Number: {i}")
        time.sleep(1)

def print_letters():
    for letter in ['A', 'B', 'C', 'D', 'E']:
        print(f"Letter: {letter}")
        time.sleep(1.5)

thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

thread1.start()
thread2.start()

thread1.join()
thread2.join()

print("All threads are done!")

 

멀티프로세싱 예제

import multiprocessing
import time

def print_numbers():
    for i in range(1, 6):
        print(f"Number: {i}")
        time.sleep(1)

def print_letters():
    for letter in ['A', 'B', 'C', 'D', 'E']:
        print(f"Letter: {letter}")
        time.sleep(1.5)

process1 = multiprocessing.Process(target=print_numbers)
process2 = multiprocessing.Process(target=print_letters)

process1.start()
process2.start()

process1.join()
process2.join()

print("All processes are done!")

주요 차이점 요약

  • 메모리 공유: 스레드는 같은 메모리를 공유하지만, 프로세스는 별도의 메모리를 사용합니다.
  • GIL의 영향: 스레드는 GIL의 영향을 받으며, CPU 바운드 작업에서 성능이 제한될 수 있습니다. 반면, 프로세스는 GIL의 영향을 받지 않습니다.
  • 안정성: 프로세스는 서로 격리되어 있어 하나의 프로세스 오류가 다른 프로세스에 영향을 주지 않습니다.
  • 통신 방법: 스레드는 간단하고 빠른 통신이 가능하지만, 프로세스는 복잡하고 느린 통신을 사용합니다.

적절한 방법을 선택하는 것은 작업의 특성에 따라 다르며, I/O 바운드 작업에는 스레드를, CPU 바운드 작업에는 프로세스를 사용하는 것이 일반적입니다.

 

I/O 바운드: 입출력 작업이 많은 프로세스

CPU 바운드: 입출력 작업보다 연산작업이 많은 프로세스

728x90
반응형
LIST

+ Recent posts