gnome-games r7584 - in branches/gnome-2-22/gnome-sudoku: . src/lib



Author: thomashpa
Date: Mon Apr  7 16:14:53 2008
New Revision: 7584
URL: http://svn.gnome.org/viewvc/gnome-games?rev=7584&view=rev

Log:
Backport Toms bugfixes from trunk

Modified:
   branches/gnome-2-22/gnome-sudoku/ChangeLog
   branches/gnome-2-22/gnome-sudoku/src/lib/game_selector.py
   branches/gnome-2-22/gnome-sudoku/src/lib/gsudoku.py
   branches/gnome-2-22/gnome-sudoku/src/lib/sudoku_maker.py

Modified: branches/gnome-2-22/gnome-sudoku/src/lib/game_selector.py
==============================================================================
--- branches/gnome-2-22/gnome-sudoku/src/lib/game_selector.py	(original)
+++ branches/gnome-2-22/gnome-sudoku/src/lib/game_selector.py	Mon Apr  7 16:14:53 2008
@@ -100,9 +100,23 @@
             rng = DR.categories[cat]; label = DR.label_by_cat[cat]
             #puzzle,diff = self.sudoku_maker.get_new_puzzle(.01*random.randint(*[r*100 for r in rng]))
             #diff_val = diff.value
-            puzzle,diff_val = self.sudoku_maker.get_puzzles(1,[cat],new=True,
-                                                            exclude=saved_games_to_exclude
-                                                            )[0]
+            puzzles = self.sudoku_maker.get_puzzles(1,[cat],new=True,
+                                                    exclude=saved_games_to_exclude
+                                                    )
+            if puzzles:
+                puzzle,diff_val = puzzles[0]
+            else:
+                print 'WARNING: Repeating puzzle for difficulty %s -- generate more puzzles to avoid this.'%cat
+                puzzles = self.sudoku_maker.get_puzzles(1,[cat],new=False)
+                if puzzles:
+                    puzzle,diff_val = puzzles[0]
+                    lpuz = list(puzzle)
+                    lpuz.reverse() # we reverse the puzzle so it at least looks different :-)
+                    puzzle = ''
+                    for n in lpuz: puzzle += n
+                else:
+                    print 'WARNING: No puzzle for difficulty',cat
+                    continue
             #print 'Got new puzzle for ',cat,'difficulty:',diff
             grid = sudoku.sudoku_grid_from_string(puzzle).grid
             self.new_game_model.append(('<b><i>'+label+'</i></b>',

Modified: branches/gnome-2-22/gnome-sudoku/src/lib/gsudoku.py
==============================================================================
--- branches/gnome-2-22/gnome-sudoku/src/lib/gsudoku.py	(original)
+++ branches/gnome-2-22/gnome-sudoku/src/lib/gsudoku.py	Mon Apr  7 16:14:53 2008
@@ -1258,7 +1258,8 @@
             x,y,v = self.trackers[identifier][0]
             ret.append((x,y,v,self.trackers_for_point(x,y,v)))
             self.remove(x,y)
-            self.grid.remove(x,y)
+            if self.grid and self.grid._get_(x,y):
+                self.grid.remove(x,y)
         return ret
 
     def delete_except_for_tracker (self, identifier):
@@ -1273,7 +1274,9 @@
                     ):
                     removed.append((x,y,val,self.trackers_for_point(x,y,val)))
                     self.remove(x,y)
-                    self.grid.remove(x,y)
+                    if self.grid and self.grid._get_(x,y):
+                        self.grid.remove(x,y)
+
         return removed
 
     def add_tracker (self, x, y, tracker, val=None):

Modified: branches/gnome-2-22/gnome-sudoku/src/lib/sudoku_maker.py
==============================================================================
--- branches/gnome-2-22/gnome-sudoku/src/lib/sudoku_maker.py	(original)
+++ branches/gnome-2-22/gnome-sudoku/src/lib/sudoku_maker.py	Mon Apr  7 16:14:53 2008
@@ -407,13 +407,63 @@
                         puzzle_list.append(puzzle)
         return puzzle_list
 
-    def get_puzzles (self, n, levels, new=True,
+    def get_puzzles_random (self, n, levels, new=True, exclude=[]):
+        """Return a list of n puzzles and difficulty values (as floats).
+
+        The puzzles will correspond as closely as possible to levels.
+        If new, we only return puzzles not yet played.
+        """
+        if not n: return []
+        assert(levels)
+        puzzles = []
+        # Open files to read puzzles...
+        puzzles_by_level = {}; files = {}
+        for l in levels:
+            files[l] = os.path.join(self.pickle_to,
+                                    l.replace(' ','_'))
+            fi = file(files[l],'r')
+            puzzles_by_level[l] = fi.readlines(); fi.close()
+            random.shuffle(puzzles_by_level[l])
+        i = 0; il = 0
+        n_per_level = {}
+        finished = []
+        while i < n and len(finished) < len(levels):
+            if il >= len(levels): il = 0
+            lev = levels[il]
+            # skip any levels that we've exhausted
+            if lev in finished:
+                il += 1
+                continue
+            try:
+                line = puzzles_by_level[lev].pop()
+            except IndexError:
+                finished.append(lev)
+            else:
+                try:
+                    p,d = line.split('\t')
+                except ValueError:
+                    print 'WARNING: invalid line %s in file %s'%(line,files[lev])
+                    continue
+                if sudoku.is_valid_puzzle(p):
+                    if (p not in exclude) and (not new or p not in self.played):
+                        puzzles.append((p,float(d)))
+                        i += 1
+                else:
+                    print 'WARNING: invalid puzzle %s in file %s'%(p,files[lev])
+            il += 1
+        if i < n:
+            print 'WARNING: Not able to provide %s puzzles in levels %s'%(n,levels)
+            print 'WARNING: Generate more puzzles if you really need this many puzzles!'
+        return puzzles    
+
+    def get_puzzles (self, n, levels, new=True, randomize=True,
                      exclude=[]):
         """Return a list of n puzzles and difficulty values (as floats).
 
         The puzzles will correspond as closely as possible to levels.
         If new, we only return puzzles not yet played.
         """
+        if randomize: return self.get_puzzles_random(n,levels,new=new,exclude=exclude)
         if not n: return []
         assert(levels)
         puzzles = []



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]