Sep-14-2017, 03:09 PM
OK, so in my "sim" I've managed to assign "cells" or agents to a sprite group, and plants (for cells to eat and obtain food) into another group. After scouring google I came up with the following to process collisions in a manner that each plant give its unique self.food value to the cell that "eats" it, increasing the cells.food (up to its limit or else skip)
However after verbosing the collision handling code, it seems I'm not actually accessing and 'feeding' the plant.food, but rather cell.food to the same cell, thereby doubling its food exponentially with hilarious results (their self.size is based on food, making them produce screen filling 'babies' who inherit half the insane amount of food lol).:
Question: How do I make it so when a "cell" object from spr_cell_group hits a "plant" object from spr_plant_group, the plant and cell in the individual collision are referenced correctly and the 'food' is provided from THAT plant to THAT cell ?
Simplified code:
However after verbosing the collision handling code, it seems I'm not actually accessing and 'feeding' the plant.food, but rather cell.food to the same cell, thereby doubling its food exponentially with hilarious results (their self.size is based on food, making them produce screen filling 'babies' who inherit half the insane amount of food lol).:
Question: How do I make it so when a "cell" object from spr_cell_group hits a "plant" object from spr_plant_group, the plant and cell in the individual collision are referenced correctly and the 'food' is provided from THAT plant to THAT cell ?
Simplified code:
spr_cell_group = sprite.Group() spr_plant_group = sprite.Group() class Agent(sprite.Sprite): def __init__(self, sense_range, size, food, maxspeed): sprite.Sprite.__init__(self) self.x = randint(0,450) self.y = randint(0,450) self.ang = 0 self.dx = 0 self.dy = 0 self.speed = 0 self.maxspeed = maxspeed self.food = food self.max_food = 300 self.target = [] self.age = 1 # generic sensor range to allow it to see how large the cell is self.sense_range = sense_range self.size = size self.color = (randint(0,255), randint(0,255),randint(0,255)) width = int(self.size) height = int(self.size) self.image = pg.Surface([width*2, height*2]) self.image.fill(white) self.image.set_colorkey(white) pg.draw.circle (self.image, self.color, (int(width),int(height)), int(self.size)) self.rect = self.image.get_rect() self.rect.x = self.x self.rect.y = self.y spr_cell_group.add(self) class Plant (sprite.Sprite): def __init__(self): sprite.Sprite.__init__(self) self.x = randint(0,450) self.y = randint(0,450) self.age = 1 + randint(0,50) #varying colors 1-4 #varying food value based on color self.color = 1 + randint(0,3) self.food = self.color * 10 + randint(1,10) self.size = self.food / 7 if self.color == 1: color = (0,50,0) elif self.color == 2: color = (0,100,0) elif self.color == 3: color = (0,150,0) elif self.color == 4: color = (0,250,0) width = self.size height = self.size self.image = pg.Surface([width*2, height*2]) self.image.fill(white) self.image.set_colorkey(white) pg.draw.circle (self.image, color, (int(width),int(height)), int(self.size)) self.rect = self.image.get_rect() self.rect.x = self.x self.rect.y = self.y spr_plant_group.add(self) # Create initial random cell animals def populate_cells (num): for x in range(num): smell = randint(50,75) size = randint(1,5) food = 100 + randint(-25,50) maxspeed = randint(1,3) agent.append (Agent(smell, size, food, maxspeed)) # Create initial plants (food) def populate_plants (num): for x in range(num): plant.append (Plant()) #.blah blah blah # # def update_cells() #stuff and thangs def update_plants() #stuff and thangs # ============ SOMETHING IS WRONG BELOW WITH THE COLLISION HANDLING? def check_collisions(): hit_list = sprite.groupcollide(spr_cell_group, spr_plant_group, False, False) #if hit_list != {}: #print (hit_list) for a in hit_list: for p in hit_list: if a.food < a.max_food: a.food += p.food print(a, a.food) print(p, p.food) p.kill() #lots of blah # In the main loop I'm running this --------------------- while done == False: for event in pg.event.get(): if event.type == pg.QUIT: done = True screen.fill(black) # Debug info showing food for an agent at index [3] i = 0 if agent[i] in spr_cell_group: font = pg.font.SysFont(None, 20) text = font.render ("Food: "+str(agent[i].food), True, white) screen.blit (text,(agent[i].x,agent[i].y+10)) update_cells() update_plants() check_collisions() rep += 1 if rep >= rep_limit: done = True print ("Sim completed =", done) spr_cell_group.draw(screen) spr_plant_group.draw(screen) #pg.display.update() pg.display.flip() clock.tick(60) pg.quit()BTW this is the output to the console from my debug messages. As you can see, everytime there is a collision, I'm supposed to be printing the a.food (the cell, hopefully?) and p.food (that is pointing to the plant?) and instead it looks like duplicates i.e. I'm feeding the cell its own food value??
=================== RESTART: C:\Python\GA_sim4_Sprites.py =================== <Group(20 sprites)> <Group(40 sprites)> <Agent sprite(in 1 groups)> 151.8 <Agent sprite(in 1 groups)> 151.8 <Agent sprite(in 1 groups)> 229.00000000000006 <Agent sprite(in 1 groups)> 229.00000000000006 <Agent sprite(in 1 groups)> 287.20000000000016 <Agent sprite(in 1 groups)> 287.20000000000016 <Agent sprite(in 1 groups)> 244.00000000000023 <Agent sprite(in 1 groups)> 244.00000000000023 <Agent sprite(in 1 groups)> 161.40000000000026 <Agent sprite(in 1 groups)> 161.40000000000026 <Agent sprite(in 1 groups)> 251.40000000000038 <Agent sprite(in 1 groups)> 251.40000000000038 <Agent sprite(in 1 groups)> 143.00000000000074 <Agent sprite(in 1 groups)> 143.00000000000074 <Agent sprite(in 1 groups)> 232.8000000000011 <Agent sprite(in 1 groups)> 232.8000000000011 <Agent sprite(in 1 groups)> 252.80000000000223 <Agent sprite(in 1 groups)> 252.80000000000223 <Agent sprite(in 1 groups)> 204.00000000000273 <Agent sprite(in 1 groups)> 204.00000000000273 <Agent sprite(in 1 groups)> 139.20000000000346 <Agent sprite(in 1 groups)> 139.20000000000346 <Agent sprite(in 1 groups)> 130.2000000000035 <Agent sprite(in 1 groups)> 130.2000000000035 <Agent sprite(in 1 groups)> 146.20000000000363 <Agent sprite(in 1 groups)> 146.20000000000363 <Agent sprite(in 1 groups)> 157.4000000000039 <Agent sprite(in 1 groups)> 157.4000000000039 <Agent sprite(in 1 groups)> 180.00000000000625 <Agent sprite(in 1 groups)> 180.00000000000625 <Agent sprite(in 1 groups)> 128.8000000000078 <Agent sprite(in 1 groups)> 128.8000000000078 <Agent sprite(in 1 groups)> 50.400000000003104 <Agent sprite(in 1 groups)> 50.400000000003104 Sim completed = True >>>