写一个俄罗斯方块的代码
时间: 2023-12-01 09:00:30 浏览: 46
这里是一个简单的俄罗斯方块的代码示例,使用 Python 语言和 Pygame 库:
```python
import pygame
import random
# 定义一些常量
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
BLOCK_SIZE = 20
BOARD_WIDTH = 10
BOARD_HEIGHT = 20
FPS = 60
# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
CYAN = (0, 255, 255)
MAGENTA = (255, 0, 255)
# 定义方块的类型和形状
BLOCKS = [
[[1, 1, 1], [0, 1, 0]], # T
[[1, 1, 0], [0, 1, 1]], # Z
[[0, 1, 1], [1, 1, 0]], # S
[[1, 1, 1, 1]], # I
[[1, 1], [1, 1]], # O
[[1, 1, 1], [1, 0, 0]], # L
[[1, 1, 1], [0, 0, 1]] # J
]
# 初始化 Pygame
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 设置窗口标题
pygame.display.set_caption("Tetris")
# 创建字体对象
font = pygame.font.Font(None, 36)
# 定义方块类
class Block:
def __init__(self, x, y, shape):
self.x = x
self.y = y
self.shape = shape
def draw(self):
for i in range(len(self.shape)):
for j in range(len(self.shape[i])):
if self.shape[i][j] == 1:
pygame.draw.rect(screen, WHITE, (self.x + j * BLOCK_SIZE, self.y + i * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))
def move(self, dx, dy):
self.x += dx
self.y += dy
def rotate(self):
self.shape = [[self.shape[j][i] for j in range(len(self.shape))] for i in range(len(self.shape[0]) - 1, -1, -1)]
def collides_with(self, board):
for i in range(len(self.shape)):
for j in range(len(self.shape[i])):
if self.shape[i][j] == 1:
x = self.x + j
y = self.y + i
if x < 0 or x >= BOARD_WIDTH or y >= BOARD_HEIGHT or board[y][x] == 1:
return True
return False
# 创建游戏板类
class Board:
def __init__(self):
self.board = [[0] * BOARD_WIDTH for i in range(BOARD_HEIGHT)]
def draw(self):
for i in range(BOARD_HEIGHT):
for j in range(BOARD_WIDTH):
if self.board[i][j] == 1:
pygame.draw.rect(screen, WHITE, (j * BLOCK_SIZE, i * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), 1)
def add_block(self, block):
for i in range(len(block.shape)):
for j in range(len(block.shape[i])):
if block.shape[i][j] == 1:
x = block.x + j
y = block.y + i
self.board[y][x] = 1
def check_full_rows(self):
rows_to_remove = []
for i in range(BOARD_HEIGHT):
if sum(self.board[i]) == BOARD_WIDTH:
rows_to_remove.append(i)
return rows_to_remove
def remove_rows(self, rows):
for row in rows:
del self.board[row]
self.board.insert(0, [0] * BOARD_WIDTH)
# 创建游戏对象
board = Board()
current_block = Block(3 * BLOCK_SIZE, 0, random.choice(BLOCKS))
# 设置游戏时钟
clock = pygame.time.Clock()
# 游戏循环
while True:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
current_block.move(-BLOCK_SIZE, 0)
if current_block.collides_with(board.board):
current_block.move(BLOCK_SIZE, 0)
elif event.key == pygame.K_RIGHT:
current_block.move(BLOCK_SIZE, 0)
if current_block.collides_with(board.board):
current_block.move(-BLOCK_SIZE, 0)
elif event.key == pygame.K_DOWN:
current_block.move(0, BLOCK_SIZE)
if current_block.collides_with(board.board):
current_block.move(0, -BLOCK_SIZE)
elif event.key == pygame.K_UP:
current_block.rotate()
if current_block.collides_with(board.board):
current_block.rotate()
# 检查是否需要增加方块
if current_block.collides_with(board.board):
board.add_block(current_block)
rows = board.check_full_rows()
if rows:
board.remove_rows(rows)
current_block = Block(3 * BLOCK_SIZE, 0, random.choice(BLOCKS))
# 移动方块
current_block.move(0, BLOCK_SIZE)
if current_block.collides_with(board.board):
current_block.move(0, -BLOCK_SIZE)
# 绘制游戏界面
screen.fill(BLACK)
board.draw()
current_block.draw()
score_text = font.render("Score: " + str(sum(map(sum, board.board))), 1, WHITE)
screen.blit(score_text, (10, 10))
pygame.display.update()
# 控制游戏帧率
clock.tick(FPS)
```
这个代码实现了一个基本的俄罗斯方块游戏,包括方块的生成、移动和旋转,以及游戏板的更新和行消除等功能。你可以根据自己的需要进行修改和扩展。