From 5c7c626cae0de03c1b41605be7779986fac558aa Mon Sep 17 00:00:00 2001 From: FrederikSchlemmer <35023083+FrederikSchlemmer@users.noreply.github.com> Date: Tue, 30 Jan 2018 15:56:05 +0100 Subject: [PATCH 1/5] Update Konzept.md --- Dokumentation/Konzept.md | 76 ++++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/Dokumentation/Konzept.md b/Dokumentation/Konzept.md index 901b763..91dfaee 100644 --- a/Dokumentation/Konzept.md +++ b/Dokumentation/Konzept.md @@ -4,8 +4,8 @@ - [Spiel aus Sicht des Players](#spiel-aus-sicht-des-players) - [Herausforderungen für die Entwickler der Agenten](#herausforderungen-f%C3%BCr-die-entwickler-der-agenten) - [Technische Umsetzung](#technische-umsetzung) - - [Object: _PlayerStatus_](#object-playerstatus) - - [Object: _PlayerView_](#object-playerview) + - [Objekt: _PlayerState_](#objekt-playerstate) + - [Objekt: _PlayerView_](#objekt-playerview) - [Projektstrucktur (Gradle)](#projektstrucktur-gradle) - [Programmablauf](#programmablauf) - [Simulationsablauf](#simulationsablauf) @@ -23,39 +23,63 @@ Der Agent wird von der Simulation nach seiner nächsten Aktion gefragt. ## Herausforderungen für die Entwickler der Agenten -1. Herausforderungen Stufe #1 +1. **Herausforderungen Stufe #1** 1. Der Agent sollte seinen Status (PlayerStatus) von der Simulation entgegennehmen können und verstehen wo das Kopfelement ist und entsprechend handeln. Befindet sich das Kopfelement an der Position (0, 0) muss Agent wissen, dass es nur eine gültige Zugrichtung gibt. Ebenso kann der Agent aus der Sicht nach vorne (PlayerStatus -> PlayerView) erkennen, dass die Elemente links und vorne Wandelemente sind (WallElement) 2. Der Angent kann seine Positionen selbst verwalten und liefert auf Anfrage der Simulation einen gültigen Zug. -2. Herausforderungen Stufe #2 +2. **Herausforderungen Stufe #2** 1. Der Agent kann sich selbständig und strategisch in der Spielwelt bewegen und verfolgt eine Strategie. Beispiel: Der Agent hält sich von gegnerischen Einheiten fern und beginnt frühzeitig mit dem Wachstum -3. Herausforderungen der Stufe #3 +3. **Herausforderungen der Stufe #3** 1. Der Agent ist in der Lage das Verhalten der Gegner einzubeziehen. -4. Herausforderungen Stufe #4 +4. **Herausforderungen Stufe #4** 1. Der Agent ist selbstlernend. Daher wird das Verhalten durch die Entwickler nicht mehr explizit vorgegeben. ## Technische Umsetzung -Jeder Agent implementiert das Interface BrainySnake, welches folgende Methoden vorgibt: -- **void handlePlayerStatusUpdate (PlayerStatus playerStatus)** - - Der Agent bekommt ein Update vom Spiel und kann damit sein Datenstand aktualisieren. -- **PlayerUpdate getPlayerUpdate()** - - Agent wird nach seinem nächsten Spielzug gefragt - -### Object: _PlayerStatus_ - - number movesPlayed _// Anzahl der gespielten Spielzüge_ - - number movesRemaining _// Verbleibende Spielzüge in der Runden_ - - number PlayerPoints _// Erspielte Punkte im Spiel (Länge der Schlange)_ - - PlayerPosition head _// Kopf der Schlange (Position x und y)_ - - PlayserPosition tail _// Ende der Schlange (Position x und y)_ - - boolen gotPenalty _// Der Agent hat eine Strafe erhalten_ - - GameEvent gameEvent _// Spielereignis pro Spielzug(Kollision mit Wand/Hindernis/sich selbst/Gegner, Schritt, Tod, Punkt Konsumiert)_ - - PlayerView view _// Sicht des Spielers auf das Spielfeld(Sichtfeld)_ - - boolean ghostmode _// Der Agent hat ein Schlangenelement gerammt und geht für x Züge in den Ghostmode. Der gerammte Agent verliert einen Punkt, welcher auf den Attackierer übergeht._ - -### Object: _PlayerView_ -Der Agent erhält ein zweidimensionales Sichtfeld(x Felder breit und y Felder hoch), welches Koordinaten und Bezeichnung von allen Gegenständen enthält. Das Sichtfeld beginnt auf höhe des Kopfes (Kopfposition plus einen Schritt nach vorne). -Jedes **Field** innerhalb des **PlayerView** hat eine **Position** und kann ein **GameObject** enthalten. + +Jeder Agent implementiert das Interface **BrainySnakePlayer**, welches folgende Methoden vorgibt: +- **String getPlayerName()** +-- Agent wird nach dem gesetztem Spielernamen gefragt + +- **boolean handlePlayerStatusUpdate (PlayerState playerState)** +-- Der Agent bekommt ein Update vom Spiel und kann damit seinen Datenstand aktualisieren. + +- **PlayerUpdate tellPlayerUpdate ()** +-- Agent wird nach seinem nächsten Spielzug gefragt + + +### Objekt: PlayerState + +Übersicht der vorhandenen Daten: + +| Name / Methode |Beschreibung|Datentyp| +|----------------|-------------------------------|-----------------------------| +|movesPlayed / getMovesPlayed()| Anzahl der gespielten Runden.|int +|movesRemaining / getMovesRemaining()|Anzahl der übrigen zu spielenden Runden.|int +|playerPoints / getPlayerPoints()|Aktuelle Spielerpunkte (Gesamtzahl von Kopf und Körperteileanzahl).|int +|playersHead / getPlayersHead()|Aktuelle Position des Kopfes von der Schlange.|Point2D +|playersTail / getPlayersTail()|Aktuelle Position des Körpers von der Schlange. Es wird nur der letzte Punkt des Körpers zurückgegeben. Falls kein Körper vorhanden wird null zurückgegeben.|Point2D +|ghostModeActive / isGhostModeActive()|Zustand des GhostMode bei der Schlange (GhostMode aktiv = true, GhostMode inaktiv = false).|boolean +|ghostModeRemaining / getGhostModeRemaining()|Verbleibende Dauer von dem aktiven GhostMode. Bei nicht aktivem GhostMode wir die definierte maximale Dauer zurückgegeben.|int +|bitByPlayer / isBitByPlayer()|Mit dieser Methode kann der Zustand über einen Biss an einem Spieler geprüft werden.|boolean +|moved / isMoved()|Mit dieser Methode kann der Zustand über die Bewegung der Schlage des Spielers geprüft werden.|boolean +|collisionWithLevel / isCollisionWithLevel()|Mit dieser Methode kann der Zustand über die Kollision der Schlage des Spielers mit dem Level geprüft werden.|boolean +|playerView / getPlayerView()|Die aktuelle Sicht der Schlange in dem Spielzug. Beinhaltet das Objekt PlayerView.|PlayerView + + +### Objekt: PlayerView + +Der Agent erhält ein zweidimensionales Sichtfeld(viewWidth und viewRange), welches Koordinaten und Bezeichnung von allen Gegenständen enthält. Das Sichtfeld beginnt auf höhe des Kopfes (Kopfposition plus einen Schritt nach vorne). Jedes Field innerhalb des PlayerView hat eine Position und kann ein GameObject enthalten. + +Übersicht der vorhandenen Daten: + +| Name / Methode |Beschreibung |Datentyp | +|---------------- |------------------------------- |----------------------------- | +|currentOrientation/ getCurrentOrientation()| Aktuelle Orientierung der Schlange.|Orientation +|viewWidth / getViewWidth()|Feldbreite in Feldern aus Sicht der Schlange. Das Feld beginnt vor dem Kopf der Schlange. Die Aufteilung findet in gleichen Anteilen nach rechts & links der Schlange statt.|int +|viewRange / getViewRange()|Feldhöhe in Feldern aus Sicht der Schlange. Beginnend einen Punkt vor dem Kopf der Schlange.|int +|visibleFields / getVisibleFields()|Liste mit allen sichtbaren Feldern für die Schlange. Der erste Eintrag in der Liste mit dem Index 0 ist aus Sicht der Schlange der Punkt links oben.|List of Fields + ## Projektstrucktur (Gradle) From 61ef7815b88b4294d50fef38734fbf37b52b0049 Mon Sep 17 00:00:00 2001 From: FrederikSchlemmer <35023083+FrederikSchlemmer@users.noreply.github.com> Date: Thu, 1 Feb 2018 07:47:13 +0100 Subject: [PATCH 2/5] Update Konzept.md --- Dokumentation/Konzept.md | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/Dokumentation/Konzept.md b/Dokumentation/Konzept.md index 91dfaee..ec7b939 100644 --- a/Dokumentation/Konzept.md +++ b/Dokumentation/Konzept.md @@ -6,7 +6,7 @@ - [Technische Umsetzung](#technische-umsetzung) - [Objekt: _PlayerState_](#objekt-playerstate) - [Objekt: _PlayerView_](#objekt-playerview) - - [Projektstrucktur (Gradle)](#projektstrucktur-gradle) + - [Projektstruktur (Gradle)](#projektstruktur-gradle) - [Programmablauf](#programmablauf) - [Simulationsablauf](#simulationsablauf) - [Technische Herausforderungen](#technische-herausforderungen) @@ -53,7 +53,7 @@ Jeder Agent implementiert das Interface **BrainySnakePlayer**, welches folgende Übersicht der vorhandenen Daten: | Name / Methode |Beschreibung|Datentyp| -|----------------|-------------------------------|-----------------------------| +|:----------------|:-------------------------------|:-----------------------------:| |movesPlayed / getMovesPlayed()| Anzahl der gespielten Runden.|int |movesRemaining / getMovesRemaining()|Anzahl der übrigen zu spielenden Runden.|int |playerPoints / getPlayerPoints()|Aktuelle Spielerpunkte (Gesamtzahl von Kopf und Körperteileanzahl).|int @@ -74,21 +74,21 @@ Der Agent erhält ein zweidimensionales Sichtfeld(viewWidth und viewRange), welc Übersicht der vorhandenen Daten: | Name / Methode |Beschreibung |Datentyp | -|---------------- |------------------------------- |----------------------------- | +|---------------- |------------------------------- |:-----------------------------:| |currentOrientation/ getCurrentOrientation()| Aktuelle Orientierung der Schlange.|Orientation |viewWidth / getViewWidth()|Feldbreite in Feldern aus Sicht der Schlange. Das Feld beginnt vor dem Kopf der Schlange. Die Aufteilung findet in gleichen Anteilen nach rechts & links der Schlange statt.|int |viewRange / getViewRange()|Feldhöhe in Feldern aus Sicht der Schlange. Beginnend einen Punkt vor dem Kopf der Schlange.|int |visibleFields / getVisibleFields()|Liste mit allen sichtbaren Feldern für die Schlange. Der erste Eintrag in der Liste mit dem Index 0 ist aus Sicht der Schlange der Punkt links oben.|List of Fields -## Projektstrucktur (Gradle) +## Projektstruktur (Gradle) -Jeder Player (Agent) wird in ein **seperates Modul** auisgelagert welches in den Core improtiert wird. -Damit sollten keine Zugriffe auf fremden Code möglich sein. -Jedes Player Modul importierrt **playerCommon** indem gemeinsame Interfaces und Klassen liegen. (z.B. PlayerStatus, GameEvent und das BrainySnake Interface) +Jeder Player (Agent) wird in ein **seperates Modul** ausgelagertwelches in den Core improtiert wird. +Diese Auslagerung verhindert den Zugriff von den Agent auf fremden Code. +Jedes Player Modul implementiert das Interface **BrainySnakePlayer** und importiert das Package **playerCommon**, welches das Interface und die Klassen beinhaltet (z.B. PlayerStatus, GameEvent und das BrainySnake Interface). Modul | Beschreibung | Includes ---------- | ------------------ |-------- +--------- | ------------------ |:--------: desktop | Starter für die Anwendung | core core | Logik der Simulation | SamplePlayer, PlayerOne, PlayerTwo, ... playerCommon | Klassen, Interfaces, Enums die alle Agenten brauchen | junit @@ -116,20 +116,24 @@ playerOne | Spieler (Agent) der zu Implementieren ist | player ## Technische Herausforderungen ### Der Agent antwortet nicht -__Problem:__ Fehler, der auftreten kann, wenn der Agent verschuldet oder unverschuldet in einer Endlosschleife läuft -**Präventiv Lösung:** Unit-Tests schreiben +__Problem:__ Fehler, der auftreten kann, wenn der Agent verschuldet oder unverschuldet in einer Endlosschleife läuft. + +**Präventiv Lösung:** Unit-Tests schreiben. + **Laufzeit Lösung:** Der Aufruf jedes Agenten erfolgt ein eigenem Thread, welcher nach einer angemessenen Zeit terminiert, sofern keine Antwort eingegangen ist. Der Agent wird eingefroren (PlayerStatus frozen), wechselt zur Kennzeichnung des Status die Farbe und es werden zu diesem Zug keine Aktionen für diesen Agenten ausgeführt. ### Der Agent greift auf Fremden Code zu -**Problem:** Der Agent könnte **Public Methoden** der Simulation der oder die **Public Methoden** anderer Agenten zugreifen. +__Problem:__ Der Agent könnte **Public Methoden** der Simulation der oder die **Public Methoden** anderer Agenten zugreifen. Denkbar sind auch **Reflections** mit der Private Methoden aufgerufen werden. + **Präventiv Lösung:** Wir verbieten das und kontrollieren den Quellcode der Agenten + **Laufzeit Lösung:** - 1. Die Simulation verwendet **keine öffentlichen Interfaces**, die Agenten werden von der Simulation aufgerufen. - 1. Jeder Agent bekommt ein eigens Paket - 1. **TODO:** Gibt es weitere Möglichkeiten Code zu isolieren? + - Die Simulation verwendet **keine öffentlichen Interfaces**, die Agenten werden von der Simulation aufgerufen. + - Jeder Agent bekommt ein eigenes Paket + - **TODO:** Gibt es weitere Möglichkeiten Code zu isolieren? ## Glossar - Ghostmode: Im Ghostmode kann der Agent keine Aktionen ausfürhen außer sich zu bewegen From 33bf9539dec1921389ed3962347724b30922d329 Mon Sep 17 00:00:00 2001 From: FrederikSchlemmer <35023083+FrederikSchlemmer@users.noreply.github.com> Date: Thu, 1 Feb 2018 10:25:03 +0100 Subject: [PATCH 3/5] Update Konzept.md --- Dokumentation/Konzept.md | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/Dokumentation/Konzept.md b/Dokumentation/Konzept.md index ec7b939..377e966 100644 --- a/Dokumentation/Konzept.md +++ b/Dokumentation/Konzept.md @@ -1,11 +1,12 @@ -# Konzeption des Simulationsspiels BrainySnake +# Dokumentation des Simulationsspiels BrainySnake -- [Konzeption des Simulationsspiels BrainySnake](#konzeption-des-simulationsspiels-brainysnake) +- [Dokumentation des Simulationsspiels BrainySnake](#dokumentation-des-simulationsspiels-brainysnake) - [Spiel aus Sicht des Players](#spiel-aus-sicht-des-players) - [Herausforderungen für die Entwickler der Agenten](#herausforderungen-f%C3%BCr-die-entwickler-der-agenten) - [Technische Umsetzung](#technische-umsetzung) - [Objekt: _PlayerState_](#objekt-playerstate) - [Objekt: _PlayerView_](#objekt-playerview) + - [Objekt: _RoundEvent_](#objekt-roundevent) - [Projektstruktur (Gradle)](#projektstruktur-gradle) - [Programmablauf](#programmablauf) - [Simulationsablauf](#simulationsablauf) @@ -50,6 +51,8 @@ Jeder Agent implementiert das Interface **BrainySnakePlayer**, welches folgende ### Objekt: PlayerState +Der Agent erhält das Objekt PlayerState in seiner Methode *handlePlayerStatusUpdate()* übergeben. In dem Objekt kann der Zustand der eigenen Schlange abgefragt werden. + Übersicht der vorhandenen Daten: | Name / Methode |Beschreibung|Datentyp| @@ -80,10 +83,27 @@ Der Agent erhält ein zweidimensionales Sichtfeld(viewWidth und viewRange), welc |viewRange / getViewRange()|Feldhöhe in Feldern aus Sicht der Schlange. Beginnend einen Punkt vor dem Kopf der Schlange.|int |visibleFields / getVisibleFields()|Liste mit allen sichtbaren Feldern für die Schlange. Der erste Eintrag in der Liste mit dem Index 0 ist aus Sicht der Schlange der Punkt links oben.|List of Fields +### Objekt: RoundEvent + +Jede Runde werden für die jeweiligen Schlangen verschiedene RoundEvents berechnet. Diese RoundEvents können in dem PlayerState ausgelesen werden. + +Übersicht der vorhandenen Events: + +| Name |Beschreibung |Abfragbar (siehe PlayerState) +|---------------- |------------------------------- |:-----------------: +|MOVED | Bewegung der Schlange. | true +|BIT_BY_PLAYER | Biss an der eigenen Schlange von einem anderen Spieler. | true +|COLLISION_WITH_LEVEL | Kollision mit Levelobjekten. | true +|CONFUSED | Verwirrung der Schlange durch ungültiges Update. | false +|BIT_AGENT | Biss von der eigenen Schlange an einem anderen Spieler. | false +|BIT_HIMSELF | Biss von der eigenen Schlange an sich selber. | false +|DIED | Löschung der Schlange aufgrund Punktestand. | false +|CONSUMED_POINT | Konsum von Spielpunkten. | false + ## Projektstruktur (Gradle) -Jeder Player (Agent) wird in ein **seperates Modul** ausgelagertwelches in den Core improtiert wird. +Jeder Player (Agent) wird in ein **seperates Modul** ausgelagert, welches in den Core improtiert wird. Diese Auslagerung verhindert den Zugriff von den Agent auf fremden Code. Jedes Player Modul implementiert das Interface **BrainySnakePlayer** und importiert das Package **playerCommon**, welches das Interface und die Klassen beinhaltet (z.B. PlayerStatus, GameEvent und das BrainySnake Interface). From 1be7f13403bcf29891aeb7ba48b80a3d0878e01b Mon Sep 17 00:00:00 2001 From: FrederikSchlemmer <35023083+FrederikSchlemmer@users.noreply.github.com> Date: Thu, 8 Feb 2018 08:39:57 +0100 Subject: [PATCH 4/5] Update Konzept.md --- Dokumentation/Konzept.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Dokumentation/Konzept.md b/Dokumentation/Konzept.md index 377e966..8bfbd71 100644 --- a/Dokumentation/Konzept.md +++ b/Dokumentation/Konzept.md @@ -40,7 +40,7 @@ Der Agent wird von der Simulation nach seiner nächsten Aktion gefragt. Jeder Agent implementiert das Interface **BrainySnakePlayer**, welches folgende Methoden vorgibt: - **String getPlayerName()** --- Agent wird nach dem gesetztem Spielernamen gefragt +-- Agent wird nach dem gesetzten Spielernamen gefragt - **boolean handlePlayerStatusUpdate (PlayerState playerState)** -- Der Agent bekommt ein Update vom Spiel und kann damit seinen Datenstand aktualisieren. @@ -51,7 +51,7 @@ Jeder Agent implementiert das Interface **BrainySnakePlayer**, welches folgende ### Objekt: PlayerState -Der Agent erhält das Objekt PlayerState in seiner Methode *handlePlayerStatusUpdate()* übergeben. In dem Objekt kann der Zustand der eigenen Schlange abgefragt werden. +Der Agent bekommt das Objekt PlayerState in seiner Methode *handlePlayerStatusUpdate()* übergeben. In dem Objekt kann der Zustand der eigenen Schlange abgefragt werden. Übersicht der vorhandenen Daten: @@ -59,11 +59,11 @@ Der Agent erhält das Objekt PlayerState in seiner Methode *handlePlayerStatusUp |:----------------|:-------------------------------|:-----------------------------:| |movesPlayed / getMovesPlayed()| Anzahl der gespielten Runden.|int |movesRemaining / getMovesRemaining()|Anzahl der übrigen zu spielenden Runden.|int -|playerPoints / getPlayerPoints()|Aktuelle Spielerpunkte (Gesamtzahl von Kopf und Körperteileanzahl).|int +|playerPoints / getPlayerPoints()|Aktuelle Spielerpunkte (Gesamtzahl von Kopf- und Körperteilanzahl).|int |playersHead / getPlayersHead()|Aktuelle Position des Kopfes von der Schlange.|Point2D |playersTail / getPlayersTail()|Aktuelle Position des Körpers von der Schlange. Es wird nur der letzte Punkt des Körpers zurückgegeben. Falls kein Körper vorhanden wird null zurückgegeben.|Point2D |ghostModeActive / isGhostModeActive()|Zustand des GhostMode bei der Schlange (GhostMode aktiv = true, GhostMode inaktiv = false).|boolean -|ghostModeRemaining / getGhostModeRemaining()|Verbleibende Dauer von dem aktiven GhostMode. Bei nicht aktivem GhostMode wir die definierte maximale Dauer zurückgegeben.|int +|ghostModeRemaining / getGhostModeRemaining()|Verbleibende Dauer von des aktiven GhostMode. Bei nicht aktivem GhostMode wir die definierte maximale Dauer zurückgegeben.|int |bitByPlayer / isBitByPlayer()|Mit dieser Methode kann der Zustand über einen Biss an einem Spieler geprüft werden.|boolean |moved / isMoved()|Mit dieser Methode kann der Zustand über die Bewegung der Schlage des Spielers geprüft werden.|boolean |collisionWithLevel / isCollisionWithLevel()|Mit dieser Methode kann der Zustand über die Kollision der Schlage des Spielers mit dem Level geprüft werden.|boolean @@ -103,8 +103,8 @@ Jede Runde werden für die jeweiligen Schlangen verschiedene RoundEvents berechn ## Projektstruktur (Gradle) -Jeder Player (Agent) wird in ein **seperates Modul** ausgelagert, welches in den Core improtiert wird. -Diese Auslagerung verhindert den Zugriff von den Agent auf fremden Code. +Jeder Player (Agent) wird in ein **seperates Modul** ausgelagert, welches in den Core importiert wird. +Diese Auslagerung verhindert den Zugriff von den Agenten auf fremden Code. Jedes Player Modul implementiert das Interface **BrainySnakePlayer** und importiert das Package **playerCommon**, welches das Interface und die Klassen beinhaltet (z.B. PlayerStatus, GameEvent und das BrainySnake Interface). Modul | Beschreibung | Includes @@ -144,7 +144,7 @@ __Problem:__ Fehler, der auftreten kann, wenn der Agent verschuldet oder unversc Der Agent wird eingefroren (PlayerStatus frozen), wechselt zur Kennzeichnung des Status die Farbe und es werden zu diesem Zug keine Aktionen für diesen Agenten ausgeführt. ### Der Agent greift auf Fremden Code zu -__Problem:__ Der Agent könnte **Public Methoden** der Simulation der oder die **Public Methoden** anderer Agenten zugreifen. +__Problem:__ Der Agent könnte auf **Public Methoden** der Simulation oder die **Public Methoden** anderer Agenten zugreifen. Denkbar sind auch **Reflections** mit der Private Methoden aufgerufen werden. **Präventiv Lösung:** Wir verbieten das und kontrollieren den Quellcode der Agenten From 610d58c92b02c11719baae4cc16d78feabc2ad70 Mon Sep 17 00:00:00 2001 From: Rudi Klassen Date: Sun, 11 Feb 2018 22:48:29 +0100 Subject: [PATCH 5/5] Changes after Review --- Dokumentation/Konzept.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dokumentation/Konzept.md b/Dokumentation/Konzept.md index 8bfbd71..26fb8f3 100644 --- a/Dokumentation/Konzept.md +++ b/Dokumentation/Konzept.md @@ -79,13 +79,13 @@ Der Agent erhält ein zweidimensionales Sichtfeld(viewWidth und viewRange), welc | Name / Methode |Beschreibung |Datentyp | |---------------- |------------------------------- |:-----------------------------:| |currentOrientation/ getCurrentOrientation()| Aktuelle Orientierung der Schlange.|Orientation -|viewWidth / getViewWidth()|Feldbreite in Feldern aus Sicht der Schlange. Das Feld beginnt vor dem Kopf der Schlange. Die Aufteilung findet in gleichen Anteilen nach rechts & links der Schlange statt.|int +|viewWidth / getViewWidth()|Feldbreite in Feldern aus Sicht der Schlange. Das Feld beginnt vor dem Kopf der Schlange. Die Aufteilung findet in gleichen Anteilen rechts und links der Schlange statt.|int |viewRange / getViewRange()|Feldhöhe in Feldern aus Sicht der Schlange. Beginnend einen Punkt vor dem Kopf der Schlange.|int |visibleFields / getVisibleFields()|Liste mit allen sichtbaren Feldern für die Schlange. Der erste Eintrag in der Liste mit dem Index 0 ist aus Sicht der Schlange der Punkt links oben.|List of Fields ### Objekt: RoundEvent -Jede Runde werden für die jeweiligen Schlangen verschiedene RoundEvents berechnet. Diese RoundEvents können in dem PlayerState ausgelesen werden. +Jede Runde werden für die jeweiligen Schlangen verschiedene RoundEvents berechnet. Diese RoundEvents können im PlayerState ausgelesen werden. Übersicht der vorhandenen Events: @@ -153,7 +153,6 @@ Denkbar sind auch **Reflections** mit der Private Methoden aufgerufen werden. - Die Simulation verwendet **keine öffentlichen Interfaces**, die Agenten werden von der Simulation aufgerufen. - Jeder Agent bekommt ein eigenes Paket - - **TODO:** Gibt es weitere Möglichkeiten Code zu isolieren? ## Glossar - Ghostmode: Im Ghostmode kann der Agent keine Aktionen ausfürhen außer sich zu bewegen