battlesnake 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2100d8f190752e432572971a16b1ad7de7ee941008df10df475084d9851cb8e
4
- data.tar.gz: 17435dbdad3f48cb3f99591af60b2f471dcafca058221146b534754a09b6be13
3
+ metadata.gz: dc1006d3ed555bc10587302b1d0bd9323e92f2a194bc2ce6673ac44e4b502f74
4
+ data.tar.gz: e5a12dcd3a84f68b6d70735448d115a007909018b27010597753c7dff41aba84
5
5
  SHA512:
6
- metadata.gz: 34023efce3a589e86f65a30f983b93f9c24d745faebbaf05ef4db31d0a695be641665f282f45fe6d84a0c35462c4b7d67a91ae67bee11af0842fa67cf71536f9
7
- data.tar.gz: 8565f7f891d1c59be120f9b002e2f2c2242ef38b68dae5e0798da735a3353f83d8cd1ec232203e3515845b3380690f378a744851671ffa2b1c9de0af8cec63d8
6
+ metadata.gz: 66184f4a9b2474337f1d25a76a4ffd7cd2b63beeb390a7a3261e2ff51911b7c2dcabd453f7510018b785869ab25736d3e31e35e031111cbd4c8ef39966f1182c
7
+ data.tar.gz: 9ebae26dac464f629359f325f871500d0634a5bdf381ec416b8581ff358777ae94267973c5c937921279afc5dc45490ad63bc8e4357f4f2dce61cde08f0537ca
data/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Battlesnake
2
2
 
3
+ ## 0.1.4 (2023-01-03)
4
+
5
+ ### Added
6
+
7
+ - Board
8
+ - #food?(location) returns true if location is food.
9
+
10
+ ### Changed
11
+
12
+ - Board
13
+ - #occupied_locations no longer includes food.
14
+
15
+ ## 0.1.3 (2022-11-07)
16
+
17
+ ### Added
18
+
19
+ - Board
20
+ - #on_board?(location) returns true if location is within board boundaries.
21
+ - #paths(from, to) returns all valid paths from one location to the next.
22
+
23
+ ### Changed
24
+
25
+ - Board
26
+ - #occupied?(location) now only accepts a location object.
27
+ - #available?(location) now only accepts a location object.
28
+ - locations must be both unoccupied AND on_board to be considered available.
29
+
3
30
  ## 0.1.2 (2022-11-05)
4
31
 
5
32
  ### Added
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- battlesnake (0.1.2)
4
+ battlesnake (0.1.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -241,7 +241,7 @@
241
241
  </div>
242
242
 
243
243
  <div id="footer">
244
- Generated on Sat Nov 5 20:09:02 2022 by
244
+ Generated on Mon Nov 7 15:30:13 2022 by
245
245
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
246
246
  0.9.28 (ruby-2.7.2).
247
247
  </div>
@@ -309,7 +309,7 @@
309
309
  <li class="public ">
310
310
  <span class="summary_signature">
311
311
 
312
- <a href="#available%3F-instance_method" title="#available? (instance method)">#<strong>available?</strong>(*coordinates) &#x21d2; Boolean </a>
312
+ <a href="#available%3F-instance_method" title="#available? (instance method)">#<strong>available?</strong>(location) &#x21d2; Boolean </a>
313
313
 
314
314
 
315
315
 
@@ -383,7 +383,7 @@
383
383
  <li class="public ">
384
384
  <span class="summary_signature">
385
385
 
386
- <a href="#occupied%3F-instance_method" title="#occupied? (instance method)">#<strong>occupied?</strong>(*coordinates) &#x21d2; Boolean </a>
386
+ <a href="#occupied%3F-instance_method" title="#occupied? (instance method)">#<strong>occupied?</strong>(location) &#x21d2; Boolean </a>
387
387
 
388
388
 
389
389
 
@@ -425,6 +425,54 @@
425
425
  <p>List of all occupied locations on the board; snakes, food, hazards, etc.</p>
426
426
  </div></span>
427
427
 
428
+ </li>
429
+
430
+
431
+ <li class="public ">
432
+ <span class="summary_signature">
433
+
434
+ <a href="#on_board%3F-instance_method" title="#on_board? (instance method)">#<strong>on_board?</strong>(location) &#x21d2; Boolean </a>
435
+
436
+
437
+
438
+ </span>
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+ <span class="summary_desc"><div class='inline'>
449
+ <p>Where the supplied location falls within the boundaries of the board.</p>
450
+ </div></span>
451
+
452
+ </li>
453
+
454
+
455
+ <li class="public ">
456
+ <span class="summary_signature">
457
+
458
+ <a href="#paths-instance_method" title="#paths (instance method)">#<strong>paths</strong>(from, to) &#x21d2; Array&lt;Path&gt; </a>
459
+
460
+
461
+
462
+ </span>
463
+
464
+
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+ <span class="summary_desc"><div class='inline'>
473
+ <p>List of valid, consecutive paths from one location to the next.</p>
474
+ </div></span>
475
+
428
476
  </li>
429
477
 
430
478
 
@@ -901,7 +949,7 @@
901
949
  <div class="method_details first">
902
950
  <h3 class="signature first" id="available?-instance_method">
903
951
 
904
- #<strong>available?</strong>(*coordinates) &#x21d2; <tt>Boolean</tt>
952
+ #<strong>available?</strong>(location) &#x21d2; <tt>Boolean</tt>
905
953
 
906
954
 
907
955
 
@@ -921,16 +969,16 @@
921
969
 
922
970
  <li>
923
971
 
924
- <span class='name'>*coordinates</span>
972
+ <span class='name'>location</span>
925
973
 
926
974
 
927
- <span class='type'>(<tt><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></tt>, <tt>Hash</tt>, <tt>String</tt>, <tt>Array</tt>)</span>
975
+ <span class='type'>(<tt><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></tt>)</span>
928
976
 
929
977
 
930
978
 
931
979
  &mdash;
932
980
  <div class='inline'>
933
- <p>can be specified as a <em>Location</em> object, hash containing x/y keys, JSON string of such a hash, or a pair of x,y coordinates expressed as a 2-element array or two separate parameters.</p>
981
+ <p>being tested for availability.</p>
934
982
  </div>
935
983
 
936
984
  </li>
@@ -962,15 +1010,15 @@
962
1010
  <pre class="lines">
963
1011
 
964
1012
 
965
- 73
966
- 74
967
- 75</pre>
1013
+ 78
1014
+ 79
1015
+ 80</pre>
968
1016
  </td>
969
1017
  <td>
970
- <pre class="code"><span class="info file"># File 'lib/battlesnake/board.rb', line 73</span>
1018
+ <pre class="code"><span class="info file"># File 'lib/battlesnake/board.rb', line 78</span>
971
1019
 
972
- <span class='kw'>def</span> <span class='id identifier rubyid_available?'>available?</span><span class='lparen'>(</span><span class='op'>*</span><span class='id identifier rubyid_coordinates'>coordinates</span><span class='rparen'>)</span>
973
- <span class='op'>!</span><span class='id identifier rubyid_occupied?'>occupied?</span><span class='lparen'>(</span><span class='op'>*</span><span class='id identifier rubyid_coordinates'>coordinates</span><span class='rparen'>)</span>
1020
+ <span class='kw'>def</span> <span class='id identifier rubyid_available?'>available?</span><span class='lparen'>(</span><span class='id identifier rubyid_location'>location</span><span class='rparen'>)</span>
1021
+ <span class='id identifier rubyid_on_board?'>on_board?</span><span class='lparen'>(</span><span class='id identifier rubyid_location'>location</span><span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='id identifier rubyid_occupied?'>occupied?</span><span class='lparen'>(</span><span class='id identifier rubyid_location'>location</span><span class='rparen'>)</span>
974
1022
  <span class='kw'>end</span></pre>
975
1023
  </td>
976
1024
  </tr>
@@ -1041,14 +1089,14 @@
1041
1089
  <pre class="lines">
1042
1090
 
1043
1091
 
1044
- 83
1045
- 84
1046
- 85
1047
- 86
1048
- 87</pre>
1092
+ 88
1093
+ 89
1094
+ 90
1095
+ 91
1096
+ 92</pre>
1049
1097
  </td>
1050
1098
  <td>
1051
- <pre class="code"><span class="info file"># File 'lib/battlesnake/board.rb', line 83</span>
1099
+ <pre class="code"><span class="info file"># File 'lib/battlesnake/board.rb', line 88</span>
1052
1100
 
1053
1101
  <span class='kw'>def</span> <span class='id identifier rubyid_available_directions'>available_directions</span><span class='lparen'>(</span><span class='id identifier rubyid_location'>location</span><span class='rparen'>)</span>
1054
1102
  <span class='const'><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Location.html#DIRECTIONS-constant" title="Battlesnake::Location::DIRECTIONS (constant)">DIRECTIONS</a></span></span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_direction'>direction</span><span class='op'>|</span>
@@ -1063,7 +1111,7 @@
1063
1111
  <div class="method_details ">
1064
1112
  <h3 class="signature " id="occupied?-instance_method">
1065
1113
 
1066
- #<strong>occupied?</strong>(*coordinates) &#x21d2; <tt>Boolean</tt>
1114
+ #<strong>occupied?</strong>(location) &#x21d2; <tt>Boolean</tt>
1067
1115
 
1068
1116
 
1069
1117
 
@@ -1083,16 +1131,16 @@
1083
1131
 
1084
1132
  <li>
1085
1133
 
1086
- <span class='name'>*coordinates</span>
1134
+ <span class='name'>location</span>
1087
1135
 
1088
1136
 
1089
- <span class='type'>(<tt><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></tt>, <tt>Hash</tt>, <tt>String</tt>, <tt>Array</tt>)</span>
1137
+ <span class='type'>(<tt><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></tt>)</span>
1090
1138
 
1091
1139
 
1092
1140
 
1093
1141
  &mdash;
1094
1142
  <div class='inline'>
1095
- <p>can be specified as a <em>Location</em> object, hash containing x/y keys, JSON string of such a hash, or a pair of x,y coordinates expressed as a 2-element array or two separate parameters.</p>
1143
+ <p>being checked for occupancy.</p>
1096
1144
  </div>
1097
1145
 
1098
1146
  </li>
@@ -1124,16 +1172,14 @@
1124
1172
  <pre class="lines">
1125
1173
 
1126
1174
 
1127
- 60
1128
- 61
1129
- 62
1130
- 63</pre>
1175
+ 58
1176
+ 59
1177
+ 60</pre>
1131
1178
  </td>
1132
1179
  <td>
1133
- <pre class="code"><span class="info file"># File 'lib/battlesnake/board.rb', line 60</span>
1180
+ <pre class="code"><span class="info file"># File 'lib/battlesnake/board.rb', line 58</span>
1134
1181
 
1135
- <span class='kw'>def</span> <span class='id identifier rubyid_occupied?'>occupied?</span><span class='lparen'>(</span><span class='op'>*</span><span class='id identifier rubyid_coordinates'>coordinates</span><span class='rparen'>)</span>
1136
- <span class='id identifier rubyid_location'>location</span> <span class='op'>=</span> <span class='id identifier rubyid_coordinates'>coordinates</span><span class='period'>.</span><span class='id identifier rubyid_first'>first</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></span><span class='rparen'>)</span> <span class='op'>?</span> <span class='id identifier rubyid_coordinates'>coordinates</span><span class='period'>.</span><span class='id identifier rubyid_first'>first</span> <span class='op'>:</span> <span class='const'><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="Location.html#initialize-instance_method" title="Battlesnake::Location#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='op'>*</span><span class='id identifier rubyid_coordinates'>coordinates</span><span class='rparen'>)</span>
1182
+ <span class='kw'>def</span> <span class='id identifier rubyid_occupied?'>occupied?</span><span class='lparen'>(</span><span class='id identifier rubyid_location'>location</span><span class='rparen'>)</span>
1137
1183
  <span class='id identifier rubyid_occupied_locations'>occupied_locations</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_location'>location</span><span class='rparen'>)</span>
1138
1184
  <span class='kw'>end</span></pre>
1139
1185
  </td>
@@ -1196,6 +1242,187 @@
1196
1242
  <span class='kw'>def</span> <span class='id identifier rubyid_occupied_locations'>occupied_locations</span>
1197
1243
  <span class='kw'>return</span> <span class='ivar'>@occupied_locations</span> <span class='kw'>if</span> <span class='kw'>defined?</span><span class='lparen'>(</span><span class='ivar'>@occupied_locations</span><span class='rparen'>)</span>
1198
1244
  <span class='ivar'>@occupied_locations</span> <span class='op'>=</span> <span class='id identifier rubyid_snakes'>snakes</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:body</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_flatten'>flatten</span> <span class='op'>+</span> <span class='id identifier rubyid_food'>food</span> <span class='op'>+</span> <span class='id identifier rubyid_hazards'>hazards</span>
1245
+ <span class='kw'>end</span></pre>
1246
+ </td>
1247
+ </tr>
1248
+ </table>
1249
+ </div>
1250
+
1251
+ <div class="method_details ">
1252
+ <h3 class="signature " id="on_board?-instance_method">
1253
+
1254
+ #<strong>on_board?</strong>(location) &#x21d2; <tt>Boolean</tt>
1255
+
1256
+
1257
+
1258
+
1259
+
1260
+ </h3><div class="docstring">
1261
+ <div class="discussion">
1262
+
1263
+ <p>Where the supplied location falls within the boundaries of the board.</p>
1264
+
1265
+
1266
+ </div>
1267
+ </div>
1268
+ <div class="tags">
1269
+ <p class="tag_title">Parameters:</p>
1270
+ <ul class="param">
1271
+
1272
+ <li>
1273
+
1274
+ <span class='name'>location</span>
1275
+
1276
+
1277
+ <span class='type'>(<tt><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></tt>)</span>
1278
+
1279
+
1280
+
1281
+ &mdash;
1282
+ <div class='inline'>
1283
+ <p>being tested.</p>
1284
+ </div>
1285
+
1286
+ </li>
1287
+
1288
+ </ul>
1289
+
1290
+ <p class="tag_title">Returns:</p>
1291
+ <ul class="return">
1292
+
1293
+ <li>
1294
+
1295
+
1296
+ <span class='type'>(<tt>Boolean</tt>)</span>
1297
+
1298
+
1299
+
1300
+ &mdash;
1301
+ <div class='inline'>
1302
+ <p>true if location is within the boundaries of the board.</p>
1303
+ </div>
1304
+
1305
+ </li>
1306
+
1307
+ </ul>
1308
+
1309
+ </div><table class="source_code">
1310
+ <tr>
1311
+ <td>
1312
+ <pre class="lines">
1313
+
1314
+
1315
+ 68
1316
+ 69
1317
+ 70</pre>
1318
+ </td>
1319
+ <td>
1320
+ <pre class="code"><span class="info file"># File 'lib/battlesnake/board.rb', line 68</span>
1321
+
1322
+ <span class='kw'>def</span> <span class='id identifier rubyid_on_board?'>on_board?</span><span class='lparen'>(</span><span class='id identifier rubyid_location'>location</span><span class='rparen'>)</span>
1323
+ <span class='id identifier rubyid_location'>location</span><span class='period'>.</span><span class='id identifier rubyid_x'>x</span> <span class='op'>&gt;=</span> <span class='int'>0</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_location'>location</span><span class='period'>.</span><span class='id identifier rubyid_y'>y</span> <span class='op'>&gt;=</span> <span class='int'>0</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_location'>location</span><span class='period'>.</span><span class='id identifier rubyid_x'>x</span> <span class='op'>&lt;</span> <span class='id identifier rubyid_width'>width</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_location'>location</span><span class='period'>.</span><span class='id identifier rubyid_y'>y</span> <span class='op'>&lt;</span> <span class='id identifier rubyid_height'>height</span>
1324
+ <span class='kw'>end</span></pre>
1325
+ </td>
1326
+ </tr>
1327
+ </table>
1328
+ </div>
1329
+
1330
+ <div class="method_details ">
1331
+ <h3 class="signature " id="paths-instance_method">
1332
+
1333
+ #<strong>paths</strong>(from, to) &#x21d2; <tt>Array&lt;Path&gt;</tt>
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+ </h3><div class="docstring">
1340
+ <div class="discussion">
1341
+
1342
+ <p>List of valid, consecutive paths from one location to the next. Paths may not:</p>
1343
+
1344
+ <pre class="code ruby"><code class="ruby">- wander outside board boundaries.
1345
+ - use the same location more than once.
1346
+ - contain occupied locations, EXCEPT the start/end locations.
1347
+ </code></pre>
1348
+
1349
+ <p>The exception for start/end locations allows us to generate paths, for example, from a snake to a food location, without having to calulate the starting/ending permutations ourselves.</p>
1350
+
1351
+
1352
+ </div>
1353
+ </div>
1354
+ <div class="tags">
1355
+ <p class="tag_title">Parameters:</p>
1356
+ <ul class="param">
1357
+
1358
+ <li>
1359
+
1360
+ <span class='name'>from</span>
1361
+
1362
+
1363
+ <span class='type'>(<tt><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></tt>)</span>
1364
+
1365
+
1366
+
1367
+ &mdash;
1368
+ <div class='inline'>
1369
+ <p>starting location, may be occupied</p>
1370
+ </div>
1371
+
1372
+ </li>
1373
+
1374
+ <li>
1375
+
1376
+ <span class='name'>to</span>
1377
+
1378
+
1379
+ <span class='type'>(<tt><span class='object_link'><a href="Location.html" title="Battlesnake::Location (class)">Location</a></span></tt>)</span>
1380
+
1381
+
1382
+
1383
+ &mdash;
1384
+ <div class='inline'>
1385
+ <p>starting location, may be occupied</p>
1386
+ </div>
1387
+
1388
+ </li>
1389
+
1390
+ </ul>
1391
+
1392
+ <p class="tag_title">Returns:</p>
1393
+ <ul class="return">
1394
+
1395
+ <li>
1396
+
1397
+
1398
+ <span class='type'>(<tt>Array&lt;Path&gt;</tt>)</span>
1399
+
1400
+
1401
+
1402
+ &mdash;
1403
+ <div class='inline'>
1404
+ <p>a list of paths, which themselves are lists of consecutive, valid locations.</p>
1405
+ </div>
1406
+
1407
+ </li>
1408
+
1409
+ </ul>
1410
+
1411
+ </div><table class="source_code">
1412
+ <tr>
1413
+ <td>
1414
+ <pre class="lines">
1415
+
1416
+
1417
+ 108
1418
+ 109
1419
+ 110</pre>
1420
+ </td>
1421
+ <td>
1422
+ <pre class="code"><span class="info file"># File 'lib/battlesnake/board.rb', line 108</span>
1423
+
1424
+ <span class='kw'>def</span> <span class='id identifier rubyid_paths'>paths</span><span class='lparen'>(</span><span class='id identifier rubyid_from'>from</span><span class='comma'>,</span> <span class='id identifier rubyid_to'>to</span><span class='rparen'>)</span>
1425
+
1199
1426
  <span class='kw'>end</span></pre>
1200
1427
  </td>
1201
1428
  </tr>
@@ -1207,7 +1434,7 @@
1207
1434
  </div>
1208
1435
 
1209
1436
  <div id="footer">
1210
- Generated on Sat Nov 5 20:09:02 2022 by
1437
+ Generated on Mon Nov 7 15:30:13 2022 by
1211
1438
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1212
1439
  0.9.28 (ruby-2.7.2).
1213
1440
  </div>
@@ -125,7 +125,7 @@
125
125
  </div>
126
126
 
127
127
  <div id="footer">
128
- Generated on Sat Nov 5 20:09:02 2022 by
128
+ Generated on Mon Nov 7 15:30:13 2022 by
129
129
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
130
130
  0.9.28 (ruby-2.7.2).
131
131
  </div>
@@ -803,7 +803,7 @@
803
803
  </div>
804
804
 
805
805
  <div id="footer">
806
- Generated on Sat Nov 5 20:09:02 2022 by
806
+ Generated on Mon Nov 7 15:30:13 2022 by
807
807
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
808
808
  0.9.28 (ruby-2.7.2).
809
809
  </div>
@@ -1008,7 +1008,7 @@
1008
1008
  </div>
1009
1009
 
1010
1010
  <div id="footer">
1011
- Generated on Sat Nov 5 20:09:02 2022 by
1011
+ Generated on Mon Nov 7 15:30:13 2022 by
1012
1012
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1013
1013
  0.9.28 (ruby-2.7.2).
1014
1014
  </div>
@@ -1352,7 +1352,7 @@
1352
1352
  </div>
1353
1353
 
1354
1354
  <div id="footer">
1355
- Generated on Sat Nov 5 20:09:02 2022 by
1355
+ Generated on Mon Nov 7 15:30:13 2022 by
1356
1356
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1357
1357
  0.9.28 (ruby-2.7.2).
1358
1358
  </div>
@@ -145,7 +145,7 @@
145
145
  </div>
146
146
 
147
147
  <div id="footer">
148
- Generated on Sat Nov 5 20:09:02 2022 by
148
+ Generated on Mon Nov 7 15:30:13 2022 by
149
149
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
150
150
  0.9.28 (ruby-2.7.2).
151
151
  </div>
data/docs/_index.html CHANGED
@@ -171,7 +171,7 @@
171
171
  </div>
172
172
 
173
173
  <div id="footer">
174
- Generated on Sat Nov 5 20:09:02 2022 by
174
+ Generated on Mon Nov 7 15:30:12 2022 by
175
175
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
176
176
  0.9.28 (ruby-2.7.2).
177
177
  </div>
@@ -97,7 +97,7 @@
97
97
  </div></div>
98
98
 
99
99
  <div id="footer">
100
- Generated on Sat Nov 5 20:09:02 2022 by
100
+ Generated on Mon Nov 7 15:30:13 2022 by
101
101
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
102
102
  0.9.28 (ruby-2.7.2).
103
103
  </div>
data/docs/index.html CHANGED
@@ -97,7 +97,7 @@
97
97
  </div></div>
98
98
 
99
99
  <div id="footer">
100
- Generated on Sat Nov 5 20:09:02 2022 by
100
+ Generated on Mon Nov 7 15:30:12 2022 by
101
101
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
102
102
  0.9.28 (ruby-2.7.2).
103
103
  </div>
@@ -62,16 +62,16 @@
62
62
 
63
63
  <li class="odd ">
64
64
  <div class="item">
65
- <span class='object_link'><a href="Battlesnake/Snake.html#as_json-instance_method" title="Battlesnake::Snake#as_json (method)">#as_json</a></span>
66
- <small>Battlesnake::Snake</small>
65
+ <span class='object_link'><a href="Battlesnake/Game.html#as_json-instance_method" title="Battlesnake::Game#as_json (method)">#as_json</a></span>
66
+ <small>Battlesnake::Game</small>
67
67
  </div>
68
68
  </li>
69
69
 
70
70
 
71
71
  <li class="even ">
72
72
  <div class="item">
73
- <span class='object_link'><a href="Battlesnake/Game.html#as_json-instance_method" title="Battlesnake::Game#as_json (method)">#as_json</a></span>
74
- <small>Battlesnake::Game</small>
73
+ <span class='object_link'><a href="Battlesnake/Snake.html#as_json-instance_method" title="Battlesnake::Snake#as_json (method)">#as_json</a></span>
74
+ <small>Battlesnake::Snake</small>
75
75
  </div>
76
76
  </li>
77
77
 
@@ -214,16 +214,16 @@
214
214
 
215
215
  <li class="even ">
216
216
  <div class="item">
217
- <span class='object_link'><a href="Battlesnake/Location.html#initialize-instance_method" title="Battlesnake::Location#initialize (method)">#initialize</a></span>
218
- <small>Battlesnake::Location</small>
217
+ <span class='object_link'><a href="Battlesnake/Board.html#initialize-instance_method" title="Battlesnake::Board#initialize (method)">#initialize</a></span>
218
+ <small>Battlesnake::Board</small>
219
219
  </div>
220
220
  </li>
221
221
 
222
222
 
223
223
  <li class="odd ">
224
224
  <div class="item">
225
- <span class='object_link'><a href="Battlesnake/Board.html#initialize-instance_method" title="Battlesnake::Board#initialize (method)">#initialize</a></span>
226
- <small>Battlesnake::Board</small>
225
+ <span class='object_link'><a href="Battlesnake/Location.html#initialize-instance_method" title="Battlesnake::Location#initialize (method)">#initialize</a></span>
226
+ <small>Battlesnake::Location</small>
227
227
  </div>
228
228
  </li>
229
229
 
@@ -292,6 +292,22 @@
292
292
  </li>
293
293
 
294
294
 
295
+ <li class="even ">
296
+ <div class="item">
297
+ <span class='object_link'><a href="Battlesnake/Board.html#on_board%3F-instance_method" title="Battlesnake::Board#on_board? (method)">#on_board?</a></span>
298
+ <small>Battlesnake::Board</small>
299
+ </div>
300
+ </li>
301
+
302
+
303
+ <li class="odd ">
304
+ <div class="item">
305
+ <span class='object_link'><a href="Battlesnake/Board.html#paths-instance_method" title="Battlesnake::Board#paths (method)">#paths</a></span>
306
+ <small>Battlesnake::Board</small>
307
+ </div>
308
+ </li>
309
+
310
+
295
311
  <li class="even ">
296
312
  <div class="item">
297
313
  <span class='object_link'><a href="Battlesnake/Game.html#ruleset-instance_method" title="Battlesnake::Game#ruleset (method)">#ruleset</a></span>
@@ -100,7 +100,7 @@
100
100
  </div>
101
101
 
102
102
  <div id="footer">
103
- Generated on Sat Nov 5 20:09:02 2022 by
103
+ Generated on Mon Nov 7 15:30:13 2022 by
104
104
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
105
105
  0.9.28 (ruby-2.7.2).
106
106
  </div>
@@ -41,37 +41,53 @@ module Battlesnake
41
41
  end
42
42
 
43
43
  ##
44
- # List of all occupied locations on the board; snakes, food, hazards, etc
44
+ # List of all occupied locations on the board; snakes, hazards, etc.
45
+ # Does NOT include food, since we don't want to avoid that.
45
46
  #
46
47
  # @return [Array<Location>] list of occupied locations
47
48
  def occupied_locations
48
49
  return @occupied_locations if defined?(@occupied_locations)
49
- @occupied_locations = snakes.map(&:body).flatten + food + hazards
50
+ @occupied_locations = snakes.map(&:body).flatten + hazards
50
51
  end
51
52
 
52
53
  ##
53
54
  # Whether the supplied location is occupied.
54
55
  #
55
- # @param *coordinates [Location,Hash,String,Array] can be specified as a _Location_ object,
56
- # hash containing x/y keys, JSON string of such a hash, or a pair of x,y coordinates expressed
57
- # as a 2-element array or two separate parameters.
56
+ # @param [Location] location being checked for occupancy.
58
57
  #
59
58
  # @return [Boolean] true if location is occupied by snakes, food, hazards, etc.
60
- def occupied?(*coordinates)
61
- location = coordinates.first.is_a?(Location) ? coordinates.first : Location.new(*coordinates)
59
+ def occupied?(location)
62
60
  occupied_locations.include?(location)
63
61
  end
64
62
 
63
+ ##
64
+ # Where the supplied location falls within the boundaries of the board.
65
+ #
66
+ # @param [Location] location being tested.
67
+ #
68
+ # @return [Boolean] true if location is within the boundaries of the board.
69
+ def on_board?(location)
70
+ location.x >= 0 && location.y >= 0 && location.x < width && location.y < height
71
+ end
72
+
65
73
  ##
66
74
  # Whether the supplied location is available (unoccupied).
67
75
  #
68
- # @param *coordinates [Location,Hash,String,Array] can be specified as a _Location_ object,
69
- # hash containing x/y keys, JSON string of such a hash, or a pair of x,y coordinates expressed
70
- # as a 2-element array or two separate parameters.
76
+ # @param [Location] location being tested for availability.
71
77
  #
72
78
  # @return [Boolean] true if location is available (unoccupied by snakes, food, hazards, etc).
73
- def available?(*coordinates)
74
- !occupied?(*coordinates)
79
+ def available?(location)
80
+ on_board?(location) && !occupied?(location)
81
+ end
82
+
83
+ ##
84
+ # Whether the supplied location is food.
85
+ #
86
+ # @param [Location] location being tested for availability.
87
+ #
88
+ # @return [Boolean] true if location is food.
89
+ def food?(location)
90
+ food.include?(location)
75
91
  end
76
92
 
77
93
  ##
@@ -85,5 +101,129 @@ module Battlesnake
85
101
  available?(location.move(direction))
86
102
  end
87
103
  end
104
+
105
+ ##
106
+ # List of valid, consecutive paths from one location to the next. Paths may not:
107
+ #
108
+ # - wander outside board boundaries.
109
+ # - use the same location more than once.
110
+ # - contain occupied locations, EXCEPT the start/end locations.
111
+ #
112
+ # The exception for start/end locations allows us to generate paths, for example, from a snake
113
+ # to a food location, without having to calulate the starting/ending permutations ourselves.
114
+ #
115
+ # @param from [Location] starting location, may be occupied
116
+ # @param to [Location] starting location, may be occupied
117
+ #
118
+ # @return [Array<Path>] a list of paths, which themselves are lists of consecutive, valid locations.
119
+ def find_path(from, to, max_distance: nil)
120
+ @paths = []
121
+ @ideal_path_size = from.distance(to) + 1
122
+ @shortest_path_size = max_distance || @ideal_path_size
123
+ @ideal_path_size_found = false
124
+
125
+ recursive_paths(from, to, [from])
126
+
127
+ @paths.select{ |path| path.size == @shortest_path_size }.first
128
+ end
129
+
130
+ def recursive_paths(from, to, path)
131
+ head = path.last
132
+
133
+ # give up if path is too long already.
134
+ return [] if path.size > @shortest_path_size || @ideal_path_size_found
135
+
136
+ # if we've made it to "to", we have a successful candidate path.
137
+ if head.as_json == to.as_json
138
+ @paths << path
139
+ @shortest_path_size = [@shortest_path_size, path.size].min
140
+ @ideal_path_size_found = true if path.size == @ideal_path_size
141
+
142
+ return path
143
+ end
144
+
145
+ available_directions(head).sort_by do |direction|
146
+ # prefer to continue in same direction
147
+ neck = path[-2]
148
+
149
+ if neck && neck.direction(head) == direction
150
+ 0
151
+ else
152
+ rand
153
+ end
154
+ end.map do |direction|
155
+ # convert direction string to a location
156
+ head.move(direction)
157
+ end.map do |location|
158
+ # convert location to a full path
159
+ path + [location]
160
+ end.select do |candidate|
161
+ # don't allow paths that overlap themselves
162
+ candidate.size == candidate.uniq(&:as_json).size
163
+ end.each do |candidate|
164
+ # recurse into remaining candidate paths
165
+ recursive_paths(from, to, candidate)
166
+ end
167
+ end
168
+
169
+ def shorty(location)
170
+ "#{location.x}:#{location.y}"
171
+ end
172
+
173
+ def shorties(list)
174
+ case list.first
175
+ when Array
176
+ list.map{ |l| shorties(l) }
177
+ when Location
178
+ list.map{|x| shorty(x)}.join(' ')
179
+ end
180
+ end
181
+
182
+ def print_grid(path, prefix: ' ')
183
+ max_x = path.map(&:x).max
184
+ max_y = path.map(&:y).max
185
+
186
+ (0..max_y).each do |row|
187
+ y = max_y - row
188
+
189
+ cols = (0..max_x).map do |x|
190
+ loc = Location.new(x, y)
191
+
192
+ if path.include?(loc)
193
+ after = path.index{ |l| l.as_json == loc.as_json} + 1
194
+
195
+ if after >= path.size
196
+ "\u00d7"
197
+ elsif loc.as_json == path.first.as_json
198
+ case loc.direction(path[after])
199
+ when 'up'
200
+ "\u21a5"
201
+ when 'down'
202
+ "\u21a7"
203
+ when 'left'
204
+ "\u21a4"
205
+ when 'right'
206
+ "\u21a6"
207
+ end
208
+ else
209
+ case loc.direction(path[after])
210
+ when 'up'
211
+ "\u2191"
212
+ when 'down'
213
+ "\u2193"
214
+ when 'left'
215
+ "\u2190"
216
+ when 'right'
217
+ "\u2192"
218
+ end
219
+ end
220
+ else
221
+ 'O'
222
+ end
223
+ end.join(' ')
224
+
225
+ puts "#{prefix} #{cols}"
226
+ end
227
+ end
88
228
  end
89
229
  end
@@ -1,4 +1,4 @@
1
1
  module Battlesnake
2
2
  # The current version of the driver.
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.4"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: battlesnake
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jaime Bellmyer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-06 00:00:00.000000000 Z
11
+ date: 2023-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec