# 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

#---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
