[Python] 纯文本查看 复制代码
for i, text in enumerate(controls):
ctrl_text = self.small_font.render(text, True, LIGHT_GRAY)
self.screen.blit(ctrl_text, (sidebar_left + 20, controls_y + i * 30))
def draw_game_over(self):
overlay = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.SRCALPHA)
overlay.fill((0, 0, 0, 180))
self.screen.blit(overlay, (0, 0))
game_over_text = self.font.render("游戏结束!", True, RED)
score_text = self.font.render(f"最终分数: {self.score}", True, WHITE)
restart_text = self.font.render("按 R 键重新开始", True, YELLOW)
self.screen.blit(game_over_text, (SCREEN_WIDTH // 2 - game_over_text.get_width() // 2, SCREEN_HEIGHT // 2 - 60))
self.screen.blit(score_text, (SCREEN_WIDTH // 2 - score_text.get_width() // 2, SCREEN_HEIGHT // 2))
self.screen.blit(restart_text, (SCREEN_WIDTH // 2 - restart_text.get_width() // 2, SCREEN_HEIGHT // 2 + 60))
def draw_pause(self):
overlay = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.SRCALPHA)
overlay.fill((0, 0, 0, 180))
self.screen.blit(overlay, (0, 0))
pause_text = self.font.render("游戏暂停", True, YELLOW)
continue_text = self.font.render("按 P 键继续", True, WHITE)
self.screen.blit(pause_text, (SCREEN_WIDTH // 2 - pause_text.get_width() // 2, SCREEN_HEIGHT // 2 - 30))
self.screen.blit(continue_text, (SCREEN_WIDTH // 2 - continue_text.get_width() // 2, SCREEN_HEIGHT // 2 + 30))
def check_collision(self, piece, x_offset=0, y_offset=0):
for x, y in piece.get_positions():
new_x, new_y = x + x_offset, y + y_offset
# 检查是否超出边界
if new_x < 0 or new_x >= GRID_WIDTH or new_y >= GRID_HEIGHT:
return True
# 检查是否与已有方块重叠
if new_y >= 0 and self.board[new_y][new_x]:
return True
return False
def rotate_piece(self):
rotated_shape = self.current_piece.rotate()
original_shape = self.current_piece.shape
self.current_piece.shape = rotated_shape
# 如果旋转后发生碰撞,则恢复原来的形状
if self.check_collision(self.current_piece):
self.current_piece.shape = original_shape
def move_piece(self, dx, dy):
if not self.check_collision(self.current_piece, dx, dy):
self.current_piece.x += dx
self.current_piece.y += dy
return True
return False
def drop_piece(self):
while self.move_piece(0, 1):
pass
self.lock_piece()
def lock_piece(self):
for x, y in self.current_piece.get_positions():
if y >= 0: # 确保在网格内
self.board[y][x] = self.current_piece.shape_idx + 1
# 检查是否有完整的行
self.clear_lines()
# 生成新方块
self.current_piece = self.next_piece
self.next_piece = Tetromino()
# 检查游戏是否结束
if self.check_collision(self.current_piece):
self.game_over = True
def clear_lines(self):
lines_to_clear = []
for y in range(GRID_HEIGHT):
if all(self.board[y]):
lines_to_clear.append(y)
if not lines_to_clear:
return
# 更新分数
cleared = len(lines_to_clear)
self.lines_cleared += cleared
self.score += [100, 300, 500, 800][min(cleared-1, 3)] * self.level
# 更新等级
self.level = self.lines_cleared // 10 + 1
self.fall_speed = max(0.05, 0.5 - (self.level - 1) * 0.05)
# 消除行并下移
for line in lines_to_clear:
del self.board[line]
self.board.insert(0, [0 for _ in range(GRID_WIDTH)])
def draw(self):
self.screen.fill(BACKGROUND)
# 绘制标题
title_font = pygame.font.SysFont(None, 60)
title = title_font.render("俄罗斯方块", True, CYAN)
self.screen.blit(title, (SCREEN_WIDTH // 2 - title.get_width() // 2, 20))
self.draw_grid()
self.draw_sidebar()
if self.game_over:
self.draw_game_over()
elif self.paused:
self.draw_pause()
pygame.display.flip()
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if self.game_over:
if event.key == pygame.K_r:
self.reset_game()
else:
if event.key == pygame.K_p:
self.paused = not self.paused
if not self.paused:
if event.key == pygame.K_LEFT:
self.move_piece(-1, 0)
elif event.key == pygame.K_RIGHT:
self.move_piece(1, 0)
elif event.key == pygame.K_DOWN:
self.move_piece(0, 1)
elif event.key == pygame.K_UP:
self.rotate_piece()
elif event.key == pygame.K_SPACE:
self.drop_piece()
elif event.key == pygame.K_r:
self.reset_game()
def update(self, delta_time):
if self.game_over or self.paused:
return
self.fall_timer += delta_time
if self.fall_timer >= self.fall_speed:
self.fall_timer = 0
if not self.move_piece(0, 1):
self.lock_piece()
def run(self):
while True:
delta_time = self.clock.tick(60) / 1000.0 # 转换为秒
self.handle_events()
self.update(delta_time)
self.draw()
# 运行游戏
if __name__ == "__main__":
game = TetrisGame()
game.run() [/mw_shl_code]