ranks = ['B','1','2','3','4','5','6','7','8','9','s','F', '?', '+']
-def move(x, y, direction):
+def is_integer(s):
+ """ Using exceptions for this feels... wrong..."""
+ try:
+ int(s)
+ return True
+ except ValueError:
+ return False
+
+def move(x, y, direction, multiplier):
""" Moves point (x,y) in direction, returns a pair """
if direction == "UP":
- return (x,y-1)
+ return (x,y-multiplier)
elif direction == "DOWN":
- return (x,y+1)
+ return (x,y+multiplier)
elif direction == "LEFT":
- return (x-1, y)
+ return (x-multiplier, y)
elif direction == "RIGHT":
- return (x+1, y)
+ return (x+multiplier, y)
return (x,y)
self.x = x
self.y = y
self.lastMoved = -1
+ self.beenRevealed = False
+ self.positions = [(x, y)]
def mobile(self):
return self.rank != 'F' and self.rank != 'B' and self.rank != '?' and self.rank != '+'
return 0
+def valuedRank(rank):
+ if ranks.count(rank) > 0:
+ return len(ranks) - 2 - ranks.index(rank)
+ else:
+ return 0
+
class BasicAI:
self.units = []
self.enemyUnits = []
+ self.totalAllies = {'B':6,'1':1,'2':1,'3':2,'4':3,'5':4,'6':4,'7':4,'8':5,'9':8,'s':1,'F':1}
+ self.totalEnemies = {'B':6,'1':1,'2':1,'3':2,'4':3,'5':4,'6':4,'7':4,'8':5,'9':8,'s':1,'F':1}
+ self.hiddenEnemies = {'B':6,'1':1,'2':1,'3':2,'4':3,'5':4,'6':4,'7':4,'8':5,'9':8,'s':1,'F':1}
+ self.hiddenAllies = {'B':6,'1':1,'2':1,'3':2,'4':3,'5':4,'6':4,'7':4,'8':5,'9':8,'s':1,'F':1}
+ self.lastMoved = None
+
def Setup(self):
while True:
#sys.stderr.write("Trying index " + str(dirIndex) + "\n")
- p = move(piece.x, piece.y, directions[dirIndex])
+ p = move(piece.x, piece.y, directions[dirIndex],1)
if p[0] >= 0 and p[0] < self.width and p[1] >= 0 and p[1] < self.height:
target = self.board[p[0]][p[1]]
if target == None or (target.colour != piece.colour and target.colour != "NONE" and target.colour != "BOTH"):
#sys.stderr.write(" Board position " + str(x) + " " + str(y) + " is OK!\n")
direction = result[2].strip()
+
+ multiplier = 1
outcome = result[3].strip()
+ outIndex = 3
+ if is_integer(outcome):
+ multiplier = int(outcome)
+ outcome = result[4].strip()
+ outIndex = 4
- p = move(x,y,direction)
+ p = move(x,y,direction, multiplier)
-
+ #Determine attacking piece
+ attacker = self.board[x][y]
+ self.board[x][y] = None
- if outcome == "OK":
- self.board[p[0]][p[1]] = self.board[x][y]
- self.board[x][y].x = p[0]
- self.board[x][y].y = p[1]
+ if attacker == None:
+ return False
- self.board[x][y] = None
- elif outcome == "KILLS":
- if self.board[p[0]][p[1]] == None:
- return False
+ lastMoved = attacker
- if self.board[p[0]][p[1]].colour == self.colour:
- self.units.remove(self.board[p[0]][p[1]])
- elif self.board[p[0]][p[1]].colour == oppositeColour(self.colour):
- self.enemyUnits.remove(self.board[p[0]][p[1]])
+ defender = self.board[p[0]][p[1]]
- self.board[x][y].x = p[0]
- self.board[x][y].y = p[1]
+ #Update attacker's position (Don't overwrite the board yet though)
+ attacker.x = p[0]
+ attacker.y = p[1]
+ attacker.positions.insert(0, (attacker.x, attacker.y))
- self.board[p[0]][p[1]] = self.board[x][y]
- self.board[x][y].rank = result[4].strip()
+
+ #Determine ranks of pieces if supplied
+ if len(result) >= outIndex + 3:
+ if defender == None:
+ return False
+ attacker.rank = result[outIndex+1].strip()
+ if attacker.beenRevealed == False:
+ if attacker.colour == self.colour:
+ self.hiddenAllies[attacker.rank] -= 1
+ elif attacker.colour == oppositeColour(self.colour):
+ self.hiddenEnemies[attacker.rank] -= 1
+ attacker.beenRevealed = True
+ defender.rank = result[outIndex+2].strip()
+ if defender.beenRevealed == False:
+ if defender.colour == self.colour:
+ self.hiddenAllies[defender.rank] -= 1
+ elif defender.colour == oppositeColour(self.colour):
+ self.hiddenEnemies[defender.rank] -= 1
+
+ defender.beenRevealed = True
- self.board[x][y] = None
+
+ if outcome == "OK":
+ self.board[p[0]][p[1]] = attacker
+
+ elif outcome == "KILLS":
+ self.board[p[0]][p[1]] = attacker
+
+ if defender.colour == self.colour:
+ self.totalAllies[defender.rank] -= 1
+ self.units.remove(defender)
+ elif defender.colour == oppositeColour(self.colour):
+ self.totalEnemies[defender.rank] -= 1
+ self.enemyUnits.remove(defender)
+
elif outcome == "DIES":
- if self.board[p[0]][p[1]] == None:
- return False
-
- if self.board[x][y].colour == self.colour:
- self.units.remove(self.board[x][y])
- elif self.board[x][y].colour == oppositeColour(self.colour):
- self.enemyUnits.remove(self.board[x][y])
+ if attacker.colour == self.colour:
+ self.totalAllies[attacker.rank] -= 1
+ self.units.remove(attacker)
+ elif attacker.colour == oppositeColour(self.colour):
+ self.totalEnemies[attacker.rank] -= 1
+ self.enemyUnits.remove(attacker)
- self.board[p[0]][p[1]].rank = result[5].strip()
- self.board[x][y] = None
elif outcome == "BOTHDIE":
- if self.board[p[0]][p[1]] == None:
- return False
-
+ self.board[p[0]][p[1]] = None
- if self.board[x][y].colour == self.colour:
- self.units.remove(self.board[x][y])
- elif self.board[x][y].colour == oppositeColour(self.colour):
- self.enemyUnits.remove(self.board[x][y])
- if self.board[p[0]][p[1]].colour == self.colour:
- self.units.remove(self.board[p[0]][p[1]])
- elif self.board[p[0]][p[1]].colour == oppositeColour(self.colour):
- self.enemyUnits.remove(self.board[p[0]][p[1]])
+ if defender.colour == self.colour:
+ self.totalAllies[defender.rank] -= 1
+ self.units.remove(defender)
+ elif defender.colour == oppositeColour(self.colour):
+ self.totalEnemies[defender.rank] -= 1
+ self.enemyUnits.remove(defender)
+ if attacker.colour == self.colour:
+ self.totalAllies[attacker.rank] -= 1
+ self.units.remove(attacker)
+ elif attacker.colour == oppositeColour(self.colour):
+ self.totalEnemies[attacker.rank] -= 1
+ self.enemyUnits.remove(attacker)
- self.board[p[0]][p[1]] = None
- self.board[x][y] = None
elif outcome == "FLAG":
#sys.stderr.write(" Game over!\n")
return False