Exemple #1
0
class Application(Frame):
    # class attributes
    matrix = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]


    WIDTH = 1000
    HEIGHT = 700
    IMAGE_SIZE = 60

    def __init__(self, window):
        super().__init__(window)
        self.grid() # display

        #build map
        map = Map(self.matrix, 50)
        self.WIDTH = map.getScreenWidth()
        self.HEIGHT = map.getScreenHeight()

        # Canvas - private instance variable
        self.__canvas = Canvas(self, width = self.WIDTH, height = self.HEIGHT, bg = "white")
        self.__canvas.grid()



        # Images - private instance variable
        self.snake = Snake(self.__canvas, 5, map.num2pixel(5), map.num2pixel(6))
        self.food = Sprite("goomba.gif", self.__canvas, 300, 300)

        # bind keyboard
        self.__canvas.bind("<Key>", self.key)
        # focus input on canvas
        self.__canvas.focus_set()
        self.start()

    def start(self):
        self.score = StringVar(self, 0)
        self.scoreVal = 0
        self.scoreText = self.__canvas.create_text(self.WIDTH - 120, self.HEIGHT/10, font = "Times 20 bold" ,text="score:")
        self.scoreText = self.__canvas.create_text(self.WIDTH - 50, self.HEIGHT/10, font = "Times 20 bold" ,text=self.score.get())
        self.update()

    def update(self):
        gameOver = False
        self.__canvas.itemconfig(self.scoreText, text = self.score.get())

        self.snake.snakeMove(self.snake.cur_dir)
        collider = Collider(self.__canvas)
        if collider.hasCollision(self.snake.spriteList[0].spriteEntity, self.food.spriteEntity):
            self.snake.eat()
            self.food.kill()
            self.randomFood()
            self.scoreVal += 1
            self.score.set(self.scoreVal)
        for i in range(1, len(self.snake.spriteList)):
            if collider.hasCollision(self.snake.spriteList[0].spriteEntity, self.snake.spriteList[i].spriteEntity):
                gameOver = True
        if not gameOver:
            self.snake.snakeOffScreen(self.WIDTH, self.HEIGHT, self.IMAGE_SIZE)
            self.after(150, self.update)
        else:
            text = self.__canvas.create_text(self.WIDTH/2, self.HEIGHT/2, font = "Times 30 bold" ,text="Game Over")

    def randomFood(self):
        row = int(self.HEIGHT/self.IMAGE_SIZE)
        col = int(self.WIDTH/self.IMAGE_SIZE)
        allPos = [i for i in range(row*col)]
        invalidPos = []
        for sprite in self.snake.spriteList:
            invalidPos.append(int(sprite.y/self.IMAGE_SIZE) * row + int(sprite.x/self.IMAGE_SIZE))
        valid = []
        for x in allPos:
            if x not in invalidPos:
                valid.append(x)
        x = int(valid[random.randint(0, len(valid)-1)]%col) * self.IMAGE_SIZE
        y = int(valid[random.randint(0, len(valid)-1)]/col) * self.IMAGE_SIZE
        self.food = Sprite("goomba.gif", self.__canvas, x,y)



    # # set up our key bindings
    def key(self, event):
        if event.keysym == "Up" or event.keysym == "w":
            self.snake.cur_dir = -1
        elif event.keysym == "Down" or event.keysym == "s":
            self.snake.cur_dir = 1
        elif event.keysym == "Left" or event.keysym == "a":
            self.snake.cur_dir = -2
        elif event.keysym == "Right" or event.keysym == "d":
            self.snake.cur_dir = 2