Example #1
0
class Member:

	max_energy = config.member_max_energy

	def __init__( self ):
		self.radius 	 = config.member_radius
		self.color  	 = Helper.random_color()

		self.brain       = Brain()

		self.x 			 = None
		self.y 			 = None

		self.energy      = self.max_energy
		self.distance    = 0.0
		self.relation    = 0.0
		self.rotation    = 0.0
		self.speed       = 0.0

		self.left_track  = None
		self.right_track = None

		self.close_to    = None
		self.alive 		 = True
		self.food 		 = 0
		self.score       = 0
		self.norm_score  = 0.0
		self.mutations   = 0

		self.error_count = 0

		self.born 		 = pygame.time.get_ticks()
		self.died		 = None
		self.lifespan    = 0

		self.generation  = 0
		self.member_num  = 0

	def update_member_state( self ):

		if self.energy == 0 or self.energy > self.max_energy * 2:
			self.alive    = False
			self.died  	  = pygame.time.get_ticks()
			self.lifespan = self.died - self.born
		else:
			self.alive = True

		if self.alive:
			self.process_network()
			self.rotation += (self.left_track - self.right_track) / self.radius
			if self.rotation > (2 * math.pi): self.rotation = 0
			elif self.rotation < 0: self.rotation = (2 * math.pi)
			self.speed = self.left_track + self.right_track

			if self.close_to != None:
				self.distance = Helper.get_distance(self,self.close_to)
				self.relation = Helper.get_relation_to(self,self.close_to)

			self.energy -= config.energy_loss


	def update_member_position( self ):

		if self.alive:

			x_move = self.x + Helper.delta_x( self.rotation, self.speed )
			y_move = self.y + Helper.delta_y( self.rotation, self.speed )

			if x_move > config.viewport_width: x_move = 0
			elif x_move < 0: x_move = config.viewport_width

			if y_move > config.viewport_height: y_move = 0
			elif y_move < 0: y_move = config.viewport_height

			self.x, self.y = x_move, y_move
	
	def process_network( self ):
		if self.error_count < 10:
			try:
				self.left_track, self.right_track = self.brain.activate_network(self.get_params())
			except:
				self.brain.network.sortModules()
				self.error_count += 1
				self.process_network()
		else:
			self.left_track, self.right_track = [0,0]
			self.color = [20,20,20]

	def get_params( self ):
		energy_input 	= Helper.make_uniform(self.energy, 1)
		distance 		= Helper.make_uniform(self.distance, 2)
		relation		= Helper.make_uniform(self.relation, 2)
		return [ energy_input, distance, relation ]

	def draw( self, display ):
		if self.alive:
			dx = self.x + Helper.delta_x( self.rotation, self.radius )
			dy = self.y + Helper.delta_y( self.rotation, self.radius )
			# if self.close_to != None and config.debug: pygame.draw.aaline( display, [130,130,130], (Helper.fixed(self.x), Helper.fixed(self.y)), (Helper.fixed(self.close_to.x), Helper.fixed(self.close_to.y)), 1)
			pygame.draw.circle( display, self.color, (Helper.fixed(self.x), Helper.fixed(self.y)), self.radius, 0)
			pygame.draw.circle( display, [0,0,0], (Helper.fixed(self.x), Helper.fixed(self.y)), self.radius, 1)
			pygame.draw.aaline( display, [0,0,0], (Helper.fixed(self.x), Helper.fixed(self.y)), (Helper.fixed(dx), Helper.fixed(dy)), 1)

			if config.debug:
				font = pygame.font.SysFont("monospace", 10)

				label = font.render(str(self.mutations), 1, [0,0,0] )
				display.blit( label, (self.x - 6, self.y + 10))

				label = font.render(str(self.food), 1, [0,0,0] )
				display.blit( label, (self.x, self.y + 10))