X-Git-Url: https://git.ucc.asn.au/?p=progcomp2012.git;a=blobdiff_plain;f=progcomp%2Fagents%2Fbasic_python%2Fbasic_python.py;h=b38483834124be627565d8771e59216a4a41ebf0;hp=9b427c73a23d9475f7890adedf2921c6b75db921;hb=e8a611c553bd336550c50ed7491d5800a2ae7142;hpb=cf19b39b4fbc4ae5fd134cfe6c76f7718cc3097f diff --git a/progcomp/agents/basic_python/basic_python.py b/progcomp/agents/basic_python/basic_python.py index 9b427c7..b384838 100755 --- a/progcomp/agents/basic_python/basic_python.py +++ b/progcomp/agents/basic_python/basic_python.py @@ -61,6 +61,8 @@ class Piece: 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 != '+' @@ -72,6 +74,12 @@ class Piece: return 0 +def valuedRank(rank): + if ranks.count(rank) > 0: + return len(ranks) - 2 - ranks.index(rank) + else: + return 0 + class BasicAI: @@ -89,6 +97,12 @@ 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): @@ -140,7 +154,7 @@ class BasicAI: 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"): @@ -222,60 +236,84 @@ class BasicAI: 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[outIndex+1].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 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) - 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]) - - self.board[p[0]][p[1]].rank = result[outIndex+2].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