X-Git-Url: https://git.ucc.asn.au/?p=progcomp2012.git;a=blobdiff_plain;f=progcomp%2Fagents%2Fbasic_python%2Fbasic_python.py;h=919d1a2570cf8a6bc10f988ff67db76f3a53093b;hp=cf024e8d45ae9c67256f325b4ec82432d10f228f;hb=3d01a5643ce96271f2b7db1cdcc9cafb189667f9;hpb=88fc5a96c424e9a451b98f3b680bc1980345320d diff --git a/progcomp/agents/basic_python/basic_python.py b/progcomp/agents/basic_python/basic_python.py old mode 100644 new mode 100755 index cf024e8..919d1a2 --- a/progcomp/agents/basic_python/basic_python.py +++ b/progcomp/agents/basic_python/basic_python.py @@ -20,16 +20,24 @@ import random 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) @@ -53,6 +61,7 @@ class Piece: self.x = x self.y = y self.lastMoved = -1 + self.beenRevealed = False def mobile(self): return self.rank != 'F' and self.rank != 'B' and self.rank != '?' and self.rank != '+' @@ -64,6 +73,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: @@ -81,6 +96,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): @@ -132,7 +153,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"): @@ -203,64 +224,93 @@ class BasicAI: #sys.stderr.write(" Board position " + str(x) + " " + str(y) + " is OK!\n") direction = result[2].strip() - outcome = result[3].strip() - - p = move(x,y,direction) + 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, multiplier) - 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] + #Determine attacking piece + attacker = self.board[x][y] + self.board[x][y] = None - self.board[x][y] = None - elif outcome == "KILLS": - if self.board[p[0]][p[1]] == None: - return False + if attacker == None: + return False - 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]]) + lastMoved = attacker - self.board[x][y].x = p[0] - self.board[x][y].y = p[1] + defender = self.board[p[0]][p[1]] + #Update attacker's position (Don't overwrite the board yet though) + attacker.x = p[0] + attacker.y = p[1] - 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 @@ -287,8 +337,9 @@ class BasicAI: sys.stderr.write(str(self.board[x][y].rank)); sys.stderr.write("\n") -#basicAI = BasicAI() -#if basicAI.Setup(): -# while basicAI.MoveCycle(): -# pass +if __name__ == "__main__": + basicAI = BasicAI() + if basicAI.Setup(): + while basicAI.MoveCycle(): + pass