Untitled
unknown
plain_text
a year ago
11 kB
7
Indexable
Main.py: from game_functions import * from game_state import game_started, showing_rules pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("Color Blocks") rules_window = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT)) running = True clock = pygame.time.Clock() while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: mouse_x, mouse_y = event.pos if not game_started: if 250 <= mouse_x <= 550 and 300 <= mouse_y <= 400: game_started = True showing_rules = False elif 250 <= mouse_x <= 550 and 450 <= mouse_y <= 550: showing_rules = True draw_rules(rules_window, screen) elif showing_rules: if 10 <= mouse_x <= 40 and 10 <= mouse_y <= 40: showing_rules = False else: if 10 <= mouse_x <= 40 and 10 <= mouse_y <= 40: game_started = False if not game_started and not showing_rules: draw_preview(screen, rules_window) elif game_started: draw_game(screen, rules_window) elif showing_rules: draw_rules(rules_window, screen) mouse = pygame.mouse.get_pos() click = pygame.mouse.get_pressed() if 10 <= mouse[0] <= 40 and 10 <= mouse[1] <= 40 and click[0] == 1: showing_rules = False pygame.display.flip() clock.tick(30) pygame.quit() Game_functions.py: import math import pygame import random from constants import * from game_state import game_started, showing_rules # Генерация начального поля блоков blocks = [[random.randint(0, len(COLORS) - 1) for _ in range(COL_COUNT)] for _ in range(ROW_COUNT)] # Создание изображения крестика cross_img = pygame.Surface((30, 30)) cross_img.fill(WHITE) pygame.draw.line(cross_img, BLACK, (5, 5), (25, 25), 2) pygame.draw.line(cross_img, BLACK, (5, 25), (25, 5), 2) score = 0 group_size = 2 # Функция для отображения текста на экране def draw_text(text, font, color, surface, x, y): text_obj = font.render(text, True, color) text_rect = text_obj.get_rect() text_rect.center = (x, y) surface.blit(text_obj, text_rect) # Функция для отображения превью игры def draw_preview(screen, rules_window): if showing_rules: draw_rules(rules_window, screen) else: screen.fill(WHITE) draw_text("Color Blocks", pygame.font.Font("fonts/cherry-cream-soda-regular.ttf", 70), BLUE, screen, SCREEN_WIDTH // 2, 100) # Отображение кнопки "START" pygame.draw.rect(screen, GREEN, pygame.Rect(250, 300, 300, 100)) draw_text("START", pygame.font.Font("fonts/cherry-cream-soda-regular.ttf", 40), WHITE, screen, 400, 350) # Отображение кнопки "RULES" pygame.draw.rect(screen, ORANGE, pygame.Rect(250, 450, 300, 100)) draw_text("RULES", pygame.font.Font("fonts/cherry-cream-soda-regular.ttf", 40), WHITE, screen, 400, 500) pygame.display.flip() # Функция для отображения правил игры def draw_rules(surface, screen): surface.fill(WHITE) draw_text("Rules", pygame.font.Font("fonts/cherry-cream-soda-regular.ttf", 60), BLUE, surface, SCREEN_WIDTH // 2, 50) # Рамочка вокруг текста с правилами pygame.draw.rect(surface, BLACK, pygame.Rect(50, 100, SCREEN_WIDTH - 100, SCREEN_HEIGHT - 150), 3) # Отображение текста с правилами rules_text = [ "1. Поле игры: Прямоугольное поле, усыпанное разноцветными квадратиками (блоками).", " Блоки разных цветов промаркированы маленькими геометрическими фигурками:", " зеленые - окружностью, желтые - треугольником, синие - квадратом,", " а красные - звездой.", "2. Уборка блоков: Уборка блоков производится целыми группами.", " Один квадратик убрать нельзя, только группу от двух.", " Группировкой считается скопление квадратиков одинакового цвета.", " Минимально возможная для уборки группа должна включать в себе два элемента одного цвета.", "3. Текущий минимум: В игре есть понятие «текущий минимум».", " Это число, показывающее минимальную численность группы на данном этапе,", " необходимую для того, чтобы при уборке такой группы, на поле появились новые блоки.", " Число это находится под надписью Group.", "4. Цель игры: Ваша цель — набрать максимальное количество очков!" ] for i, text in enumerate(rules_text): draw_text(text, pygame.font.Font(None, 20), BLACK, surface, SCREEN_WIDTH // 2, 150 + i * 30) surface.blit(cross_img, (0, 10)) screen.blit(surface, (0, 0)) pygame.display.flip() # Функция для отображения игрового поля def draw_game(screen, rules_window): if showing_rules: draw_rules(rules_window, screen) else: screen.fill(WHITE) # Отображение игрового поля pygame.draw.rect(screen, BLACK, pygame.Rect(FIELD_MARGIN, FIELD_MARGIN, FIELD_WIDTH, FIELD_HEIGHT), 3) for row in range(ROW_COUNT): for col in range(COL_COUNT): color = COLORS[blocks[row][col]] # Отрисовка квадрата заданного цвета pygame.draw.rect(screen, color, pygame.Rect(FIELD_MARGIN + col * BLOCK_SIZE, FIELD_MARGIN + row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE)) # Определение границ квадрата для отрисовки фигур внутри square_left = FIELD_MARGIN + col * BLOCK_SIZE square_top = FIELD_MARGIN + row * BLOCK_SIZE square_right = square_left + BLOCK_SIZE square_bottom = square_top + BLOCK_SIZE # Отрисовка контура фигуры внутри квадрата if color == COLORS[0]: # Зеленый цвет (окружность) pygame.draw.circle(screen, BLACK, (square_left + BLOCK_SIZE // 2, square_top + BLOCK_SIZE // 2), BLOCK_SIZE // 4, 2) elif color == COLORS[1]: # Желтый цвет (треугольник) pygame.draw.polygon(screen, BLACK, [(square_left + BLOCK_SIZE // 2, square_top + BLOCK_SIZE // 4), (square_left + BLOCK_SIZE // 4, square_bottom - BLOCK_SIZE // 4), (square_right - BLOCK_SIZE // 4, square_bottom - BLOCK_SIZE // 4)], 2) elif color == COLORS[2]: # Синий цвет (квадрат) pygame.draw.rect(screen, BLACK, pygame.Rect(square_left + BLOCK_SIZE // 4, square_top + BLOCK_SIZE // 4, BLOCK_SIZE // 2, BLOCK_SIZE // 2), 2) elif color == COLORS[3]: # Красный цвет (звезда) points = [] for i in range(5): angle = i * 4 * math.pi / 5 # Внутренние точки (координаты для внутренних углов звезды) inner_x = square_left + BLOCK_SIZE // 2 + BLOCK_SIZE // 4 * math.cos(angle) inner_y = square_top + BLOCK_SIZE // 2 + BLOCK_SIZE // 4 * math.sin(angle) points.append((inner_x, inner_y)) # Внешние точки (координаты для внешних углов звезды) outer_x = square_left + BLOCK_SIZE // 2 + BLOCK_SIZE // 2 * math.cos(angle + 2 * math.pi / 5) outer_y = square_top + BLOCK_SIZE // 2 + BLOCK_SIZE // 2 * math.sin(angle + 2 * math.pi / 5) points.append((outer_x, outer_y)) pygame.draw.lines(screen, BLACK, True, points, 2) # Отображение кнопки в виде крестика screen.blit(cross_img, (10, 10)) # Отображение счета и размера группы draw_text("Score: " + str(score), pygame.font.Font("fonts/cherry-cream-soda-regular.ttf", 30), BLACK, screen, SCREEN_WIDTH - 100, 50) draw_text("Group: " + str(group_size), pygame.font.Font("fonts/cherry-cream-soda-regular.ttf", 30), BLACK, screen, SCREEN_WIDTH - 100, 100) pygame.display.flip() Constants.py: SCREEN_WIDTH = 800 SCREEN_HEIGHT = 650 BLOCK_SIZE = 50 FIELD_WIDTH = 8 * BLOCK_SIZE FIELD_HEIGHT = 11 * BLOCK_SIZE FIELD_MARGIN = 50 ROW_COUNT = 11 COL_COUNT = 8 COLORS = [(247, 207, 198), (193, 229, 207), (180, 208, 221), (255, 249, 196)] SHAPE_NAMES = ["circle", "triangle", "square", "star"] WHITE = (255, 255, 255) BLACK = (0, 0, 0) GRAY = (150, 150, 150) LIGHT_GRAY = (200, 200, 200) BLUE = (20, 75, 200) GREEN = (0, 200, 0) ORANGE = (255, 165, 0) PINK = (255, 105, 180) RED = (255, 0, 0) Game_state.py: game_started = False showing_rules = False
Editor is loading...
Leave a Comment