forked from DynCodingForKids/rgserver
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgettingstarted.html
135 lines (124 loc) · 9.74 KB
/
gettingstarted.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
$var title: Getting started
<div class="prose">
<div class="clearfix">
<h1 class="left no-margin">Getting started</h1>
<h3 class="right no-margin"><a href="/api">Back to the table of contents</a></h3>
</div>
<hr />
<ol>
<li><a href="#a1">Creating a robot</a></li>
<li><a href="#a2">Accessing the robot's info</a></li>
<li><a href="#a3">Example starting robot</a></li>
</ol>
<hr/>
<a name="a1"></a>
<h2>1. Creating a robot</h2>
<p>This is the basic structure of every robot file:</p>
<div class="highlight"><pre><span class="k">class</span> <span class="nc">Robot</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">act</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">game</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="o"><</span><span class="n">some</span> <span class="n">action</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="n">params</span><span class="o">></span><span class="p">]</span>
</pre></div>
<p>
At the beginning of the game, the system creates one instance of your
<code>Robot</code> class. This means that class variables and your module's
global variables are shared between calls. Every turn the system calls
that single instance's <code>act</code> method once for each of your robots
to determine its next action. (Again, please read the rules first.) The method
should return one of:
</p>
<div class="highlight"><pre><span class="p">[</span><span class="s">'move'</span><span class="p">,</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)]</span>
<span class="p">[</span><span class="s">'attack'</span><span class="p">,</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)]</span>
<span class="p">[</span><span class="s">'guard'</span><span class="p">]</span>
<span class="p">[</span><span class="s">'suicide'</span><span class="p">]</span>
</pre></div>
<p>
If <code>act</code> throws an exception or returns an invalid command,
the robot will simply guard, but if it times out too many times then it
will be forced to surrender the match. Please see
<b><a href="/security">Security</a></b> for those details.
</p>
<hr/>
<a name="a2"></a>
<h2>2. Accessing the robot's info</h2>
<p>
Every robot, including <code>self</code>, has the following properties
exposed:
</p>
<ul>
<li><code>location</code> — the robot's location as a tuple (x, y)</li>
<li><code>hp</code> — the robot's health as an int</li>
<li><code>player_id</code> — the robot's player_id (what "team" it belongs to)</li>
<li><code>robot_id</code> — a unique number identifying each robot (only available for robots on your team)</li>
</ul>
<p>For example, to access the current robot's HP, you would write <code>self.hp</code>.</p>
<p>Every turn, the system calls your <code>act</code> method, passing it a <code>game</code> parameter set to the following structure:</p>
<div class="highlight"><pre><span class="p">{</span>
<span class="c"># a dictionary of all robots on the field mapped</span>
<span class="c"># by {location: robot}</span>
<span class="s">'robots'</span><span class="p">:</span> <span class="p">{</span>
<span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">y1</span><span class="p">):</span> <span class="p">{</span>
<span class="s">'location'</span><span class="p">:</span> <span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">y1</span><span class="p">),</span>
<span class="s">'hp'</span><span class="p">:</span> <span class="n">hp</span><span class="p">,</span>
<span class="s">'player_id'</span><span class="p">:</span> <span class="n">player_id</span><span class="p">,</span>
<span class="c"># only if the robot is on your team</span>
<span class="s">'robot_id'</span><span class="p">:</span> <span class="n">robot_id</span>
<span class="p">},</span>
<span class="c"># ...and the rest of the robots</span>
<span class="p">},</span>
<span class="c"># number of turns passed (starts at 0)</span>
<span class="s">'turn'</span><span class="p">:</span> <span class="n">turn</span>
<span class="p">}</span>
</pre></div>
<p>
<code>game</code> and every robot in <code>game['robots']</code> are
instances of a special type of dict where you can access values using
attributes. This is to make writing code faster. So, the following are
equivalent:
</p>
<div class="highlight"><pre><span class="n">game</span><span class="p">[</span><span class="s">'robots'</span><span class="p">][</span><span class="n">location</span><span class="p">][</span><span class="s">'hp'</span><span class="p">]</span>
<span class="n">game</span><span class="p">[</span><span class="s">'robots'</span><span class="p">][</span><span class="n">location</span><span class="p">]</span><span class="o">.</span><span class="n">hp</span>
<span class="n">game</span><span class="o">.</span><span class="n">robots</span><span class="p">[</span><span class="n">location</span><span class="p">]</span><span class="o">.</span><span class="n">hp</span>
</pre></div>
<p>
Here's a quick example to print out the location of any robots that are
on your team:
</p>
<div class="highlight"><pre><span class="k">class</span> <span class="nc">Robot</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">act</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">game</span><span class="p">):</span>
<span class="k">for</span> <span class="n">loc</span><span class="p">,</span> <span class="n">robot</span> <span class="ow">in</span> <span class="n">game</span><span class="o">.</span><span class="n">robots</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">robot</span><span class="o">.</span><span class="n">player_id</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">player_id</span><span class="p">:</span>
<span class="k">print</span> <span class="n">loc</span>
</pre></div>
<hr/>
<a name="a3"></a>
<h2>3. Example starting robot</h2>
<p>
Here's a simple robot to use as a starting point. It looks for any
enemies around and attacks them. Otherwise, it tries to move to the
center.
</p>
<div class="highlight"><pre><span class="kn">import</span> <span class="nn">rg</span>
<span class="k">class</span> <span class="nc">Robot</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">act</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">game</span><span class="p">):</span>
<span class="c"># if we're in the center, stay put</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span> <span class="o">==</span> <span class="n">rg</span><span class="o">.</span><span class="n">CENTER_POINT</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span><span class="s">'guard'</span><span class="p">]</span>
<span class="c"># if there are enemies around, attack them</span>
<span class="k">for</span> <span class="n">loc</span><span class="p">,</span> <span class="n">bot</span> <span class="ow">in</span> <span class="n">game</span><span class="o">.</span><span class="n">robots</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
<span class="k">if</span> <span class="n">bot</span><span class="o">.</span><span class="n">player_id</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">player_id</span><span class="p">:</span>
<span class="k">if</span> <span class="n">rg</span><span class="o">.</span><span class="n">dist</span><span class="p">(</span><span class="n">loc</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">)</span> <span class="o"><=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span><span class="s">'attack'</span><span class="p">,</span> <span class="n">loc</span><span class="p">]</span>
<span class="c"># move toward the center</span>
<span class="k">return</span> <span class="p">[</span><span class="s">'move'</span><span class="p">,</span> <span class="n">rg</span><span class="o">.</span><span class="n">toward</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="n">rg</span><span class="o">.</span><span class="n">CENTER_POINT</span><span class="p">)]</span>
</pre></div>
<p>As you can see, there is a module called <code>rg</code> being used. We'll look at this next.</p>
<p>
Implementation detail: only one instance of your robot is created each
game, so you can store persistent data in your instance variables.
</p>
<hr/>
<div class="clearfix">
<h3 class="left">Back: <a href="/rules">Game rules</a></h3>
<h3 class="right">Next: <a href="/rgdocs">Library documentation</a></h3>
</div>
</div>