python 编写俄罗斯方块小游戏
时间: 2023-07-27 15:18:49 浏览: 100
好的,下面是一个简单的Python俄罗斯方块小游戏的实现,可以使用Python标准库中的`pygame`模块进行图形化界面的开发:
```python
import pygame
import random
# 定义方块的大小和游戏区域的大小
block_size = 30
game_width = 300
game_height = 600
# 定义颜色
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
yellow = (255, 255, 0)
# 定义各种形状的方块,每个方块由四个小方块组成
shapes = [
[[1, 1, 1, 1]],
[[1, 1], [1, 1]],
[[1, 1, 1], [0, 1, 0]],
[[1, 1, 0], [0, 1, 1]],
[[0, 1, 1], [1, 1, 0]],
[[1, 0, 0], [1, 1, 1]],
[[0, 0, 1], [1, 1, 1]],
]
class Block:
def __init__(self, shape):
self.shape = shape
self.color = random.choice([red, green, blue, yellow])
self.x = 0
self.y = 0
def rotate(self):
self.shape = list(zip(*self.shape[::-1]))
def move_down(self):
self.y += 1
def move_left(self):
self.x -= 1
def move_right(self):
self.x += 1
class Game:
def __init__(self):
self.screen = pygame.display.set_mode((game_width, game_height))
self.clock = pygame.time.Clock()
self.score = 0
self.game_over = False
self.board = [[0] * (game_width // block_size) for _ in range(game_height // block_size)]
self.current_block = Block(random.choice(shapes))
def draw_block(self, block):
for i, row in enumerate(block.shape):
for j, cell in enumerate(row):
if cell == 1:
pygame.draw.rect(self.screen, block.color, (block.x + j, block.y + i, 1, 1))
def draw_board(self):
for i, row in enumerate(self.board):
for j, cell in enumerate(row):
if cell != 0:
pygame.draw.rect(self.screen, white, (j, i, 1, 1))
def check_collision(self, block):
for i, row in enumerate(block.shape):
for j, cell in enumerate(row):
if cell == 1:
if i + block.y >= game_height // block_size or j + block.x < 0 or j + block.x >= game_width // block_size or self.board[i + block.y][j + block.x] != 0:
return True
return False
def add_block_to_board(self, block):
for i, row in enumerate(block.shape):
for j, cell in enumerate(row):
if cell == 1:
self.board[i + block.y][j + block.x] = block.color
def remove_full_rows(self):
new_board = [[0] * (game_width // block_size) for _ in range(game_height // block_size)]
new_row = game_height // block_size - 1
for i in range(game_height // block_size - 1, -1, -1):
if sum(self.board[i]) != game_width // block_size:
new_board[new_row] = self.board[i]
new_row -= 1
else:
self.score += 1
self.board = new_board
def run(self):
while not self.game_over:
self.clock.tick(10)
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.game_over = True
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
self.current_block.move_left()
if self.check_collision(self.current_block):
self.current_block.move_right()
elif event.key == pygame.K_RIGHT:
self.current_block.move_right()
if self.check_collision(self.current_block):
self.current_block.move_left()
elif event.key == pygame.K_DOWN:
self.current_block.move_down()
if self.check_collision(self.current_block):
self.current_block.move_up()
elif event.key == pygame.K_UP:
self.current_block.rotate()
if self.check_collision(self.current_block):
self.current_block.rotate()
self.screen.fill(black)
self.draw_board()
self.draw_block(self.current_block)
if self.check_collision(self.current_block):
self.add_block_to_board(self.current_block)
self.current_block = Block(random.choice(shapes))
if self.check_collision(self.current_block):
self.game_over = True
else:
self.current_block.move_down()
self.remove_full_rows()
pygame.display.update()
pygame.quit()
if __name__ == '__main__':
pygame.init()
game = Game()
game.run()
```
这个游戏包括一个游戏类`Game`和一个方块类`Block`,其中`Game`类负责游戏逻辑和图形化界面的绘制,`Block`类负责方块的移动和变形操作。游戏的主循环中,不断更新屏幕并处理用户输入,实现了俄罗斯方块的基本功能。
阅读全文