def __init__ (self):
self.msg = "No words in grid"
+# exception to raise when solution is imcomplete when trying to verify it
+class IncompleteSolutionException (Exception):
+ def __init__ (self):
+ self.msg = "Solution incomplete"
+
class CrosswordPuzzle:
def __init__ (self, rows, cols):
# define number of rows and columns
for col in range (self.cols):
self.data[row][col].revealed = revealed
+ # clear the guesses for the board
+ def clear_guesses (self):
+ # run through the grid and set the guesses to None
+ for row in range (self.rows):
+ for col in range (self.cols):
+ self.data[row][col].guess = None
+
+ # verify the solution - return True if all guessed characters are correct
+ # return False if some of them are wrong.
+ # if the board is not completed as yet, raise a IncompleteSolutionException
+ def is_solution_correct (self):
+ # run through the grid and check for each character in occupied cells
+ flag = True
+ for row in range (self.rows):
+ for col in range (self.cols):
+ if (self.data[row][col].occupied_across is True or
+ self.data[row][col].occupied_down is True):
+ # if there is no guess at a particular location raise
+ # the incomplete solution exception
+ if not self.data[row][col].guess:
+ raise IncompleteSolutionException
+ # if a character doesn't match, return False
+ if self.data[row][col].char <> self.data[row][col].guess:
+ flag = False
+
+ # finally return result
+ return flag
self.gtk_main_quit ()
+ # callback for menu item clear grid activated event
+ def on_cleargrid_activate (self, menuitem):
+ if self.puzzle:
+ dlg = gtk.MessageDialog (self.window, gtk.DIALOG_MODAL,
+ gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO,
+ "Are you sure you wish to clear your entries?")
+ if dlg.run () == gtk.RESPONSE_YES:
+ # clear the guesses
+ self.puzzle.clear_guesses ()
+ # redraw the grid
+ puzgrid = self.ui.get_object ("puzzlegrid")
+ puzgrid.queue_draw ()
+ dlg.destroy()
+
+ # callback for menu item verify board activated event
+ def on_verify_activate (self, menuitem):
+ if self.puzzle:
+ try:
+ ans = self.puzzle.is_solution_correct ()
+ # if the solution is correct
+ if ans:
+ dlg = gtk.MessageDialog (self.window, gtk.DIALOG_MODAL,
+ gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE,
+ "Success! Your entries are correct.")
+ dlg.run ()
+ else:
+ dlg = gtk.MessageDialog (self.window, gtk.DIALOG_MODAL,
+ gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE,
+ "Your solution has some errors. Fix them and try again")
+ dlg.run ()
+ except crosswordpuzzle.IncompleteSolutionException:
+ dlg = gtk.MessageDialog (self.window, gtk.DIALOG_MODAL,
+ gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
+ "You've not completed the board yet. Cannot verify")
+ dlg.run ()
+ dlg.destroy ()
+
# callback for menu item hide solution activated event
def on_hidesolution_activate (self, menuitem):
if self.puzzle:
<property name="visible">True</property>
<property name="label" translatable="yes">_Verify your board...</property>
<property name="use_underline">True</property>
+ <signal name="activate" handler="on_verify_activate"/>
</object>
</child>
<child>
<property name="visible">True</property>
<property name="label" translatable="yes">_Clear all...</property>
<property name="use_underline">True</property>
+ <signal name="activate" handler="on_cleargrid_activate"/>
</object>
</child>
</object>