generated from mwc/project_game
89 lines
1.6 KiB
Python
89 lines
1.6 KiB
Python
import random
|
|
|
|
from cell import Cell
|
|
|
|
|
|
class Board:
|
|
|
|
def __init__(self):
|
|
|
|
self.grid = [[0 for _ in range(9)] for _ in range(9)]
|
|
self.cells = []
|
|
|
|
def generate(self):
|
|
|
|
self._fill_board()
|
|
|
|
self.create_cells()
|
|
|
|
def create_cells(self):
|
|
|
|
self.cells = []
|
|
|
|
for row in range(9):
|
|
|
|
for col in range(9):
|
|
|
|
self.cells.append(
|
|
Cell(
|
|
row=row,
|
|
col=col,
|
|
value=self.grid[row][col]
|
|
)
|
|
)
|
|
|
|
def _find_empty(self):
|
|
|
|
for row in range(9):
|
|
|
|
for col in range(9):
|
|
|
|
if self.grid[row][col] == 0:
|
|
return row, col
|
|
|
|
return None
|
|
|
|
def _valid(self, row, col, num):
|
|
|
|
if num in self.grid[row]:
|
|
return False
|
|
|
|
for r in range(9):
|
|
if self.grid[r][col] == num:
|
|
return False
|
|
|
|
box_row = (row // 3) * 3
|
|
box_col = (col // 3) * 3
|
|
|
|
for r in range(box_row, box_row + 3):
|
|
for c in range(box_col, box_col + 3):
|
|
|
|
if self.grid[r][c] == num:
|
|
return False
|
|
|
|
return True
|
|
|
|
def _fill_board(self):
|
|
|
|
empty = self._find_empty()
|
|
|
|
if empty is None:
|
|
return True
|
|
|
|
row, col = empty
|
|
|
|
nums = list(range(1, 10))
|
|
random.shuffle(nums)
|
|
|
|
for num in nums:
|
|
|
|
if self._valid(row, col, num):
|
|
|
|
self.grid[row][col] = num
|
|
|
|
if self._fill_board():
|
|
return True
|
|
|
|
self.grid[row][col] = 0
|
|
|
|
return False |