From d2af7b75e9d19ba56460d9898f7b55b951638937 Mon Sep 17 00:00:00 2001 From: kromskii2 <146603192+kromskii2@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:29:58 +0700 Subject: [PATCH] Create 1 --- 1 | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 1 diff --git a/1 b/1 new file mode 100644 index 0000000..dd5133c --- /dev/null +++ b/1 @@ -0,0 +1,176 @@ +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()