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()
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)