用python写俄罗斯方块
时间: 2023-09-30 18:06:28 浏览: 53
好的,下面是一个简单的俄罗斯方块的 Python 实现,仅供参考。
```python
import pygame
import random
# 游戏界面大小
WIDTH = 800
HEIGHT = 600
# 定义方块大小
BLOCK_SIZE = 30
# 定义方块的形状
SHAPES = [
[(0, 0, 1, 0, 1, 1, 2, 1), (1, 0, 1, 1, 0, 2, 1, 2), (0, 1, 1, 1, 1, 0, 2, 0), (0, 0, 0, 1, 1, 1, 1, 2)],
[(0, 1, 1, 1, 2, 1, 3, 1), (1, 0, 1, 1, 1, 2, 1, 3)],
[(0, 1, 1, 1, 2, 1, 2, 0), (1, 0, 1, 1, 1, 2, 2, 2), (0, 1, 1, 1, 2, 1, 0, 2), (0, 0, 1, 0, 1, 1, 1, 2)],
[(0, 1, 1, 1, 1, 0, 2, 0), (1, 0, 1, 1, 2, 1, 2, 2)],
[(0, 1, 1, 1, 1, 0, 2, 1), (1, 0, 1, 1, 2, 1, 1, 2), (0, 1, 1, 1, 1, 2, 2, 1), (0, 0, 1, 0, 1, 1, 2, 0)]
]
# 定义方块的颜色
COLORS = [
(255, 0, 0),
(0, 255, 0),
(0, 0, 255),
(255, 255, 0),
(255, 0, 255),
(0, 255, 255),
(128, 0, 0)
]
class Block:
def __init__(self, shape, color):
self.shape = shape
self.color = color
self.x = WIDTH // BLOCK_SIZE // 2 - 1
self.y = 0
def rotate(self):
self.shape = [(self.shape[i + 1], -self.shape[i]) for i in range(0, len(self.shape), 2)]
def move_left(self):
self.x -= 1
def move_right(self):
self.x += 1
def move_down(self):
self.y += 1
def draw(self, surface):
for i in range(0, len(self.shape), 2):
pygame.draw.rect(surface, self.color, (self.x * BLOCK_SIZE + self.shape[i] * BLOCK_SIZE,
self.y * BLOCK_SIZE + self.shape[i + 1] * BLOCK_SIZE,
BLOCK_SIZE, BLOCK_SIZE))
class Tetris:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Tetris')
self.clock = pygame.time.Clock()
self.score = 0
self.board = [[0] * (WIDTH // BLOCK_SIZE) for _ in range(HEIGHT // BLOCK_SIZE)]
self.current_block = Block(random.choice(SHAPES), random.choice(COLORS))
self.next_block = Block(random.choice(SHAPES), random.choice(COLORS))
self.is_game_over = False
def run(self):
while not self.is_game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.is_game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
self.current_block.move_left()
if self.is_collision():
self.current_block.move_right()
if event.key == pygame.K_RIGHT:
self.current_block.move_right()
if self.is_collision():
self.current_block.move_left()
if event.key == pygame.K_UP:
self.current_block.rotate()
if self.is_collision():
self.current_block.rotate()
self.current_block.rotate()
self.current_block.rotate()
if event.key == pygame.K_DOWN:
self.current_block.move_down()
if self.is_collision():
self.current_block.move_up()
self.merge()
self.current_block.move_down()
if self.is_collision():
self.current_block.move_up()
self.merge()
self.screen.fill((0, 0, 0))
self.draw_board()
self.draw_score()
self.draw_block(self.current_block)
pygame.display.update()
if self.is_game_over:
break
if self.current_block.y == 0:
self.is_game_over = True
if self.is_row_full():
self.score += 10
self.remove_row()
if self.current_block.y + len(self.current_block.shape) >= HEIGHT // BLOCK_SIZE:
self.merge()
self.current_block = self.next_block
self.next_block = Block(random.choice(SHAPES), random.choice(COLORS))
self.clock.tick(10)
pygame.quit()
def is_collision(self):
for i in range(0, len(self.current_block.shape), 2):
x = self.current_block.x + self.current_block.shape[i]
y = self.current_block.y + self.current_block.shape[i + 1]
if x < 0 or x >= WIDTH // BLOCK_SIZE or y >= HEIGHT // BLOCK_SIZE or self.board[y][x]:
return True
return False
def merge(self):
for i in range(0, len(self.current_block.shape), 2):
x = self.current_block.x + self.current_block.shape[i]
y = self.current_block.y + self.current_block.shape[i + 1]
self.board[y][x] = self.current_block.color
def is_row_full(self):
for y in range(HEIGHT // BLOCK_SIZE):
if all(self.board[y]):
return True
return False
def remove_row(self):
for y in range(HEIGHT // BLOCK_SIZE):
if all(self.board[y]):
for x in range(WIDTH // BLOCK_SIZE):
self.board[y][x] = 0
for yy in range(y - 1, -1, -1):
self.board[yy + 1] = self.board[yy]
self.board[yy] = [0] * (WIDTH // BLOCK_SIZE)
def draw_board(self):
for y in range(HEIGHT // BLOCK_SIZE):
for x in range(WIDTH // BLOCK_SIZE):
pygame.draw.rect(self.screen, self.board[y][x], (x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), 1)
def draw_score(self):
font = pygame.font.Font(None, 36)
text = font.render('Score: {}'.format(self.score), True, (255, 255, 255))
self.screen.blit(text, (10, 10))
def draw_block(self, block):
block.draw(self.screen)
if __name__ == '__main__':
tetris = Tetris()
tetris.run()
```
这个实现并不完美,仅实现了基础的游戏功能,可以根据自己的需要进行修改和扩展。