I am trying to make the game 2048 and in the game if we tap a direction and the position of the numbers do not change then no new number is spawned.
I tried to implement that in python and the program seems to have problems. The game thinks two different states are the same when they aren't. The problem is with the algorithm.
I cannot figure out why I am getting the "same" output.
I have tried changing the position of current
but it has yielded the same result.
EDIT: I removed the pygame elements and I can see that the problem is with the algorithm.
import random
import time
game =[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
def inverse(game):
game2 = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
for x in range(len(game)):
for y in range(len(game[x])):
game2[y][x] = int(game[x][y])
return game2
def spawn(game):
e = []
for x in range(4):
for y in range(4):
if game[x][y]==0:
e.append((x,y))
place = random.choice(e)
nums = [2,2,2,2,4]
num = random.choice(nums)
x,y=place[0],place[1]
game[x][y] = num
return game
def left(game):
for i in range(len(game)-1):
for x in range(len(game)):
for y in range(len(game[x])):
if y in (1,2,3):
if game[x][y-1] == 0 or game[x][y-1] == game[x][y]:
game[x][y-1] += game[x][y]
game[x][y] = 0
return game
def right(game):
for i in range(len(game)-1):
for x in range(len(game)):
for y in range(len(game[x])):
if y in (0,1,2):
if game[x][y+1] == 0 or game[x][y+1] == game[x][y]:
game[x][y+1] += game[x][y]
game[x][y] = 0
return game
def down(game):
game2 = inverse(game)
for i in range(len(game)-1):
for x in range(len(game2)):
for y in range(len(game2[x])):
if y in (0,1,2):
if game2[x][y+1] == 0 or game2[x][y+1] == game2[x][y]:
game2[x][y+1] += game2[x][y]
game2[x][y] = 0
game = inverse(game2)
return game
def up(game):
game2 = inverse(game)
for i in range(len(game)-1):
for x in range(len(game2)):
for y in range(len(game2[x])):
if y in (1,2,3):
if game2[x][y-1] == 0 or game2[x][y-1] == game2[x][y]:
game2[x][y-1] += game2[x][y]
game2[x][y] = 0
game = inverse(game2)
return game
def display(game):
for i in game:
print(i)
win = False
game = spawn(game)
game = spawn(game)
running = True
current = list(game)
while running:
game_2d = [y for x in game for y in x]
empty = 16
for x in game_2d:
if x != 0:
empty-=1
if 2048 in game_2d:
print("win")
running = False
elif empty == 0 and 2048 not in game_2d:
print("lose")
running = False
else:
display(game)
current = list(game)
x = input("Enter l / r / u / d / q: ")
x = x.lower()
x = x[0]
if x == "l":
game = left(game)
elif x == "r":
game = right(game)
elif x == "u":
game = up(game)
elif x == "d":
game = down(game)
elif x == "q":
running = False
if current == game:
print("\nsame\n")
pass
else:
spawn(game)