Питон тетрис
import pygame
import random
# Инициализация pygame
pygame.init()
# Цвета
black = (0, 0, 0)
white = (255, 255, 255)
colors = [
(0, 255, 255), # Cyan
(255, 255, 0), # Yellow
(255, 165, 0), # Orange
(0, 0, 255), # Blue
(0, 255, 0), # Green
(128, 0, 128), # Purple
(255, 0, 0) # Red
]
# Размеры окна
width = 1000 # Увеличили ширину окна для отображения счета
height = 900
# Размер блока
block_size = 50
# Создание окна
game_window = pygame.display.set_mode((width, height))
pygame.display.set_caption('Тетрис')
# Шрифт для отображения счета
font = pygame.font.SysFont(None, 40)
# Часы для управления FPS
clock = pygame.time.Clock()
# Игровое поле
grid = [[black for _ in range((width - 100) // block_size)] for _ in range(height // block_size)] # Уменьшили ширину сетки для счета
# Фигуры и их вращения
shapes = [
[[1, 1, 1, 1]], # I
[[1, 1, 1], [0, 1, 0]], # T
[[1, 1], [1, 1]], # O
[[1, 1, 0], [0, 1, 1]], # Z
[[0, 1, 1], [1, 1, 0]], # S
[[1, 1, 1], [1, 0, 0]], # L
[[1, 1, 1], [0, 0, 1]] # J
]
# Класс для фигур
class Piece:
def __init__(self, shape):
self.shape = shape
self.color = random.choice(colors)
self.x = (width - 100) // block_size // 2 - len(shape[0]) // 2 # Учитываем новую ширину сетки
self.y = 0
# Функция для создания новой фигуры
def new_piece():
return Piece(random.choice(shapes))
# Функция для отрисовки сетки
def draw_grid():
for y in range(len(grid)):
for x in range(len(grid[y])):
pygame.draw.rect(game_window, grid[y][x], (x * block_size, y * block_size, block_size, block_size), 0)
for y in range(len(grid)):
pygame.draw.line(game_window, white, (0, y * block_size), ((width - 100), y * block_size)) # Учитываем новую ширину сетки
for x in range(len(grid[0])):
pygame.draw.line(game_window, white, (x * block_size, 0), (x * block_size, height))
# Функция для отрисовки фигуры
def draw_piece(piece):
for y, row in enumerate(piece.shape):
for x, cell in enumerate(row):
if cell:
pygame.draw.rect(game_window, piece.color, ((piece.x + x) * block_size, (piece.y + y) * block_size, block_size, block_size), 0)
# Функция для проверки столкновений
def check_collision(piece):
for y, row in enumerate(piece.shape):
for x, cell in enumerate(row):
if cell:
if piece.y + y >= len(grid) or piece.x + x < 0 or piece.x + x >= len(grid[0]) or grid[piece.y + y][piece.x + x] != black:
return True
return False
# Функция для фиксации фигуры на поле
def fix_piece(piece):
for y, row in enumerate(piece.shape):
for x, cell in enumerate(row):
if cell:
grid[piece.y + y][piece.x + x] = piece.color
# Функция для удаления заполненных строк
def clear_lines():
lines_cleared = 0
for y in range(len(grid) - 1, -1, -1):
if black not in grid[y]:
lines_cleared += 1
del grid[y]
grid.insert(0, [black for _ in range(len(grid[0]))])
return lines_cleared
# Основной игровой цикл
def game_loop():
global grid
piece = new_piece()
fall_time = 0
fall_speed = 0.5
score = 0
running = True
while running:
fall_time += clock.get_rawtime()
clock.tick()
if fall_time / 1000 >= fall_speed:
fall_time = 0
piece.y += 1
if check_collision(piece):
piece.y -= 1
fix_piece(piece)
lines_cleared = clear_lines()
score += lines_cleared * 100
piece = new_piece()
if check_collision(piece):
running = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
piece.x -= 1
if check_collision(piece):
piece.x += 1
if event.key == pygame.K_RIGHT:
piece.x += 1
if check_collision(piece):
piece.x -= 1
if event.key == pygame.K_DOWN:
piece.y += 1
if check_collision(piece):
piece.y -= 1
if event.key == pygame.K_UP:
rotated_piece = list(zip(*reversed(piece.shape)))
if not check_collision(Piece(rotated_piece)):
piece.shape = rotated_piece
game_window.fill(black)
draw_grid()
draw_piece(piece)
# Отрисовка счета
score_text = font.render(f'Score: {score}', True, white)
game_window.blit(score_text, (width - 150, 50)) # Позиция счета справа от сетки
pygame.display.update()
pygame.quit()
quit()
# Запуск игры
game_loop()