Diffstat (limited to 'Logic.gd')
-rw-r--r--Logic.gd143
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]