写一个俄罗斯方块的python代码
时间: 2023-12-31 17:04:39 浏览: 23
以下是一个简单的俄罗斯方块 Python 代码示例:
```
import pygame
import random
# 游戏方块大小
BLOCK_SIZE = 20
# 游戏区域大小
SCREEN_WIDTH = 10 * BLOCK_SIZE
SCREEN_HEIGHT = 20 * BLOCK_SIZE
# 游戏区域
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 方块形状
SHAPES = [
[[1, 1, 1], [0, 1, 0]],
[[2, 2], [2, 2]],
[[3, 3, 0], [0, 3, 3]],
[[0, 4, 4], [4, 4, 0]],
[[5, 5, 5, 5]],
[[6, 6, 6], [0, 0, 6]]
]
# 方块颜色
COLORS = [
(0, 0, 0),
(255, 0, 0),
(0, 255, 0),
(0, 0, 255),
(255, 255, 0),
(0, 255, 255),
(255, 0, 255)
]
# 随机生成一个新方块
def new_block():
shape = random.choice(SHAPES)
color = random.randint(1, len(COLORS) - 1)
block = []
for i in range(len(shape)):
row = []
for j in range(len(shape[i])):
if shape[i][j]:
row.append(color)
else:
row.append(0)
block.append(row)
return block
# 方块是否可以移动
def can_move(x, y, block):
if x < 0 or x + len(block[0]) > SCREEN_WIDTH / BLOCK_SIZE:
return False
if y + len(block) > SCREEN_HEIGHT / BLOCK_SIZE:
return False
for i in range(len(block)):
for j in range(len(block[i])):
if block[i][j] and board[y+i][x+j]:
return False
return True
# 方块是否可以旋转
def can_rotate(x, y, block):
new_block = []
for i in range(len(block[0])):
row = []
for j in range(len(block)-1, -1, -1):
row.append(block[j][i])
new_block.append(row)
return can_move(x, y, new_block)
# 绘制方块
def draw_block(x, y, block):
for i in range(len(block)):
for j in range(len(block[i])):
if block[i][j]:
pygame.draw.rect(screen, COLORS[block[i][j]], (x+j)*BLOCK_SIZE, (y+i)*BLOCK_SIZE, BLOCK_SIZE)
# 初始化游戏区域
board = []
for i in range(SCREEN_HEIGHT // BLOCK_SIZE):
row = []
for j in range(SCREEN_WIDTH // BLOCK_SIZE):
row.append(0)
board.append(row)
# 游戏主循环
clock = pygame.time.Clock()
block = new_block()
x, y = 4, 0
while True:
clock.tick(5)
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT and can_move(x-1, y, block):
x -= 1
elif event.key == pygame.K_RIGHT and can_move(x+1, y, block):
x += 1
elif event.key == pygame.K_DOWN and can_move(x, y+1, block):
y += 1
elif event.key == pygame.K_UP and can_rotate(x, y, block):
block = new_block()
elif event.key == pygame.K_ESCAPE:
exit()
# 更新游戏区域
if can_move(x, y+1, block):
y += 1
else:
for i in range(len(block)):
for j in range(len(block[i])):
if block[i][j]:
board[y+i][x+j] = block[i][j]
block = new_block()
x, y = 4, 0
# 绘制游戏区域
screen.fill((255, 255, 255))
for i in range(len(board)):
for j in range(len(board[i])):
if board[i][j]:
pygame.draw.rect(screen, COLORS[board[i][j]], (j*BLOCK_SIZE, i*BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))
draw_block(x, y, block)
pygame.display.flip()
```
以上代码只是一个简单的实现,还有很多改进的空间。