Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ss24:code_hier [2024/07/25 17:37] Paul-Hoeft angelegt |
ss24:code_hier [2024/07/25 17:49] (aktuell) Paul-Hoeft |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
======Code====== | ======Code====== | ||
- | ===def main()=== | + | =====main.py===== |
+ | <file python main.py> | ||
global running | global running | ||
global state | global state | ||
Zeile 72: | Zeile 73: | ||
pygame.quit()#Pygame wird geschlossen | pygame.quit()#Pygame wird geschlossen | ||
plt.show()#Graphen anzeigen | plt.show()#Graphen anzeigen | ||
+ | </file> | ||
+ | =====bee.update.py===== | ||
+ | <file python bee-update.py> | ||
+ | def update(self, flower, bees): | ||
+ | scale = 3.0 | ||
+ | |||
+ | radius_repel = 3.0 * scale | ||
+ | radius_align = 25.0 * scale | ||
+ | radius_attract = 100.0 * scale | ||
+ | |||
+ | social_strength = 0.5 | ||
+ | |||
+ | nearestBeeDistTo = float("inf") | ||
+ | NearestBeeVecTo = pygame.Vector2(0.0, 0.0) | ||
+ | NearestBeeDir = pygame.Vector2(0.0, 0.0) | ||
+ | ToFlower_vec = pygame.Vector2(0.0, 0.0) | ||
+ | ToHive_vec = pygame.Vector2(0.0, 0.0) | ||
+ | social_vec = pygame.Vector2(0.0, 0.0) | ||
+ | |||
+ | NearestBeeStatus = None | ||
+ | |||
+ | # Der Vektor von der Biene zur Blume | ||
+ | flower_pos = pygame.math.Vector2(flower.rect.center[0], flower.rect.center[1]) | ||
+ | # TODO solange blumen radius auch nicht über torus verläfut macht das keinen Unterschied | ||
+ | # ob Biene über torus oder nicht | ||
+ | to_flower = utils.nearest_vector(self.float_rect, flower_pos) | ||
+ | # if(flower != self.lastflower): | ||
+ | _len = to_flower.length() | ||
+ | # else: | ||
+ | # _len = Bee.RADIUS+1 | ||
+ | # Biene stirbt nach gewisser Zeit | ||
+ | if time.time() - self.STARTTIME >= self.lebensdauer: | ||
+ | self.die() | ||
+ | print("die", self.hive.name, self.hive.livingBees) | ||
+ | |||
+ | # alle bienen durchgehen um nächste zu finden | ||
+ | for bee in bees: | ||
+ | BeeVecTo = ( | ||
+ | bee.float_rect - self.float_rect | ||
+ | ) # Vector zur gerade betrachteten Biene | ||
+ | BeeDistTo = BeeVecTo.length() | ||
+ | if BeeDistTo < nearestBeeDistTo and BeeDistTo > 0: | ||
+ | NearestBeeVecTo = BeeVecTo | ||
+ | nearestBeeDistTo = BeeDistTo | ||
+ | NearestBeeDir = bee.dir | ||
+ | NearestBeeStatus = bee.status | ||
+ | |||
+ | # ich weiß das ist voll schlecht so aber mir fällt grad nichts besseres ein | ||
+ | # ignoriert bienen anderen typs wenn IGNOREOTHERS = True | ||
+ | # imo etwas sinnvoller denn, warum sollten suchende bienen anderen zum hive folgen | ||
+ | # keine so großes Chaos bei hoher social_strength | ||
+ | if config.IGNOREOTHERS: | ||
+ | if self.status == NearestBeeStatus: | ||
+ | if ( | ||
+ | nearestBeeDistTo < radius_attract | ||
+ | and nearestBeeDistTo > radius_align | ||
+ | ): | ||
+ | social_vec = NearestBeeVecTo.normalize() | ||
+ | |||
+ | if nearestBeeDistTo < radius_align and nearestBeeDistTo > radius_repel: | ||
+ | social_vec = NearestBeeDir | ||
+ | |||
+ | else: | ||
+ | if nearestBeeDistTo < radius_attract and nearestBeeDistTo > radius_align: | ||
+ | social_vec = NearestBeeVecTo.normalize() | ||
+ | |||
+ | if nearestBeeDistTo < radius_align and nearestBeeDistTo > radius_repel: | ||
+ | social_vec = NearestBeeDir | ||
+ | |||
+ | if nearestBeeDistTo < radius_repel: | ||
+ | social_vec = -NearestBeeVecTo.normalize() | ||
+ | # falls der Vektor zur Blume <= des Blumen Radius entspricht | ||
+ | # und die Biene neutral ist, fliegt die Biene zur Blume | ||
+ | if _len <= Bee.RADIUS and self.status == "neutral": | ||
+ | ToFlower_vec = to_flower / _len * min(_len, Bee.SPEED) | ||
+ | # print(ToFlower_vec) | ||
+ | self.image.fill(Bee.ATTRACTED_COLOR) | ||
+ | |||
+ | # Ist sie nah genug dran, ändere den status und die Biene fliegt | ||
+ | # zurück zum hive | ||
+ | if _len < 20: | ||
+ | self.status = "return" | ||
+ | # Biene erhält Nahrung --> lebensdauer verlängern | ||
+ | self.lebensdauer += 5 | ||
+ | self.lastflower = flower | ||
+ | |||
+ | # Die Bewegung der Biene entschieden durch übergebene Argumente | ||
+ | # während sie neutral ist | ||
+ | # elif self.status == "neutral": | ||
+ | |||
+ | # Hier ist de Status return und die Biene fliegt zu ihrem hive zurück: | ||
+ | # ['self.hive'] | ||
+ | |||
+ | # ist config.ENDLESS = True ist status "neutral" wenn Bienen Hive erreichen | ||
+ | elif self.status == "return": | ||
+ | self.image.fill(Bee.RETURN_COLOR) | ||
+ | to_hive = pygame.math.Vector2((self.hive.rect.center) - self.float_rect) | ||
+ | if to_hive.length() > 5: | ||
+ | ToHive_vec = ( | ||
+ | to_hive / to_hive.length() * min(to_hive.length(), Bee.SPEED) | ||
+ | ) | ||
+ | elif config.ENDLESS: | ||
+ | self.status = "neutral" | ||
+ | self.image.fill(Bee.NEUTRAL_COLOR) | ||
+ | self.hive.pollen += 1 | ||
+ | self.dir = pygame.math.Vector2( | ||
+ | uniform(-1.0, -1.0), uniform(-1.0, -1.0) | ||
+ | ).normalize() | ||
+ | |||
+ | # Move Bee | ||
+ | social_vec *= social_strength | ||
+ | self.dir = (self.dir + social_vec + ToFlower_vec + ToHive_vec).normalize() | ||
+ | |||
+ | self.float_rect += Bee.SPEED * self.dir | ||
+ | self.tp() | ||
+ | </file> |