gnome-games r7584 - in branches/gnome-2-22/gnome-sudoku: . src/lib
- From: thomashpa svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-games r7584 - in branches/gnome-2-22/gnome-sudoku: . src/lib
- Date: Mon, 7 Apr 2008 16:14:53 +0100 (BST)
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]