X-Git-Url: https://harishankar.org/repos/?p=getaclue.git;a=blobdiff_plain;f=crosswordpuzzle.py;h=4e291dbb0bee01eee40efccc8e37386b066d12dc;hp=56807cdc36696f22e750b3f6ae45bc3ef0f2df38;hb=d6e2568319dc01f123d8d7cddf8a85cbeb292cb4;hpb=b1ba162f06177e9ccd5456e378069aafe6b2a916 diff --git a/crosswordpuzzle.py b/crosswordpuzzle.py index 56807cd..4e291db 100644 --- a/crosswordpuzzle.py +++ b/crosswordpuzzle.py @@ -45,6 +45,16 @@ class FrozenGridException (Exception): def __init__ (self): self.msg = "Grid is frozen and cannot be edited" +# exception when no word is found at a position +class NoWordException (Exception): + def __init__ (self, row, col): + self.pos = (row, col) + +# exception when no words are present in the grid +class NoWordsException (Exception): + def __init__ (self): + self.msg = "No words in grid" + class CrosswordPuzzle: def __init__ (self, rows, cols): # define number of rows and columns @@ -63,6 +73,108 @@ class CrosswordPuzzle: for j in range (cols): self.data[i].append (GridItem ()) + # get all the clues for across + def get_clues_across (self): + clues = [] + # traverse the grid + for row in range (self.rows): + for col in range (self.cols): + if (self.data[row][col].occupied_across is True and + self.data[row][col].across_start is True): + word_across = self.get_word_across (row, col) + clues.append ((word_across, self.data[row][col].clue_across)) + # if no across words are found at all + if not clues: + raise NoWordsException + + return clues + + # get all the clues for down + def get_clues_down (self): + clues = [] + # traverse the grid + for row in range (self.rows): + for col in range (self.cols): + if (self.data[row][col].occupied_down is True and + self.data[row][col].down_start is True): + word_down = self.get_word_down (row, col) + clues.append ((word_down, self.data[row][col].clue_down)) + # if no down words are found at all + if not clues: + raise NoWordsException + + return clues + + # getting a down word at a position + def get_word_down (self, row, col): + # if index is out of bounds + if row >= self.rows or col >= self.cols: + raise NoWordException (row, col) + + # if there is no occupied down letter at that position + if self.data[row][col].occupied_down is False: + raise NoWordException (row, col) + + # now traverse the grid to find the beginning of the word + i = row + while i >= 0: + # if it is occupied down and is the beginning of the word + if (self.data[i][col].occupied_down is True and + self.data[i][col].down_start is True): + start_row = i + break + i -= 1 + + i = start_row + word_chars = [] + # now seek the end of the word + while i < self.rows: + if self.data[i][col].occupied_down is True: + word_chars.append (self.data[i][col].char) + else: + break + i += 1 + + word = "".join (word_chars) + + # return the word, starting row, column and length as a tuple + return (word, start_row, col, len(word)) + + # getting an across word at a position + def get_word_across (self, row, col): + # if index is out of bounds + if row >= self.rows or col >= self.cols: + raise NoWordException (row, col) + + # if there is no occupied across letter at that position + if self.data[row][col].occupied_across is False: + raise NoWordException (row, col) + + # now traverse the grid to look for the beginning of the word + i = col + while i >= 0: + # if it is occupied across and is the beginning of the word + if (self.data[row][i].occupied_across is True and + self.data[row][i].across_start is True): + start_col = i + break + i -= 1 + + i = start_col + word_chars = [] + # now seek the end of the word + while i < self.cols: + if self.data[row][i].occupied_across is True: + word_chars.append (self.data[row][i].char) + else: + break + i += 1 + + word = "".join (word_chars) + + # return the word, starting column, row and length as a tuple + return (word, row, start_col, len(word)) + # setting a down word def set_word_down (self, row, col, word): # if the grid is frozen the abort