Untitled
unknown
plain_text
2 years ago
11 kB
11
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