X-Git-Url: https://harishankar.org/repos/?p=getaclue.git;a=blobdiff_plain;f=crosswordpuzzle.py;h=56807cdc36696f22e750b3f6ae45bc3ef0f2df38;hp=c1f822b3ed8a121c7af46d456626225f9de18471;hb=b1ba162f06177e9ccd5456e378069aafe6b2a916;hpb=85159420b6ed652a259484b3cf192f602d9418c0 diff --git a/crosswordpuzzle.py b/crosswordpuzzle.py index c1f822b..56807cd 100644 --- a/crosswordpuzzle.py +++ b/crosswordpuzzle.py @@ -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 @@ -156,40 +163,6 @@ class CrosswordPuzzle: self.data[row][col+i].char = word[i].upper () self.data[row][col+i].occupied_across = True - # display the grid with words - def print_grid (self, no_words=False): - # get row, col and print them (with grid number if set) - for col in range (self.cols): - # print the first row as column headers - print self.BLUE + ' ' + str (col) + self.ENDCOL, - print - - for row in range (self.rows): - for col in range (self.cols): - # print the data - # if the cell is numbered i.e. start of a word - if self.data[row][col].numbered != 0: - print self.BRICKRED + str(self.data[row][col].numbered) + self.ENDCOL, - # print a space - else: - print ' ', - # if the character is not a blank or a block - if self.data[row][col].char <> "." and self.data[row][col].char <> "#": - # if words are to be shown regardless of hidden/revealed state - if no_words is False: - print self.BOLD + self.data[row][col].char + self.ENDCOL, - else: - # display only revealed - if self.data[row][col].revealed is True: - print self.BOLD + self.data[row][col].char + self.ENDCOL, - # else print a block - else: - print self.GREY + '.' + self.ENDCOL, - else: - print self.GREY + self.data[row][col].char + self.ENDCOL, - - print ' ' + self.BLUE + str(row) + self.ENDCOL - # freeze the grid numbers etc. def freeze_grid (self): # numbering @@ -208,3 +181,15 @@ class CrosswordPuzzle: self.frozen_grid = True + # unfreeze the grid numbers etc. + def unfreeze_grid (self): + # run through the grid + for row in range (self.rows): + for col in range (self.cols): + self.data[row][col].numbered = 0 + if (self.data[row][col].occupied_across is False and + self.data[row][col].occupied_down is False): + self.data[row][col].char = '.' + + self.frozen_grid = False +