# Set the number of cells of the board here 9, 16, 25 etc num_grid_cells = 16 piece_color = color(255, 175, 0) background_color = color(235, 231, 178) piece_shadow_dark = color(206, 141, 0) piece_shadow_light = color(255, 214, 126) def setup(): global piece, piece_number, row_length, piece_side_length size(400, 400) # Window size width and height must be egual background(200, 50, 0) row_length = int(sqrt(num_grid_cells)) piece_side_length = width / row_length textSize(piece_side_length / 2.7) textAlign(CENTER) # Setting the x and y values for each cell on grid xy_val = [] t = 0 for i in range(0, num_grid_cells, row_length): for j in range(row_length): xy_val.append((j * piece_side_length, t * piece_side_length)) t += 1 piece = [] # Puzzle piece objects placed = [False] * num_grid_cells # to help placing the pieces randomly piece_number = 0 # Placing pieces randomly in grid while (piece_number < num_grid_cells): p = int(random(0, num_grid_cells)) # Once placed will be set to True to avoid adding again at this location if not placed[p]: # Creating the piece objects list piece.append(PuzzlePiece(piece_number, xy_val[p][0], xy_val[p][1])) placed[p] = True piece[piece_number].design() # Draw newly create piece object piece_number += 1 def draw(): # Search all piece object indexes and verify which one is mouse pressed for i in range(num_grid_cells): if (mousePressed and piece[i].x <= mouseX <= piece[i].x + piece_side_length and piece[i].y <= mouseY <= piece[i].y + piece_side_length and piece[i].piece_number != 15): if (pieceMove(piece[num_grid_cells - 1].x, piece[num_grid_cells - 1].y, piece[i].x, piece[i].y)): # Remember x and y value of final piece index (white piece) temp_x = int(piece[num_grid_cells - 1].x) temp_y = int(piece[num_grid_cells - 1].y) # Store clicked x and y value in final index of piece list piece[num_grid_cells - 1].set_pos(piece[i].x, piece[i].y) # Store temp x and y value (the last/previous final index # values) in current clicked piece piece[i].set_pos(temp_x, temp_y) # draw the final index piece index (only final piece index is # painted white) piece[num_grid_cells - 1].design() piece[i].design() # Draw a numbered piece of current index def pieceMove(final_index_piece_x, final_index_piece_y, current_index_x, current_index_y): # If both x's from clicked and white piece have same value meaning in same horizontal column # AND current clicked y value is equal to white piece y value - piece side lenght OR # current clicked y value + piece side lenght is egual to white piece y if (current_index_x == final_index_piece_x and (current_index_y == final_index_piece_y - piece_side_length or (current_index_y == final_index_piece_y + piece_side_length))): return True # If both y's from clicked and white piece have same value meaning in same vertical column AND current clicked x value # is equal to white piece x value - piece side lenght OR current clicked x value + piece side lenght is # egual to white piece x elif (current_index_y == final_index_piece_y and (current_index_x == final_index_piece_x - piece_side_length or (current_index_x == final_index_piece_x + piece_side_length))): return True else: return False class PuzzlePiece: def __init__(self, pn, xp, yp): self.piece_number = pn self.x = xp self.y = yp def set_pos(self, xp, yp): self.x = xp self.y = yp def design(self): noStroke() fill(piece_color) if (self.piece_number == num_grid_cells - 1): fill(background_color) rect(self.x + 1, self.y + 1, piece_side_length - 1, piece_side_length - 1) if (self.piece_number != num_grid_cells - 1): fill(0) # Black text shadow text(self.piece_number + 1, self.x + piece_side_length / 2 + 2, self.y + piece_side_length / 2 + textAscent() / 2) fill(255) text(self.piece_number + 1, self.x + piece_side_length / 2, self.y + piece_side_length / 2 + textAscent() / 2) stroke(piece_shadow_dark) line(self.x + piece_side_length - 1, self.y + 1, self.x + piece_side_length - 1, self.y + piece_side_length - 1) # Right side shadow line(self.x + 2, self.y + piece_side_length, self.x + piece_side_length - 1, self.y + piece_side_length) # Bottom side shadow stroke(piece_shadow_light) # Left bright line(self.x + 2, self.y - 1, self.x + 2, self.y + piece_side_length) # Upper bright line(self.x + 2, self.y + 1, self.x + piece_side_length - 1, self.y + 1)