""" All tetrominos and their rotations """ import collections import numpy as np def convert_to_array(tetromino): rows = len(tetromino) cols = len(tetromino[0]) array_tetromino = np.zeros(shape=(rows,cols), dtype=np.int32, order="C") for row_index, row in enumerate(tetromino): for col_index, col in enumerate(row): array_tetromino[row_index,col_index] = 0 if col == '.' else 1 return array_tetromino def crop_col_right_once(tetromino): if not np.any(tetromino[:,-1]): return tetromino[:,0:-1] return None def crop_col_right(tetromino): while True: new_tetromino = crop_col_right_once(tetromino) if new_tetromino is None: return tetromino tetromino = new_tetromino def crop_row_bottom_once(tetromino): if not np.any(tetromino[-1,:]): return tetromino[0:-1,:] return None def crop_row_bottom(tetromino): while True: new_tetromino = crop_row_bottom_once(tetromino) if new_tetromino is None: return tetromino tetromino = new_tetromino def crop_col_left_once(tetromino): if not np.any(tetromino[:,0]): return tetromino[:,1:] return None def crop_col_left(tetromino): col_offset = 0 while True: new_tetromino = crop_col_left_once(tetromino) if new_tetromino is None: return (tetromino, col_offset) tetromino = new_tetromino col_offset += 1 def crop_row_top_once(tetromino): if not np.any(tetromino[0,:]): return tetromino[1:,:] return None def crop_row_top(tetromino): row_offset = 0 while True: new_tetromino = crop_row_top_once(tetromino) if new_tetromino is None: return (tetromino, row_offset) tetromino = new_tetromino row_offset += 1 Tetromino = collections.namedtuple('Tetromino', ['data', 'col_offset', 'row_offset']) def crop(tetromino): new_tetromino = crop_col_right(crop_row_bottom(tetromino)) new_tetromino, c_off = crop_col_left(new_tetromino) new_tetromino, r_off = crop_row_top(new_tetromino) return Tetromino(data=new_tetromino, col_offset=c_off, row_offset=r_off) def convert_to_tuples(tetrominos): return list(map(lambda x: crop(convert_to_array(x)), tetrominos)) I_RAW = [['..........', '...0000...', '..........', '..........'], ['.....0....', '.....0....', '.....0....', '.....0....'], ['..........', '..........', '...0000...', '..........'], ['....0.....', '....0.....', '....0.....', '....0.....']] O_RAW = [['..........', '....00....', '....00....', '..........'], ['..........', '....00....', '....00....', '..........'], ['..........', '....00....', '....00....', '..........'], ['..........', '....00....', '....00....', '..........']] T_RAW = [['....0.....', '...000....', '..........', '..........'], ['....0.....', '....00....', '....0.....', '..........'], ['..........', '...000....', '....0.....', '..........'], ['....0.....', '...00.....', '....0.....', '..........']] S_RAW = [['....00....', '...00.....', '..........', '..........'], ['....0.....', '....00....', '.....0....', '..........'], ['..........', '....00....', '...00.....', '..........'], ['...0......', '...00.....', '....0.....', '..........']] Z_RAW = [['...00.....', '....00....', '..........', '..........'], ['.....0....', '....00....', '....0.....', '..........'], ['..........', '...00.....', '....00....', '..........'], ['....0.....', '...00.....', '...0......', '..........']] J_RAW = [['...0......', '...000....', '..........', '..........'], ['....00....', '....0.....', '....0.....', '..........'], ['..........', '...000....', '.....0....', '..........'], ['....0.....', '....0.....', '...00.....', '..........']] L_RAW = [['.....0....', '...000....', '..........', '..........'], ['....0.....', '....0.....', '....00....', '..........'], ['..........', '...000....', '...0......', '..........'], ['...00.....', '....0.....', '....0.....', '..........']] I = convert_to_tuples(I_RAW) O = convert_to_tuples(O_RAW) T = convert_to_tuples(T_RAW) S = convert_to_tuples(S_RAW) Z = convert_to_tuples(Z_RAW) J = convert_to_tuples(J_RAW) L = convert_to_tuples(L_RAW) SHAPES = [S, Z, I, O, J, L, T] SHAPES_RAW = [S_RAW, Z_RAW, I_RAW, O_RAW, J_RAW, L_RAW, T_RAW] SHAPE_COLORS = [(0, 255, 0), (255, 0, 0), (0, 255, 255), (255, 255, 0), (255, 165, 0), (0, 0, 255), (128, 0, 128)]