Fixing simulate.py
[progcomp2012.git] / progcomp / agents / basic_python / basic_python.py
old mode 100644 (file)
new mode 100755 (executable)
index cf024e8..b384838
@@ -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,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 != '+'
@@ -64,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:
@@ -81,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):
@@ -132,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"):   
@@ -203,64 +225,95 @@ class BasicAI:
                #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
@@ -287,8 +340,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
 

UCC git Repository :: git.ucc.asn.au