示例#1
0
class Renderer():
    def __init__(self):
        self.window = curses.initscr()
        size = self.window.getmaxyx()
        self.board = Board(size[1], size[0] - 1)
        self.snake = Snake((int(size[1] / 2), int(size[0] / 2)))
        self.apple = Apple(size[1], size[0] - 1)
        self.input = Input()
        curses.noecho()
        curses.cbreak()
        curses.curs_set(0)
        self.window.keypad(True)
        self.window.nodelay(True)
        self.window.scrollok(False)

        self.gameover = False

    def update(self):
        # Propagate user inputs
        try:
            instruction = self.input.get_instruction(self.window)
            self.snake.process_instruction(instruction)
        except exceptions.NoInputException:
            pass  # Just skip if there's no input

        # Update game object state
        self.snake.update()

        # Did the snake eat the apple?
        snakehead = self.snake.get_head_position()
        if self.apple.overlaps(snakehead):
            self.snake.grow()
            self.apple.move()

        # Check for game over
        if self.board.is_outside_bounds(
                snakehead) or self.snake.self_intersects():
            self.gameover = True
            self.board.game_over = True
            self.snake.is_active = False

        # Render
        self.window.erase()
        self.board.render(self.window)
        self.snake.render(self.window)
        self.apple.render(self.window)
        self.input.render(self.window)
        self.window.refresh()

    def terminate(self):
        curses.nocbreak()
        self.window.keypad(False)
        curses.echo()
        curses.endwin()
示例#2
0
class Game:
    def __init__(self):
        pass

    def init(self, winWidth, winHeight):
        self.fieldWidth = winWidth // constants.FIELD_SIZE
        self.fieldHeight = winHeight // constants.FIELD_SIZE

        self.snake = Snake(self.fieldWidth // 2, self.fieldHeight // 2)
        self.apple = Apple(self.snake.getOccupiedCoords(), self.fieldWidth,
                           self.fieldHeight)
        self.currentTick = 0
        self.score = 0

    def update(self):
        res = True
        self.currentTick += 1
        if self.currentTick > 5:
            res = res and self.snake.update(self.fieldWidth, self.fieldHeight)
            snakeBlocks = self.snake.getOccupiedCoords()
            if self.apple.pos in snakeBlocks:
                self.snake.grow()
                self.apple = Apple(snakeBlocks, self.fieldWidth,
                                   self.fieldHeight)

            self.currentTick = 0

        if res == False:
            #Death
            print("[GAMEOVER] Snakelength : " + str(len(self.snake.body) + 1))

        return res

    def render(self, win):
        #First render the field
        #To make the lines shorter
        fz = constants.FIELD_SIZE
        for y in range(self.fieldHeight):
            for x in range(self.fieldWidth):
                pygame.draw.rect(win, constants.FIELD_COLOR,
                                 (x * fz, y * fz, fz, fz),
                                 constants.FIELD_BORDER_SIZE)

        self.snake.render(win)

        self.apple.render(win)