Changes

Migrate to GitHub
Line 1: Line 1:  
==Turtle in a Pond Activity==
 
==Turtle in a Pond Activity==
   −
Turtle in a Pond is a strategy game. The goal is to surround the turtle before it runs off the screen. (Turtle in a Pond was inspired by the game [http://www.members.shaw.ca/gf3/circle-the-cat.html Circle the Cat].)
+
Wiki Page Status: <span style="color:#ff0000"> DEPRECATED </span>
   −
[[File:Turtle-in-a-pond.png|300px]]
+
Read at https://help.sugarlabs.org/turtle_in_a_pond.html
   −
=== How to play Turtle in a Pond ===
+
The source file has been moved to [https://github.com/godiard/help-activity/blob/master/source/turtle_in_a_pond.rst GitHub]
 
  −
Click on the dots to keep the turtle from escaping.
  −
 
  −
<gallery>
  −
File:Turtle-in-a-pond-win.png|The turtle is captured
  −
File:Turtle-in-a-pond-lose.png|The turtle escaped
  −
</gallery>
  −
 
  −
 
  −
Did you know that:
  −
* You can load your own [[#Strategy|strategy]] for the turtle by importing Python code you can write with [http://activities.sugarlabs.org/en-US/sugar/addon/4041 Pippy]?
  −
 
  −
 
  −
==== The Toolbars ====
  −
 
  −
[[Image:TurtlePond_toolbar-1.png]]
  −
 
  −
:from left to right
  −
# the Activity toolbar button (shown in the open position)
  −
# the New-game button
  −
# the Beginner level (uses beginner strategy below)
  −
# the Intermediate level (uses intermediate strategy below)
  −
# the Expert level (uses expert strategy below)
  −
# the Custom level (uses user-designed strategy below)
  −
# an area for messages
  −
# the Load-new-strategy button
  −
# the Activity stop button
  −
 
  −
=== Strategy ===
  −
 
  −
Cut and paste these examples into Pippy and save then to your Sugar Journal. Then use the Load-new-strategy button in the Turtle-in-a-Pond Activity to try them. They are written in Python, you can learn about Python by reading the [http://docs.python.org  Python Documentation]
  −
 
  −
In this strategy, the turtle moves down regardless of whether the dot is open.
  −
<pre>
  −
def _turtle_strategy(self, turtle):
  −
    turtle[1] += 1
  −
    return turtle
  −
</pre>
  −
 
  −
In this strategy, the turtle moves down until it is blocked (i.e., when the dot type is True).
  −
<pre>
  −
def _turtle_strategy(self, turtle):
  −
    if not self._dots[self._grid_to_dot((turtle[0], turtle[1]+1))].type:
  −
      turtle[1] += 1
  −
    return turtle
  −
</pre>
  −
 
  −
In this strategy, the turtle searches for an open dot, looking clockwise.
  −
 
  −
<pre>
  −
def _turtle_strategy(self, turtle):
  −
    dots = self._surrounding_dots(turtle)
  −
    for i in range(6):  # search for an opening
  −
        if not self._dots[dots[i]].type:
  −
            return self._dot_to_grid(dots[i])
  −
    return turtle
  −
</pre>
  −
 
  −
In this version, the turtle orientation is set as well.
  −
 
  −
<pre>
  −
def _turtle_strategy(self, turtle):
  −
    dots = self._surrounding_dots(turtle)
  −
    for i in range(6):  # search for an opening
  −
        if not self._dots[dots[i]].type:
  −
            self._orientation = i
  −
            return self._dot_to_grid(dots[i])
  −
    return turtle
  −
</pre>
  −
 
  −
The turtle choose a random direction and goes there if the dot is open. (This is the beginner strategy.)
  −
 
  −
<pre>
  −
def _turtle_strategy(self, turtle):
  −
    dots = self._surrounding_dots(turtle)
  −
    n = int(uniform(0, 6))  # choose a random orientation
  −
    for i in range(6):  # search for an opening
  −
        if not self._dots[dots[(i + n) % 6]].type:
  −
            self._orientation = (i + n) % 6
  −
            return self._dot_to_grid(dots[(i + n) % 6])
  −
    return turtle
  −
</pre>
  −
 
  −
In this strategy, the turtle will go off the edge if it can. (This is the intermediate strategy.)
  −
 
  −
<pre>
  −
def _turtle_strategy(self, turtle):
  −
    dots = self._surrounding_dots(turtle)
  −
    for i in range(6):  # search for an edge
  −
        if self._dots[dots[i]].type is None:
  −
            self._orientation = i
  −
            return self._dot_to_grid(dots[i])
  −
 
  −
    n = int(uniform(0, 6))  # choose a random orientation
  −
    for i in range(6):  # search for an opening
  −
        if not self._dots[dots[(i + n) % 6]].type:
  −
            self._orientation = (i + n) % 6
  −
            return self._dot_to_grid(dots[(i + n) % 6])
  −
    return turtle
  −
</pre>
  −
 
  −
In this version, it looks for a path to the edge in the direction it was already heading.
  −
 
  −
<pre>
  −
def _turtle_strategy(self, turtle):
  −
    dots = self._surrounding_dots(turtle)
  −
 
  −
    for i in range(6):  # search for an edge
  −
        if self._dots[dots[i]].type is None:
  −
            self._orientation = i
  −
            return self._dot_to_grid(dots[i])
  −
 
  −
    if self._daylight_ahead(turtle):
  −
        return self._dot_to_grid(dots[self._orientation])
  −
 
  −
    n = int(uniform(0, 6))  # choose a random orientation
  −
    for i in range(6):  # search for an opening
  −
        if not self._dots[dots[(i + n) % 6]].type:
  −
            self._orientation = (i + n) % 6
  −
            return self._dot_to_grid(dots[(i + n) % 6])
  −
    return turtle
  −
</pre>
  −
 
  −
A weighing function is used: preference is given to dots closer to the edges.
  −
<pre>
  −
def _turtle_strategy(self, turtle):
  −
    dots_ordered_by_weight = self._ordered_weights(turtle)
  −
    if self._dots[dots_ordered_by_weight[0]].type is None:
  −
        return self._dot_to_grid(dots_ordered_by_weight[0])
  −
    elif not self._dots[dots_ordered_by_weight[0]].type:
  −
        return self._dot_to_grid(dots_ordered_by_weight[0])
  −
    else:
  −
        return turtle
  −
</pre>
  −
 
  −
This is the expert strategy.
  −
 
  −
<pre>
  −
def _turtle_strategy(self, turtle):
  −
    dots = self._surrounding_dots(turtle)
  −
    for i in range(6):
  −
        if self._dots[dots[i]].type is None:
  −
            self._orientation = i
  −
            return self._dot_to_grid(dots[i])
  −
    dots_ordered_by_weight = self._ordered_weights(turtle)
  −
    for i in range(6):
  −
        self._orientation = dots.index(dots_ordered_by_weight[i])
  −
        if self._daylight_ahead(turtle):
  −
            return self._dot_to_grid(dots[self._orientation])
  −
    n = int(uniform(0, 6))
  −
    for i in range(6):
  −
        if not self._dots[dots[(i + n) % 6]].type:
  −
            self._orientation = (i + n) % 6
  −
            return self._dot_to_grid(dots[(i + n) % 6])
  −
    self._orientation = (i + n) % 6
  −
    return turtle
  −
 
  −
</pre>
  −
 
  −
 
  −
The dots are stored in a 13✕13 array. Each dot has an attribute, 'type', that determines it status. The edges have a type=None. Occupied dots have a type=True. Unoccupied dots have a type=False.
  −
 
  −
Your strategy should start with:
  −
 
  −
def _turtle_strategy(self, turtle):
  −
 
  −
The turtle argument is a tuple containing the column and row of the current turtle position. That is, turtle[0] is the horizontal position and turtle[1] is the vertical position.
  −
 
  −
Your strategy should return a tuple containing the column and row of the new turtle position, e.g.,
  −
 
  −
return [column, row]
  −
 
  −
===Resources===
  −
There are some resources that you can use in your program, including:
  −
 
  −
;self._surrounding_dots((column, row)): returns an array of dots surrounding a given position in the grid
  −
;self._daylight_ahead((column, row)): returns True if there is a clear path to the edge heading in the current direction
  −
;self._ordered_weights((column, row)): returns an array of surrounding dots ordered by their distance from the edge
  −
;self._dots: the array of dots from which you can test the type attribute (self._dots[i].type==None → edge; self._dots[i].type==False → open; self._dots[i].type==True → blocked)
  −
;self._orientation:you can set the orientation of your turtle by assigning a number from 0-5 (clockwise beginning with 30 degrees from north)
  −
;self._set_label('your message here'):you can write a message on the toolbar if you want to communicate what your turtle is thinking
  −
;self._grid_to_dot((column, row)): returns the dot that is at a grid position (column, row)
  −
;self._dot_to_grid(dot): returns an array (column, row) representing the grid position of a dot
  −
 
  −
===Digging deeper===
  −
To better understand how to use the above resources, view the program source. Look at game.py for code relating to game strategy. [[View_Source]]
  −
 
  −
[[File:"Turtle in a Pond Activity" viewsource.png|400px]]
  −
 
  −
If your Sugar distribution includes the Gnome editor GEdit, you can use it to view and edit the program source. In Terminal type
  −
 
  −
gedit
  −
 
  −
You will find the program source at
  −
 
  −
/home/olpc/Activities/TurtleinaPond.activity
  −
 
  −
 
  −
See [[Activity_Team/Modifing_an_Activity]] for other methods for viewing and editing the source.
  −
 
  −
=== Where to get Turtle in a Pond ===
  −
 
  −
The Turtle in a Pond activity is available for download from the [http://activities.sugarlabs.org Sugar Activity Library]: [http://activities.sugarlabs.org/en-US/sugar/addon/4516 Turtle in a Pond]
  −
 
  −
The source code is available on [http://git.sugarlabs.org/turtlepond the Sugar Labs Gitorious server].
  −
 
  −
[[Category:Activity]]
  −
[[Category:Activities]]
 
154

edits