Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 25.04.2020
Сообщений: 39

Удаление плиток в игре при определенном условии

01.02.2024, 12:35. Показов 1236. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Пробую писать игру и возникла проблема. Если поле 10 на 10, в каждой ячейке которого находится плитка с определенной цифрой и цветом. Данный код пока просто позволяет нажимать на плитку мышкой и она подсвечивается. Мне на данном этапе надо добавить возможность удаления плиток согласно методу remove_tiles класса game. А именно, можно удалить плитки с одинаковыми цифрами или сумма цифр равна 10 и при этом плитки расположены на одной линии и между ними не других плиток. Все эти условия прописаны в методе. Плитки на поле задаются через группу спрайтов. Собственно, возникает проблема, как применить этот метод в обработчике событий handle_event в главном классе игры gameapp и плитками с цифрами стали корректно удаляться с поля. Еще момент. Сначала нажимается первая плитка и если потом попробуем нажать вторую и условия удаления ее с первой будут выполнены (проверяется в методе remove_tiles), то тогда плитки удаляются. Если после нажатия на вторую плитку условия удаления не выполняются, то его не происходит и эта вторая плитка теперь будет подсвеченной, а первая вернет свой исходный цвет. Добавлю еще в архиве необходимые изображения и шрифт для запуска кода
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import pygame
import random
 
tile_size, gap = 65, 3
offset = (23, 23)
COLORS = {1: (250, 130, 124), 2: (98, 120, 255), 3: (249, 204, 122),
          4: (127, 254, 138), 5: (251, 94, 223), 6: (126, 253, 205),
          7: (239, 255, 127), 8: (174, 121, 251), 9: (255, 152, 123)}
 
class Tile(pygame.sprite.Sprite):
    def __init__(self, number, position, color):
        super().__init__()
        self.number = number
        self.position = position
        self.color = color
        self.image = pygame.Surface((tile_size, tile_size))
        self.rect = self.image.get_rect()
        self.x = self.position[0]
        self.y = self.position[1]
        self.rect.topleft = ((self.y + 1) * gap + self.y * tile_size, (self.x + 1) * gap + self.x * tile_size)
        self.draw_tile((0, 0, 0))  # Используем черный цвет для текста при инициализации
 
    def draw_tile(self, text_color):
        self.image.fill(self.color)
        pygame.draw.rect(self.image, (71, 74, 72), self.image.get_rect(), 2)
        font = pygame.font.Font('C:\\Users\\1\\PycharmProjects\\game\\fonts\\OpenSans-VariableFont_wdth,wght.ttf', 40)
        text = font.render(str(self.number), True, text_color)
        text_rect = text.get_rect(center=(tile_size // 2, tile_size // 2))
        self.image.blit(text, text_rect)
 
    def update_color(self, new_color, text_color=(255, 255, 202)):
        self.color = new_color
        self.draw_tile(text_color)  # Используем новый цвет для текста при обновлении цвета плитки
        
    def draw(self, screen):
        screen.blit(self.image, self.rect.topleft)
        
class Game:
    def __init__(self, tiles, time_limit=300):
        self.tiles = tiles
        self.board = [[Tile(number := random.randint(1, 9), (i, j), COLORS[number]) for j in range(10)] for i in range(10)]  # Игровое поле
        self.score = 0  # Счет
        self.time_limit = time_limit  # Время игры
        self.selected_tile = None
        self.original_color = None
        self.start_time = None  # Время начала игры
        self.game_over_flag = False  # Флаг окончания игры
        
    def select_tile(self, tile):
        if self.selected_tile is not None:  # Если уже есть выбранная плитка
            self.selected_tile.update_color(self.original_color, (0, 0, 0))  # Восстанавливаем исходный цвет
        self.selected_tile = tile  # Обновляем выбранную плитку
        self.original_color = tile.color  # Сохраняем исходный цвет
        tile.update_color((255, 139, 2), (255, 255, 202))  # Меняем цвет плитки и цвет текста
        
    def remove_tiles(self, tile1, tile2):
        print('trying remove')
        x1, y1 = tile1.position
        x2, y2 = tile2.position
        if (tile1.number == tile2.number or tile1.number + tile2.number == 10):  # Проверка условий для удаления плиток
            if x1 == x2:  # Плитки находятся на одной вертикальной линии
                if abs(y1 - y2) == 1 or all(self.board[x1][j] is None for j in range(min(y1, y2) + 1, max(y1, y2))):
                    self.score += (abs(y1 - y2) + 1) * (abs(y1 - y2) + 2) // 2
                    self.board[x1][y1] = None
                    self.board[x2][y2] = None
                    self.tiles.remove(tile1, tile2)  # Удаление плиток из группы спрайтов
                    return True  # Успешное удаление
            elif y1 == y2:  # Плитки находятся на одной горизонтальной линии
                if abs(x1 - x2) == 1 or all(self.board[i][y1] is None for i in range(min(x1, x2) + 1, max(x1, x2))):
                    self.score += (abs(x1 - x2) + 1) * (abs(x1 - x2) + 2) // 2
                    self.board[x1][y1] = None
                    self.board[x2][y2] = None
                    self.tiles.remove(tile1, tile2)  # Удаление плиток из группы спрайтов
                    return True  # Успешное удаление
        return False  # Условия для удаления не выполняются
    
class GameApp:
    def __init__(self):
        self.WIDTH, self.HEIGHT = 963, 723
        self.frame = 10
        self.window = self.HEIGHT - 20
        self.panel_width, self.panel_height = 240, self.HEIGHT
        self.tile_size, self.gap, self.FPS = 63, 3, 10
        self.offset = (23, 23)
        pygame.init()
        self.screen = pygame.display.set_mode((self.WIDTH, self.HEIGHT))
        pygame.display.set_caption('Игра цифры')
        self.icon = pygame.image.load('C:\\Users\\1\\PycharmProjects\\game\\images\\icon.png')
        pygame.display.set_icon(self.icon)
        self.background_tile = pygame.image.load('C:\\Users\\1\\PycharmProjects\\game\\images\\cell.JPG')
        self.tiles = pygame.sprite.Group()
        self.game = Game(self.tiles)
        self.tile_surface = pygame.Surface((self.HEIGHT - 4 * self.frame, self.HEIGHT - 4 * self.frame))
        self.tile_surface.fill((212, 222, 197))
 
    def handle_event(self, event):
        if event.type == pygame.QUIT:
            return False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:  # Левая кнопка мыши
                pos = pygame.mouse.get_pos()
                pos = (pos[0] - self.offset[0], pos[1] - self.offset[1])  # Учитываем смещение
                for tile in self.tiles:  # Перебираем все плитки
                    if tile.rect.collidepoint(pos):  # Если текущее положение мыши внутри плитки
                        self.game.select_tile(tile)
                        pygame.display.update()  # Обновляем дисплей
        return True
 
    def run(self):
        for i in range(10):
            for j in range(10):
                tile = Tile(number := random.randint(1, 9), (i, j), COLORS[number])
                self.tiles.add(tile)
        running = True
        while running:
            for i in range(0, 960, self.background_tile.get_width()):
                for j in range(0, 720, self.background_tile.get_height()):
                    self.screen.blit(self.background_tile, (i, j))
            pygame.draw.rect(self.screen, (247, 204, 74), (self.frame, self.frame, self.window, self.window), self.frame)
            pygame.draw.rect(self.screen, (62, 157, 203), (self.HEIGHT, 0, self.panel_width, self.panel_height))
            self.screen.blit(self.tile_surface, (2 * self.frame, 2 * self.frame))
            self.tiles.draw(self.tile_surface)
            pygame.display.update()
            for event in pygame.event.get():
                running = self.handle_event(event)
 
app = GameApp()
app.run()
Вложения
Тип файла: rar images, font.rar (337.3 Кб, 0 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.02.2024, 12:35
Ответы с готовыми решениями:

Отыскание корня при определенном условии
Здравствуйте. Подскажите пожалуйста как можно реализовать следующую операцию: необходимо определить корень при условии чтобы модуль...

Окно сообщения при определенном условии
Всем привет. Есть кнопка по нажатию которой заполняется поле. Нужно, чтобы при определенном значении слова открывалось окно сообщения. ...

Отправка формы при определённом условии
Уважаемые форумчане. Есть такой вопрос! У меня есть некая форма (к примеру страница создания анкеты). Есть задача. При нажатии на...

1
0 / 0 / 0
Регистрация: 25.04.2020
Сообщений: 39
01.02.2024, 15:10  [ТС]
Я решил проблему
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2024, 15:10
Помогаю со студенческими работами здесь

При определенном условии сгенерировать массив
Нужно при определенном условии сгенерировать массив, если написать это условие: int i,j; for(i=0; i<n; i++) for(j=0; j<n; j++)...

Повтор цикла при определенном условии
Как такое сделать? IF True Then Все_сначала

Перезагрузка программы при определённом условии
Здравствуйте. Ситуация следующая, на сервере круглосуточно работает программа ЗБ, для её стабильной работы написан батник, который...

Бесплатная доставка при определенном условии
Есть сайт на WOOСOMMERCE. Как сделать так, чтобы бесплатная доставка была доступна, если человек выбрал вариант оплаты Прямой банковский...

Отобразить button при определенном условии
По умолчанию button1 скрыт в свойствах. Есть splitContainer у которого splitContainer.panel1 по нажатию другой кнопки button2 скрывается. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru