Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter 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)
commit53754e5186c75be8e3b43c69f0c8990f251596af (patch)
tree91a38ec8785402b5592c77925ed71ffdb2e87e1d
parent681e144e710e67aaf5be9581b7a6752fbfd1d194 (diff)
add levels
-rw-r--r--TurtlePondActivity.py48
-rw-r--r--game.py54
-rw-r--r--icons/beginner.svg35
-rw-r--r--icons/expert.svg32
-rw-r--r--icons/intermediate.svg33
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):
diff --git a/game.py b/game.py
index 90a8c55..e7aa316 100644
--- a/game.py
+++ b/game.py
@@ -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>