示例#1
0
class Formulagame:
    
    def __init__(self, fileName, plr1, plr2):
        self.__track = Track("Tracks/" + fileName)
        self.__progress = True
        self.__moves = 0

        self.__startPosA = []
        self.__startPosB = []
        self.__initStartPos()
        
        self.__winner = None
        self.__winnerMoves = 0
        self.__trackName = fileName
        
        self.__playerA = Car("A", plr1, self.__startPosA)
        self.__playerB = Car("B", plr2, self.__startPosB)
    
    def getGrid(self):
        return self.__track.getGrid()
    
    def __initStartPos(self):
        self.__startPosA = self.__track.getPlayerPos("A")
        self.__startPosB = self.__track.getPlayerPos("B")
    
    def getProgress(self):
        return self.__progress
        
    def getSquare(self, x, y):
        return self.__track.getSquare(x, y) 
        
    def getMoves(self):
        return self.__moves

    # //
    def makeMove(self, input):
        if self.__progress == True:
            car = self.nextPlayer()
            
            startPoint = car.getLocation()

            startSquare = self.getSquare(startPoint[0], startPoint[1])
            startSquare.rmvPlayer()
            
            car.move(input)
            self.__moves += 1
            
            endPoint = car.getLocation()
            bresenham = self.bresenham(startPoint, endPoint)
            
            for point in bresenham:
                midPoint = self.getSquare(point[0], point[1])
                if not midPoint.isRoad():
                    self.__progress = False
                    return "wall", str(car.getName())
                if midPoint.isBanana():
                    car.swapDirection()
                if midPoint.getPlayer():
                    self.__progress = False
                    return "hit", str(car.getName())
                if midPoint.isFinishLine():
                    self.__progress = False
                    return "win", [car.getName(), self.getMoves()/2 + 1]
                midPoint.setVisited()

            square = self.getSquare(endPoint[0], endPoint[1])
            square.setPlayer(car.getChar())
            
            # Get the player, who's next in turn and return, so that we can print the allowed moves on the track!
            nextCar = self.nextPlayer()
            newPlayerMoves = car.allowedMoves()
            
            return bresenham, newPlayerMoves
            
        
    def nextPlayer(self):
        if (self.__moves % 2) == 0:
            return self.__playerA
        else:
            return self.__playerB

    # Bresenham's algorithm to count the square between to locations.
    # http://en.wikipedia.org/wiki/Bresenham's_line_algorithm
    def bresenham(self, oldLocation, newLocation):
        x0 = oldLocation[0]
        x1 = newLocation[0]
        y0 = oldLocation[1]
        y1 = newLocation[1]
        line = []
        sx = 0
        sy = 0
        dx = fabs(x1-x0)
        dy = fabs(y1-y0) 
        if x0 < x1:
            sx = 1 
        else:
            sx = -1
            
        if y0 < y1:
            sy = 1 
        else: 
            sy = -1
            
        diff = dx-dy
    
        while True:
            e2 = 2*diff
            if e2 > -dy:
                diff = diff - dy
                x0 += sx
    
            if e2 <  dx: 
                diff = diff + dx
                y0 = y0 + sy 
            
            line.append([x0,y0])
            
            if x0 == x1 and y0 == y1:
                break
        return line
    
    def getWidth(self):
        return self.__track.getWidth()

    def getHeight(self):
        return self.__track.getHeight()
    
    def __str__(self):
        out = ""
        out += str(self.__track)
        out += str(self.__playerA)
        return out