Python——俄罗斯方块

俄罗斯方块游戏是一款经典的益智游戏,通常使用编程语言Python来实现。下面是一个简单的俄罗斯方块游戏的示例代码:

python 复制代码
import pygame
import random

# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
CYAN = (0, 255, 255)
MAGENTA = (255, 0, 255)
YELLOW = (255, 255, 0)
ORANGE = (255, 165, 0)

# 定义方块的形状
SHAPES = [
    [[1, 1, 1, 1]],
    [[1, 1], [1, 1]],
    [[1, 1, 0], [0, 1, 1]],
    [[0, 1, 1], [1, 1, 0]],
    [[1, 0, 0], [1, 1, 1]],
    [[0, 0, 1], [1, 1, 1]],
    [[1, 1, 1], [0, 1, 0]]
]

# 初始化游戏
pygame.init()

# 设置屏幕宽高
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
pygame.display.set_caption("俄罗斯方块")

# 定义方块的大小和间隙
block_size = 30
block_gap = 2

# 初始化方块的位置
x_pos = 3
y_pos = 0

# 初始化方块的形状
shape = random.choice(SHAPES)

# 初始化方块的颜色
color = random.choice([RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW, ORANGE])

# 设置游戏时钟
clock = pygame.time.Clock()

# 判断方块是否可以移动
def can_move(x_offset, y_offset):
    for i in range(len(shape)):
        for j in range(len(shape[i])):
            if shape[i][j]:
                x = x_pos + j + x_offset
                y = y_pos + i + y_offset
                if (x < 0 or x >= SCREEN_WIDTH // (block_size + block_gap) or
                    y >= SCREEN_HEIGHT // (block_size + block_gap) or
                    grid[y][x]):
                    return False
    return True

# 绘制方块
def draw_block(x, y, color):
    pygame.draw.rect(screen, color, [(block_size + block_gap) * x,
                                     (block_size + block_gap) * y,
                                     block_size,
                                     block_size])

# 绘制网格
def draw_grid(grid):
    for i in range(len(grid)):
        for j in range(len(grid[i])):
            if grid[i][j]:
                draw_block(j, i, grid[i][j])

# 更新网格
def update_grid(x_offset, y_offset):
    global x_pos, y_pos
    x_pos += x_offset
    y_pos += y_offset
    for i in range(len(shape)):
        for j in range(len(shape[i])):
            if shape[i][j]:
                x = x_pos + j
                y = y_pos + i
                if y >= 0:
                    grid[y][x] = color

# 消除行
def clear_rows():
    full_rows = []
    for i in range(len(grid)):
        if all(grid[i]):
            full_rows.append(i)
    for row in full_rows:
        del grid[row]
        grid.insert(0, [BLACK] * (SCREEN_WIDTH // (block_size + block_gap)))

# 初始化网格
grid = [[BLACK] * (SCREEN_WIDTH // (block_size + block_gap))
        for _ in range(SCREEN_HEIGHT // (block_size + block_gap))]

# 游戏主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT and can_move(-1, 0):
                update_grid(-1, 0)
            elif event.key == pygame.K_RIGHT and can_move(1, 0):
                update_grid(1, 0)
            elif event.key == pygame.K_DOWN and can_move(0, 1):
                update_grid(0, 1)
            elif event.key == pygame.K_SPACE:
                rot_shape = list(zip(*reversed(shape)))
                if can_move(0, 0):
                    shape = rot_shape
                elif can_move(-1, 0):
                    update_grid(-1, 0)
                    shape = rot_shape
                elif can_move(1, 0):
                    update_grid(1, 0)
                    shape = rot_shape

    if can_move(0, 1):
        update_grid(0, 1)
    else:
        clear_rows()
        x_pos = 3
        y_pos = 0
        shape = random.choice(SHAPES)
        color = random.choice([RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW, ORANGE])
        if not can_move(0, 1):
            running = False

    # 绘制背景
    screen.fill(BLACK)

    # 绘制方块
    for i in range(len(shape)):
        for j in range(len(shape[i])):
            if shape[i][j]:
                draw_block(x_pos + j, y_pos + i, color)

    # 绘制网格
    draw_grid(grid)

    # 设置帧率
    clock.tick(5)

    # 更新屏幕
    pygame.display.flip()

# 退出游戏
pygame.quit()

这段代码使用了Pygame库来实现游戏的图形界面,通过键盘控制方块的移动和旋转。游戏循环不断更新方块的位置和网格状态,并绘制在屏幕上。在方块达到底部或无法继续移动时,判断是否有满行,并清除满行的方块。游戏会根据方块的状态和移动情况不断更新,直到无法继续下落为止,游戏结束。

请注意,这只是一个简单的示例,可能还有一些功能和优化方面的改进。您可以根据自己的需求进行修改和扩展。

相关推荐
ZZHow10249 分钟前
PyTorch深度学习入门笔记(小土堆)P7-14
人工智能·pytorch·笔记·python·深度学习
很楠爱上1 小时前
AI项目------赛博负熵:拆解一个 Codex 生成的英语背单词全栈工程(附源码文件免费)
人工智能·python·codex
小挪号底迪滴1 小时前
Docker 多阶段构建实战:让 Python 镜像更小、更快、更安全
python·安全·docker
并不喜欢吃鱼1 小时前
从零开始 C++------ 十六.深度拆解 C++ 智能指针:unique_ptr/shared_ptr/weak_ptr 底层模拟、内存泄漏根治
开发语言·c++
不相心 -w-1 小时前
Cmake的基础用法
linux·开发语言·c++
WangChenGe1 小时前
Windows 10/11 上 Pyenv-win 完整安装教程
python
想会飞的蒲公英1 小时前
PyTorch中SGD 与 Momentum 从零理解:给最朴素的优化器加上“惯性“
人工智能·pytorch·python·深度学习·机器学习
拿铁铁1 小时前
平板坡口机换碳刷时间参考手册
python·电脑
撑伞的鱼99371 小时前
C++开发用什么AI编程工具效果好?2026年实测横评(附选型指南)
开发语言·c++·ai编程·cursor
大数据张老师1 小时前
Typora 导出 Word 模版操作手册
开发语言·c#·word·typora