Пытаюсь написать свою версию 2048, но столкнулся с проблемой. Пытаюсь написать движение чисел вверх, для этого мне нужно отсортировать список по горизонтали так, чтобы слева стояли двойки, а дальше шли нули и поменять местами столбцы и строки, чтобы всё заработало. Перепробовал множество вариантов решения проблемы, но никак не могу решить её.
import pygame
import sys
import random
pygame.init()
SIZE_BLOCK = 100
MARGIN = 5
WIDTH = HEIGHT = SIZE_BLOCK * 4 + MARGIN * 5
BLACK = 0, 0, 0
RED = 255, 0, 0
GREEN = 0, 255, 0
WHITE = 255, 255, 255
def pretty_print(list):
for j in list:
print(j)
print('-' * 25)
def left_sort_in_mas(list):
# Подсчитываем количесво нулей в словаре
zeroes_count = list.count(0)
# Создаем словарь с количеством нулей zeroes_count
zeroes_count_list = [0] * zeroes_count
len_row = len(list)
while zeroes_count_list != list[len_row - zeroes_count:]:
first_zero_index = list.index(0)
del list[first_zero_index]
list.append(0)
return list
# Функция возвращает индекс последнего элемента со значением number в списке row
def found_last_number(row, number):
try:
zero_index = row.index(number)
number_count = row.count(number)
iteration_count = 1
while number_count != iteration_count:
zero_index = row.index(number, zero_index + 1, len(row) - 1)
iteration_count += 1
return zero_index
except ValueError:
zero_index = -1
return zero_index
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('2048')
mas = [[0] * 4 for i in range(4)]
# Стараюсь создать в массиве множество двое, чтобы проверить логику игры. Решение, конечно, временное =)
def random_2():
mas[random.randint(0, 3)][random.randint(0, 3)] = 2
mas[random.randint(0, 3)][random.randint(0, 3)] = 2
mas[random.randint(0, 3)][random.randint(0, 3)] = 2
random_2()
random_2()
random_2()
random_2()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
for row in mas:
left_sort_in_mas(row)
if event.key == pygame.K_RIGHT:
for row in mas:
# Подсчет количества нулей
zeroes_count = row.count(0)
# Создаем список из количества нулей в row
zeroes_count_list = [0] * zeroes_count
# Пока эти списки не будут равный переносим нули влево
while zeroes_count_list != row[:zeroes_count]:
last_zero_index = found_last_number(row, 0)
if last_zero_index >= 0 or last_zero_index <= 3:
del row[last_zero_index]
row.insert(0, 0)
print(row)
else:
continue
elif event.key == pygame.K_UP:
mas_row_sorted = []
print(mas)
# Создаём новый список идентичный mas, но отсортированный
for j in mas:
mas_row_sorted.append(left_sort_in_mas(j))
print(mas_row_sorted)
mas = [[0] * 4 for i in range(4)]
# Не получается заменить столбец на колонку!!!
# Деление на 2, поскольку заменяю сверху и снизу сразу
for row in range(len(mas_row_sorted) // 2):
for column in range(len(mas_row_sorted)):
mas[row][column] = mas_row_sorted[column][row]
mas[column][row] = mas_row_sorted[row][column]
for row in range(4):
for col in range(4):
x = col * SIZE_BLOCK + (col + 1) * MARGIN
y = row * SIZE_BLOCK + (row + 1) * MARGIN
pygame.draw.rect(screen, WHITE, (x, y, SIZE_BLOCK, SIZE_BLOCK))
font = pygame.font.SysFont('stxingkai', 80)
text_1 = font.render(str(mas[row][col]), True, BLACK)
screen.blit(text_1, (x, y))
pygame.display.flip()