Untitled

mail@pastecode.io avatar
unknown
plain_text
2 months ago
11 kB
4
Indexable
Never
 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

Leave a Comment