Added a python sample agent
authorSam Moore <matches@ucc.asn.au>
Sun, 4 Dec 2011 15:48:47 +0000 (23:48 +0800)
committerSam Moore <matches@ucc.asn.au>
Sun, 4 Dec 2011 15:48:47 +0000 (23:48 +0800)
- Learnt python (again).
- Asmodeus just makes random moves like "dummy", except written in python.
- Python programs need to be started with the -u switch to be unbuffered. Easier than expected.

TODO (still)
- Setup vm
Involves kvm on motsugo? or qemu? kvm is faster, but otherwise are they the same thing? kvm's man page even calls it "qemu" (!?)
- Come up with long term scoring and agent handling protocol
I have a few ideas about this. But I need the vm setup to test most of the stuff properly.

samples/asmodeus/asmodeus.py [new file with mode: 0755]

diff --git a/samples/asmodeus/asmodeus.py b/samples/asmodeus/asmodeus.py
new file mode 100755 (executable)
index 0000000..3a104fd
--- /dev/null
@@ -0,0 +1,214 @@
+#!/usr/bin/python -u
+
+#NOTE: The -u option is required for unbuffered stdin/stdout.
+#      If stdin/stdout are buffered, the manager program will not recieve any messages and assume that the agent has timed out.
+
+'''
+ asmodeus.py - A sample Stratego AI for the UCC Programming Competition 2012
+
+ Written in python, the slithery language 
+
+ author Sam Moore (matches) [SZM]
+ website http://matches.ucc.asn.au/stratego
+ email progcomp@ucc.asn.au or matches@ucc.asn.au
+ git git.ucc.asn.au/progcomp2012.git
+'''
+
+import sys
+import random
+
+ranks = ('B','1','2','3','4','5','6','7','8','9','s','F', '?', '+')
+
+def move(x, y, direction):
+       if direction == "UP":
+               return (x,y-1)
+       elif direction == "DOWN":
+               return (x,y+1)
+       elif direction == "LEFT":
+               return (x-1, y)
+       elif direction == "RIGHT":
+               return (x+1, y)
+       print "Error in move!"
+       return (x,y)
+
+def oppositeColour(colour):
+       if colour == "RED":
+               return "BLUE"
+       elif colour == "BLUE":
+               return "RED"
+       else:
+               return "NONE"
+
+class Piece:
+       def __init__(self, colour, rank, x, y):
+               self.colour = colour
+               self.rank = rank
+               self.x = x
+               self.y = y
+       
+
+
+
+class Asmodeus:
+       def __init__(self):
+               #sys.stderr.write("Asmodeus __init__ here...\n");
+               self.turn = 0
+               self.board = []
+               self.units = []
+               if self.Setup():
+                       while self.MakeMove():
+                               pass
+               
+
+       def Setup(self):
+               #sys.stderr.write("Asmodeus Setup here...\n");
+               setup = sys.stdin.readline().split(' ')
+               self.colour = setup[0]
+               self.opponentName = setup[1]
+               self.width = int(setup[2])
+               self.height = int(setup[3])
+               for x in range(0, self.width):
+                       self.board.append([])
+                       for y in range(0, self.height):         
+                               self.board[x].append(None)
+               if self.colour == "RED":
+                       print "FB8sB479B8\nBB31555583\n6724898974\n967B669999"
+               elif self.colour == "BLUE":
+                       print "967B669999\n6724898974\nBB31555583\nFB8sB479B8"
+               return True
+
+       def MoveCycle(self):
+               #sys.stderr.write("Asmodeus MakeMove here...\n");
+               if self.InterpretResult() == False or self.ReadBoard() == False or self.MakeMove() == False:
+                       return False
+               self.turn += 1
+               return self.InterpretResult()
+
+       def MakeMove(self):
+               #TODO: Over-ride this function in base classes with more complex move behaviour
+
+               #sys.stderr.write("Asmodeus MakeRandomMove here...\n")
+               #self.debugPrintBoard()
+               while True:
+                       if len(self.units) <= 0:
+                               return False
+                       piece = random.choice(self.units)
+                       if piece == None:
+                               continue
+                       if piece.rank == '?' or piece.rank == 'B' or piece.rank == 'F':
+                               continue
+
+                       direction = random.choice(("UP", "DOWN", "LEFT", "RIGHT"))
+                       p = move(piece.x, piece.y, direction)
+                       if p[0] >= 0 and p[0] < self.width and p[1] >= 0 and p[1] < self.height:
+                               if self.board[p[0]][p[1]] == None or self.board[p[0]][p[1]].colour == oppositeColour(self.colour):
+                                       print str(piece.x) + " " + str(piece.y) + " " + direction
+                                       break
+               return True
+                                                       
+                       
+       def ReadBoard(self):
+               #sys.stderr.write("Asmodeus ReadBoard here...\n");
+               for y in range(0,self.height):
+                       row = sys.stdin.readline()
+                       for x in range(0,len(row)-1):
+                               if self.turn == 0:
+                                       if row[x] == '.':
+                                               pass
+                                       elif row[x] == '#':
+                                               self.board[x][y] = Piece(oppositeColour(self.colour), '?',x,y)
+                                       elif row[x] == '+':
+                                               self.board[x][y] = Piece("NONE", '+', x, y)
+                                       else:
+                                               self.board[x][y] = Piece(self.colour, row[x],x,y)
+                                               self.units.append(self.board[x][y])
+                               else:
+                                       pass
+               return True
+               
+
+       def InterpretResult(self):
+               #sys.stderr.write("Asmodeus InterpretResult here...\n")
+               result = sys.stdin.readline().split(' ')
+               #sys.stderr.write("     Read status line \"" + str(result) + "\"\n")
+               if self.turn == 0:
+                       return True
+
+               x = int(result[0].strip())
+               y = int(result[1].strip())
+
+
+               #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)
+
+               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]
+
+                       self.board[x][y] = None
+               elif outcome == "KILLS":
+                       if self.board[p[0]][p[1]] == None:
+                               return False
+
+                       if self.board[p[0]][p[1]].colour == self.colour:
+                               self.units.remove(self.board[p[0]][p[1]])
+                       self.board[x][y].x = p[0]
+                       self.board[x][y].y = p[1]
+
+
+                       self.board[p[0]][p[1]] = self.board[x][y]
+                       self.board[x][y].rank = result[4]
+
+                       self.board[x][y] = None
+                       
+               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])
+
+                       self.board[p[0]][p[1]].rank = result[5]
+                       self.board[x][y] = None
+               elif outcome == "BOTHDIE":
+                       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])
+                       if self.board[p[0]][p[1]].colour == self.colour:
+                               self.units.remove(self.board[p[0]][p[1]])
+                       self.board[p[0]][p[1]] = None
+                       self.board[x][y] = None
+               elif outcome == "FLAG":
+                       #sys.stderr.write("     Game over!\n")
+                       return False
+               elif outcome == "ILLEGAL":
+                       #sys.stderr.write("     Illegal move!\n")
+                       return False
+               else:
+                       #sys.stderr.write("     Don't understand outcome \"" + outcome + "\"!\n");
+                       return False
+
+               #sys.stderr.write("     Completed interpreting move!\n");               
+               return True
+
+       def debugPrintBoard(self):
+               for y in range(0, self.height):
+                       for x in range(0, self.width):
+                               if self.board[x][y] == None:
+                                       sys.stderr.write(".");
+                               else:
+                                       sys.stderr.write(str(self.board[x][y].rank));
+                       sys.stderr.write("\n")
+                               
+                       
+
+asmodeus = Asmodeus()
+

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