def generateSlidingBlockGrid(size): grid = None grid = convertTupleToList(generateGrid(size, 0)) goalBlock = generateGoalBlock(size) # grid = insertGoalBlockInEmptyGrid(goalBlock, grid) grid = insertGoalBlockInStartPosition(goalBlock, grid) #{DIFFICULT} i = 2 while getSpaceNumber(grid) > max(getSize(goalBlock)[0], getSize(goalBlock)[1]) + size[0]: #{DIFFICULT} # while getSpaceNumber(grid) > (size[0]+size[1]): newBlock = generateNonGoalBlock(size, i) if getInsertPosition(newBlock, grid) != (-1, -1): grid = insertNonGoalBlock(newBlock, grid, i) else: continue i += 1 # grid = performNSteps(grid, steps) if not checkIfGoalTileIsInUpperLeftHalfgrid(grid): return generateSlidingBlockGrid(size) else: return grid
def getInsertPosition(block, grid): (gridX, gridY) = getSize(grid) (blockX, blockY) = getSize(block) validPositions = [] found = False for i in range(len(grid)): for j in range(len(grid[i])): if (grid[i][j] == 0): tempBool = True for k in range(blockX): for l in range(blockY): if i + k > gridX - 1 or j + l > gridY - 1: tempBool = False break if grid[i + k][j + l] != 0: tempBool = False break if tempBool: validPositions.append((i, j)) found = True if found: return random.choice(validPositions) else: return (-1 ,-1)
def getInsertPosition(block, grid): (gridX, gridY) = getSize(grid) (blockX, blockY) = getSize(block) validPositions = [] found = False for i in range(len(grid)): for j in range(len(grid[i])): if (grid[i][j] == 0): tempBool = True for k in range(blockX): for l in range(blockY): if i + k > gridX - 1 or j + l > gridY - 1: tempBool = False break if grid[i + k][j + l] != 0: tempBool = False break if tempBool: validPositions.append((i, j)) found = True if found: return random.choice(validPositions) else: return (-1, -1)
def checkIfInsertionPossible(grid, block): (gridX, gridY) = getSize(grid) (blockX, blockY) = getSize(block) if insertNonGoalBlock(block, grid, 15) == (-1, -1): return False for i in range(len(grid)): for j in range(len(grid[i])): if (grid[i][j] == 0): tempBool = True for k in range(blockX): if i + k > gridX - 1: tempBool = False break if grid[i + k][j] != 0: tempBool = False break for l in range(blockY): if j + l > gridY - 1: tempBool = False break if grid[i][j + l] != 0: tempBool = False break if tempBool: return True return False
def generateSlidingBlockGrid(size): grid = None grid = convertTupleToList(generateGrid(size, 0)) goalBlock = generateGoalBlock(size) # grid = insertGoalBlockInEmptyGrid(goalBlock, grid) grid = insertGoalBlockInStartPosition(goalBlock, grid) #{DIFFICULT} i = 2 while getSpaceNumber(grid) > max( getSize(goalBlock)[0], getSize(goalBlock)[1]) + size[0]: #{DIFFICULT} # while getSpaceNumber(grid) > (size[0]+size[1]): newBlock = generateNonGoalBlock(size, i) if getInsertPosition(newBlock, grid) != (-1, -1): grid = insertNonGoalBlock(newBlock, grid, i) else: continue i += 1 # grid = performNSteps(grid, steps) if not checkIfGoalTileIsInUpperLeftHalfgrid(grid): return generateSlidingBlockGrid(size) else: return grid
def insertGoalBlockInEmptyGrid(goalBlock, emptyGrid): emptyGrid = convertTupleToList(emptyGrid) for i in range(len(emptyGrid) - getSize(goalBlock)[0], len(emptyGrid)): for j in range (0, getSize(goalBlock)[1]): emptyGrid[i][j] = 1 return convertListToTuple(emptyGrid)
def insertGoalBlockInEmptyGrid(goalBlock, emptyGrid): emptyGrid = convertTupleToList(emptyGrid) for i in range(len(emptyGrid) - getSize(goalBlock)[0], len(emptyGrid)): for j in range(0, getSize(goalBlock)[1]): emptyGrid[i][j] = 1 return convertListToTuple(emptyGrid)
def insertGoalBlockInStartPosition(goalBlock, emptyGrid): emptyGrid = convertTupleToList(emptyGrid) goalSize = getSize(goalBlock) for i in range(0, goalSize[0]): for j in range (len(emptyGrid[i]) - goalSize[1], len(emptyGrid[i])): emptyGrid[i][j] = 1 return convertListToTuple(emptyGrid)
def insertGoalBlockInStartPosition(goalBlock, emptyGrid): emptyGrid = convertTupleToList(emptyGrid) goalSize = getSize(goalBlock) for i in range(0, goalSize[0]): for j in range(len(emptyGrid[i]) - goalSize[1], len(emptyGrid[i])): emptyGrid[i][j] = 1 return convertListToTuple(emptyGrid)
def insertNonGoalBlock(block, grid, symbol): (blockX, blockY) = getSize(block) # Get the position of the leftmost upper corner insertPos = getInsertPosition(block, grid) i = insertPos[0] j = insertPos[1] grid = convertTupleToList(grid) grid[i][j] = symbol # Fill it up for k in range(blockX): for l in range(blockY): if grid[i + k][j + l] == 0: grid[i + k][j + l] = symbol return convertListToTuple(grid)