summaryrefslogtreecommitdiffhomepage
path: root/digital/io-hub/src/robospierre
diff options
context:
space:
mode:
authorNicolas Schodet2011-06-03 13:28:10 +0200
committerNicolas Schodet2011-06-03 13:28:10 +0200
commit631860f79e52a0c155bb2e191c2729c0ca7e3149 (patch)
treeecfd590f3e36e99299fe79d7b50479fe8e0fefc9 /digital/io-hub/src/robospierre
parentfe415bb389823f1557ef05324bbc966bd42de0a4 (diff)
digital/io-hub: on pathologic failure, add failure offset
Diffstat (limited to 'digital/io-hub/src/robospierre')
-rw-r--r--digital/io-hub/src/robospierre/element.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/digital/io-hub/src/robospierre/element.c b/digital/io-hub/src/robospierre/element.c
index cbb07a65..599e9175 100644
--- a/digital/io-hub/src/robospierre/element.c
+++ b/digital/io-hub/src/robospierre/element.c
@@ -34,6 +34,9 @@
#include "bot.h"
#include "playground.h"
+/** Offset to be used when everything fail. */
+static uint8_t failure_offset_s;
+
/** Elements on table. */
struct element_t element_table[] =
{
@@ -179,7 +182,7 @@ element_unload_score (position_t robot_pos, uint8_t element_id)
/* Failed element. */
if (e.failure_until_s
- && e.failure_until_s < chrono_remaining_time () / 1000)
+ && e.failure_until_s + failure_offset_s < chrono_remaining_time () / 1000)
return -1;
/* Bonus adjust. */
@@ -217,17 +220,23 @@ element_unload_best (position_t robot_pos)
uint8_t i;
uint8_t best = 0xff;
int32_t score, best_score = 0;
- for (i = ELEMENT_UNLOAD_START;
- i <= ELEMENT_UNLOAD_END;
- i++)
+ uint8_t retry = 0;
+ do
{
- score = element_unload_score (robot_pos , i);
- if (best == 0xff || best_score < score)
+ if (retry && failure_offset_s != 255)
+ failure_offset_s++;
+ for (i = ELEMENT_UNLOAD_START;
+ i <= ELEMENT_UNLOAD_END;
+ i++)
{
- best = i;
- best_score = score;
+ score = element_unload_score (robot_pos , i);
+ if (best == 0xff || best_score < score)
+ {
+ best = i;
+ best_score = score;
+ }
}
- }
+ } while (best_score == -1 && retry++ < 10);
return best;
}
@@ -252,7 +261,7 @@ element_score (position_t robot_pos, uint8_t element_id)
/* Failed element. */
if (e.failure_until_s
- && e.failure_until_s < chrono_remaining_time () / 1000)
+ && e.failure_until_s + failure_offset_s < chrono_remaining_time () / 1000)
return -1;
if (e.type & ELEMENT_PAWN)
@@ -401,15 +410,21 @@ element_best (position_t robot_pos)
uint8_t i;
uint8_t best = 0xff;
int32_t score = 0, best_score = 0;
- for (i = 0; i < UTILS_COUNT (element_table); i++)
+ uint8_t retry = 0;
+ do
{
- score = element_score (robot_pos ,i);
- if (best == 0xff || best_score < score)
+ if (retry && failure_offset_s != 255)
+ failure_offset_s++;
+ for (i = 0; i < UTILS_COUNT (element_table); i++)
{
- best = i;
- best_score = score;
+ score = element_score (robot_pos ,i);
+ if (best == 0xff || best_score < score)
+ {
+ best = i;
+ best_score = score;
+ }
}
- }
+ } while (best_score == -1 && retry++ < 10);
return best;
}