Example #1
0
 def add_board(self):
     board = VGroup(*[
         Square(
             side_length = 0.8,
             stroke_width = 0, fill_opacity = 1,
             fill_color = CB_DARK if (i+j)%2!=0 else CB_LIGHT
         )
         for i in range(8) for j in range(8)
     ])
     board.arrange_submobjects_in_grid(8, 8, buff = 0)
     self.add(board)
     self.board = board
class SudokuBoard(VGroup):
    CONFIG = {
        "n": 3,
        "height": 6,
    }

    def generate_points(self):
        n = self.n
        self.small_squares = VGroup(*[
            Square(side_length=1, stroke_color=GREY, stroke_width=3)
            for k in range(n**4)
        ])
        self.small_squares.arrange_submobjects_in_grid(n**2, n**2, buff=0)
        self.big_squares = VGroup(*[
            Square(side_length=self.n, stroke_color=WHITE, stroke_width=8)
            for k in range(n**2)
        ])
        self.big_squares.arrange_submobjects_in_grid(n, n, buff=0)
        self.entries = dict()
        self.add(self.small_squares, self.big_squares)
        self.center()
        self.set_height(self.height)

    def add_entry(self, x, y, entry):
        # x: row index (up->down, 0->8); y: column index (left->right, 0->8)
        text = TexMobject(str(entry))
        square = self.get_square(x, y)
        fit_mobject_in(text, square)
        self.entries[(x, y)] = text
        self.add(text)

    def add_entries(self, entries):
        for (x, y), entry in entries:
            self.add_entry(x, y, entry)

    def get_square(self, x, y):
        square_index = (self.n**2) * x + y
        return self.small_squares[square_index]

    def get_square_critical_point(self, x, y, direction):
        square = self.get_square(x, y)
        return square.get_critical_point(direction)

    def get_entry(self, x, y):
        return self.entries[(x, y)]

    def get_elimination_arrow(self, x1, y1, x2, y2, direction, **arrow_kwargs):
        nudge = self.get_square(0, 0).get_height() * 0.05 * (-direction)
        start_point = self.get_square_critical_point(x1, y1, direction) + nudge
        end_point = self.get_square_critical_point(x2, y2, direction) + nudge
        arrow = Arrow(start_point, end_point, buff=0, **arrow_kwargs)
        return arrow