BasicAI.__init__(self)
- self.bombScores = {'1' : -0.9 , '2' : -0.8 , '3' : -0.5 , '4' : 0.1, '5' : 0.1, '6' : 0.3, '7' : 0.7, '8' : 1 , '9' : 0.6, 's' : 0}
- self.suicideScores = {'1' : -0.5 , '2' : -0.4 , '3' : -0.35, '4' : -0.25, '5' : -0.2, '6' : 0.0, '7' : 0.1, '8' : -0.4 , '9' : 0.0, 's' : -0.4}
- self.killScores = {'1' : 1.0 , '2' : 0.9 , '3' : 0.9 , '4' : 0.8, '5' : 0.8, '6' : 0.8, '7' : 0.8, '8' : 0.9 , '9' : 0.7, 's' : 0.9}
+ #self.bombScores = {'1' : -0.9 , '2' : -0.8 , '3' : -0.5 , '4' : 0.1, '5' : 0.1, '6' : 0.3, '7' : 0.7, '8' : 1 , '9' : 0.6, 's' : 0}
+ #self.bombScores = {'1' : -0.9 , '2' : -0.8 , '3' : -0.5 , '4' : -0.5, '5' : -0.4, '6' : -0.5, '7' : -0.2, '8' : 1.0 , '9' : -0.1, 's' : -0.2}
+ self.suicideScores = {'1' : -0.5 , '2' : -0.4 , '3' : -0.35, '4' : -0.25, '5' : -0.2, '6' : 0.0, '7' : 0.1, '8' : -1.0 , '9' : 0.0, 's' : -0.4}
+ self.killScores = {'1' : 1.0 , '2' : 0.9 , '3' : 0.9 , '4' : 0.8, '5' : 0.8, '6' : 0.8, '7' : 0.8, '8' : 0.9 , '9' : 0.7, 's' : 1.0}
self.riskScores = {'1' : 0.0, '2' : 0.1, '3' : 0.2, '4': 0.4, '5': 0.6, '6': 0.7, '7':0.8, '8': 0.0, '9' : 1.0, 's' : 0.1}
path = PathFinder().pathFind((unit.x, unit.y), (target.x, target.y), self.board)
if path == False or len(path) == 0:
continue
- moveList.append({"unit":unit, "direction":path[0], "score":self.CalculateScore(unit, target, path)})
- #scores[path[0]] += self.CalculateScore(unit, target, path)
+ #moveList.append({"unit":unit, "direction":path[0], "score":self.CalculateScore(unit, target, path)})
+ scores[path[0]] += self.CalculateScore(unit, target, path)
- #bestScore = sorted(scores.items(), key = lambda e : e[1], reverse=True)[0]
- #moveList.append({"unit":unit, "direction":bestScore[0], "score":bestScore[1]})
+ bestScore = sorted(scores.items(), key = lambda e : e[1], reverse=True)[0]
+ moveList.append({"unit":unit, "direction":bestScore[0], "score":bestScore[1]})
if len(moveList) == 0:
return True
moveList.sort(key = lambda e : e["score"], reverse=True)
- sys.stderr.write("vixen - best move: " + str(moveList[0]["unit"].x) + " " + str(moveList[0]["unit"].y) + " " + moveList[0]["direction"] + " [ score = " + str(moveList[0]["score"]) + " ]\n")
+ #sys.stderr.write("vixen - best move: " + str(moveList[0]["unit"].x) + " " + str(moveList[0]["unit"].y) + " " + moveList[0]["direction"] + " [ score = " + str(moveList[0]["score"]) + " ]\n")
if moveList[0]["score"] == 0:
print "NO_MOVE"
return True
def CalculateScore(self, attacker, defender, path):
+ p = move(attacker.x, attacker.y, path[0], 1)
+
+
total = 0.0
count = 0.0
for rank in ranks:
total = total * self.tailFactor(len(path))
+ #HACK - Prevent "oscillating" by decreasing the value of backtracks
+ if len(path) > 1 and len(attacker.positions) > 1 and attacker.positions[1][0] == p[0] and attacker.positions[1][1] == p[1]:
+ total = total / 100
#sys.stderr.write("Total score for " + str(attacker) + " vs. " + str(defender) + " is " + str(total) + "\n")
return total
return self.killScores[defenderRank]
def bombScore(self, attackerRank):
- return self.bombScores[attackerRank]
+ if attackerRank == '8':
+ return 1.0
+ else:
+ return 0.0
def suicideScore(self, attackerRank):
return self.suicideScores[attackerRank]
return 0.0
return float(float(self.hiddenEnemies[targetRank]) / float(total))
- def InterpretResult(self):
- """ Over-ride the basic AI interpret result so we can update probabilities """
- if BasicAI.InterpretResult(self) == False:
- return False
-
- return True
+
5 Captain 5 4
6 Lieutenant 6 4
7 Sergeant 7 4
- 8 Miner 8 5 Destroys Bombs without being killed
+ 8 Miner 8 5 Destroys Bombs
9 Scout 9 8 May move more through multiple empty squares
s Spy 10 1 If the Spy attacks the Marshal, the Marshal dies
- B Bomb NA 6 Immobile. If any piece (except a Miner) encounters an enemy Bomb, both pieces are destroyed
- F Flag NA 1 Immobile. If any piece encounters the enemy Flag, the controlling player wins.
+ B Bomb NA 6 Immobile. If any piece (except a Miner) attacks an enemy Bomb, that piece is destroyed.
+ F Flag NA 1 Immobile. If any piece attacks the enemy Flag, the controlling player wins.
Additional pieces, not controlled by the player:
Piece Name Number Notes
Each player's pieces are hidden from the other player. When two pieces encounter each other, the ranks will be revealed.
The objective is to destroy all Enemy Pieces (#) or capture the Enemy Flag (also #).
+
+ Since 20/12 Bombs reflect the traditional rules; they are only destroyed by Miners.
+ In previous versions contact of an attacker other than a Miner with a Bomb destroyed the Bomb as well as the attacking piece.
PROTOCOL
BUGS
+ Occasionally the result is not printed at the end of the game.
+ So far this has only been observed to occur when RED wins the game by Flag capture.
+
stratego is still a work in progress. Report another bug to the AUTHOR (see below).
+
AUTHORS