Add printable board

This commit is contained in:
2022-08-31 09:56:47 -04:00
parent 5f9a0d1990
commit bc4922dc55
+31 -16
View File
@@ -2,7 +2,6 @@
from __future__ import annotations from __future__ import annotations
from os import path from os import path
from itertools import islice
import sys import sys
class BoardCell: class BoardCell:
@@ -47,16 +46,17 @@ class BoardCell:
return f"({self.__row}, {self.__col}): {self.__letters}" return f"({self.__row}, {self.__col}): {self.__letters}"
def __repr__(self): def __repr__(self):
return f"({self.__row}, {self.__col}): {self.__letters}" return f"(BoardCell({self.__row}, {self.__col}): {self.__letters}; {self.__adjacent_cells})"
class BoggleBoard: class BoggleBoard:
'''Boggle board structure''' '''Boggle board structure'''
def __init__(self, board: list[list[str]], max_word_len: int = 14) -> BoggleBoard: def __init__(self, board: list[list[str]], max_word_len: int = 14) -> BoggleBoard:
self.__height: int = len(board) self.__height: int = len(board)
self.__width: int = len(board[0]) if self.__height > 0 else 0 self.__width: int = len(board[0]) if self.__height > 0 else 0
self.__board_list = board
self.__board: dict[(int, int), BoardCell] = {} self.__board: dict[(int, int), BoardCell] = {}
# max word length is limited by size of the board # Max word length is limited by size of the board
self.__max_word_len = min(max_word_len, self.__width * self.__height) self.__max_word_len = min(max_word_len, self.__width * self.__height)
# Generate BoardCell for each position on the board # Generate BoardCell for each position on the board
@@ -67,10 +67,24 @@ class BoggleBoard:
# Update adjacent cell references for each BoardCell # Update adjacent cell references for each BoardCell
for cell in self.__board.values(): for cell in self.__board.values():
adjacent_indexes = self.__get_adjacent_indexes(cell.row, cell.col) adjacent_indexes = self.__get_adjacent_indexes(cell.row, cell.col)
#print(cell)
#print(adjacent_indexes)
cell.adjacent_cells = [self.__board[(x[0], x[1])] for x in adjacent_indexes] cell.adjacent_cells = [self.__board[(x[0], x[1])] for x in adjacent_indexes]
def __str__(self):
flattened_board_list = [y for x in self.__board_list for y in x]
max_len = len(max(flattened_board_list, key=len))
max_len = max_len + 1 if max_len % 2 == 0 else max_len + 2 # keep header_len odd
header_len = self.__width * (max_len + 1) - 1
head = "-" * header_len
header = f"+{head}+\n"
body = ""
for row in self.__board_list:
body += "|"
for col in row:
body += f"{col.upper(): ^{max_len}}|"
body += "\n"
body += header
return f"{header}{body}"
@property @property
def height(self) -> int: def height(self) -> int:
'''Getter for height property''' '''Getter for height property'''
@@ -174,7 +188,7 @@ class WordNode:
return f"WordNode: {self.letters}, {self.is_word}" return f"WordNode: {self.letters}, {self.is_word}"
def __repr__(self): def __repr__(self):
return self.__str__() return f"WordNode: {self.letters}, {self.is_word}, {self.children}"
class WordTree: class WordTree:
'''A tree populated by WordNode(s) to complete words from a given root letter and wordlist''' '''A tree populated by WordNode(s) to complete words from a given root letter and wordlist'''
@@ -323,11 +337,12 @@ class WordTree:
#print("WORD FOUND:", "".join([board.board[x].letters for x in word_path]), word_path) #print("WORD FOUND:", "".join([board.board[x].letters for x in word_path]), word_path)
self.active_node = self.active_node.parent self.active_node = self.active_node.parent
subtree.active_node = subtree.active_node.parent subtree.active_node = subtree.active_node.parent
#subtree.leaf_nodes_by_word.append(self.active_node)
return return
elif self.active_node.is_word: elif self.active_node.is_word:
word_path = subtree.active_node.path[::-1] word_path = subtree.active_node.path[::-1]
print("WORD FOUND:", "".join([board.board[x].letters for x in word_path]), word_path) #print("WORD FOUND:", "".join([board.board[x].letters for x in word_path]), word_path)
#subtree.leaf_nodes.append(self.active_node) #subtree.leaf_nodes_by_word.append(self.active_node)
if depth > self.max_word_len: if depth > self.max_word_len:
print(f"MAX DEPTH REACHED! Depth = {depth}") print(f"MAX DEPTH REACHED! Depth = {depth}")
@@ -387,12 +402,12 @@ def read_boggle_file(file):
return [x.rstrip().split(',') for x in file.readlines()] return [x.rstrip().split(',') for x in file.readlines()]
if __name__ == "__main__": if __name__ == "__main__":
b2 = read_boggle_file("boards/b1.csv") #b2 = read_boggle_file("boards/b1.csv")
#b2 = read_boggle_file(sys.argv[1]) b2 = read_boggle_file(sys.argv[1])
b2_board = BoggleBoard(b2) b2_board = BoggleBoard(b2)
print([x.letters for x in b2_board.board.values()]) print(b2_board)
boggle_tree = build_full_boggle_tree(b2_board, "wordlists/dwyl") #boggle_tree = build_full_boggle_tree(b2_board, "wordlists/dwyl")
print("Search 'quay':", boggle_tree[(1,1)].search('quay').path) #print("Search 'quay':", boggle_tree[(1,1)].search('quay').path)
print("Search 'quip':", boggle_tree[(1,1)].search('quip').path) #print("Search 'quip':", boggle_tree[(1,1)].search('quip').path)
print("Search 'squall':", boggle_tree[(0,0)].search('squall').path) #print("Search 'squall':", boggle_tree[(0,0)].search('squall').path)
print("Search 'quash':", boggle_tree[(1,1)].search('quash').path) #print("Search 'quash':", boggle_tree[(1,1)].search('quash').path)