def Move(self, direction: Direction, map: Map):
        ''' Liikuttaa ajoneuvoa haluttuun suuntaan.

        Kohdekoordinaatti riippuu ajoneuvon nopeudesta. Osa ajoneuvoista voi liikkua vain tietynlaisessa 
        maastossa. Varmista, että ajoneuvo ei liiku sellaiseen maastoon, jossa se ei voi kulkea.
        Ajoneuvo liikkuu sen nopeuden määrittämän määrän ruutuja vuoron aikana suuntaan direction, mutta
        kuitenkin siten, että se ei päädy koskaan sellaiselle maastolle, missä se ei voi kulkea.
        Esimerkiksi jos ajoneuvon nopeus on kaksi, mutta kulkusuunnassa on vain yksi ruutu maastoa, jossa
        ajoneuvo voi kulkea, liikkuu ajoneuvo vain yhden ruudun.
        Metodi asettaa self.position muuttujan arvon siihen koordinaattiin, johon ajoneuvo on
        liikkunut.
    '''
        # 1. Luetaan nykyinen sijainti
        targetPosition = self.position

        # 2. for liike in 1..nopeus
        for step in range(1, self.speed + 1):
            if direction == Direction.UP:
                x = targetPosition[0]
                y = targetPosition[1] - 1
            elif direction == Direction.DOWN:
                x = targetPosition[0]
                y = targetPosition[1] + 1
            elif direction == Direction.LEFT:
                x = targetPosition[0] - 1
                y = targetPosition[1]
            elif direction == Direction.RIGHT:
                x = targetPosition[0] + 1
                y = targetPosition[1]

            # 2.1 tutkitaan, onko maasto kohdekoordinaatissa sallittu
            try:
                terrain = map.GetTerrainAt(x - 1, y - 1)
                if terrain in self.allowedTerrains:
                    # 2.2 jos on, päivitä sijainti
                    targetPosition = (x, y)
                    self.position = targetPosition
                else:
                    # 2.3 jos ei, poistu silmukasta
                    # Kohteessa on maastoa, jossa ajoneuvo ei voi liikkua, lopeta funktio
                    return

            except IndexError:
                # Yritetään liikkua kartan ulkopuolelle
                return  # Lopetetaan funktion suoritus
Ejemplo n.º 2
0
    def Move(self, direction: Direction, map: Map):
        ''' Liikuttaa ajoneuvoa parametrin direction suuntaan

        Liikuttaa ajoneuvoa haluttuun suuntaan, mutta vain, jos kyseisessä suunnassa on sallittua maastoa.
        Kohdekoordinaatti riippuu ajoneuvon nopeudesta. Osa ajoneuvoista voi liikkua vain tietynlaisessa 
        maastossa. Varmista, että ajoneuvo ei liiku sellaiseen maastoon, jossa se ei voi kulkea.
        Ajoneuvo liikkuu sen nopeuden määrittämän määrän ruutuja vuoron aikana suuntaan direction, mutta
        kuitenkin siten, että se ei päädy koskaan sellaiselle maastolle, missä se ei voi kulkea.
        Esimerkiksi jos ajoneuvon nopeus on kaksi, mutta kulkusuunnassa on vain yksi ruutu maastoa, jossa
        ajoneuvo voi kulkea, liikkuu ajoneuvo vain yhden ruudun.
    '''
        # 1. Otetaan ajoneuvon nykyinen sijainti talteen
        targetPosition = self.position

        # 2. Silmukassa, selvitä ruutu kerrallaan, voiko ajoneuvo liikkua siihen
        # (pyrkii liikkumaan nopeuden verran ruutuja)
        for step in range(1, self.speed + 1):
            # Selvitetään koordinaatti liikkumisen jälkeen
            if direction == Direction.UP:
                x = targetPosition[0]
                y = targetPosition[1] - 1
            elif direction == Direction.DOWN:
                x = targetPosition[0]
                y = targetPosition[1] + 1
            elif direction == Direction.LEFT:
                x = targetPosition[0] - 1
                y = targetPosition[1]
            elif direction == Direction.RIGHT:
                x = targetPosition[0] + 1
                y = targetPosition[1]

            targetTerrain = map.GetTerrainAt(x - 1, y - 1)
            if targetTerrain == Terrain.NONE:
                return  # Arvo NONE tarkoittaa, että yritettiin liikkua kartan ulkopuolelle, poistutaan funktiosta

            # Jos kohderuudussa ei ole sallittua maastoa, poistu funktiosta
            if targetTerrain not in self.allowedTerrains:
                return

            # Liikutaan sallittuun maastoon, päivitetään ajoneuvon sijainti
            targetPosition = (x, y)
            self.position = targetPosition