TETRIS.PY
0.00MB

 

      import pygame
import random

# Define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (128, 128, 128)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
CYAN = (0, 255, 255)
MAGENTA = (255, 0, 255)
ORANGE = (255, 165, 0)

# Define shapes
SHAPES = [
    [[1, 1, 1, 1]],  # I
    [[1, 1], [1, 1]],  # O
    [[0, 1, 1], [1, 1, 0]],  # S
    [[1, 1, 0], [0, 1, 1]],  # Z
    [[1, 0, 0], [1, 1, 1]],  # J
    [[0, 0, 1], [1, 1, 1]],  # L
    [[0, 1, 0], [1, 1, 1]]   # T
]

COLORS = [CYAN, YELLOW, GREEN, RED, BLUE, ORANGE, MAGENTA]


class Tetris:
    def __init__(self, width, height):
        self.width = width
        self.height = height
        self.grid = [[0 for _ in range(width)] for _ in range(height)]
        self.current_piece = None
        self.current_x = 0
        self.current_y = 0
        self.game_over = False
        self.score = 0
        self.speed = 1  # Adjust for game speed
        self.current_color_index = 0

    def new_piece(self):
        self.current_piece = random.choice(SHAPES)
        self.current_x = self.width // 2 - len(self.current_piece[0]) // 2
        self.current_y = 0
        self.current_color_index = SHAPES.index(self.current_piece)

        if self.is_collision(self.current_piece, self.current_x, self.current_y):
            self.game_over = True

    def rotate_piece(self):
        rotated_piece = list(zip(*self.current_piece[::-1]))
        if not self.is_collision(rotated_piece, self.current_x, self.current_y):
            self.current_piece = rotated_piece
            try:
                self.current_color_index = SHAPES.index(self.current_piece)
            except ValueError:
                self.current_color_index = 0

    def move(self, dx):
        if self.is_collision(self.current_piece, self.current_x + dx, self.current_y):
            return
        self.current_x += dx

    def drop(self):
        if self.is_collision(self.current_piece, self.current_x, self.current_y + 1):
            self.lock_piece()
            return True
        self.current_y += 1
        return False

    def lock_piece(self):
        for y in range(len(self.current_piece)):
            for x in range(len(self.current_piece[0])):
                if self.current_piece[y][x]:
                    self.grid[self.current_y + y][self.current_x + x] = 1
        self.clear_lines()
        self.new_piece()

    def is_collision(self, piece, x, y):
        for py in range(len(piece)):
            for px in range(len(piece[0])):
                if piece[py][px]:
                    grid_x = x + px
                    grid_y = y + py
                    if grid_x < 0 or grid_x >= self.width or grid_y >= self.height:
                        return True
                    if self.grid[grid_y][grid_x]:
                        return True
        return False

    def clear_lines(self):
        lines_cleared = 0
        for y in range(self.height):
            if all(self.grid[y]):
                del self.grid[y]
                self.grid.insert(0, [0 for _ in range(self.width)])
                lines_cleared += 1

        if lines_cleared > 0:
            self.score += lines_cleared ** 2 * 100

    def draw(self, screen):
        for y in range(self.height):
            for x in range(self.width):
                if self.grid[y][x]:
                    pygame.draw.rect(screen, GRAY, (x * 30, y * 30, 30, 30), 0)

        if self.current_piece:
            for y in range(len(self.current_piece)):
                for x in range(len(self.current_piece[0])):
                    if self.current_piece[y][x]:
                        pygame.draw.rect(screen, COLORS[self.current_color_index],
                                         ((self.current_x + x) * 30, (self.current_y + y) * 30, 30, 30), 0)

        font = pygame.font.Font(None, 36)
        score_text = font.render(f"Score: {self.score}", True, WHITE)
        screen.blit(score_text, (10, 10))

        if self.game_over:
            game_over_text = font.render("Game Over!", True, RED)
            text_rect = game_over_text.get_rect(center=(self.width * 30 // 2, self.height * 30 // 2))
            screen.blit(game_over_text, text_rect)


def main():
    pygame.init()
    width = 10
    height = 20
    screen_width = width * 30
    screen_height = height * 30
    screen = pygame.display.set_mode((screen_width, screen_height))
    pygame.display.set_caption("Tetris")

    game = Tetris(width, height)
    game.new_piece()

    clock = pygame.time.Clock()
    fall_time = 0
    fall_speed = 500

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    game.move(-1)
                if event.key == pygame.K_RIGHT:
                    game.move(1)
                if event.key == pygame.K_DOWN:
                    game.drop()
                if event.key == pygame.K_UP:
                    game.rotate_piece()

        fall_time += clock.get_rawtime()
        if fall_time > fall_speed:
            fall_time = 0
            game.drop()

        if game.game_over:
            running = False

        screen.fill(BLACK)
        game.draw(screen)
        pygame.display.flip()

        clock.tick(60)

    pygame.quit()


if __name__ == "__main__":
    main()
    

 

콘트롤 : 방향 키 , 왼쪽, 오른쪽, 아래

블록 변환 : 방향 키 위

 

2025.03.14 - [파이썬 프로그래밍] - 3.파이썬 프로그래밍 Copilot 연동 가능한 비주얼 스튜디오 코드 다운로드해서 설치하기

 

3.파이썬 프로그래밍 Copilot 연동 가능한 비주얼 스튜디오 코드 다운로드해서 설치하기

텍스트 에디터 : 비주얼 스튜디오 코드 현업에서 많이 사용하는 여러 텍스트 에디터 중에서 일반적으로 많이 사용하는 텍스트 에디터 중에 비주얼 스튜디오 코드 라는 프로그램을 설치해 보

suncommq.tistory.com

 

반응형
LIST
 



파이썬 기초 게임 코딩하기

 

1. 파이썬 액션 게임 코드 (Pygame 기반)

아래는 pygame 라이브러리를 활용한 액션 게임 예제입니다. 플레이어가 버튼(키보드 입력)을 이용해 캐릭터를 움직이고 적을 회피하는 간단한 액션 메커니즘을 포함합니다.

 

코드:

 

import pygame
import random


# 초기화
pygame.init()


# 화면 설정
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("액션 게임")
clock = pygame.time.Clock()


# 색상
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)


# 플레이어 설정
player_size = 50
player_pos = [screen_width // 2, screen_height - player_size * 2]
player_speed = 10


# 적 설정
enemy_size = 50
enemy_pos = [random.randint(0, screen_width - enemy_size), 0]
enemy_speed = 7


# 게임 루프
running = True
while running:
    screen.fill(WHITE)


    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False


    # 키 입력 처리
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and player_pos[0] > 0:
        player_pos[0] -= player_speed
    if keys[pygame.K_RIGHT] and player_pos[0] < screen_width - player_size:
        player_pos[0] += player_speed
    if keys[pygame.K_UP] and player_pos[1] > 0:
        player_pos[1] -= player_speed
    if keys[pygame.K_DOWN] and player_pos[1] < screen_height - player_size:
        player_pos[1] += player_speed


    # 적 이동
    enemy_pos[1] += enemy_speed
    if enemy_pos[1] > screen_height:
        enemy_pos[0] = random.randint(0, screen_width - enemy_size)
        enemy_pos[1] = 0


    # 충돌 처리
    if (enemy_pos[0] < player_pos[0] < enemy_pos[0] + enemy_size or enemy_pos[0] < player_pos[0] + player_size < enemy_pos[0] + enemy_size) and (enemy_pos[1] < player_pos[1] < enemy_pos[1] + enemy_size or enemy_pos[1] < player_pos[1] + player_size < enemy_pos[1] + enemy_size):
        print("Game Over")
        running = False


    # 화면 그리기
    pygame.draw.rect(screen, BLUE, (player_pos[0], player_pos[1], player_size, player_size))
    pygame.draw.rect(screen, RED, (enemy_pos[0], enemy_pos[1], enemy_size, enemy_size))


    pygame.display.flip()
    clock.tick(30)


pygame.quit()

 

 

 

 

파이썬은 간단한 코드로 복잡한 게임을 만들 수 있는 강력한 도구입니다. 특히 pygame 라이브러리를 활용하면 실제로 조작 가능한 액션 게임을 쉽고 빠르게 개발할 수 있습니다. 이 블로그에서는 초보자와 중급 개발자를 위한 고급스러운 액션 게임을 구현하며, 플레이어와 적의 움직임, 충돌 처리, 키보드 입력 등을 다룹니다.

 

주요 특징:

 

  • 플레이어 조작: 키보드를 사용해 실시간으로 캐릭터를 움직일 수 있음.

 

  • 적 생성 및 충돌 처리: 적을 생성하고, 충돌 시 게임 종료.

 

  • 버튼 설정 가능: 좌/우/상/하 방향키로 자유로운 이동.

 

 

 

 

 사용자가 예상할 수 있는 주요 오류 사항

코드를 실행하기 전에, 사용자가 자주 겪을 수 있는 문제와 해결 방법을 정리했습니다:

 

1. pygame 모듈 설치 오류

문제: "ModuleNotFoundError: No module named 'pygame'"

 

원인: pygame 라이브러리가 설치되지 않음.

 

해결 방법:

 

 

pip install pygame

 

2. 해상도 관련 충돌

문제: 창 크기(screen_width, screen_height)를 초과하는 값으로 캐릭터나 적을 배치했을 때.

 

해결 방법: 값 설정 시 화면 크기를 초과하지 않도록 제한.

 

3. 충돌 검사 오류

문제: 충돌 로직(if 조건)이 제대로 작동하지 않음.

 

원인: enemy_pos와 player_pos 좌표 계산 실수.

 

해결 방법: 항상 좌표와 크기 값을 정확히 확인하고 테스트할 것.

 

4. 프레임 속도 관련 렉

문제: clock.tick(30)을 조정하지 않으면 게임이 너무 빠르거나 느리게 작동.

 

해결 방법: 적절한 FPS 값을 설정(권장: 30~60).

 



반응형
LIST

+ Recent posts