Made some logic changes to word intersection code
authorHarishankar <v.harishankar@gmail.com>
Sat, 4 Dec 2010 12:06:43 +0000 (17:36 +0530)
committerHarishankar <v.harishankar@gmail.com>
Sat, 4 Dec 2010 12:06:43 +0000 (17:36 +0530)
Refined the word intersection detection code a bit but it is
still not perfect.

crosswordpuzzle.py
crosswordpuzzlecreator.py

index fb9ada5..56807cd 100644 (file)
@@ -46,17 +46,6 @@ class FrozenGridException (Exception):
                self.msg = "Grid is frozen and cannot be edited"
 
 class CrosswordPuzzle:
-       # ansi color codes for grid display
-       BRICKRED = '\033[44;1;31m'
-       # bold
-       BOLD = '\033[33m'
-       # blue
-       BLUE = '\033[34m'
-       # grey
-       GREY = '\033[30m'
-       # disable colors
-       ENDCOL = '\033[0m'
-
        def __init__ (self, rows, cols):
                # define number of rows and columns
                self.rows = rows
@@ -89,14 +78,23 @@ class CrosswordPuzzle:
                        # on the same column
                        if self.data[row+i][col].occupied_down is True:
                                raise IntersectWordException (word, len(word))
-                       # on the previous column
-                       if col > 0 and self.data[row+i][col-1].occupied_down is True:
-                               raise IntersectWordException (word, len(word))
-                       # on the next column
-                       if (col < (len(word) - 1) and
-                               (self.data[row+i][col+1].occupied_down is True or
-                               self.data[row+i][col+1].across_start is True)):
-                               raise IntersectWordException (word, len(word))
+                       # on the previous column except first column
+                       if col > 0:
+                               # except the first and last col
+                               if i > 0 and i < len(word) - 1:
+                                       if self.data[row+i][col-1].occupied_down is True:
+                                               raise IntersectWordException (word, len(word))
+                       # on the next column except last column
+                       if col < len(word) - 1:
+                               # except the first and last row check if there is any
+                               # down word in previous column
+                               if i > 0 and i < len(word) - 1:
+                                       if self.data[row+i][col+1].occupied_down is True:
+                                               raise IntersectWordException (word, len(word))
+                               # check if there is any across word starting in the
+                               # next column
+                               if self.data[row+i][col+1].across_start is True:
+                                       raise IntersectWordException (word, len(word))
 
                # also check the character before and after
                if (row > 0 and self.data[row-1][col].occupied_down is True
@@ -127,17 +125,26 @@ class CrosswordPuzzle:
 
                # is the word intersecting any other word?
                for i in range (len(word)):
-                       # on the same line
+                       # on the same row
                        if self.data[row][col+i].occupied_across is True:
                                raise IntersectWordException (word, len(word))
-                       # on a previous line except the last column
-                       if row > 0 and self.data[row-1][col+i].occupied_across is True:
-                               raise IntersectWordException (word, len(word))
-                       # on a next line except the last column
-                       if (row < (self.rows - 1) and
-                        (self.data[row+1][col+i].down_start is True
-                       or self.data[row+1][col+i].occupied_across is True)):
-                               raise IntersectWordException (word, len(word))
+                       # on a previous row except first row
+                       if row > 0:
+                               # if not the first or last col
+                               if i > 0 and i < len(word) - 1:
+                                       if self.data[row-1][col+i].occupied_across is True:
+                                               raise IntersectWordException (word, len(word))
+                       # on a next row
+                       if (row < (self.rows - 1)):
+                               # except the first and last letter check if there is
+                               # any across intersection
+                               if i > 0 and i < len (word) - 1:
+                                       if self.data[row+1][col+i].occupied_across is True:
+                                               raise IntersectWordException (word, len(word))
+                               # if a down word is starting at any column below the
+                               # word
+                               if self.data[row+1][col+i].down_start is True:
+                                       raise IntersectWordException (word, len(word))
 
                # also check the character beyond and before and after
                if (col > 0 and (self.data[row][col-1].occupied_across is True or
@@ -184,3 +191,5 @@ class CrosswordPuzzle:
                                        self.data[row][col].occupied_down is False):
                                        self.data[row][col].char = '.'
 
+               self.frozen_grid = False
+
index 42d4fdd..4098cd3 100644 (file)
@@ -19,9 +19,9 @@ class CrosswordPuzzleCreator:
        # Black background white text
        BLACK_BG = '\033[40;1;37m'
        # white background black text
-       WHITE_BG = '\033[47;0;30m'
+       WHITE_BG = '\033[47;1;30m'
        # white background red text
-       REDWHITE_BG = '\033[47;0;31m'
+       REDWHITE_BG = '\033[47;1;31m'
        # disable colors
        ENDCOL = '\033[0m'