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