diff options
author | Walter Bender <walter.bender@gmail.com> | 2011-12-16 02:18:31 (GMT) |
---|---|---|
committer | Walter Bender <walter.bender@gmail.com> | 2011-12-16 02:18:31 (GMT) |
commit | 53754e5186c75be8e3b43c69f0c8990f251596af (patch) | |
tree | 91a38ec8785402b5592c77925ed71ffdb2e87e1d | |
parent | 681e144e710e67aaf5be9581b7a6752fbfd1d194 (diff) |
add levels
-rw-r--r-- | TurtlePondActivity.py | 48 | ||||
-rw-r--r-- | game.py | 54 | ||||
-rw-r--r-- | icons/beginner.svg | 35 | ||||
-rw-r--r-- | icons/expert.svg | 32 | ||||
-rw-r--r-- | icons/intermediate.svg | 33 |
5 files changed, 191 insertions, 11 deletions
diff --git a/TurtlePondActivity.py b/TurtlePondActivity.py index 3d8fffa..65700ee 100644 --- a/TurtlePondActivity.py +++ b/TurtlePondActivity.py @@ -35,7 +35,7 @@ from sugar.datastore import datastore from sugar.graphics.objectchooser import ObjectChooser from toolbar_utils import button_factory, image_factory, label_factory, \ - separator_factory + separator_factory, radio_factory from gettext import gettext as _ import locale @@ -48,10 +48,11 @@ from utils import svg_str_to_pixbuf import logging _logger = logging.getLogger('turtle-in-a-pond-activity') - -SERVICE = 'org.sugarlabs.TurtlePondActivity' -IFACE = SERVICE -PATH = '/org/augarlabs/TurtlePondActivity' +BEGINNER = 0 +INTERMEDIATE = 1 +EXPERT = 2 +CUSTOM = 3 +LEVEL_LABELS = [_('beginner'), _('intermediate'), _('expert'), _('custom')] class TurtlePondActivity(activity.Activity): @@ -113,6 +114,37 @@ class TurtlePondActivity(activity.Activity): 'new-game', self.toolbar, self._new_game_cb, tooltip=_('Start a new game.')) + separator_factory(self.toolbar, False, True) + + self.beginner_button = radio_factory( + 'beginner', + self.toolbar, + self._level_cb, + cb_arg=BEGINNER, + tooltip=LEVEL_LABELS[BEGINNER], + group=None) + self.intermediate_button = radio_factory( + 'intermediate', + self.toolbar, + self._level_cb, + cb_arg=INTERMEDIATE, + tooltip=LEVEL_LABELS[INTERMEDIATE], + group=self.beginner_button) + self.expert_button = radio_factory( + 'expert', + self.toolbar, + self._level_cb, + cb_arg=EXPERT, + tooltip=LEVEL_LABELS[EXPERT], + group=self.beginner_button) + self.custom_button = radio_factory( + 'view-source', + self.toolbar, + self._level_cb, + cb_arg=CUSTOM, + tooltip=LEVEL_LABELS[CUSTOM], + group=self.beginner_button) + self.status = label_factory(self.toolbar, '') if _have_toolbox: @@ -134,6 +166,10 @@ class TurtlePondActivity(activity.Activity): toolbox.toolbar.insert(stop_button, -1) stop_button.show() + def _level_cb(self, button, level): + self._game.level = level + self._game.new_game() + def _new_game_cb(self, button=None): ''' Start a new game. ''' self._game.new_game() @@ -155,6 +191,8 @@ class TurtlePondActivity(activity.Activity): ''' Load Python code from the Journal. ''' self._chooser('org.laptop.Pippy', self._load_python_code_from_journal) + self._game.level = CUSTOM + # FIXME: set radio button self._game.new_game() def _load_python_code_from_journal(self, dsobject): @@ -40,8 +40,39 @@ CIRCLE = [[(0, -1), (1, 0), (0, 1), (-1, 1), (-1, 0), (-1, -1)], [(1, -1), (1, 0), (1, 1), (0, 1), (-1, 0), (0, -1)]] ''' Simple strategy: head to daylight or randomly check for an open dot turtle is the (col, row) of the current turtle position ''' -STRATEGY_MSG = _('turtle is looking for any open dot') -STRATEGY = 'def _turtle_strategy(self, turtle):\n\ +BEGINNER_MSG = _('random') +BEGINNER_STRATEGY = 'def _turtle_strategy(self, turtle):\n\ + self._set_label(self.strategy_msg)\n\ + dots = self._surrounding_dots(turtle)\n\ + n = int(uniform(0, 6))\n\ + for i in range(6):\n\ + if not self._dots[dots[(i + n) % 6]].type:\n\ + self._orientation = (i + n) % 6\n\ + return self._dot_to_grid(dots[(i + n) % 6])\n\ + self._orientation = (i + n) % 6\n\ + return turtle\n' +INTERMEDIATE_MSG = _('turtle is looking for any open dot') +INTERMEDIATE_STRATEGY = 'def _turtle_strategy(self, turtle):\n\ + self._set_label(self.strategy_msg)\n\ + dots = self._surrounding_dots(turtle)\n\ + for i in range(6):\n\ + if self._dots[dots[i]].type is None:\n\ + self._orientation = i\n\ + return self._dot_to_grid(dots[i])\n\ + dots_ordered_by_weight = self._ordered_weights(turtle)\n\ + for i in range(6):\n\ + self._orientation = dots.index(dots_ordered_by_weight[i])\n\ + if self._daylight_ahead(turtle):\n\ + return self._dot_to_grid(dots[self._orientation])\n\ + n = int(uniform(0, 6))\n\ + for i in range(6):\n\ + if not self._dots[dots[(i + n) % 6]].type:\n\ + self._orientation = (i + n) % 6\n\ + return self._dot_to_grid(dots[(i + n) % 6])\n\ + self._orientation = (i + n) % 6\n\ + return turtle\n' +EXPERT_MSG = _('turtle is looking for any open dot') +EXPERT_STRATEGY = 'def _turtle_strategy(self, turtle):\n\ self._set_label(self.strategy_msg)\n\ dots = self._surrounding_dots(turtle)\n\ for i in range(6):\n\ @@ -83,8 +114,14 @@ class Game(): self._turtle_offset = 0 self._space = int(self._dot_size / 5.) self._orientation = 0 - self.strategy = STRATEGY - self.strategy_msg = STRATEGY_MSG + self.level = 0 + self.custom_strategy = EXPERT_STRATEGY + self.strategies = [BEGINNER_STRATEGY, INTERMEDIATE_STRATEGY, + EXPERT_STRATEGY, self.custom_strategy] + self.msgs = [BEGINNER_MSG, INTERMEDIATE_MSG, + EXPERT_MSG, _('strategy from Journal')] + self.strategy = self.strategies[self.level] + self.strategy_msg = self.msgs[self.level] # Generate the sprites we'll need... self._sprites = Sprites(self._canvas) @@ -139,16 +176,19 @@ class Game(): self._turtle.move(pos) self._turtle.move_relative((-self._turtle_offset, -self._turtle_offset)) self._turtle.set_shape(self._turtle_images[0]) + self._set_label('') + ''' self._set_label( _('Click on the dots to keep the turtle from escaping.')) + ''' def _initiating(self): return self._activity.initiating def reset_strategy(self): ''' Reload default strategy ''' - self.strategy = STRATEGY - self.strategy_msg = STRATEGY_MSG + self.custom_strategy = self.strategies[2] + self.level = 3 def new_game(self, saved_state=None): ''' Start a new game. ''' @@ -163,6 +203,8 @@ class Game(): # Calculate the distances to the edge self._initialize_weights() + self.strategy = self.strategies[self.level] + self.strategy_msg = self.msgs[self.level] def _set_label(self, string): ''' Set the label in the toolbar or the window frame. ''' diff --git a/icons/beginner.svg b/icons/beginner.svg new file mode 100644 index 0000000..434ebbe --- /dev/null +++ b/icons/beginner.svg @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.0" + width="55" + height="55" + id="svg2"> + <metadata + id="metadata8"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs4" /> + <rect + width="25" + height="25" + x="15" + y="15" + id="rect2816" + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /> +</svg> diff --git a/icons/expert.svg b/icons/expert.svg new file mode 100644 index 0000000..f722e95 --- /dev/null +++ b/icons/expert.svg @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.0" + width="55" + height="55" + id="svg2"> + <metadata + id="metadata3027"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs4" /> + <path + d="m 12.5,27.5 15,-15 15,15 -15,15 -15,-15 z" + id="path2821" + style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.5px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> +</svg> diff --git a/icons/intermediate.svg b/icons/intermediate.svg new file mode 100644 index 0000000..d7a2b22 --- /dev/null +++ b/icons/intermediate.svg @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.0" + width="55" + height="55" + id="svg2"> + <metadata + id="metadata3060"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs4" /> + <path + d="m 34.724577,28.082626 a 8.7394066,8.7394066 0 1 1 -17.478813,0 8.7394066,8.7394066 0 1 1 17.478813,0 z" + transform="matrix(1.4649286,0,0,1.4649286,-10.566419,-13.639042)" + id="path2820" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> +</svg> |