# evaluate.py - Classes for simulating "The Settlers of Catan" #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ # 97-02-27 ct7 Original version. # 97-03-06 ct7 Split Board into multiple classes # 97-03-10 ct7 Seperate evaluator from boards #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ from pieces import * #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ Odds = { 2:1, 3:2, 4:3, 5:4, 6:5, 7:6, 8:5, 9:4, 10:3, 11:2, 12:1 } #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ # Order of hexes and spots around a given hex or spot #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ CntrClock = [ ( 0,-1),( 1,-1),( 1, 0),( 0, 1),(-1, 1),(-1, 0),( 0,-1) ] Clockwise = [ ( 0,-1),(-1, 0),(-1, 1),( 0, 1),( 1, 0),( 1,-1),( 0,-1) ] #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ # The Evaluator class is responsible for evaluating a board/position. #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ class Evaluator: #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ def __init__( self, board ): self.board = board #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ class Simple(Evaluator): #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ def evaluate( self ): self.eval_resources() self.eval_spots() self.eval_print() #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ def eval_resources( self ): p = {} p[ Brick ] = 0 p[ Rocks ] = 0 p[ Sheep ] = 0 p[ Trees ] = 0 p[ Wheat ] = 0 sum = 0.0 for land in self.board.lands: if land.roll: p[ land.land ] = p[ land.land ] + Odds[ land.roll ] sum = sum + Odds[ land.roll ] self.prob = p self.resource = {} self.resource[ Brick ] = sum / p[ Brick ] self.resource[ Rocks ] = sum / p[ Rocks ] self.resource[ Sheep ] = sum / p[ Sheep ] self.resource[ Trees ] = sum / p[ Trees ] self.resource[ Wheat ] = sum / p[ Wheat ] #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ def eval_spots( self ): s = [] for spot in self.board.spots: sum = 0.0 pic = "" for land in spot.lands: if land.roll: sum = sum + Odds[ land.roll ] * \ self.resource[ land.land ] pic = pic + "%s%02d " % \ (land.land.repr, land.roll) else: pic = pic + "D-- " s.append( (sum, spot.x, spot.y, pic) ) s.sort() s.reverse() self.best_spots = s #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ def eval_print( self ): print "In 36 rolls, the following resources will generate:" print print "%s: %3d" % (Brick.type, self.prob[ Brick ]) print "%s: %3d" % (Rocks.type, self.prob[ Rocks ]) print "%s: %3d" % (Sheep.type, self.prob[ Sheep ]) print "%s: %3d" % (Trees.type, self.prob[ Trees ]) print "%s: %3d" % (Wheat.type, self.prob[ Wheat ]) print print "The best spots are:" print print "Index (x,y) Hexes " print "------ ------- -----------" for spot in self.best_spots[:15]: print "%6.3f (%2d,%2d) %s" % spot #---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+