大数跨境
0
0

python写一个俄罗斯方块小游戏

python写一个俄罗斯方块小游戏 橙子好甜
2025-05-16
2
导读:小时候,最期待的就是拥有一台掌机,而《俄罗斯方块》几乎是每一台掌机的标配游戏。看着屏幕上的方块一个个落下,紧张又兴奋,仿佛整个世界都浓缩在那小小的屏幕上。
      小时候,最期待的就是拥有一台掌机,而《俄罗斯方块》几乎是每一台掌机的标配游戏。看着屏幕上的方块一个个落下,紧张又兴奋,仿佛整个世界都浓缩在那小小的屏幕上。
模块安装
pip install pygame
代码实现
import pygameimport random
# 初始化pygame.init()
# 颜色定义BLACK = (000)WHITE = (255255255)GRAY = (128128128)COLORS = [    (0255255),  # I - 青色    (00255),    # J - 蓝色    (2551650),  # L - 橙色    (2552550),  # O - 黄色    (02550),    # S - 绿色    (1280128),  # T - 紫色    (25500)     # Z - 红色]
# 游戏设置CELL_SIZE = 30GRID_WIDTH = 10GRID_HEIGHT = 20SCREEN_WIDTH = CELL_SIZE * (GRID_WIDTH + 6)SCREEN_HEIGHT = CELL_SIZE * GRID_HEIGHTGAME_AREA_LEFT = CELL_SIZE
# 方块形状定义SHAPES = [    [[1111]],  # I
    [[100],     [111]],     # J
    [[001],     [111]],     # L
    [[11],     [11]],        # O
    [[011],     [110]],     # S
    [[010],     [111]],     # T
    [[110],     [011]]      # Z]
# 创建游戏窗口screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption("俄罗斯方块")
clock = pygame.time.Clock()
class Tetris:    def __init__(self):        self.grid = [[0 for _ in range(GRID_WIDTH)] for _ in range(GRID_HEIGHT)]        self.current_piece = self.new_piece()        self.game_over = False        self.paused = False  # 暂停状态        self.score = 0        self.level = 1        self.fall_speed = 0.5  # 秒        self.fall_time = 0
    def new_piece(self):        # 随机选择一个方块        shape = random.choice(SHAPES)        color = COLORS[SHAPES.index(shape)]
        # 初始位置 (顶部中间)        x = GRID_WIDTH // 2 - len(shape[0]) // 2        y = 0
        return {"shape": shape, "color": color, "x": x, "y": y}
    def valid_move(self, piece, x_offset=0, y_offset=0):        for y, row in enumerate(piece["shape"]):            for x, cell in enumerate(row):                if cell:                    new_x = piece["x"] + x + x_offset                    new_y = piece["y"] + y + y_offset
                    if (new_x < 0 or new_x >= GRID_WIDTH or                         new_y >= GRID_HEIGHT or                         (new_y >= 0 and self.grid[new_y][new_x])):                        return False        return True
    def rotate_piece(self):        # 转置矩阵然后反转每一行来实现旋转        piece = self.current_piece.copy()        shape = piece["shape"]        rows = len(shape)        cols = len(shape[0])
        # 旋转矩阵        rotated = [[shape[rows-1-j][i] for j in range(rows)] for i in range(cols)]
        old_shape = piece["shape"]        piece["shape"] = rotated
        if not self.valid_move(piece):            piece["shape"] = old_shape
        self.current_piece = piece
    def lock_piece(self):        for y, row in enumerate(self.current_piece["shape"]):            for x, cell in enumerate(row):                if cell:                    self.grid[self.current_piece["y"] + y][self.current_piece["x"] + x] = self.current_piece["color"]
        # 检查是否有完整的行        self.clear_lines()
        # 创建新方块        self.current_piece = self.new_piece()
        # 检查游戏是否结束        if not self.valid_move(self.current_piece):            self.game_over = True
    def clear_lines(self):        lines_cleared = 0        for y in range(GRID_HEIGHT):            if all(self.grid[y]):                lines_cleared += 1                # 移动上面的行下来                for y2 in range(y, 0, -1):                    self.grid[y2] = self.grid[y2-1].copy()                self.grid[0] = [0 for _ in range(GRID_WIDTH)]
        # 更新分数        if lines_cleared == 1:            self.score += 100 * self.level        elif lines_cleared == 2:            self.score += 300 * self.level        elif lines_cleared == 3:            self.score += 500 * self.level        elif lines_cleared == 4:            self.score += 800 * self.level
        # 更新等级 (每清除10行升一级)        self.level = 1 + self.score // 10000        self.fall_speed = max(0.050.5 - (self.level - 1) * 0.05)
    def update(self, delta_time):        if self.game_over or self.paused:            return
        self.fall_time += delta_time
        if self.fall_time >= self.fall_speed:            self.fall_time = 0            if self.valid_move(self.current_piece, 01):                self.current_piece["y"] += 1            else:                self.lock_piece()
    def draw(self):        # 绘制游戏区域背景        pygame.draw.rect(screen, GRAY, (GAME_AREA_LEFT, 0, GRID_WIDTH * CELL_SIZE, GRID_HEIGHT * CELL_SIZE))        pygame.draw.rect(screen, BLACK, (GAME_AREA_LEFT, 0, GRID_WIDTH * CELL_SIZE, GRID_HEIGHT * CELL_SIZE), 2)
        # 绘制网格线        for x in range(GRID_WIDTH + 1):            pygame.draw.line(screen, GRAY,                             (GAME_AREA_LEFT + x * CELL_SIZE, 0),                             (GAME_AREA_LEFT + x * CELL_SIZE, GRID_HEIGHT * CELL_SIZE))        for y in range(GRID_HEIGHT + 1):            pygame.draw.line(screen, GRAY,                             (GAME_AREA_LEFT, y * CELL_SIZE),                             (GAME_AREA_LEFT + GRID_WIDTH * CELL_SIZE, y * CELL_SIZE))
        # 绘制已固定的方块        for y in range(GRID_HEIGHT):            for x in range(GRID_WIDTH):                if self.grid[y][x]:                    pygame.draw.rect(screen, self.grid[y][x],                                     (GAME_AREA_LEFT + x * CELL_SIZE + 1                                     y * CELL_SIZE + 1                                     CELL_SIZE - 2, CELL_SIZE - 2))
        # 绘制当前移动的方块        if not self.game_over:            for y, row in enumerate(self.current_piece["shape"]):                for x, cell in enumerate(row):                    if cell:                        pygame.draw.rect(screen, self.current_piece["color"],                                         (GAME_AREA_LEFT + (self.current_piece["x"] + x) * CELL_SIZE + 1                                         (self.current_piece["y"] + y) * CELL_SIZE + 1                                         CELL_SIZE - 2, CELL_SIZE - 2))
        # 绘制分数和等级        font = pygame.font.SysFont(None36)        score_text = font.render(f"分数: {self.score}"True, WHITE)        level_text = font.render(f"等级: {self.level}"True, WHITE)        screen.blit(score_text, (GAME_AREA_LEFT + GRID_WIDTH * CELL_SIZE + 2030))        screen.blit(level_text, (GAME_AREA_LEFT + GRID_WIDTH * CELL_SIZE + 2070))
        # 绘制暂停提示        if self.paused:            font = pygame.font.SysFont(None48)            pause_text = font.render("已暂停"True, WHITE)            screen.blit(pause_text, (GAME_AREA_LEFT + GRID_WIDTH * CELL_SIZE // 2 - 60                                   GRID_HEIGHT * CELL_SIZE // 2 - 30))
        # 游戏结束提示        if self.game_over:            font = pygame.font.SysFont(None48)            game_over_text = font.render("游戏结束!"True, (25500))            restart_text = font.render("按R键重新开始"True, WHITE)            screen.blit(game_over_text, (GAME_AREA_LEFT + GRID_WIDTH * CELL_SIZE // 2 - 100                                       GRID_HEIGHT * CELL_SIZE // 2 - 60))            screen.blit(restart_text, (GAME_AREA_LEFT + GRID_WIDTH * CELL_SIZE // 2 - 120                                     GRID_HEIGHT * CELL_SIZE // 2))
# 创建游戏实例game = Tetris()
# 游戏主循环running = Truewhile running:    delta_time = clock.tick(60) / 1000.0  # 转换为秒
    # 处理事件    for event in pygame.event.get():        if event.type == pygame.QUIT:            running = False
        if event.type == pygame.KEYDOWN:            if event.key == pygame.K_p:  # 按P键暂停/继续                if not game.game_over:                    game.paused = not game.paused
            if event.key == pygame.K_r and game.game_over:  # 按R键重新开始                game = Tetris()
            if not game.game_over and not game.paused:                if event.key == pygame.K_LEFT and game.valid_move(game.current_piece, -10):                    game.current_piece["x"] -= 1                elif event.key == pygame.K_RIGHT and game.valid_move(game.current_piece, 10):                    game.current_piece["x"] += 1                elif event.key == pygame.K_DOWN and game.valid_move(game.current_piece, 01):                    game.current_piece["y"] += 1                elif event.key == pygame.K_UP:                    game.rotate_piece()                elif event.key == pygame.K_SPACE:  # 硬降落                    while game.valid_move(game.current_piece, 01):                        game.current_piece["y"] += 1                    game.lock_piece()
    # 更新游戏状态 - 只在未暂停且未结束时更新    game.update(delta_time)
    # 绘制    screen.fill(BLACK)    game.draw()    pygame.display.flip()
pygame.quit()
运行结果

 游戏功能说明

1.基本游戏机制

    • 7种经典俄罗斯方块形状

    • 方块自动下落

    • 左右移动和旋转控制(左移方向键、右移方向键、向上方向键)

    • 快速下落(空格键)

    • 行消除和分数计算

    • 随着分数增加难度提升

2.按钮功能

 暂停功能

    • 按 P 键可以暂停/继续游戏

    • 暂停时会显示"已暂停"提示

    • 暂停时方块停止下落,不接受任何操作


重新开始功能

    • 游戏结束后按 R 键可以重新开始游戏

    • 重新初始化所有游戏状态

游戏状态管理
      • 游戏有三种状态:运行中、暂停、结束

      • 每种状态下只接受特定的按键操作

    3.操作说明

    • ← → 键:左右移动方块

    • ↑ 键:旋转方块

    • ↓ 键:加速下落

    • 空格键:直接落到底部

    • P 键:暂停/继续游戏

    • R 键:游戏结束后重新开始

    4.计分系统

      • 消除1行: 100分 × 当前等级

      • 消除2行: 300分 × 当前等级

      • 消除3行: 500分 × 当前等级

      • 消除4行: 800分 × 当前等级

    【声明】内容源于网络
    0
    0
    橙子好甜
    人生苦短,我用python --it测试狗
    内容 30
    粉丝 0
    橙子好甜 人生苦短,我用python --it测试狗
    总阅读0
    粉丝0
    内容30