티스토리 뷰

반응형

 

 

다음과 같이 챗지피티(ChatGPT)를 켜고 

 

"

pygame으로 아래와 같은 조건의 간단한 리듬 게임을 만들어줘

 

1. S,D,F,J,K,L 키를 이용함
2. 음악의 bpm 변수에 따라서 박자에 맞게 노트를 생성함
3. 노트 가로는 100으로 해주고 노트의 세로는 20으로 해줘
4. S,L 노트는 흰색으로, D,K 노트는 노란색으로 F,J노트는 핑크색으로 해줘
5. 화면 맨 아래에 판정라인을 빨간색 바로 그려줘 두께는 노트의 세로보다 0.5cm정도 두껍게 - 해당 라인의 일부라도 노트가 겹쳐있을때 해당 노트에 맞는 키를 치면 점수 증가
6. 배경은 어두운 회색으로 해주고 노트와 노트 사이에 일정한 간격으로 구분선 넣어줘 (밝은 회색)
7. 노트별로 노트가 생성되는 부분 위쪽에 해당 노트의(S,D,F,J,K,L) 텍스트 넣어줘
8. 점수판은 우측 상단에

"

 

라는 내용의 명령을 주면 코드를 만들어 줍니다. (만들고자 하는 리듬게임을 그냥 두루뭉술하게 "pygame으로 리듬게임 만들어줘" 보다는 비교적 간결한 문장으로 자세한 디테일까지 명시해주면 내가 원하는 대로 게임을 만들어줄 확률이 큽니다)

 

위 명령어 입력 시 챗gpt에서 만들어준 코드는 다음과 같아요.

 

--------------------------------

import pygame
import random

# 초기 설정
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("리듬 게임")

# 색상 정의
DARK_GRAY = (50, 50, 50)
LIGHT_GRAY = (150, 150, 150)
WHITE = (255, 255, 255)
YELLOW = (255, 255, 0)
PINK = (255, 105, 180)
RED = (255, 0, 0)

# FPS 설정
clock = pygame.time.Clock()
FPS = 60

# 키 설정 및 색상 매핑
KEYS = {pygame.K_s: (100, WHITE), pygame.K_d: (200, YELLOW), pygame.K_f: (300, PINK),
        pygame.K_j: (400, PINK), pygame.K_k: (500, YELLOW), pygame.K_l: (600, WHITE)}

# 노트 클래스
target_y = 500  # 키를 눌러야 하는 위치
note_width = 100   # 노트 가로 크기
note_height = 20  # 노트 세로 크기
bpm = 120  # BPM 설정
beat_interval = 60 / bpm * FPS  # 박자 간격
hit_margin = 10  # 오차 허용 범위 (1cm 정도로 설정)
panel_thickness = note_height + 5  # 판정 라인의 두께 (0.5cm 더 두껍게 설정)

class Note:
    def __init__(self, x, color, speed):
        self.x = x
        self.y = 0
        self.color = color
        self.speed = speed
        self.hit = False

    def move(self):
        self.y += self.speed

    def draw(self):
        pygame.draw.rect(screen, self.color, (self.x, self.y, note_width, note_height))

    def check_hit(self, key_x):
        if target_y - note_height <= self.y <= target_y + panel_thickness:  # 오차 허용
            if abs(self.x - key_x) < 50:
                self.hit = True
                return True
        return False

# 게임 변수
notes = []
score = 0
running = True
frame_count = 0

# 배경 음악 추가
pygame.mixer.init()
pygame.mixer.music.load("your_music_file.mp3")  # 음악 파일 경로
pygame.mixer.music.play(-1)  # 반복 재생

# 게임 루프
while running:
    screen.fill(DARK_GRAY)
   
    # 노트 라인 그리기 및 노트명 표시
    font = pygame.font.Font(None, 36)
    note_labels = ['S', 'D', 'F', 'J', 'K', 'L']
    keys_positions = list(KEYS.values())
   
    for i, (key, color) in enumerate(keys_positions):
        pygame.draw.line(screen, LIGHT_GRAY, (key, 0), (key, HEIGHT), 2)  # 노트 좌우 구분선
        text = font.render(note_labels[i], True, WHITE)
        screen.blit(text, (key + 10, 20))
   
    # 일정한 간격으로 구분선 추가
    for i in range(WIDTH // 100):
        pygame.draw.line(screen, LIGHT_GRAY, (i * 100, 0), (i * 100, HEIGHT), 1)
   
    # 판정 라인 그리기 (노트 크기보다 0.5cm 두껍게 설정)
    pygame.draw.rect(screen, RED, (50, target_y, WIDTH - 100, panel_thickness))
   
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key in KEYS:
                for note in notes:
                    if note.check_hit(KEYS[event.key][0]):
                        score += 10
   
    # 박자에 맞게 노트 생성
    if frame_count % beat_interval < 1:
        key, color = random.choice(list(KEYS.values()))
        notes.append(Note(key, color, 5))
   
    # 노트 이동 및 그리기
    for note in notes:
        note.move()
        note.draw()
   
    # 점수 표시 (우측 상단)
    score_text = font.render(f"Score: {score}", True, WHITE)
    screen.blit(score_text, (WIDTH - 150, 10))
   
    pygame.display.flip()
    clock.tick(FPS)
    frame_count += 1

pygame.quit()

-----------------------------------------

 

 

위 코드를 이용해 음악에 맞는 알맞은 박자로 노트가 떨어지는 리듬게임으로 완성하고 싶으면

내가 삽입하고자 하는 음악을 선택하고 해당 음악의 bpm을 알아놔야 합니다.

 

음원(mp3파일)파일을  https://vocalremover.org/ko/key-bpm-finder 사이트에 넣고 bpm을 확인합니다

(대략 노래 bpm찾는 사이트 인터넷에 검색하면 여러군데 나옴)

 

파일 선택

 

bpm 확인 (해당 음악은 114)

 

 

이제 확인된 음악 파일을 해당 코드가 있는 디렉토리 내에 넣어주고, 코드 내에 음악파일명을 해당 음악파일 명으로 교체해주며 bpm변수에도 해당 음악파일의 bpm숫자를 넣어줍니다. 

----------

bpm = 120  # BPM 설정

----------

위 부분 bpm=114로 정정할것

 

 

------------

pygame.mixer.music.load("your_music_file.mp3")  # 음악 파일 경로

-------------

위 부분 "your_music_file.mp3"를 다운받은 음악파일명인 "Britney Spears - Gimme More (Lyrics).mp3"로 정정

 

 

[수정된 최종 코드]

----------rhythmgame.py----------------------

import pygame
import random

# 초기 설정
pygame.init()

# 화면 설정
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("리듬 게임")

# 색상 정의
DARK_GRAY = (50, 50, 50)
LIGHT_GRAY = (150, 150, 150)
WHITE = (255, 255, 255)
YELLOW = (255, 255, 0)
PINK = (255, 105, 180)
RED = (255, 0, 0)

# FPS 설정
clock = pygame.time.Clock()
FPS = 60

# 키 설정 및 색상 매핑
KEYS = {pygame.K_s: (100, WHITE), pygame.K_d: (200, YELLOW), pygame.K_f: (300, PINK),
        pygame.K_j: (400, PINK), pygame.K_k: (500, YELLOW), pygame.K_l: (600, WHITE)}

# 노트 클래스
target_y = 500  # 키를 눌러야 하는 위치
note_width = 100   # 노트 가로 크기
note_height = 20  # 노트 세로 크기
bpm =114  # BPM 설정
beat_interval = 60 / bpm * FPS  # 박자 간격
hit_margin = 10  # 오차 허용 범위 (1cm 정도로 설정)
panel_thickness = note_height + 5  # 판정 라인의 두께 (0.5cm 더 두껍게 설정)

class Note:
    def __init__(self, x, color, speed):
        self.x = x
        self.y = 0
        self.color = color
        self.speed = speed
        self.hit = False

    def move(self):
        self.y += self.speed

    def draw(self):
        pygame.draw.rect(screen, self.color, (self.x, self.y, note_width, note_height))

    def check_hit(self, key_x):
        if target_y - note_height <= self.y <= target_y + panel_thickness:  # 오차 허용
            if abs(self.x - key_x) < 50:
                self.hit = True
                return True
        return False

# 게임 변수
notes = []
score = 0
running = True
frame_count = 0

# 배경 음악 추가
pygame.mixer.init()
pygame.mixer.music.load("Britney Spears - Gimme More (Lyrics).mp3")  # 음악 파일 경로
pygame.mixer.music.play(-1)  # 반복 재생

# 게임 루프
while running:
    screen.fill(DARK_GRAY)
   
    # 노트 라인 그리기 및 노트명 표시
    font = pygame.font.Font(None, 36)
    note_labels = ['S', 'D', 'F', 'J', 'K', 'L']
    keys_positions = list(KEYS.values())
   
    for i, (key, color) in enumerate(keys_positions):
        pygame.draw.line(screen, LIGHT_GRAY, (key, 0), (key, HEIGHT), 2)  # 노트 좌우 구분선
        text = font.render(note_labels[i], True, WHITE)
        screen.blit(text, (key + 10, 20))
   
    # 일정한 간격으로 구분선 추가
    for i in range(WIDTH // 100):
        pygame.draw.line(screen, LIGHT_GRAY, (i * 100, 0), (i * 100, HEIGHT), 1)
   
    # 판정 라인 그리기 (노트 크기보다 0.5cm 두껍게 설정)
    pygame.draw.rect(screen, RED, (50, target_y, WIDTH - 100, panel_thickness))
   
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key in KEYS:
                for note in notes:
                    if note.check_hit(KEYS[event.key][0]):
                        score += 10
   
    # 박자에 맞게 노트 생성
    if frame_count % beat_interval < 1:
        key, color = random.choice(list(KEYS.values()))
        notes.append(Note(key, color, 5))
   
    # 노트 이동 및 그리기
    for note in notes:
        note.move()
        note.draw()
   
    # 점수 표시 (우측 상단)
    score_text = font.render(f"Score: {score}", True, WHITE)
    screen.blit(score_text, (WIDTH - 150, 10))
   
    pygame.display.flip()
    clock.tick(FPS)
    frame_count += 1

pygame.quit()

-----------------------------------------

 

 

해당 코드 및 음악파일이 들어있는 폴더구조 및 사용된 mp3파일

 

 

Britney Spears - Gimme More (Lyrics).mp3
5.70MB

 

 

 

이제 직접 리듬게임을 실행시켜볼까요?

리듬게임 실행화면

 

위는 움짤이라 음악이 안나오지만 직접 pygame이 깔린 파이썬 환경에서 실행시켜보면 해당 음원이 나오며, 나오는 음악의 박자에 맞게 노트를 치면 점수가 올라가는 리듬게임이 실행될 것입니다 ^^

반응형