Exemplo n.º 1
0
class View():
    def __init__(self, screen, map, algorithm):
        self.screen = screen
        self.map = map
        self.values = eventValues()
        self.algorithm = algorithm
        self.Alg = None

        #state = ['startMenu','pickStart','pickEnd','drawWalls','algorithmRunning','end','kill']

    def getIndexByPosition(self, posClick):
        selectedRow = None
        selectedColum = None
        rows = self.map.getNumberOfRows()
        columns = self.map.getNumberOfColums()

        for i in range(columns + 1):
            if (selectedColum == None
                    and (i * (self.screen.get_width() / rows) > posClick[0])):
                selectedColum = i - 1
                break

        for i in range(rows + 1):
            if (selectedRow == None and
                (i * (self.screen.get_height() / columns) > posClick[1])):
                selectedRow = i - 1
                break

        index = (selectedRow, selectedColum)
        return index

    def getStartRetangle(self, posClick):
        inicio = False
        if (self.map.getStart() == None):
            inicio = self.map.setStart(self.getIndexByPosition(posClick))
        else:
            inicio = True
        return inicio

    def getEndRetangle(self, posClick):
        fin = False
        if (self.map.getObjective() == None):
            fin = self.map.setObjective(self.getIndexByPosition(posClick))
        else:
            fin = True
        return fin

    def reestart(self):
        return self.values.out

    def setWallByDrag(self, posClick):
        self.map.setWall(self.getIndexByPosition(posClick))

    def updateOpenRectangles(self, open):
        for node in open:
            self.map.setOpen(node.position)

    def updateClosedRectangles(self, closed):
        for node in closed:
            self.map.setClosed(node.position)

    def updateFinishRectangles(self, path):
        for i in path:
            self.map.setPath(i)

    def getColor(self, rectangle):
        value = self.map.getValue(rectangle)
        color = (0, 0, 0)
        if value == 'F':
            color = (200, 200, 200, 100)
        elif value == 'W':
            color = (20, 20, 20, 100)
        elif value == 'S':
            color = (73, 99, 251, 100)
        elif value == 'G':
            color = (235, 249, 60)
        elif value == 'O':
            color = (245, 94, 19)
        elif value == 'C':
            color = (106, 238, 56)
        elif value == 'P':
            color = (100, 8, 200)
        else:
            print('error, Value no existente')
        return color

    def drawGrid(self):
        NumberOfColums = self.map.getNumberOfColums()
        NumberOfRows = self.map.getNumberOfRows()
        blockSize = (self.screen.get_width() / NumberOfColums,
                     self.screen.get_height() / NumberOfRows)
        for x in range(NumberOfColums):
            for y in range(NumberOfRows):

                color = self.getColor((y, x))
                rect = pygame.Rect(x * blockSize[0], y * blockSize[1],
                                   blockSize[0], blockSize[1])
                pygame.draw.rect(self.screen, color, rect)
                rect = pygame.Rect(x * blockSize[0], y * blockSize[1],
                                   blockSize[0], blockSize[1])
                pygame.draw.rect(self.screen, (60, 70, 108, 60), rect, 1)

    def setAlgorithm(self):
        if self.algorithm == "A*":
            self.Alg = AStar(self.map)
        elif self.algorithm == "MinimalCost":
            self.Alg = minimalPath(self.map)

    def updateEventos(self, event):

        posClick = pygame.mouse.get_pos()
        if event.type == pygame.MOUSEBUTTONDOWN:
            if self.values.inicio == True and self.values.fin == True:
                self.values.dragged = True
        elif event.type == pygame.MOUSEBUTTONUP:
            if self.values.inicio == False:
                self.values.inicio = self.getStartRetangle(posClick)
            elif self.values.fin == False:
                self.values.fin = self.getEndRetangle(posClick)
            self.values.dragged = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN:
                if self.values.algorithmStart == False and self.values.inicio and self.values.fin:
                    self.values.algorithmStart = True
                    self.setAlgorithm()
                elif self.values.algorithmStart == True and self.values.AlgorithmEnd == True:
                    self.values.out = True

    def viewWork(self, event):
        self.updateEventos(event)
        if (self.values.algorithmStart == False):
            if (self.values.dragged == True):
                posClick = pygame.mouse.get_pos()
                self.setWallByDrag(posClick)
        else:
            if (self.Alg.IsEnd() or self.values.AlgorithmEnd):
                self.updateFinishRectangles(self.Alg.getPath())
                self.values.AlgorithmEnd = True
            else:
                self.Alg.nextStep()
                self.updateOpenRectangles(self.Alg.getOpen())
                self.updateClosedRectangles(self.Alg.getClosed())
        self.screen.fill((0, 0, 0))
        self.drawGrid()