Files
2024-03-19 21:29:58 +07:00

177 lines
5.0 KiB
Plaintext

import pygame
import random
# Инициализация Pygame
pygame.init()
# Установка параметров экрана
SCREEN_WIDTH = 300
SCREEN_HEIGHT = 600
BLOCK_SIZE = 30
GRID_WIDTH = SCREEN_WIDTH // BLOCK_SIZE
GRID_HEIGHT = SCREEN_HEIGHT // BLOCK_SIZE
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (128, 128, 128)
# Создание экрана
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Tetris")
# Определение форм фигур Тетриса
tetris_shapes = [
[[1, 1, 1],
[0, 1, 0]],
[[0, 2, 2],
[2, 2, 0]],
[[3, 3, 0],
[0, 3, 3]],
[[4, 0, 0],
[4, 4, 4]],
[[0, 0, 5],
[5, 5, 5]],
[[6, 6, 6, 6]],
[[7, 7],
[7, 7]]
]
# Класс фигуры Тетриса
class TetrisPiece:
def __init__(self, x, y):
self.x = x
self.y = y
self.shape = random.choice(tetris_shapes)
self.color = random.randint(1, 7)
def rotate(self):
self.shape = [list(row) for row in zip(*self.shape[::-1])]
def move(self, dx, dy):
self.x += dx
self.y += dy
def draw(self, surface):
for y, row in enumerate(self.shape):
for x, cell in enumerate(row):
if cell:
pygame.draw.rect(surface, colors[self.color], (self.x + x, self.y + y, 1, 1), 0)
# Функция отрисовки сетки
def draw_grid(surface):
for y in range(GRID_HEIGHT):
for x in range(GRID_WIDTH):
pygame.draw.rect(surface, GRAY, (x, y, 1, 1), 1)
# Функция проверки столкновений
def check_collision(board, piece, offset):
off_x, off_y = offset
for y, row in enumerate(piece.shape):
for x, cell in enumerate(row):
if cell and board[y + piece.y + off_y][x + piece.x + off_x]:
return True
return False
# Функция обновления доски
def update_board(board, piece):
for y, row in enumerate(piece.shape):
for x, cell in enumerate(row):
if cell:
board[y + piece.y][x + piece.x] = piece.color
# Функция очистки заполненных рядов
def clear_rows(board):
rows_cleared = 0
y = GRID_HEIGHT - 1
while y >= 0:
if all(board[y]):
del board[y]
board.insert(0, [0] * GRID_WIDTH)
rows_cleared += 1
else:
y -= 1
return rows_cleared
# Функция рисования текущего состояния игры
def draw_game(screen, board, piece):
screen.fill(WHITE)
draw_grid(screen)
for y, row in enumerate(board):
for x, cell in enumerate(row):
if cell:
pygame.draw.rect(screen, colors[cell], (x, y, 1, 1), 0)
piece.draw(screen)
pygame.display.flip()
# Основная функция игры
def run_game():
board = [[0] * GRID_WIDTH for _ in range(GRID_HEIGHT)]
piece = TetrisPiece(2, 0)
clock = pygame.time.Clock()
fall_time = 0
fall_speed = 0.5
game_over = False
while not game_over:
board_copy = [row[:] for row in board]
fall_time += clock.get_rawtime()
clock.tick()
# Падение фигуры
if fall_time / 1000 >= fall_speed:
fall_time = 0
piece.move(0, 1)
if check_collision(board, piece, (0, 0)):
piece.move(0, -1)
update_board(board, piece)
rows_cleared = clear_rows(board)
if rows_cleared:
fall_speed = max(0.1, fall_speed - 0.01 * rows_cleared)
piece = TetrisPiece(2, 0)
if check_collision(board, piece, (0, 0)):
game_over = True
# Обработка событий
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
piece.move(-1, 0)
if check_collision(board, piece, (0, 0)):
piece.move(1, 0)
elif event.key == pygame.K_RIGHT:
piece.move(1, 0)
if check_collision(board, piece, (0, 0)):
piece.move(-1, 0)
elif event.key == pygame.K_DOWN:
piece.move(0, 1)
if check_collision(board, piece, (0, 0)):
piece.move(0, -1)
elif event.key == pygame.K_UP:
piece.rotate()
if check_collision(board, piece, (0, 0)):
piece.rotate()
# Отрисовка текущего состояния игры
draw_game(screen, board, piece)
pygame.quit()
if __name__ == "__main__":
colors = {
1: (255, 0, 0),
2: (0, 255, 0),
3: (0, 0, 255),
4: (255, 255, 0),
5: (255, 0, 255),
6: (0, 255, 255),
7: (255, 165, 0)
}
run_game()