Example #1
0
class Board:
    def __init__(self):
        # overhaul size of the screen by 16x16 pixels as 1 unit
        self.size = {'columns': 45, 'rows': 30}
        # time in ticks between each snake move
        self.snakepace = 6
        # snake state, alive = True, dead = False
        self.snakeState = True
        # game score
        self.score = 0
        # internal cool down to limit player movement
        self.cd = [9, 9, False]
        # screen size in pixels
        self.psize = {'width': 720, 'height': 480}
        # fps control
        self.clock = pygame.time.Clock()
        # time in ticks for internal control
        self.pace = 0
        # spawning snake and assigning to a variable
        self.snake = Snake(352, 240)
        # spawning food and assigning to a variable
        self.food = Food(
            randint(1, self.size['columns'] - 1) * 16,
            randint(1, self.size['rows'] - 1) * 16)
        # board
        self.rows = []
        self.screen = pygame.display.set_mode(
            (self.psize['width'], self.psize['height']))
        # rows
        for i in range(0, self.size['rows']):
            self.row = []
            # columns
            for j in range(0, self.size['columns']):
                if i == 0:
                    if j == 0:
                        self.row.append(LTCell(j * 16, i * 16))
                    elif j == self.size['columns'] - 1:
                        self.row.append(TRCell(j * 16, i * 16))
                    else:
                        self.row.append(TCell(j * 16, i * 16))
                elif i == self.size['rows'] - 1:
                    if j == 0:
                        self.row.append(BLCell(j * 16, i * 16))
                    elif j == self.size['columns'] - 1:
                        self.row.append(RBCell(j * 16, i * 16))
                    else:
                        self.row.append(BCell(j * 16, i * 16))
                elif i > 0 and j == 0:
                    self.row.append(LCell(j * 16, i * 16))
                elif i > 0 and j == self.size['columns'] - 1:
                    self.row.append(RCell(j * 16, i * 16))
                else:
                    self.row.append(Cell(j * 16, i * 16))
            self.rows.append(self.row)

    # increment in pace
    def pace_increment(self):
        self.pace += 1

    # draw background in board's screen variable
    def draw_background(self):
        for i in range(0, self.size['rows']):
            for j in range(0, self.size['columns']):
                self.screen.blit(self.rows[i][j].cell,
                                 self.rows[i][j].cellRect)
        pygame.display.flip()

    # spawns food in random place
    def spawn_new_food(self):
        self.food = Food(
            randint(1, self.size['columns'] - 1) * 16,
            randint(1, self.size['rows'] - 1) * 16)

    # respawn food
    def kill_food(self, snake: Snake):
        def overlap():
            if self.food.coordinates() == snake.headRect:
                return True
            for body_rect in snake.bodyRect:
                if self.food.coordinates() == body_rect:
                    return True
            if self.food.coordinates() == snake.tailRect:
                return True
            return False

        while True:
            self.spawn_new_food()
            if not overlap():
                break

    # draws food in board's screen
    def draw_food(self):
        self.screen.blit(self.food.sprite, self.food.spriteRect)

    # kills the snake
    def kill_snake(self):
        self.snakeState = False

    # draws snake in class's screen
    def draw_snake(self):
        self.screen.blit(self.snake.headSprite, self.snake.headRect)
        for i in range(0, self.snake.bodyLength):
            self.screen.blit(self.snake.bodySprite[i], self.snake.bodyRect[i])
        self.screen.blit(self.snake.tailSprite, self.snake.tailRect)

    # check if snake is in contact with itself or the wall
    def snake_kill_check(self):
        def snake_wall_check():
            if self.snake.headRect.left < 0 or self.snake.headRect.right > self.psize[
                    'width']:
                self.kill_snake()
                return True
            if self.snake.headRect.top < 0 or self.snake.headRect.bottom > self.psize[
                    'height']:
                self.kill_snake()
                return True

        def snake_body_check():
            try:
                for i in range(1, self.snake.bodyLength):
                    if self.snake.headRect == self.snake.bodyRect[i]:
                        self.kill_snake()
                        return True
                    if self.snake.headRect == self.snake.tailRect:
                        self.kill_snake()
                        return True
            except IndexError:
                pass

        return True if snake_wall_check() or snake_body_check() else False