Diffstat (limited to 'Logic.gd')
| -rw-r--r-- | Logic.gd | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/Logic.gd b/Logic.gd new file mode 100644 index 0000000..176752e --- /dev/null +++ b/Logic.gd @@ -0,0 +1,143 @@ +# logic +extends Node + +var done + + +func new_game(n): + var matrix = [] + for i in range(n): + matrix.append([]) + for _j in range(n): + matrix[i].append(0) + matrix = add_two(matrix) + matrix = add_two(matrix) + return matrix + + +func add_two(mat): + var a = round(rand_range(0, mat.size() - 1)) + var b = round(rand_range(0, mat.size() - 1)) + while mat[a][b] != 0: + a = round(rand_range(0, mat.size() - 1)) + b = round(rand_range(0, mat.size() - 1)) + mat[a][b] = 4 if rand_range(0, 1) > .9 else 2 + return mat + + +func game_state(mat): + # check for win cell + var zero = false + for i in range(mat.size()): + for j in range(mat[0].size()): + if mat[i][j] == 2048: + return "win" + elif zero == false and mat[i][j] == 0: + zero = true + if zero: + return "not over" + + # check for same cells that touch each other + for i in range(len(mat) - 1): + # intentionally reduced to check the row on the right and below + # more elegant to use exceptions but most likely this will be their solution + for j in range(len(mat[0]) - 1): + if mat[i][j] == mat[i + 1][j] or mat[i][j + 1] == mat[i][j]: + return "not over" + for k in range(len(mat) - 1): # to check the left/right entries on the last row + if mat[len(mat) - 1][k] == mat[len(mat) - 1][k + 1]: + return "not over" + for j in range(len(mat) - 1): # check up/down entries on last column + if mat[j][len(mat) - 1] == mat[j + 1][len(mat) - 1]: + return "not over" + return "lose" + + +func reverse(mat): + var new = [] + for i in range(mat.size()): + new.append([]) + for j in range(mat[0].size()): + new[i].append(mat[i][mat[0].size() - j - 1]) + return new + + +func transpose(mat): + var new = [] + for i in range(mat[0].size()): + new.append([]) + for j in range(mat.size()): + new[i].append(mat[j][i]) + return new + + +func cover_up(mat, no_done = false): + var new = [] + for _j in range(Constants.GRID_LEN): + var partial_new = [] + for _i in range(Constants.GRID_LEN): + partial_new.append(0) + new.append(partial_new) + if !no_done: + done = false + for i in range(Constants.GRID_LEN): + var count = 0 + for j in range(Constants.GRID_LEN): + if mat[i][j] != 0: + new[i][count] = mat[i][j] + if !no_done and j != count: + done = true + count += 1 + return new + + +func merge(mat): + for i in range(Constants.GRID_LEN): + for j in range(Constants.GRID_LEN - 1): + if mat[i][j] == mat[i][j + 1] and mat[i][j] != 0: + mat[i][j] *= 2 + mat[i][j + 1] = 0 + done = true + return mat + + +func left(game): + print("<") + # return matrix after shifting left + game = transpose(game) + game = cover_up(game) + game = merge(game) + game = cover_up(game, true) + game = transpose(game) + return [game, done] + + +func right(game): + print(">") + # return matrix after shifting right + game = reverse(transpose(game)) + game = cover_up(game) + game = merge(game) + game = cover_up(game, true) + game = transpose(reverse(game)) + return [game, done] + + +func up(game): + print("^") + # return matrix after shifting up + game = cover_up(game) + game = merge(game) + game = cover_up(game, true) + return [game, done] + + +func down(game): + print("v") + # return matrix after shifting down + game = reverse(game) + game = cover_up(game) + game = merge(game) + game = cover_up(game, true) + game = reverse(game) + return [game, done] |