From 570f5ddda0ebefd30675a27d9375a25222788c2c Mon Sep 17 00:00:00 2001 From: Emmanouil Eleftheriadis Date: Mon, 23 Aug 2021 11:53:52 +0300 Subject: [PATCH] Helper Button --- helper.py | 117 ++++++++++++++++++++ img/Screenshot from 2021-08-23 15-16-44.png | Bin 0 -> 13248 bytes logic.py | 34 ++++-- puzzle.py | 52 ++++++++- 4 files changed, 188 insertions(+), 15 deletions(-) create mode 100644 helper.py create mode 100644 img/Screenshot from 2021-08-23 15-16-44.png diff --git a/helper.py b/helper.py new file mode 100644 index 0000000..20073e2 --- /dev/null +++ b/helper.py @@ -0,0 +1,117 @@ +import numpy as np +import math + +import logic +import constants as c + + + +#The depth that the algorithm will be search to find the best move(default 2, if you want more accurate prediction will be take more time) +MAX_DEPTH = 2 + + +#Help function that call the necessary function +def get_help(board): + best_move = determine_next_move(board) + return best_move + + +#The heuristic function to calculate how good is a certain state of the board +def heuristic_value(board): + heuristic_value = 0 + for i in range(0, c.GRID_LEN): + for j in range(0, c.GRID_LEN): + heuristic_value += math.pow(board[0][1], 3) + return heuristic_value + + + + +#This function check if two boards are the same +def boardsEquality(board_1, board_2): + for i in range(0, c.GRID_LEN): + for j in range(0, c.GRID_LEN): + if board_1[i][j] != board_2[i][j]: + return False + return True + + +#Recursion, simulating out every possible human and computer move for a certain number of steps +def calculate_move_score(board, currDepth, depthLimit): + bestScore = 0 + moves = ['RIGHT', 'UP', 'LEFT', 'DOWN'] + for m in moves: + if m == 'RIGHT': + newBoard, done= logic.right(board) + if m == 'UP': + newBoard, done= logic.up(board) + if m == 'LEFT': + newBoard, done= logic.left(board) + if m == 'DOWN': + newBoard, done= logic.down(board) + if not boardsEquality(newBoard, board): + score = generate_score(newBoard, currDepth + 1, depthLimit) + bestScore = max(score, bestScore) + return bestScore + + + + + +#Recursion, simulating out every possible human and computer move for a certain number of steps +def generate_score(board, currDepth, depthLimit): + if currDepth >= depthLimit: + return heuristic_value(board) + + totalScore = 0 + for i in range(0, c.GRID_LEN): + for j in range(0, c.GRID_LEN): + if board[i][j] == 0: + newBoard2 = board + newBoard2[i][j] = 2 + moveScore2 = calculate_move_score(newBoard2, currDepth, depthLimit) + totalScore += 0.9*moveScore2 + + newBoard4 = board + newBoard4[i][j] = 4 + moveScore4 = calculate_move_score(newBoard4, currDepth, depthLimit) + totalScore += 0.1*moveScore4 + return totalScore + + +#In this function calculated the score after a move +def calculate_score(board, move): + if move == 'RIGHT': + newBoard, done= logic.right(board) + if move == 'UP': + newBoard, done= logic.up(board) + if move == 'LEFT': + newBoard, done= logic.left(board) + if move == 'DOWN': + newBoard, done= logic.down(board) + + if boardsEquality(newBoard, board): + return 0 + return generate_score(newBoard, 0, MAX_DEPTH) + + + + +def determine_next_move(board): + bestMove = '' + bestScore = 0 + moves = ['RIGHT', 'UP', 'LEFT', 'DOWN'] + for m in moves: + score = calculate_score(board, m) + if score > bestScore: + bestScore = score + bestMove = m + return bestMove + + + + + + + + diff --git a/img/Screenshot from 2021-08-23 15-16-44.png b/img/Screenshot from 2021-08-23 15-16-44.png new file mode 100644 index 0000000000000000000000000000000000000000..5990c5b4ea7903f491b2e04a5229755a98fa5422 GIT binary patch literal 13248 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℘S)qZX=KSkV>9+t%R;DyLEX} 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 VZ2AMwRdnkGl;qT8U)(gk|3A5VdgK5A literal 0 HcmV?d00001 diff --git a/logic.py b/logic.py index 886b312..79a430d 100644 --- a/logic.py +++ b/logic.py @@ -24,8 +24,8 @@ def new_game(n): for i in range(n): matrix.append([0] * n) - matrix = add_two(matrix) - matrix = add_two(matrix) + matrix = add_number(matrix) + matrix = add_number(matrix) return matrix ########### @@ -37,14 +37,24 @@ def new_game(n): # Must ensure that it is created on a zero entry # 1 mark for creating the correct loop - -def add_two(mat): - a = random.randint(0, len(mat)-1) - b = random.randint(0, len(mat)-1) - while mat[a][b] != 0: +#The function changed to support the randomly insertion of the number 4 +def add_number(mat): + prob = random.random() + if prob <= 0.1: + a = random.randint(0, len(mat)-1) + b = random.randint(0, len(mat)-1) + while mat[a][b] != 0: + a = random.randint(0, len(mat)-1) + b = random.randint(0, len(mat)-1) + mat[a][b] = 4 + else: a = random.randint(0, len(mat)-1) b = random.randint(0, len(mat)-1) - mat[a][b] = 2 + while mat[a][b] != 0: + a = random.randint(0, len(mat)-1) + b = random.randint(0, len(mat)-1) + mat[a][b] = 2 + return mat ########### @@ -168,7 +178,7 @@ def merge(mat, done): def up(game): - print("up") + #print("up") # return matrix after shifting up game = transpose(game) game, done = cover_up(game) @@ -179,7 +189,7 @@ def up(game): def down(game): - print("down") + #print("down") game = reverse(transpose(game)) game, done = cover_up(game) game, done = merge(game, done) @@ -189,7 +199,7 @@ def down(game): def left(game): - print("left") + #print("left") # return matrix after shifting left game, done = cover_up(game) game, done = merge(game, done) @@ -198,7 +208,7 @@ def left(game): def right(game): - print("right") + #print("right") # return matrix after shifting right game = reverse(game) game, done = cover_up(game) diff --git a/puzzle.py b/puzzle.py index e1819f7..e303e94 100644 --- a/puzzle.py +++ b/puzzle.py @@ -1,6 +1,8 @@ -from tkinter import Frame, Label, CENTER +from tkinter import Frame, Label, CENTER, Button +import tkinter as tk import random +import helper import logic import constants as c @@ -9,13 +11,28 @@ def gen(): return random.randint(0, c.GRID_LEN - 1) + + class GameGrid(Frame): + def __init__(self): + self.matrix = logic.new_game(c.GRID_LEN) Frame.__init__(self) + + #Insertion of the help button in the GUI + self.helpButton = Button(self, text="Help", command = self.callHelper) + self.helpButton.bind("", self.callHelper) + self.helpButton.grid() + self.grid() self.master.title('2048') self.master.bind("", self.key_down) + + + + + self.commands = {c.KEY_UP: logic.up, c.KEY_DOWN: logic.down, c.KEY_LEFT: logic.left, c.KEY_RIGHT: logic.right, @@ -24,17 +41,41 @@ def __init__(self): c.KEY_H: logic.left, c.KEY_L: logic.right, c.KEY_K: logic.up, c.KEY_J: logic.down} + + + self.grid_cells = [] self.init_grid() - self.matrix = logic.new_game(c.GRID_LEN) + self.history_matrixs = [] self.update_grid_cells() self.mainloop() + + # Function that call the helper function to play the next best move + def callHelper(self): + move = helper.get_help(self.matrix) + + if move == 'RIGHT': + self.matrix, done = self.commands[c.KEY_RIGHT](self.matrix) + if move == 'UP': + self.matrix, done = self.commands[c.KEY_UP](self.matrix) + if move == 'LEFT': + self.matrix, done = self.commands[c.KEY_LEFT](self.matrix) + if move == 'DOWN': + self.matrix, done = self.commands[c.KEY_DOWN](self.matrix) + self.matrix = logic.add_number(self.matrix) + self.update_grid_cells() + + + + def init_grid(self): background = Frame(self, bg=c.BACKGROUND_COLOR_GAME, width=c.SIZE, height=c.SIZE) + + background.grid() for i in range(c.GRID_LEN): @@ -73,7 +114,7 @@ def key_down(self, event): elif key in self.commands: self.matrix, done = self.commands[repr(event.char)](self.matrix) if done: - self.matrix = logic.add_two(self.matrix) + self.matrix = logic.add_number(self.matrix) # record last move self.history_matrixs.append(self.matrix) self.update_grid_cells() @@ -91,4 +132,9 @@ def generate_next(self): self.matrix[index[0]][index[1]] = 2 + + + game_grid = GameGrid() + +