← Zurück zur Simulation

🧫 PETRISCHALE

VOLLSTÄNDIGE DOKUMENTATION · Faktoren · Funktionen · Formeln · Parameter
🏆 Konzept, Spielregeln & gesamtes Design: JÖRG SIMBRIG · Umsetzung: Kai Dieki (Claude), simbrig.eu

Dieses Dokument beschreibt das Modell der „Petrischale" erschöpfend: jeden Faktor, jede Funktion, jeden Parameter und jede Verrechnung. Es ist als Nachschlagewerk gedacht — von der Grundidee bis zur letzten Konstante. Die Simulation läuft vollständig clientseitig (WebGL2-Rendering, CPU-Simulation), eine einzige HTML-Datei, ohne Server und ohne Internet.

1 · Überblick & Grundidee

In einer kreisrunden Schale leben punktförmige Wesen. Jedes besitzt einen Gen-Code (Genom), der seine Eigenschaften festlegt. Wesen haben Bedürfnisse (Hunger, Durst, Müdigkeit), suchen dafür Ressourcen auf, weichen Gefahren aus oder jagen selbst, und pflanzen sich fort, sobald sie genug Energie haben. Bei der Fortpflanzung wird das Genom des Nachwuchses mutiert.

Es gibt keine eingebaute Fitnessfunktion. Niemand bewertet die Wesen. Wer stirbt, ist weg; wer sich fortpflanzt, gibt seine Gene weiter. Aus Variation (Mutation), Vererbung (Kopie) und Selektion (Tod & Fortpflanzungserfolg) entsteht echte Evolution. Die Ranglisten und Diagramme sind reine Beobachtungsfenster, kein Steuerungsmechanismus.

Der Mensch steuert nur die Umwelt: Stärke des Eindämmungsfelds, Menge und Nachwachsrate der Ressourcen, Größe der Zonen, Abstandsverhalten, Weltgeschwindigkeit, Mutationsstärke. Daraus ergibt sich der Selektionsdruck.

2 · Die Schale & das Eindämmungsfeld

Die Schale ist eine Kreisscheibe mit Mittelpunkt c und Radius R (= 47 % der kürzeren Fensterkante). Ein radiales Kraftfeld zieht jeden Körper zur Mitte — die „magnetische Eindämmung". Im Inneren ist es nahezu kräftefrei, zum Rand hin steigt es steil an.

# u = normierter Abstand vom Zentrum (0 = Mitte, 1 = Rand) u = clamp(r / R, 0, 1) # Feldbeschleunigung Richtung Zentrum a_feld = A · 140 · u^N # zusätzlicher harter Rückhalt direkt an der Wand: if u > 0.9: a_feld += A · 140 · (u − 0.9) · 30

Der Faktor 140 bringt das Feld in dieselbe Größenordnung wie die anderen Kräfte (Abstoßung, Räuber-Beute-Feld), sonst wäre es wirkungslos.

Integration pro Tick (fester Zeitschritt dt = 1/60):

v += (a_feld + a_verhalten) · dt v *= 0.92 # Dämpfung („Reibung" der Schale) p += v · dt if |p − c| > R: reflektieren # Sicherheitsnetz, niemand entkommt

Das Gleichgewicht (wo ein Wesen zur Ruhe kommt) liegt dort, wo die Feldkraft nach innen die nach außen gerichteten Kräfte (z. B. Gedränge) aufhebt. Stärkeres A oder kleineres N schiebt dieses Gleichgewicht weiter nach innen.

3 · Der Gen-Code (Genom)

Jedes Wesen speichert 21 vererbbare Fließkommawerte: 10 Eigenschafts-Gene (je 0…1), 10 zugehörige Pro-Gen-Mutationsraten σᵢ und 1 übergeordnete Meta-Mutationsrate τ.

Die 10 Eigenschafts-Gene

#GenKlasseWirkung (Wert 0 … 1)
0kampfLeistungaktive Angriffsstärke im Kampf
1panzerungLeistungpassive Widerstandskraft; senkt erlittenen Schaden; senkt zugleich das effektive Tempo (Gewicht)
2tempoLeistungLaufgeschwindigkeit
3wachsamkeitLeistungWahrnehmungsradius (Beute/Gefahr früh erkennen)
4lebensspanneLeistungmaximales Alter
5sparsamkeitLeistungStoffwechsel-Effizienz; senkt den Verbrauch aller drei Triebe
6aggressionStrategieGrundtemperament; wird durch Hunger moduliert
7ernaehrungstypStrategieKontinuierlicher Wert 0…1. Unterhalb der Pflanzenfresser-Grenze (herbGrenze, Vorgabe 0,25) verhält sich das Wesen als reiner Pflanzenfresser und jagt nie. Oberhalb der Fleischfresser-Grenze (carnGrenze, Vorgabe 0,75) grast es nie und jagt immer. Dazwischen: Allesfresser — wählt nach einem Hysteresemechanismus. Beide Grenzen sind per Regler einstellbar (→ §20).
8teilungsschwelleStrategieEnergieniveau, ab dem Fortpflanzung möglich ist
9brutinvestitionStrategieEnergieanteil, den das Original dem Nachwuchs mitgibt

Die 6 Leistungs-Gene (0–5) sind reine Vorteile (höher = besser) und stehen unter dem Erhaltungssatz (§4). Die 4 Strategie-Gene (6–9) sind keine „Macht", sondern Entscheidungen über die Lebensweise — sie zählen nicht ins Budget.

Effektives Tempo: tempo_eff = tempo · (1 − panzerung · 0.4) — ein schwer gepanzertes Wesen ist langsamer. Maximalgeschwindigkeit: 30 + tempo_eff · 120 px/s.

4 · Das Leistungs-Budget (Erhaltungssatz)

„Es gibt keinen kostenlosen Vorteil." Die sechs Leistungs-Gene teilen sich ein festes Punktekonto:

Σ(kampf + panzerung + tempo + wachsamkeit + lebensspanne + sparsamkeit) = B₀ ± ε B₀ = 3.0 # Mittelwert 0.5 pro Gen ε = 0.15 # erlaubte Toleranz

Wer in einer Eigenschaft stärker wird, muss anderswo schwächer werden. Nach jeder Mutation (und beim Erzeugen im Designer) wird das Konto durch Budget-Projektion wieder auf B₀ ± ε zurückgeführt: Die Abweichung wird anteilig auf alle sechs Gene verteilt und alles in [0,1] geklemmt (zweistufig, damit die Summe stimmt).

Instabilität: Weicht ein Genom (z. B. ein frei gebautes Designer-Wesen) stark vom Budget ab, zahlt es laufend Extra-Energie (energie −= |ΔΣ| · 0.0003 pro Tick, ab |ΔΣ| > 2ε) — eine sanfte Rückstellkraft statt eines harten Verbots.

Beispiel: drei „gleich teure" Genome (Σ = 3,0), aber völlig verschiedene Strategien:

Typkampfpanzertempowachslebensparsam
Glaskanone0,90,10,80,60,30,3
Tank-Grazer0,20,90,20,40,80,5
Asket/Ausdauer0,30,30,50,50,50,9

5 · Selbstadaptive Mutation

Das Mutationsmodell entspricht der selbstadaptiven Evolutionsstrategie nach Rechenberg/Schwefel: Jedes Gen trägt seine eigene Mutations-Schrittweite σᵢ, und diese Schrittweiten mutieren selbst, gesteuert von einer übergeordneten Rate τ, die ebenfalls mutiert. Bewusst auf zwei Meta-Ebenen begrenzt.

Bei jeder Teilung — das Original bleibt unverändert, nur das Kind mutiert:

# für jedes Eigenschafts-Gen i: σᵢ_kind = σᵢ_eltern · exp(τ_eltern · N(0,1)) # Schrittweite mutiert prozentual wert_kind = wert_eltern + σᵢ_kind · N(0,1) # Gen mutiert mit eigener Rate # Meta-Rate mutiert sich selbst: τ_kind = τ_eltern · exp(τ_eltern · N(0,1)) # danach: Budget-Projektion der 6 Leistungs-Gene → Σ = B₀ ± ε clamp Gene[0..1], σᵢ[0.001..0.5], τ[0.005..0.5]

N(0,1) ist eine standardnormalverteilte Zufallszahl (Box-Muller). Startwerte: σ_init = 0.05, τ_init = 0.1. Ein globaler Mutations-Multiplikator (Regler) skaliert τ zusätzlich.

Was daraus emergiert

6 · Vitalwerte & die drei Triebe

Neben dem Genom hat jedes Wesen veränderliche Zustände:

WertBedeutungsteigt/sinktkritisch
hunger0 = satt … 1 = verhungertsteigt durch Stoffwechsel; sinkt durch Fressen>0,75: Energie sinkt langsam; >0,9: schnell
durst0 = satt … 1 = verdurstetsteigt mit der Zeit; sinkt durch Trinken= 1: Tod
muede (Müdigkeit)0 = wach … 1 = erschöpftsteigt durch Aktivität; sinkt durch Ruhen>0,7: halbe Wahrnehmung; >0,8: erzwungenes Ruhen
energieLebenskraftFressen ↑, Hunger ↓≤ 0: Tod (verhungert)
alterLebenszeit (Sekunden)steigt stetig> max. Lebensspanne: Tod

Die drei Triebe (Hunger, Durst, Müdigkeit) sind der Bewegungsmotor: jeder treibt zu einem anderen Ort (Gras/Beute, Wasser, Schutz). Weil diese Orte getrennt liegen, muss ein Wesen ständig Prioritäten setzen und sich dabei in Gefahr begeben.

Maximale Lebensspanne in Sekunden: lebensspanne · 600 + 120 (also 120 s bis 720 s genetischer Spielraum).

7 · Stoffwechsel & Verbrauch

Die drei Triebe steigen pro Tick mit einer Grundrate, geteilt durch die sparsamkeit und multipliziert mit der Aktivität:

aktivität = 1.5 (beim Jagen/Fliehen) sonst 1.0 hunger += 0.00015 · aktivität · drainMult / sparsamkeit durst += 0.00012 · aktivität · drainMult / sparsamkeit muede += 0.00022 · aktivität / sparsamkeit # Müdigkeit unverändert # Energie zehrt erst bei großem Hunger: if hunger > 0.9: energie −= 0.0008 elif hunger > 0.75: energie −= 0.0003

Ein sparsames Wesen (hohe sparsamkeit) verbraucht langsamer, muss also seltener zu den gefährlichen Ressourcen pendeln — ein echter Überlebensvorteil, der über das Leistungs-Budget bezahlt wird.

Nahrungsaufnahme

eat = min(Fleckvorrat, 0.40 · dt · 20) effizienz = 1 − ernaehrungstyp # Pflanzenfresser effizienter hunger −= eat · (0.5 + effizienz·0.5) energie += eat · (0.3 + effizienz·0.3)
# Trinken drink = min(Wasservorrat, 0.50 · dt · 20) durst −= drink · 2.0

8 · Wahrnehmung

radius = 40 + wachsamkeit · 100 # 40 … 140 px if muede > 0.7: radius · 0.5 # erschöpft = unaufmerksam if Zustand = Ruhen: radius · 0.5 # schlafend = Risiko

Über diesen Radius „sieht" ein Wesen Nachbarn — für Bedrohungserkennung, Beutewahl und die Nahbereich-Abstoßung. Müdigkeit und Schlaf senken die Wachsamkeit (Risiko im Schlaf).

9 · Verhalten (Zustandsautomat)

Jedes Wesen ist in genau einem von acht Zuständen. Pro Tick wird der Zustand neu bestimmt, nach folgender Dringlichkeit (von oben nach unten):

  1. Fliehen – läuft bereits eine Flucht, hat sie Vorrang.
  2. Ruhen (Kollaps) – bei muede > 0.8 sofort zur Schutzstelle.
  3. Teilen – bei energie ≥ teilungsschwelle und Mindestalter.
  4. Hunger (>0,45) – zwei konfigurierbare Schwellwerte teilen die Population in drei harte Zonen: Pflanzenfresser grasen immer, Fleischfresser jagen immer, Allesfresser wählen per Hysterese.
  5. Durst (>0,45) – zur Wasserstelle.
  6. Ruhen (muede >0,45) – zur Schutzstelle.
  7. Lauern – wachsame Jäger ohne akutes Bedürfnis legen sich auf die Lauer.
  8. Wandern – Grundzustand, leichte Zufallsbewegung.
ZustandZiel-LenkungAktion
WANDERNzufällig
GRASENnächster Grasfleck, Stärke 130+hunger·180frisst bei Kontakt
TRINKENnächste Wasserstelle, 130+durst·180trinkt bei Kontakt
RUHENnächster Schutzpunkt, 100+muede·120regeneriert Müdigkeit (nur wenn geschützt)
JAGENBeute, Stärke 260Kampf bei Kontakt
FLIEHENvom Jäger weg, Kraft 250bis außer Sichtweite
LAUERNnächster Schutzpunkt, 90schlägt zu, wenn Beute eintrifft
TEILENZellteilung, dann Wandern
Drei Ernährungszonen: Zwei konfigurierbare Grenzen — herbGrenze (Vorgabe 0,25) und carnGrenze (Vorgabe 0,75) — teilen den ernaehrungstyp-Raum in drei harte Zonen:
  • ernaehrungstyp ≤ herbGrenze → reiner Pflanzenfresser: wählt immer GRASEN; Jagd ist für dieses Wesen ausgeschlossen — auch als Notlösung.
  • ernaehrungstyp ≥ carnGrenze → reiner Fleischfresser: wählt immer JAGEN oder LAUERN; Grasen ist ausgeschlossen — auch als Notlösung.
  • herbGrenze < ernaehrungstyp < carnGrenze → Allesfresser: wählt per Hysterese (±0,06 Aufschlag auf den Mittelpunkt) zwischen Jagen und Grasen. Hat der Allesfresser gerade gejagt, bleibt er etwas länger beim Jagen; hat er gegrast, bleibt er beim Grasen — um zufälliges Umschalten zu dämpfen.
Durch die harten Grenzen entstehen echte Spezialisten. Allesfresser können zwar flexibel reagieren, zahlen aber evolutionär: Ein Pflanzenfresser grazt effizienter, ein Fleischfresser ist der bessere Jäger — frequenzabhängige Selektion sorgt dafür, dass Spezialisten jeweils in ihrer Nische dominieren (→ §9a).

9a · Spezialisierung & frequenzabhängige Selektion

Die zwei Ernährungsgrenzen erzeugen ein Dreiklassen-System, in dem echte Spezialisten gegenüber Allesfressern einen messbaren Fitness-Vorteil haben:

TypVorteilSchwäche
Pflanzenfresserhöhere Grasverwertungs-Effizienz, meidet tödliche Konfrontation vollständigverletzlich gegenüber Fleischfressern; kein Ausweichen auf Jagd bei Grasmangel
Allesfresserflexibel — kann Engpässe überbrückenkein Spezialist in beiden Nischen; bei ausreichender Spezialistenkonkurrenz unterlegen
Fleischfresserkeine Abhängigkeit von Pflanzenressourcen; höhere Kampfkraft gegen Beutekein Grassfresser-Ausweg bei Beutemangel; populationsabhängig (verhungert ohne Beute)

Die Dynamik ist frequenzabhängig: Je seltener Pflanzenfresser werden, desto weniger Beute steht Fleischfressern zur Verfügung — deren Population bricht ein, Pflanzenfresser erholen sich. Umgekehrt explodiert bei wenigen Fleischfressern die Pflanzenfresser-Population so stark, dass Grasmangel entsteht — was Allesfressern, die auch jagen können, vorübergehend nützt. Das System tendiert zu einem dynamischen Gleichgewicht aller drei Typen, dessen Lage von den Grenzen herbGrenze und carnGrenze sowie den Ressourcemengen abhängt.

Warum Allesfresser nicht aussterben: In schwankenden Umgebungen (mal Grasmangel, mal Beutemangel) ist Flexibilität selbst eine Fitness-Eigenschaft. Allesfresser können Übergangsphasen überbrücken, in denen ein Spezialist sofort verhungert. Ihr evolutionärer Nachteil gegenüber Spezialisten in stabilen Phasen wird durch ihre Überlebensfähigkeit in Krisenzeiten ausgeglichen — die Breite der Allesfresser-Zone (Abstand zwischen herbGrenze und carnGrenze) steuert diesen Kompromiss direkt. Um den Mutationsdrift in die Mitte aktiv zu bekämpfen, steht das BALANCIERUNG-Panel zur Verfügung (→ §9b).

9b · BALANCIERUNG — Spezialistenbonus & Allesfresser-Malus

Das Mutationsdrift-Problem

Das Ernährungstyp-Gen (Gen 7) mutiert wie alle Gene mit clamp(g + σ·randn(), 0, 1). Es gibt keine natürliche Kraft, die ein Gen an einem Extrem hält — bei et=0,85 streuen Nachkommen normalverteilt um 0,85, und einige landen unterhalb von carnGrenze. Diese werden Allesfresser und überleben flexibler. Ohne Gegendruck dominieren Allesfresser langfristig, weil sie in jeder Situation fressen können, während Spezialisten bei Ressourcenmangel ihrer Nische aussterben.

Gradient-Scores

Das BALANCIERUNG-System berechnet für jedes Wesen drei kontinuierliche Scores aus seinem ernaehrungstyp-Gen (et) — je extremer die Spezialisierung, desto stärker der Effekt:

herbScore(et) = max(0, (herbGrenze − et) / herbGrenze) # 1,0 bei et=0 · 0 bei et=herbGrenze · 0 für Omni/Carn carnScore(et) = max(0, (et − carnGrenze) / (1 − carnGrenze)) # 0 bei et=carnGrenze · 1,0 bei et=1 · 0 für Herb/Omni mid = (herbGrenze + carnGrenze) / 2 omniScore(et) = max(0, 1 − |et − mid| / (mid − herbGrenze)) nur für et ∈ (herbGrenze, carnGrenze) # 0 an beiden Zonenrändern · 1,0 in der Mitte · 0 für Spezialisten

Beispielwerte bei herbGrenze=0,30 / carnGrenze=0,70:

etherbScorecarnScoreomniScore
0,001,0000
0,150,5000
0,300,0000
0,50001,00
0,7000,000
0,8500,500
1,0001,000

Die vier Balancierungs-Regler

ReglerEffektEingehängt inFormel
🌿 Herdenschutz (0–1)Pflanzenfresser erhalten zusätzliche Panzerung — frequenzabhängig: je mehr Pflanzenfresser in der Population, desto stärker der EffektdefensePower(j)+ herbScore × slider × popHerbFrac × 0,4
🔴 Jäger-Bonus (0–1)Fleischfresser erhalten additiven Angriffsbonus unabhängig von ihrer PopulationsgrößeattackPower(i)+ carnScore × slider × 0,3
🟡 Omni-Tempo − (0–1)Allesfresser werden langsamer, je näher ihr et-Gen an der Mitte der Omnivoren-Zone liegteffectiveTempo(idx)× (1 − omniScore × slider)
🟡 Omni-Aggr. − (0–1)Allesfresser kämpfen weniger oft — geringere Kampflustkampfeslust(idx)× (1 − omniScore × slider)

Evolutionäre Wirkung

Der Gradient schafft gerichteten Selektionsdruck: ein Wesen mit et=0,01 ist immer fitter als eines mit et=0,29 (als Pflanzenfresser), weil der Bonus monoton mit dem Abstand vom Extrem wächst. Das kämpft direkt gegen den Mutationsdrift — Mutation, die et von 0,01 auf 0,05 hebt, kostet Fitness. Mit reinen Schwellwerten (hard cutoff) wäre et=0,01 gleich fit wie et=0,29, und es gäbe keinen Druck tiefer zu bleiben.

Der Herdenschutz ist zudem frequenzabhängig: wenn Pflanzenfresser selten sind, hilft der Herden-Effekt kaum (popHerbFrac → 0). Das verhindert, dass eine winzige Restpopulation durch übermäßige Panzerung unsterblich wird — der Effekt wächst erst wieder, wenn sich die Herde erholt.

Default: Alle vier Spezialisten-Regler stehen auf 1,0 (voller Effekt) — das hat sich als guter Ausgangspunkt für dynamische, langlebige Populationen erwiesen. Reduziere einzelne Regler auf 0,3–0,5 um Allesfresser wieder konkurrenzfähiger zu machen. Bei 0 ist der jeweilige Effekt vollständig deaktiviert — dann dominieren Allesfresser langfristig durch Mutationsdrift.

🧬 Diversitäts-Mut. — Inzucht-Prävention

Ein fünfter BALANCIERUNG-Regler (0–3, default 1,0) adressiert ein anderes Problem: genetische Drift. Wenn eine Spezialistenpopulation dominiert und sich alle überlebenden Wesen stark ähneln, verliert die Evolution ihren Rohstoff — Variation. Die Simulation kann in einem lokalen Optimum steckenbleiben.

Alle 60 Sim-Ticks wird die Standardabweichung σ des Ernährungstyp-Gens über alle lebenden Wesen berechnet:

σ(et) = sqrt( mean(et²) − mean(et)² ) currentDivMult = 1 + slider × max(0, (0,15 − σ) / 0,15) # Schwellwert: 0,15 — unterhalb steigt der Boost; bei σ ≥ 0,15 kein Effekt

Der Multiplikator wirkt direkt auf die globale Mutationsrate in mutateChild():

tauNew = clamp(t · exp(t · randn()), TAU_MIN, TAU_MAX) · mutMult · currentDivMult

Beispielwerte bei Slider=1,0:

σ(et)BedeutungMut.×
0,00alle Wesen genetisch identisch2,0
0,075mäßig homogen1,5
0,15normal divers — kein Boost1,0
> 0,15diverse Population1,0

Live-Anzeige unter dem Slider: σ(et) (aktuelle Genpool-Breite) und Mut.× (grün wenn aktiv). Der Slider-Wert bestimmt den maximalen Boost — bei Slider=3 verdreifacht sich die Mutationsrate im schlimmsten Fall (σ=0).

Warum nur σ(ernaehrungstyp)? Das Gen 7 ist das entscheidende Spezialisierungs-Gen und direkt im Genpool-Histogramm sichtbar. Eine Mittlung über alle 10 Gene wäre robuster, aber schwerer zu beobachten und rechnerisch teurer. Die et-Variante reagiert genau dort, wo Monokultur am gefährlichsten ist.

10 · Aggression & Kampfeslust

Aggression ist kein starrer Wert, sondern wird durch den Hunger moduliert — der satte Jäger lässt Beute laufen, der hungrige geht aufs Ganze:

sigmoid(x) = 1 / (1 + e^(−4x)) kampfeslust = aggression · sigmoid(hunger − 0.5) frische = (energie + (1 − muede)) · 0.5

kampfeslust steigt mit dem Hunger und treibt sowohl Jagdentscheidung als auch Angriffsstärke. frische beschreibt die allgemeine Verfassung (Energie & Wachheit).

Diese eine Kopplung erzeugt Räuber-Beute-Wellen (Lotka-Volterra): viel Beute → satte Jäger → wenig Jagd → Beute vermehrt sich → wird knapp → Jäger hungern → hohe Aggression → Beute bricht ein → Jäger verhungern → Beute erholt sich …

11 · Kampf

Eine einheitliche, fair austarierte Funktion entscheidet jeden Kampf. Wichtig: Sie ist so geeicht, dass spezialisierte Jäger gegen weiche Beute gewinnen, gegen Tanks aber verlieren.

attackPower(A) = kampf_A · (0.55 + 0.45 · kampfeslust_A) defensePower(V) = 0.15 + panzerung_V · 0.6 + kampf_V · 0.15 winChance(A,V) = sigmoid( attackPower(A) − defensePower(V) + 0.15 )

Es gibt keinen frische-Faktor im Angriff — sonst wäre der hungrige Jäger genau dann schwach, wenn er jagen muss (Todesspirale). Der kleine Bonus +0.15 sorgt dafür, dass sich Jagen lohnt.

Begegnung (Jäger hungrig)Siegchance
Spezial-Jäger (kampf 0,8) vs. weiche Beute (panz 0,1)≈ 86 %
Durchschnitt vs. Durchschnitt≈ 47 %
Durchschnitt vs. Tank (panz 0,9)≈ 29 %
schwacher Jäger vs. weiche Beute≈ 59 %

Bei einem Sieg: energie += 0.35 + Beute.energie · 0.4, hunger −= 0.6, Kill-Zähler +1, Beute stirbt. Bei einer Niederlage flieht die Beute.

12 · Jagd & Flucht

Beutewahl

needWin = 0.3 − hunger · 0.12 # Hungrige wagen aussichtslosere Kämpfe # Beute zulässig, wenn winChance > needWin; bevorzugt wenig gepanzerte score = winChance − panzerung_Beute · 0.3

Verfolgung vs. Flucht

13 · Das langreichweitige Räuber-Beute-Feld

Über einen großen Bereich der Schale wirkt ein Kraftfeld: Beute flieht schon aus der Ferne vor Jägern, und Jäger werden zur Beute hingezogen — so durchwandern sie die Schale gezielt.

# nur Wesen mit ernaehrungstyp > herbGrenze strahlen ein Feld aus FEAR_R = schalenRadius · 0.6 # Wirkradius; Kraft dort < 10 % des Maximalwerts threat = ernaehrungstyp · aggression · (0.25 + kampfeslust) hunt = ernaehrungstyp · (0.15 + kampfeslust) inv = 1 / (Abstand + 30) # ~1/r edible = (1 − ernaehrungstyp_Beute · 0.7) · (im Schutz ? 0.12 : 1) Beute weg vom Jäger: Kraft = threat · edible · 3000 · inv Jäger hin zur Beute: Kraft = hunt · edible · 3000 · inv

Ein satter Jäger (kampfeslust ≈ 0) strahlt fast nichts aus — passend zu den Räuber-Beute-Wellen. Pflanzenfresser sind „leckerer und ängstlicher" (hoher edible-Wert); in der Schutzzone sind sie für das Feld fast unsichtbar (×0,12). Der Wirkradius FEAR_R begrenzt die Suche auf den SpatialHash — statt O(n²) aller Paare wird nur ein Nachbarschaftsausschnitt abgefragt (→ §22).

14 · Persönlicher Raum (Abstand)

Wesen können sich nicht überlagern wie Photonen — sie wollen Abstand. Eine Nahbereich-Abstoßung wirkt zwischen allen. Der Regler ABSTAND (spacingMul) skaliert Stärke und Reichweite gemeinsam:

spacingMul = ABSTAND-Regler / 100 # 0 … 10 (Regler 0…1000 %) Reichweite = 35 · (0.6 + 1.4 · spacingMul) px # bis ~511 px bei 1000 % Kraft = min( 900 · spacingMul / r² , 1200 · spacingMul )

Höherer Abstand verteilt die Wesen großräumiger — gegen das „Tümmeln" an knappen Stellen und gegen kannibalische Allesfresser-Haufen. Bei spacingMul = 0 gibt es keinen Abstandswunsch (Stapeln erlaubt). Die Bedrohung durch Jäger erledigt das separate Feld aus §13 — dieser Term ist die neutrale Abstandshaltung aller untereinander.

Reine Privatsphäre: Das aktive Jäger–Beute-Paar (gesetztes Ziel bzw. Flucht) ist von der Abstoßung ausgenommen. ABSTAND beeinträchtigt deshalb weder die Jagdannäherung noch die Angstflucht noch sonstige dynamikerzeugende Faktoren — er verteilt nur unbeteiligte Wesen. Räuber-Beute-Verhalten regelt allein das Feld aus §13.
Reichweite: Übersteigt der Abstandsradius die Wahrnehmung eines Wesens (40–140 px), wird eine eigene räumliche Abfrage verwendet — sonst könnte ein Wesen nicht von Gruppen wegdrücken, die es gar nicht „sieht", und es entstünden Haufen. Bei sehr hohem ABSTAND und großer Population wächst der Rechenaufwand (≈ O(n²)).

15 · Zonen & Ressourcen

Drei kreisförmige Zonen sind 120° um die Schale verteilt (auf 55 % Radius): Gras, Wasser, Schutz. Jede Zone hat einen einstellbaren Durchmesser (10…95 % des Schalenradius): Zonenradius = R · Prozent / 200.

Gras & Wasser = diskrete Flecken

In der Gras- bzw. Wasserzone liegen einzelne Flecken (Anzahl einstellbar), jeder mit einem Vorrat (0…1), der abgegrast/leergetrunken wird und nachwächst:

Vorrat += Nachwachsrate · Fleckfaktor (bis max. 1) Fleckfaktor = 0.7 … 1.3 (pro Fleck leicht zufällig) Nachwachsrate = Schieberwert · 0.0003 pro Tick

Leergegraste Flecken (Vorrat < 0,06) verschwinden optisch (kahler Boden) und tauchen beim Nachwachsen wieder auf. So sieht man Übernutzung und Erholung direkt.

Wichtig fürs Gleichgewicht: Begrenztes Gras = Tragfähigkeitsgrenze für Pflanzenfresser → Konkurrenz → Nische für Jäger. Bei unbegrenztem Nachwachsen würden Pflanzenfresser alles überrennen und die Welt „undynamisch". Wasser betrifft alle (jeder trinkt) und ist daher der schärfste Engpass.

16 · Schutzpunkte

Die Schutzzone besteht aus diskreten Schutzpunkten (violett). Anders als Gras/Wasser haben sie keinen Vorrat, sondern eine Kapazität: Pro Punkt sind nur die nächstgelegenen N Wesen geschützt (Wirkradius 26 px) — der Rest steht im Freien, auch wenn er nah ist. Schutz ist damit eine knappe, umkämpfte Ressource. Die Helligkeit eines Punktes zeigt seine Belegung.

Innerhalb des Schutzes verschiebt sich die Wichtung gegen Jäger, ohne die Kampfwerte zu verändern:

Aspektaußerhalbim Schutz
Sichtbarkeit im Räuber-Beute-Feldvoll×0,12 (fast unsichtbar)
Erfassbarkeit von außenjanein (nur Lauerjäger im Inneren sieht sie)
Jagdtempo des JägersSprint ×1,25×0,65 (lahm)
Fluchttempo der Beutenormal×1,15 (entwischt besser)
Verschwinde-/Entwischrate vor dem Kampf0 %60 %
Kampf (kampf/panzerung)normalunverändert

Zweischneidige Falle: Ein wachsamer Jäger (wachsamkeit > 0,6) kann sich selbst in einen Schutzpunkt legen und lauern — dann ist die getarnte Beute für ihn erfassbar. Die Schutzzone schützt also vor Jägern von außen, nicht vor einem Lauerer im Inneren.

17 · Fortpflanzung (Energie-Erhaltung)

wenn energie ≥ teilungsschwelle und alter ≥ 1 s: E_gabe = brutinvestition · energie kind.energie = E_gabe eltern.energie −= E_gabe + 0.03 # kleiner Teilungs-Overhead kind.genom = mutiere(eltern.genom) # Original bleibt, Kind mutiert

Was danach geschieht, ergibt sich von selbst aus dem Restkonto: genug Energie → sofort wieder teilen; etwas → fressen/trinken gehen; zu wenig → stirbt bald. Aus den getrennt mutierenden Genen teilungsschwelle und brutinvestition entsteht das klassische r/K-Spektrum:

Welche Strategie gewinnt, entscheidet die Umwelt. Zu wenig Investition → Kind verhungert vor der ersten Mahlzeit; zu viel → Elternteil stirbt. Der Sweet-Spot evolviert von selbst.

18 · Tod

Auch erfolglose, nie gejagte Wesen sterben zwangsläufig an Alter, Hunger oder Durst — kein ewiges Vegetieren. Jeder Tod erscheint mit Ursache im Ereignis-Register.

19 · Darstellung der Wesen

Der Gen-Code ist „auf einen Blick" ablesbar:

OptikkodiertFormel
Farbton ernaehrungstypHue = (1 − ernaehrungstyp) · 0,33 (grün→rot)
SättigungaggressionSat = aggression
HelligkeitKampf × EnergieVal = (0,5 + kampf·0,4) · energie
GrößeKörpermasse3 + ((lebensspanne + energie + Reifegrad)/3) · 7 px
Außenringpanzerungdicker/dunkler Rand
StachelnkampfZackenzahl/-länge

Reifegrad = alter / max.Lebensspanne (0 = Jungtier, 1 = ausgewachsen). Ein hungerndes Wesen verblasst und magert ab; ein junges ist klein und wächst heran.

20 · Bedienelemente

Alle Regler liegen in der linken Spalte (Steuerpult), gruppiert. Bedienelemente haben feste Positionen (variable Listen scrollen intern), damit nichts „wandert".

Gruppe SIMULATION

Regler / KnopfWirkung
▶ START / ⏸ PAUSESimulation starten/anhalten
↺ RESETWelt neu aufsetzen (mit STARTPOP)
Tempo (1–20)Weltgeschwindigkeit = Simulationsschritte pro Bild (Zeitraffer; ändert NICHT die Wesen-Geschwindigkeit)
N (Wand) (2–40)Exponent des Eindämmungsfelds; klein = weiter reichend/weicher
A (Kraft) (1–40)Randbeschleunigung des Felds
☑ Auto-Stopppausiert bei Konvergenz (eine Linie, >1 Generation) — und immer bei Aussterben (Pop = 0, unabhängig vom Häkchen) — siehe §21

Gruppen GRAS / WASSER / SCHUTZ

ReglerWirkung
Menge (Gras 5–60, Wasser 3–60)Anzahl der Gras- bzw. Wasserflecken
Nachwachs/Nachfüll ↻ (0–100)Regenerationsrate (0 = nie)
Durchm. ⌀ (10–200 %)Durchmesser der Zone als Prozent des Schalenradius; der Mittelpunkt verschiebt sich automatisch so, dass die Zone niemals den Schalenrand schneidet
Gras-Reichweite (px)Radius, innerhalb dessen ein Wesen einen Grasfleck abgrasen kann; größerer Wert = üppigere Weide
Wasser-Reichweite (px)Entsprechend für Wasserstellen
Schutz: Punkte N (1–20)Anzahl der Schutzpunkte
Schutz: Kapazität (1–30)wie viele Wesen ein Schutzpunkt gleichzeitig schützt
Schutz: Wirkradius (px)räumliche Reichweite des Schutzeffekts je Punkt; innerhalb dieses Radius sinkt die Sichtbarkeit im Räuber-Beute-Feld auf ×0,12

Gruppe BALANCIERUNG

ReglerWirkung
🌿 Herdenschutz (0–1)Gradient-Bonus auf Panzerung für Pflanzenfresser, skaliert mit Pflanzenfresser-Anteil in der Population (→ §9b)
🔴 Jäger-Bonus (0–1)Gradient-Bonus auf Angriffskraft für Fleischfresser (→ §9b)
🟡 Omni-Tempo − (0–1)Geschwindigkeitsmalus für Allesfresser, maximal in der Mitte der Omnivoren-Zone (→ §9b)
🟡 Omni-Aggr. − (0–1)Aggressionsmalus für Allesfresser, maximal in der Mitte der Omnivoren-Zone (→ §9b)
🧬 Diversitäts-Mut. (0–3)Erhöht die Mutationsrate automatisch wenn der Genpool homogen wird (σ(ernaehrungstyp) < 0,15) — Inzucht-Prävention (→ §9b)

Gruppe WELT

ReglerWirkung
Abstand (0–1000 %)reine Privatsphäre-Zone; hoch = löst Haufen auf. Stört Jagd/Flucht nicht (aktives Paar ausgenommen)
Mutation × (0,1–5)globaler Multiplikator auf die Mutationsrate τ
Startpop (50–600)Startpopulation (greift bei RESET)
Verbrauch × (0,5–10)Multiplikator auf Hunger- und Durst-Drain-Rate; höhere Werte machen Ressourcen knappeр und erhöhen den Selektionsdruck auf sparsamkeit und Ernährungsstrategie
Pflanzenfresser-Grenze (0,05–0,49)ernaehrungstyp-Schwellwert, unterhalb dessen ein Wesen niemals jagt. Kleiner Wert = nur sehr ausgeprägte Pflanzenfresser sind reine Grazer; großer Wert = breitere Pflanzenfresser-Zone (→ §9 / §9a)
Fleischfresser-Grenze (0,51–0,95)ernaehrungstyp-Schwellwert, ab dem ein Wesen niemals grast. Großer Wert = nur sehr ausgeprägte Fleischfresser jagen ausschließlich; kleiner Wert = breitere Fleischfresser-Zone. Der Bereich zwischen beiden Grenzen ist die Allesfresser-Zone.

Genom-Designer (linke Spalte) & Kopf

Die linke Spalte ist die Einstell-Seite (alle Regler + Genom-Designer), die rechte Spalte die reine Beobachtungs-Seite (Ranglisten, Live-Werte, Genpool, Linien, Ereignisse).

ElementWirkung
⬡ IN SCHALE SETZENein Wesen mit dem Designer-Genom per Klick platzieren — es wird danach automatisch als „angeklicktes Wesen" (rechts) live verfolgt (nur das zuletzt gesetzte)
➕ MIGRANTEN + Anzahleinen Schwung zufälliger, budget-konformer Wesen einwandern lassen
Klick auf Wesenzeigt dessen Werte (Triebe, Energie, alle Gene, Mutabilität)
❓ ANLEITUNG (Kopf)öffnet die Schnellanleitung als Overlay
📊 BERICHT (Kopf)erzeugt eine Auswertung des laufenden Spans (lädt sie als HTML herunter und öffnet sie im Tab) — siehe §21

21 · Genpool-Panel & Ranglisten

Genpool (live)

Top 10

Die momentan erfolgreichsten Einzelwesen, sortiert nach Erfolgsmaß:

score = Nachkommen · 3 + Kills · 2 + Alter(s)

Angeklicktes / eingesetztes Wesen

Zeigt alle Werte eines Wesens: Vitalwerte (Hunger, Durst, Müdigkeit, Energie, Alter), alle 10 Gene und τ/Kills/Nachkommen. Quelle ist entweder das angeklickte Wesen oder automatisch das zuletzt „in die Schale gesetzte" (Designer-)Wesen — so lässt sich ein neu eingesetztes Individuum live verfolgen.

Stärkste je Typ (live)

Für jede der drei Gruppen (Pflanzen-, Alles-, Fleischfresser) wird das aktuell erfolgreichste lebende Wesen (gleiches Erfolgsmaß wie Top 10) mit allen Werten angezeigt — so sieht man ständig die jeweils führenden Vertreter jedes Ernährungstyps, nicht nur selbst gebaute.

Ereignis-Register

Chronologisch Geburten ✦ und Tode ✕ mit Typ, Generation und Todesursache.

Lauf-Bericht (📊 BERICHT)

Ab jedem Start/Reset zeichnet die Seite alle 60 Ticks eine Stichprobe auf (Population, Typanteile, Durchschnittsgene, Geburten, Tode). Der Knopf 📊 BERICHT erzeugt daraus eine eigenständige HTML-Datei — sie wird heruntergeladen (Dateiname petrischale-bericht-<Zeit>.html) und zusätzlich im Tab geöffnet (dort per Strg+S/Strg+P speicher- und druckbar). Empfohlener Ablauf: laufen lassen → ⏸ PAUSE → 📊 BERICHT.

Der Bericht enthält: Kernzahlen (Start-/End-/Spitzenpopulation, höchste Generation, Geburten, Tode, End-Typen), ein SVG-Diagramm Population & Typen über die Zeit, ein Diagramm alle 10 Durchschnittsgene über die Zeit, ein Eingriffe-Protokoll mit gelben Markierungen in den Diagrammen, den Stammbaum der Linien (siehe unten), eine Tabelle Genom Start → Ende mit Δ je Gen, die Todesursachen, die Top 10 zum Schluss samt Ahnenkette sowie die Umweltparameter des Laufs. Die Parametertabelle umfasst: Basis-Regler (Tempo, Mutation, Wand, Kraft, Abstand, Startpop, Gras/Wasser/Schutz), Weltverbrauch ×, AUTO-STRESS-Status, Pflanzenfresser-/Fleischfresser-Grenze, Reichweiten (Essen/Trinken/Schutz in px) sowie alle fünf BALANCIERUNG-Regler (Herdenschutz, Jäger-Bonus, Omni-Tempo/Aggr., Diversitäts-Mut.). So lassen sich ganze Evolutionsläufe dokumentieren und vergleichen.

Stammbaum / Gründerlinien

Jedes Start-Wesen, jeder Migrant und jede Einzel-Einsetzung begründet eine Linie mit eigener Farbe; alle Nachkommen erben die Linie ihres Elternteils. Damit lässt sich verfolgen, welche Abstammung sich durchsetzt.

Die Genealogie speichert Eltern-Verknüpfungen über stabile IDs; sehr alte Ahnen werden bei Bedarf beschnitten (Speichergrenze), weshalb sehr lange Ketten mit „…" enden können.

Automatischer Stopp (Konvergenz) — Häkchen

Per Checkbox AUTO-STOPP (Steuerleiste) aktivierbar (Standard: aus). Ist sie gesetzt, pausiert die Simulation, sobald nur noch eine Linie lebt und davon mehr als eine Generation gleichzeitig am Leben ist (d. h. mindestens zwei Generationen derselben Linie koexistieren — maxGen − minGen ≥ 1 unter den Lebenden). Damit ist die Evolution auf eine einzige, sich fortpflanzende Dynastie konvergiert. Ein Hinweis (Toast) erscheint, der Eingriff wird ins Protokoll geschrieben. Mit ▶ WEITER lässt sich der Lauf fortsetzen; der Stopp greift erst wieder, wenn zwischenzeitlich mehrere Linien existierten. Ein letztes Einzelwesen oder gleichaltrige Geschwister (nur eine Generation) lösen den Stopp nicht aus.

22 · Architektur & Performance

Warum die Welt karg sein muss: Die teuren Schleifen (FSM, Nachbarsuche) wachsen mit der Population. Üppige Ressourcen treiben den Bestand gegen die Obergrenze (1200) → die CPU lahmt. Knappheit hält die Population klein und erzeugt den Selektionsdruck, ohne den Evolution erschlafft.

23 · Vollständige Parameter-Referenz

Feste Konstanten

KonstanteWertBedeutung
B₀ / ε3.0 / 0.15Leistungs-Budget & Toleranz
σ_init / τ_init0.05 / 0.10Anfangs-Mutationsraten
σ Grenzen / τ Grenzen0.001–0.5 / 0.005–0.5Klemmbereiche
CAP / MAX1200 / 1500Populationsgrenze / Slot-Reserve
dt1/60Simulations-Zeitschritt
Dämpfung0.92Geschwindigkeits-Reibung
Mindestalter Teilung60 Ticks (1 s)vor erster Fortpflanzung
Teilungs-Overhead0.03Energieverlust bei Teilung
Drain Hunger/Durst/Müde (Basis)0.00015 / 0.00012 / 0.00022Grundverbrauch pro Tick; Hunger+Durst × drainMult
FOOD_ENERGY / WATER_FILL0.40 / 0.50Aufnahme-Basiswerte
Tötungsreichweite16 pxKampf-Kontaktabstand
FEAR_K / HUNT_K / R03000 / 3000 / 30Räuber-Beute-Feld
Schutzpunkt-Radius (Vorgabe)43 pxWirkbereich eines Schutzpunkts; per Regler einstellbar (Mittelwert 2,5K/4K)
Gras-Reichweite (Vorgabe)100 pxFress-Distanz; per Regler einstellbar (Mittelwert 2,5K/4K)
Wasser-Reichweite (Vorgabe)90 pxTrink-Distanz; per Regler einstellbar (Mittelwert 2,5K/4K)
Lebensspannegen·600 + 120 smax. Alter

Start-Defaults der Regler

Die Defaults sind auf eine langlebige, evolutionär gestresste Population ausgelegt: genug Ressourcen, dass die Population nicht ausstirbt, aber knapp genug, dass Selektion wirkt. Die drei Zonen (Gras 80 %, Wasser 70 %, Schutz 60 %) überlappen sich nicht — Wesen müssen aktiv zwischen den Bereichen pendeln, was Tempo und Wachsamkeit evolutionär wertvoll macht.

ParameterDefaultBereichBegründung
TEMPO51–20Mehr Generationen pro Realzeit-Minute
N (Wand) / A (Kraft)4 / 24–40 / 2–40Minimale Eindämmung; Feld wirkt nur nahe am Rand, Innenraum bleibt frei
☑ Auto-StoppANan/ausPausiert bei Konvergenz (1 Linie, >1 Generation) und bei Aussterben (Pop = 0)
☑ AUTO-STRESSANan/ausReguliert Verbrauch automatisch nach Populationsgröße (→ §22)
🌿 Herdenschutz1,00–1Voller Gradient-Bonus; kämpft gegen Mutationsdrift zur Mitte (→ §9b)
🔴 Jäger-Bonus1,00–1Voller Gradient-Bonus für Fleischfresser (→ §9b)
🟡 Omni-Tempo −1,00–1Voller Malus; Allesfresser deutlich langsamer als Spezialisten (→ §9b)
🟡 Omni-Aggr. −1,00–1Voller Malus; kombiniert mit Omni-Tempo maximaler Spezialistendruck (→ §9b)
🧬 Diversitäts-Mut.1,00–3Bei σ(et)=0: Mutationsrate ×2; bei σ ≥ 0,15: kein Effekt (→ §9b)
Verbrauch × (drainMult)2,00,1–10Hunger-Trigger nach ~12 s; genug Druck ohne Massensterblichkeit auf dem Weg zur Nahrung
🌿 Pflanzenfresser-Grenze0,300,05–carnGrenzeBreitere reine Pflanzenfresser-Zone
🔴 Fleischfresser-Grenze0,70herbGrenze–0,95Breitere reine Fleischfresser-Zone; symmetrisch zur Pflanzenfresser-Grenze
Abstand100 %0–1000 %Verhindert Anhäufungen an Ressourcen ohne Jagddynamik zu stören
Mutation ×1,50,1–5Schnellere Adaptation → sichtbare Genpool-Verschiebungen
STARTPOP25050–600Genug Puffer für den initialen Crash; überlebt ihn mit stabiler Restpopulation
Gras Menge251–6025 Patches über fast die gesamte Schale verteilt → Futter immer in der Nähe
Gras Nachwachs ↻201–100Patch erholt sich in ~75 Ticks; Nachwuchs 1 bräuchte 3000 Ticks (zu langsam)
Gras ⌀95 %1–200 %Bewusst groß: Futter muss von überall erreichbar sein. Wesen, die weit entfernt vom Grasgebiet starten, verhungern sonst auf dem Weg dorthin — der häufigste Aussterbegrund
Gras-Reichweite10 px1–200 pxBewusst klein — Wesen müssen wirklich im Patch stehen; bei großen Bildschirmen erhöhen (→ §23a)
Wasser Menge121–60Leicht knapper als Gras und räumlich getrennt → Durstdruck als Selektionskraft auf Wachsamkeit/Tempo
Wasser Nachfüll ↻251–100Schnelle Erholung; kein Aussterben durch Durst, aber spürbarer Weg zur Wasserstelle
Wasser ⌀70 %1–200 %Klar getrennter Wasserbereich (kein Überlapp mit Gras); Wesen müssen dorthin reisen
Wasser-Reichweite10 px1–200 pxGleich wie Gras; bei großen Bildschirmen erhöhen (→ §23a)
Schutz ⌀55 %1–200 %Kompakter Zufluchtsort klar vom Wasserbereich getrennt; Räuber lauern direkt davor
Schutz Punkte N61–206 Punkte × 6 Kapazität = 36 Schutzplätze ≈ 14 % der Population; genug Schutz ohne Fleischfresser auszuhungern
Schutz Kapazität61–30Auch wenn Lauerer Plätze belegen, bleiben genug für echte Schläfer
Schutz-Wirkradius10 px1–100 pxBewusst klein; bei großen Bildschirmen erhöhen (→ §23a)
Migranten201–100Einmalige Einwanderungswelle bei Bedarf

23a · Pixel-Skalierung: Reichweiten und Bildschirmauflösung

Das Problem

Die Petrischale berechnet ihren Radius dynamisch aus der Fenstergröße:

schalenR = Math.min(canvas.width, canvas.height) × 0,47

Bei einem 4K-Monitor im Vollbild ist schalenR ≈ 1015 px — bei FullHD nur ≈ 508 px, also knapp halb so groß. Die Reichweiten-Regler (Gras-Reichweite, Wasser-Reichweite, Schutz-Wirkradius) arbeiten dagegen in absoluten Canvas-Pixeln und skalieren nicht automatisch mit.

Der Default-Wert von 10 px ist bewusst klein — Wesen müssen wirklich in einem Ressourcen-Patch stehen um zu fressen/trinken. Das erzeugt Selektionsdruck auf Orientierung und Tempo. Bei großen Bildschirmen (4K) wirken 10 px noch strenger, weil die Schale viel größer ist. Wer eine entspanntere Welt möchte, erhöht die Reichweiten manuell (Faustformel: schalenR / 50).

Welche Parameter betrifft das?

ParameterTypHinweis
Gras-ReichweiteSlider (px)Fressdistanz; muss mit schalenR skalieren
Wasser-ReichweiteSlider (px)Trinkdistanz; muss mit schalenR skalieren
Schutz-WirkradiusSlider (px)Tarnung im Räuberfeld; muss mit schalenR skalieren
CFG.KILL_RANGECode-Konstante (16 px)Angriffsdistanz; fest im Code, kein Regler
Wanddruck-Reichweiteberechnet aus spacingMul35 × (0,6 + 1,4 × spacingMul); skaliert indirekt

Empfohlene Werte nach Auflösung

Berechnung: Empfehlung = Default × (schalenR / 846) — gerundet auf 5 px.

AuflösungVollbild-schalenRGras-ReichweiteWasser-ReichweiteSchutz-Wirkradius
Default (alle Auflösungen)10 px10 px10 px
FullHD (1920 × 1080)≈ 508 px~15 px~15 px~10 px
1440p (2560 × 1440)≈ 677 px~20 px~20 px~13 px
4K (3840 × 2160)≈ 1015 px~30 px~30 px~20 px

Hinweis zu KILL_RANGE: Die 16 px Angriffsdistanz sind bei 4K sehr klein relativ zur Schale — Jagd wird schwieriger. Falls Fleischfresser dauerhaft aussterben, ist das ein Auflösungsartefakt; in zukünftigen Versionen könnte KILL_RANGE dynamisch mit schalenR skaliert werden.

Faustregel

Den aktuellen schalenR kann man mit der Browser-Entwicklerkonsole auslesen: window.schalenR (falls als globale Variable zugänglich) oder aus canvas.width/height ableiten. Als schnelle Näherung genügt:

schalenR ≈ min(Fensterbreite, Fensterhöhe) × 0,47

Skalierungsfaktor = schalenR / 846, alle drei Reichweiten damit multiplizieren.

24 · Glossar

Tickein Simulationsschritt (dt = 1/60 s)
Genomder vollständige Gen-Code eines Wesens (10 Gene + 10 σᵢ + τ)
σᵢ (Sigma)Mutations-Schrittweite eines einzelnen Gens
τ (Tau)übergeordnete Rate, die die σᵢ mutiert
Leistungs-Budgetfeste Summe der 6 Vorteils-Gene (B₀ = 3,0)
kampfeslusthungerabhängige, momentane Angriffsneigung
frischeallgemeine Verfassung aus Energie und Wachheit
r/K-Strategieviele billige vs. wenige teure Nachkommen
Lotka-Volterraoszillierende Räuber-Beute-Dynamik
FSMendlicher Zustandsautomat (das Verhalten eines Wesens)
herbGrenzeobere ernaehrungstyp-Schranke für reine Pflanzenfresser; unterhalb = nie jagen
carnGrenzeuntere ernaehrungstyp-Schranke für reine Fleischfresser; oberhalb = nie grasen
drainMultMultiplikator auf Hunger- und Durstverbrauch; steuert Ressourcenknappheit
frequenzabhängige SelektionFitness eines Typs hängt davon ab, wie häufig er selbst und seine Konkurrenten sind
herbScore / carnScore / omniScorekontinuierliche Gradient-Scores (0–1) aus dem ernaehrungstyp-Gen; steuern die Stärke der BALANCIERUNG-Boni (→ §9b)
popHerbFracaktueller Pflanzenfresser-Anteil an der Gesamtpopulation; bestimmt die Stärke des Herdenschutzes
Mutationsdriftnatürliche Tendenz von Extremgenen zur Mitte; Gegenkraft ist der Gradient-Selektionsdruck aus §9b