Clues can now be entered for words
[getaclue.git] / crosswordpuzzle.py
index 56807cd..9617897 100644 (file)
@@ -45,6 +45,11 @@ 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)
+
 class CrosswordPuzzle:
        def __init__ (self, rows, cols):
                # define number of rows and columns
@@ -63,6 +68,76 @@ class CrosswordPuzzle:
                        for j in range (cols):
                                self.data[i].append (GridItem ())
 
+       # 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, start_col, row, len(word))
+
        # setting a down word
        def set_word_down (self, row, col, word):
                # if the grid is frozen the abort