Reputation: 1
I am pretty new to pygame, after creating a few projects, I moved on try and make '2048'. So far, it's been going well, but now I have another problem:
import pygame
import random
import time
pygame.init()
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption("2048")
grid = pygame.sprite.Group()
t = time.time()
gridlist = []
gridlist_index = []
Tilegroup = pygame.sprite.Group()
sg_index = []
sg = 0
x_pos = 0
y_pos = 0
x_grid = 100
y_grid = 100
x_list = []
y_list = []
xy_dict = []
empty_img = pygame.image.load("emptyBlock.svg")
tiles = [pygame.image.load("2.svg"),
pygame.image.load("4.svg"),
pygame.image.load("8.svg"),
pygame.image.load("16.svg"),
pygame.image.load("64.svg"),
pygame.image.load("128.svg"),
pygame.image.load("256.svg")]
def createlist():
for f in range(4):
x_list.append(x_grid + (100 * f))
print(x_list, "x_list")
def anim_move(x, y):
print(" ")
def find_sprite(inputx, inputy):
for required in range(len(Tilegroup.sprites())):
if Tilegroup.sprites()[required].rect.x == inputx and Tilegroup.sprites()[required].rect.y == inputy:
break
return required
def move(dir):
print('iop')
strip = [0, 0, 0, 0]
holder = 0
if dir == 'u':
strip = [0, 0, 0, 0]
for h in range(4):
for b in range(4):
if gridlist[b + (h * 4)] == 0:
print(b, ' =b',h, ' =h')
else:
element_index = gridlist[b + (h * 4)]
gridlist[b + (h * 4)] = 0
print(b, h, "b and h")
move_sprite = Tilegroup.sprites()[find_sprite(b*100-56, h*100-57)]
move_sprite.rect.y = ((strip[b] + 1) * 100 + 57) - 100
gridlist[b + strip[b] * 4] = element_index
strip[b] += 1
print(gridlist, strip)
if dir == 'd':
strip = [3, 3, 3, 3]
x_index = 3
y_index = 3
for h in range(4):
for b in range(4):
if gridlist[x_index + (y_index * 4)] == 0:
print(0)
else:
element_index = gridlist[x_index + (y_index * 4)]
gridlist[x_index + (y_index * 4)] = 0
move_sprite = Tilegroup.sprites()[find_sprite(b*100-56, h*100-57)]
move_sprite.rect.y = ((strip[y_index] + 1)*100 + 57) - 100
gridlist[x_index + strip[x_index] * 4] = element_index
strip[x_index] -= 1
x_index -= 1
print(gridlist, strip)
x_index = 3
y_index -= 1
if dir == 'l':
strip = [0, 0, 0, 0]
for h in range(4):
for b in range(4):
if gridlist[b + (h * 4)] == 0:
print(0)
else:
element_index = gridlist[b + (h * 4)]
gridlist[b + (h * 4)] = 0
print("done")
move_sprite = Tilegroup.sprites()[find_sprite(b*100-56, h*100-57)]
move_sprite.rect.x = ((strip[b])*100 + 56)
print(b, strip)
gridlist[strip[h] + h * 4] = element_index
strip[h] += 1
print(gridlist, strip)
if dir == 'r':
x_index = 3
y_index = 3
strip = [3, 3, 3, 3]
for h in range(4):
x_index = 3
for b in range(4):
if gridlist[x_index + (y_index * 4)] == 0:
# non
a = 0
else:
element_index = gridlist[x_index + (y_index * 4)]
print(x_index, y_index, " xy")
gridlist[x_index + (y_index * 4)] = 0
print(x_index, strip, " strip")
print(strip[y_index], len(gridlist))
move_sprite = find_sprite(b*100-56, h*100-57)
Tilegroup.sprites()[move_sprite].rect.x = ((strip[y_index] + 1)*100 + 57) - 100
gridlist[(strip[y_index] + y_index * 4)] = element_index
strip[y_index] -= 1
print(gridlist, strip)
x_index -= 1
y_index -= 1
class Tile(pygame.sprite.Sprite):
def __init__(self, image, x, y, tx):
pygame.sprite.Sprite.__init__(self)
self.image = image
self.rect = image.get_rect()
self.rect.center = (x, y)
self.tx = self.rect.x - 56
class Empty(pygame.sprite.Sprite):
def __init__(self, image, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = image
self.rect = image.get_rect()
self.rect.center = (x, y)
for y in range(4):
for x in range(4):
emptyblock = Empty(empty_img, x_grid, y_grid)
grid.add(emptyblock)
x_grid += 100
gridlist.append(0)
x_grid = 100
y_grid += 100
def spawnblock():
x_pos = random.choice(x_list)
y_pos = random.choice(x_list)
while gridlist[x_list.index(x_pos) + x_list.index(y_pos) * 4] != 0:
x_pos = random.choice(x_list)
y_pos = random.choice(x_list)
sg_index = gridlist
gridlist_index.clear()
gridlist_index.append(x_list.index(x_pos))
gridlist_index.append(x_list.index(y_pos))
if random.randint(1, 10) <= 9:
gridlist[gridlist_index[0] + (gridlist_index[1] * 4)] = 2
sg_index[gridlist_index[0] + (gridlist_index[1] * 4)] = len(Tilegroup.sprites()) + 1
tile = Tile(tiles[0], x_pos, y_pos, len(Tilegroup.sprites()))
else:
gridlist[gridlist_index[0] + (gridlist_index[1] * 4)] = 4
sg_index[gridlist_index[0] + (gridlist_index[1] * 4)] = len(Tilegroup.sprites()) + 1
tile = Tile(tiles[1], x_pos, y_pos, len(Tilegroup.sprites()))
print(sg_index, "sg_index")
Tilegroup.add(tile)
print(Tilegroup.sprites()[len(Tilegroup.sprites()) - 1].tx, '= x',Tilegroup.sprites()[len(Tilegroup.sprites()) - 1].rect.y )
createlist()
spawnblock()
spawnblock()
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
print(event.key, "event key")
if event.key == pygame.K_UP:
move('u')
if event.key == pygame.K_DOWN:
move('d')
if event.key == pygame.K_LEFT:
move('l')
if event.key == pygame.K_RIGHT:
move('r')
screen.fill((195, 190, 170))
grid.draw(screen)
Tilegroup.draw(screen)
pygame.display.update()
The code given above (poor readability, ik) works as intended except in the movement scripts, only one of my tile sprites is moving, while the other seems to be in the same position. When running, the tiles display properly on the screen, but when moving them using the arrow keys, only one of them is moving. Is it because the same sprite is appended to the tile group twice, or am I missing something?
Tried to code all tiles on the screen to move, just like in the game. Expected both of them to move, but only one shows movement.
def move(dir):
print('iop')
strip = [0, 0, 0, 0]
holder = 0
if dir == 'u':
strip = [0, 0, 0, 0]
for h in range(4):
for b in range(4):
if gridlist[b + (h * 4)] == 0:
print(b, ' =b',h, ' =h')
else:
element_index = gridlist[b + (h * 4)]
gridlist[b + (h * 4)] = 0
print(b, h, "b and h")
move_sprite = Tilegroup.sprites()[find_sprite(b*100-56, h*100-57)]
move_sprite.rect.y = ((strip[b] + 1) * 100 + 57) - 100
gridlist[b + strip[b] * 4] = element_index
strip[b] += 1
print(gridlist, strip)
if dir == 'd':
strip = [3, 3, 3, 3]
x_index = 3
y_index = 3
for h in range(4):
for b in range(4):
if gridlist[x_index + (y_index * 4)] == 0:
print(0)
else:
element_index = gridlist[x_index + (y_index * 4)]
gridlist[x_index + (y_index * 4)] = 0
move_sprite = Tilegroup.sprites()[find_sprite(b*100-56, h*100-57)]
move_sprite.rect.y = ((strip[y_index] + 1)*100 + 57) - 100
gridlist[x_index + strip[x_index] * 4] = element_index
strip[x_index] -= 1
x_index -= 1
print(gridlist, strip)
x_index = 3
y_index -= 1
if dir == 'l':
strip = [0, 0, 0, 0]
for h in range(4):
for b in range(4):
if gridlist[b + (h * 4)] == 0:
print(0)
else:
element_index = gridlist[b + (h * 4)]
gridlist[b + (h * 4)] = 0
print("done")
move_sprite = Tilegroup.sprites()[find_sprite(b*100-56, h*100-57)]
move_sprite.rect.x = ((strip[b])*100 + 56)
print(b, strip)
gridlist[strip[h] + h * 4] = element_index
strip[h] += 1
print(gridlist, strip)
if dir == 'r':
x_index = 3
y_index = 3
strip = [3, 3, 3, 3]
for h in range(4):
x_index = 3
for b in range(4):
if gridlist[x_index + (y_index * 4)] == 0:
# non
a = 0
else:
element_index = gridlist[x_index + (y_index * 4)]
print(x_index, y_index, " xy")
gridlist[x_index + (y_index * 4)] = 0
print(x_index, strip, " strip")
print(strip[y_index], len(gridlist))
move_sprite = find_sprite(b*100-56, h*100-57)
Tilegroup.sprites()[move_sprite].rect.x = ((strip[y_index] + 1)*100 + 57) - 100
gridlist[(strip[y_index] + y_index * 4)] = element_index
strip[y_index] -= 1
print(gridlist, strip)
x_index -= 1
y_index -= 1
Given above is the movement function. Up next is the method I used to find the right sprite (since all sprite names are pretty much the same)
def find_sprite(inputx, inputy):
for required in range(len(Tilegroup.sprites())):
if Tilegroup.sprites()[required].rect.x == inputx and Tilegroup.sprites()[required].rect.y == inputy:
break
return required
Upvotes: -2
Views: 26