Clear grid and verify solution implemented
authorHarishankar <v.harishankar@gmail.com>
Wed, 8 Dec 2010 05:37:13 +0000 (11:07 +0530)
committerHarishankar <v.harishankar@gmail.com>
Wed, 8 Dec 2010 05:37:13 +0000 (11:07 +0530)
Now clearing the puzzle grid and verifying the solution has
been implemented

crosswordpuzzle.py
player_mainwindow.py
playerwindow.glade

index ffdd915..7ee206f 100644 (file)
@@ -119,6 +119,11 @@ class NoWordsException (Exception):
        def __init__ (self):
                self.msg = "No words in grid"
 
        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
 class CrosswordPuzzle:
        def __init__ (self, rows, cols):
                # define number of rows and columns
@@ -643,4 +648,31 @@ class CrosswordPuzzle:
                        for col in range (self.cols):
                                self.data[row][col].revealed = revealed
 
                        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
 
 
index b384b54..8ee60a7 100644 (file)
@@ -33,6 +33,43 @@ class MainWindow:
 
                self.gtk_main_quit ()
 
 
                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:
        # callback for menu item hide solution activated event
        def on_hidesolution_activate (self, menuitem):
                if self.puzzle:
index 500f359..cde1419 100644 (file)
@@ -87,6 +87,7 @@
                         <property name="visible">True</property>
                         <property name="label" translatable="yes">_Verify your board...</property>
                         <property name="use_underline">True</property>
                         <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>
                       </object>
                     </child>
                     <child>
@@ -94,6 +95,7 @@
                         <property name="visible">True</property>
                         <property name="label" translatable="yes">_Clear all...</property>
                         <property name="use_underline">True</property>
                         <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>
                       </object>
                     </child>
                   </object>