[gnome-games/applygsoc2009: 45/76] Can restore the grid from saved game
- From: Pablo Castellano <pablog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-games/applygsoc2009: 45/76] Can restore the grid from saved game
- Date: Mon, 6 Sep 2010 02:51:00 +0000 (UTC)
commit 0b164f6001f24ca96e9d026fbdf26c655acabd57
Author: Pablo Castellano <pablog src gnome org>
Date: Thu Aug 26 16:20:19 2010 +0200
Can restore the grid from saved game
Haven't got upon other saved attrbutes
gnome-sudoku/src/lib/gsudoku.py | 80 ++++++++++++--------------------------
gnome-sudoku/src/lib/main.py | 31 +++++++++++++-
gnome-sudoku/src/lib/saver.py | 35 -----------------
3 files changed, 53 insertions(+), 93 deletions(-)
---
diff --git a/gnome-sudoku/src/lib/gsudoku.py b/gnome-sudoku/src/lib/gsudoku.py
index 9bd4b2a..11686fd 100644
--- a/gnome-sudoku/src/lib/gsudoku.py
+++ b/gnome-sudoku/src/lib/gsudoku.py
@@ -109,10 +109,11 @@ class SudokuView (SudokuNumberGrid, gobject.GObject):
model.add_observer(self)
for x in range(self.group_size):
for y in range(self.group_size):
- val = model.grid._get_(x, y)
+ val = model.get_value(x, y)
if val:
- self.set_readonly_appearance(x, y, True)
self.set_value(x, y, val)
+ if model.get_virgin_value(x, y):
+ self.set_readonly_appearance(x, y, True)
def connect_to_notes_model(self, model):
self._notes_model = model
@@ -326,7 +327,7 @@ class NotesModel:
class SudokuModel:
- def __init__ (self, grid, group_size):
+ def __init__ (self, virgin_grid, group_size, initial_grid=None):
self.hints = 0
self.auto_fills = 0
self.show_impossible_implications = False
@@ -334,10 +335,16 @@ class SudokuModel:
self.impossibilities = []
self.__trackers_tracking__ = {}
self.group_size = group_size
- self._setup_grid(grid, group_size)
+ self.grid = None
+ self._virgin_grid = None
self._observers = []
+ self.__error_pairs__ = ParallelDict()
+ self._setup_virgin_grid(virgin_grid)
+ if initial_grid:
+ self._setup_initial_grid(initial_grid)
+
def add_observer(self, observer):
self._observers.append(observer)
@@ -428,58 +435,18 @@ class SudokuModel:
# Redraw the notes
self.update_all_notes()
- def _blank_grid (self):
- '''Wipe out everything on the grid.
-
- This blanks all values, notes, tracked values, virgin values. You end
- up with a blank grid ready for a new puzzle.
- '''
- for x in range(self.group_size):
- for y in range(self.group_size):
- e = self.__entries__[(x, y)]
- if e.get_value():
- self.remove(x, y)
- e.set_read_only(False)
- for imp_cell in self.impossibilities:
- self.__entries__[imp_cell].set_text('')
- self.impossibilities = []
- self.grid = None
- self.clear_notes('All')
- self.tinfo.reset()
+ def _setup_virgin_grid(self, virgin):
+ """both grid and initial_grid should be str"""
+ self._virgin_grid = [int(c) for c in virgin.split()]
+ self.grid = sudoku.InteractiveSudoku(virgin, self.group_size)
- def change_grid (self, grid, group_size):
- self.hints = 0
- self.impossible_hints = 0
- self._blank_grid()
- self._setup_grid(grid, group_size)
-
- def load_game (self, game):
- """Load a game.
-
- A game is simply a two lined string where the first line represents our
- virgin self and line two represents our game-in-progress.
- """
- self._blank_grid()
- if '\n' in game:
- virgin, in_prog = game.split('\n')
- else:
- virgin, in_prog = game, ''
- group_size = int(math.sqrt(len(virgin.split())))
- self.change_grid(virgin, group_size = group_size)
- # This int() will break if we go to 16x16 grids...
- if in_prog:
- values = [int(c) for c in in_prog.split()]
- for row in range(group_size):
- for col in range(group_size):
- index = row * 9 + col
- if values[index] and not self.grid._get_(col, row):
- self.add_value(col, row, values[index])
-
- def _setup_grid (self, grid, group_size):
- if isinstance(grid, sudoku.SudokuGrid):
- self.grid = sudoku.InteractiveSudoku(grid.grid, group_size = grid.group_size)
- else:
- self.grid = sudoku.InteractiveSudoku(grid, group_size = group_size)
+ def _setup_initial_grid(self, initial_grid):
+ values = [int(c) for c in initial_grid.split()]
+ for row in range(self.group_size):
+ for col in range(self.group_size):
+ index = row * 9 + col
+ if values[index] and not self.grid._get_(col, row):
+ self.set_value(col, row, values[index])
def update_all_notes (self):
'''Display the notes for all the cells
@@ -531,6 +498,9 @@ class SudokuModel:
self._signal_observers(result)
self._check_for_completeness()
+ def get_virgin_value(self, x, y):
+ return self._virgin_grid[9 * y + x]
+
def _remove_old_conficts(self, x, y):
result = []
old_conflicts = self._remove_related_conflicts(x, y)
diff --git a/gnome-sudoku/src/lib/main.py b/gnome-sudoku/src/lib/main.py
index 49a3aba..d93270e 100644
--- a/gnome-sudoku/src/lib/main.py
+++ b/gnome-sudoku/src/lib/main.py
@@ -115,13 +115,38 @@ class UI (gconf_wrapper.GConfWrapper):
self._main_model = gsudoku.SudokuModel(puzzle, 9)
self._notes_model = gsudoku.NotesModel(self._main_model, group_size=9)
- self._main_grid_vew.connect_to_model(self._main_model)
- self._main_grid_vew.connect_to_notes_model(self._notes_model)
# self._main_grid_vew.connect('puzzle-finished', self.you_win_callback)
elif game_type == game_selector.NewOrSavedGameSelector.SAVED_GAME:
- saver.open_game(self, puzzle)
+ saver._open_saved_game(puzzle)
+ else:
+ logger.fatal("shouldn't be here")
+
+ self._main_grid_vew.connect_to_model(self._main_model)
+ self._main_grid_vew.connect_to_notes_model(self._notes_model)
self._post_open_setup()
+ def _open_saved_game(self, jar):
+ virgin, in_prog = jar["game"].split('\n')
+ self._main_model = gsudoku.SudokuModel(virgin, 9, in_prog)
+ self._notes_model = gsudoku.NotesModel(self._main_model, group_size=9)
+ return
+
+ # this is a bit easily breakable... we take advantage of the fact
+ # that we create tracker IDs sequentially and that {}.items()
+ # sorts by keys by default
+ for tracker, tracked in jar.get('trackers', {}).items():
+ # add 1 tracker per existing tracker...
+ self.tracker_ui.add_tracker()
+ for x, y, val in tracked:
+ self.gsd.add_tracker(x, y, tracker, val = val)
+ for tracker, tracking in jar.get('tracking', {}).items():
+ if tracking:
+ ui.tracker_ui.select_tracker(tracker)
+ set_value_from_jar(ui, jar)
+ if jar.has_key('notes') and jar['notes']:
+ for x, y, top, bot in jar['notes']:
+ ui.gsd.__entries__[(x, y)].set_note_text(top, bot)
+
def _post_open_setup(self):
"""Properly do the setup after entering game
diff --git a/gnome-sudoku/src/lib/saver.py b/gnome-sudoku/src/lib/saver.py
index b559d05..c9a48ed 100644
--- a/gnome-sudoku/src/lib/saver.py
+++ b/gnome-sudoku/src/lib/saver.py
@@ -62,41 +62,6 @@ def set_value_from_jar (dest, jar):
for attr in SAVE_ATTRIBUTES:
super_setattr(dest, attr, jar[attr])
-def open_game (ui, jar):
- tinfo = tracker_info.TrackerInfo()
- tinfo.set_tracker(tracker_info.NO_TRACKER)
- ui.gsd.load_game(jar['game'])
- # The 'notes' and 'trackers' sections are for transition from the old
- # style tracker storage. The tracker values and notes are stored in the
- # 'tracked_notes' and 'tracker_info' sections now.
- if jar.has_key('notes') and jar['notes']:
- for x, y, top, bot in jar['notes']:
- ui.gsd.__entries__[(x, y)].set_note_text(top, bot)
- if jar.has_key('trackers'):
- for tracker, tracked in jar.get('trackers', {}).items():
- # add 1 tracker per existing tracker...
- ui.tracker_ui.add_tracker()
- for x, y, val in tracked:
- tinfo.add_trace(x, y, val)
- set_value_from_jar(ui, jar)
- if jar.has_key('tracking'):
- for tracker, tracking in jar.get('tracking', {}).items():
- if tracking:
- ui.tracker_ui.select_tracker(tracker)
- if jar.has_key('tracked_notes') and jar['tracked_notes']:
- for x, y, top, bot in jar['tracked_notes']:
- ui.gsd.__entries__[(x, y)].set_notelist(top, bot)
- if jar.has_key('tracker_info'):
- trackers = jar['tracker_info'][2]
- for tracking in trackers.keys():
- ui.tracker_ui.add_tracker(tracker_id = tracking)
- tinfo.load(jar['tracker_info'])
- ui.tracker_ui.select_tracker(tinfo.current_tracker)
- if tinfo.showing_tracker != tracker_info.NO_TRACKER:
- ui.gsd.show_track()
- # Display the notes
- ui.gsd.update_all_notes()
-
class SudokuTracker:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]