#! /usr/bin/python3 import random, copy def game_logic(l): oldHash = hash(tuple(l)) line_state = True global moved ls=0 #TODO: Should I double merge eg 4 2 2->8 0 0 or 4 4 0 while line_state: for i in range(board_line-1): if l[i+1] == None: pass elif l[i+1] != None and l[i] == None: mi=l.pop(i+1) l.pop(i) l.insert(i,mi) l.insert(i+1,None) elif l[i] == l[i+1]: mi=l.pop(i) l.insert(i,int(mi)*2) mi=l.pop(i+1) l.insert(i+1,None) elif l[i] > l[+1]: pass newHash = hash(tuple(l)) if oldHash == newHash: line_state = False # print('Exiting: Boxes moved',ls) else: ls=ls+1 moved=moved+ls oldHash = newHash # print('Boxes moved',ls,'Repeating') return l def movement(): m = input('\nMove the numbers: ') global moved moved=0 #TOOO: Implement undo function #TODO: Simplify movement # board_reset = board if m == 'h': for i in range(0,board_size,board_line): # print('line',i) board[i:i+board_line]=game_logic(board[i:i+board_line]) elif m == 'j': for i in range(board_line): rl = board[i::board_line] # print('column',i) board[i::board_line]=game_logic(rl[::-1])[::-1] elif m == 'k': for i in range(board_line): # print('column',i) rl = board[i::board_line] board[i::board_line]=game_logic(rl) elif m == 'l': for i in range(0,board_size,board_line): # print('line',i) rl = board[i:i+board_line] board[i:i+board_line]=game_logic(rl[::-1])[::-1] # elif m == 'u': # board=board_reset # print(board) # raise ValueError('Can not move this way') else: raise ValueError('Can not move this way') # try: # direction in ['h','j','k','l'] # print(direction) # except: # print('wtf') def print_board(): for i in range(0,board_size,board_line): print(board[i:i+board_line]) #TODO: Make a class so i can remove globals and simplify code # class Game(): # def init(): game_state = True board = [] board_line=3 board_size=board_line**2 for i in range(board_size): board.insert(i,None) # def add_number(): indices = [i for i, x in enumerate(board) if x == None] p = random.choice(indices) board[p] = random.choices([2,4],weights=[80,20])[0] # board_reset=copy.deepcopy(board) # def run(): global moved while game_state: print('\nnew choice') print_board() try: # print('\nnew choice') movement() except ValueError: #board=copy.deepcopy(board_reset) # continue pass if moved == 0: continue try: indices = [i for i, x in enumerate(board) if x == None] p = random.choice(indices) board[p] = random.choices([2,2],weights=[80,20])[0] board_reset=copy.deepcopy(board) print('New number at position',p) except IndexError: # catch game over here game_state = False print('Game Over')