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

Код зависает

15.06.2024, 17:58. Показов 714. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При отображении окна, оно виснет. Игра 2048 и не могу понять как реализовать отслеживание нажатия клавиш без зависания
Код ниже:

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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
from random import randint, choice
 
import numpy
 
import pygame
 
pygame.init()
screen = pygame.display.set_mode((550, 650))
pygame.display.set_caption('2048')
icon = pygame.image.load('icon.ico')
pygame.display.set_icon(icon)
screen.fill((255, 246, 230))
myfont = pygame.font.Font('Roboto-Light.ttf', 50)
FILE_NAME = '2048_high_score.txt'
n = 1
square = pygame.Surface((450, 450))
square.fill(color=(121, 112, 99))
 
colors = [
    [240, 228, 217],
    [238, 225, 199],
    [253, 175, 112],
    [255, 143, 86],
    [255, 112, 80],
    [255, 70, 18],
    [241, 210, 104],
    [241, 208, 86],
    [240, 203, 65],
    [242, 201, 39],
    [243, 197, 0],
    [255, 80, 75],
    [255, 34, 75],
    [248, 19, 30],
    [96, 178, 219],
    [83, 154, 229],
    [0, 118, 193]
]
 
 
def draw_field():
    for i in range(0, 16):
        width = i % 4
        height = i // 4
        pygame.draw.rect(square, color=(216, 206, 196),
                         rect=(width * 100 + 10 * width + 10, height * 100 + 10 * height + 10, 100, 100))
 
 
def get_new_board():
    global board
    board = [0 for _ in range(16)]
    add_random_number(board)
    return board
 
 
def add_random_number(board):
    number = 4 if randint(1, 10) == 1 else 2
    empty_cells = []
    for i in range(len(board)):
        if board[i] == 0:
            empty_cells.append(i)
    board[choice(empty_cells)] = number
 
 
def draw_rect(board):
    square.fill(color=(121, 112, 99))
    for (i, el) in enumerate(board):
        if el != 0:
            width = i % 4
            height = i // 4
            el2 = int(numpy.log2(el))
            rect = pygame.draw.rect(square, color=(colors[el2]),
                                    rect=(width * 100 + 10 * width + 10, height * 100 + 10 * height + 10, 100, 100))
            text = myfont.render(f'{el}', True, 'Black')
            place = text.get_rect(center=(width * 100 + 10 * width + 110, 200 + height * 100 + 10 * height + 10))
            screen.blit(text, place)
 
 
def get_high_score():
    try:
        with open(FILE_NAME) as file:
            data = file.read().strip().split()
            if len(data) == 2 and data[0].isdecimal() and data[1].isdecimal():
                checksum = round((int(data[1], 8) - 123456789) / 123456789)
                if checksum == int(data[0]):
                    return int(data[0])
            print('Файл с лучшим результатом содержит некорректные данные')
            return 0
    except FileNotFoundError:
        return 0
 
 
def board_is_full(board):
    for cell in board:
        if cell == 0:
            return False
    return True
 
 
def get_valid_move():
    move = input('Введите W, A, S или D для выбора направления или R для окончания: ').lower()
    while move not in tuple('wasdr'):
        move = input('Введите W, A, S, D или R: ')
    print()
    return move
 
 
def move_up(board):
    score = 0
    merged = []
    for i in range(4, 16):
        while i > 3 and board[i - 4] == 0:
            board[i - 4] = board[i]
            board[i] = 0
            i -= 4
        if i > 3 and board[i - 4] == board[i] and i - 4 not in merged:
            board[i - 4] *= 2
            merged.append(i - 4)
            score += board[i - 4]
            board[i] = 0
    return score
 
 
def move_left(board):
    score = 0
    merged = []
    for n in range(1, 4):
        for i in range(n, n + 13, 4):
            while i not in (0, 4, 8, 12) and board[i - 1] == 0:
                board[i - 1] = board[i]
                board[i] = 0
                i -= 1
            if i not in (0, 4, 8, 12) and board[i - 1] == board[i] and i - 1 not in merged:
                board[i - 1] *= 2
                merged.append(i - 1)
                score += board[i - 1]
                board[i] = 0
    return score
 
 
def move_down(board):
    score = 0
    merged = []
    for i in range(11, -1, -1):
        while i < 12 and board[i + 4] == 0:
            board[i + 4] = board[i]
            board[i] = 0
            i += 4
        if i < 12 and board[i + 4] == board[i] and i + 4 not in merged:
            board[i + 4] *= 2
            merged.append(i + 4)
            score += board[i + 4]
            board[i] = 0
    return score
 
 
def move_right(board):
    score = 0
    merged = []
    for n in range(2, -1, -1):
        for i in range(n, n + 13, 4):
            while i not in (3, 7, 11, 15) and board[i + 1] == 0:
                board[i + 1] = board[i]
                board[i] = 0
                i += 1
            if i not in (3, 7, 11, 15) and board[i + 1] == board[i] and i + 1 not in merged:
                board[i + 1] *= 2
                merged.append(i + 1)
                score += board[i + 1]
                board[i] = 0
    return score
 
 
def get_valid_answer():
    answer = input('Хотите сыграть снова? (да/нет): ').lower()
    while answer not in ('да', 'нет'):
        answer = input('Просто ответьте \"да\" или \"нет\": ').lower()
    print()
    return False if answer == 'нет' else True
 
 
def print_results(board, score, high_score):
    if has_won(board):
        print('Поздравляю! Вы выиграли!')
    else:
        print('К сожалению, вы проиграли...')
    print(f'Ваш финальный результат: {score}')
    if score == high_score and score > 0:
        print('Ваш результат лучший!')
    print()
 
 
def has_won(board):
    has_won = False
    for cell in board:
        if cell >= 2048:
            return True
    return False
 
 
def save_high_score(high_score):
    try:
        with open(FILE_NAME, 'w') as file:
            checksum = oct(high_score * 123456789 + 123456789)
            file.write(str(high_score) + ' ' + str(checksum)[2:])
    except OSError:
        print('Невозможно записать лучший результат в файл.\n')
 
 
draw_field()
get_new_board()
screen.blit(square, (50, 150))
draw_rect(board)
pygame.display.update()
 
running = True
while running:
    pygame.time.delay(1)
    high_score = get_high_score()
    wants_to_play = True
    while wants_to_play:
        board = get_new_board()
        score = 0
        move = None
        while not (board_is_full(board)):
            if n == 1:
                add_random_number(board)
                draw_rect(board)
                n = 0
            keys = pygame.key.get_pressed()
            if keys[pygame.K_UP]:
                score += move_up(board)
                n = 1
            elif keys[pygame.K_LEFT]:
                score += move_left(board)
                n = 1
            elif keys[pygame.K_DOWN]:
                score += move_down(board)
                n = 1
            elif keys[pygame.K_RIGHT]:
                score += move_right(board)
                n = 1
            if score > high_score:
                high_score = score
            pygame.display.update()
        draw_rect(board)
        print_results(board, score, high_score)
        wants_to_play = get_valid_answer()
        pygame.display.update()
    save_high_score(high_score)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.06.2024, 17:58
Ответы с готовыми решениями:

Код зависает
Подскажите пожалуйста в чём может быть проблема. Запускаю код и нет никакой абсолютно реакции. Нет никаких ошибок и сам код не работает....

Зависает код ESP8266
Всем привет. Такая проблема: создал пару кнопок в HTML, чтобы управлять шаговым двигателем. Суть при нажатии кнопки вверх двигатель...

Двоичный поиск, код зависает
Вот код, он при работе виснет, я прекрасно знаю почему ниже второй код на мой взгляд ничем не отличается но он работает Вопрос почему...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.06.2024, 17:58
Помогаю со студенческими работами здесь

Поиск окна по неполному соответствию, зависает код
Уже второй алгоритм и опять 25, заканчивается тем что все зависает и все и из процедуры не выходит и причем он не зацикливается вовсе, а...

Exe файл запускается и зависает, код завороченый
Здравствуйте, написал программу, учел на свой взгляд все, программа запускается и...виснет. Помогите пожалуйста найти ошибку. Вот код: ...

Зависает компьютер Kernel-Power, код 41, Категория задачи 63.
Помогите разобраться пожалуйста Т_Т. Kernel-Power, код 41, Категория задачи 63.

Загружается код и зависает экран 0.96 дюймов ssd1306 (решено)
Дратути. ************* Довольный UPD перекур.Надеюсь все кто столкнётся с данной проблемой попадут на эту тему.В конце налеплю тэгов...

При включенном в код удалении лишних пробелов отладка просто зависает
Такая проблема: если не включаю в код удаление лишних пробелов, то в принципе все работает верно, если включаю -зависает. С чем может быть...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
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