pietrobe03
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # SoPra - Session 01: 07.09.21 - 17.09.21 ## Organisatorisches - commit message style - Relevant für master - Deutsche Sprache - Nicht unter drei Emojis - Bitte ausführlich - Art, Was? - Pull/Merge requests approven? - Wer testet wessen Code? - checkstyle anpassen? - Featurebranches/Personenbranches, master, extra dev branch? - Genereller Plan Implementierung/Testen ### ToDo - [x] State Machine zeichnen (Robert) - [x] Sequenzdiagramme updaten () - [x] alle überarbeiten - [x] ändern/einfügen getCharById() - [x] Klassendiagramm fertig () - [x] offene Punkte diskutieren (alle) - [x] schönes Pattern für gegenseitig kennen - [x] public/private im Klassendiagramm - [x] Lebenslinien in Sequenzdiagramm richtig - [x] der tolle Fehler bei Goal/Game... - [x] Config vervollständigen (Robert) - [x] Command Pattern und Visitor Pattern - [x] fehlende Methoden (und Aggregationen ergänzen) - [x] überschreibungen!!! - [x] return values - [x] siehe Tafel - [x] Zeitplan - [x] Olis TODO List - [x] Konstruktoren richtig einfügen (siehe Sequenzdiagramme) ## Entwurfsplanung ### mögliche Änderungen - Konstanten - Spielphasen - mehrere Fähigkeiten - mehrere Spiele gleichzeitig? - neue Fähigkeiten ### Module / Pakete - Kommunikation - Personen - Spiel ### Klassen - Game - Konfiguration - Kommunikationstool - Reason (enum) -> Grund für Moralwechsel - Würfel/Random Wrapper - Infektionswürfel - Überlebender - Character - Kind - Standort - Eingänge - Barrikaden - Spieler - Kartenstapel - Müll - Karte - Krisenkarte - Handkarte - LOCK - SCISSORS - STUFF - FUEL - FOOD - MEDICINE - Kolonie - Moral - Fähigkeiten - Passive -> vielleicht als Decorator? - WOUND - NO-INFECTION - SEARCH - TRASH - Active - HEAL - FEED - BARRICADE - KILL - Aktionen - ohne Würfel - mit Würfel - Krisen - Nahrung - Infektionen -> vielleicht lieber Verletzungen - Wunde - Erfrierung - Biss - Spiellogik - Phasen - Spielerphase - Koloniephase - Würfel - Aktionswürfel - Infektionswürfel - Spielwelt ### Offene Punkte - (done) State Pattern ordentlich wie? - (done) welche Funktionen brauchen wir in den Game State Klassen? - (done) Würfel? - extra Infektionskettenwürfel? - (done) Funktionen in Player (und anderen Klassen) hinzufügen - (done) Aktionen als eigene Klasse oder nicht? - (done) wie machen wir das mit den Würfeln? Wird im Charakter überprüft ob wir die brauchen oder schon im Player? Braucht der Charakter zu welchem Player er gehört? wo lösen wir auf welche Aktion gemacht wird und ob die Bedingungen erfüllt sind? -> immer mitliefern, muss noch als Argument weitergegeben werden - (done) Fuel bei Move - **Zombie spawn** - (done) invalid Action wenn einfach eine Fuel-Karte gespielt werden - (done) in Character fehlen noch Funktionen - remove Trash - aktive Fähigkeiten ausführen - überschreibende Methoden für passive Fähigkeiten - (done) Zufallsbewegungen - (done) wie kommunizieren wir mit der ServerConnection? nur über Server oder alle? - (done) sendEvent als Observer?? - (done) Wie kann die Location auf das Game zugreifen? (benötigt für search) - Game als static - Feld Game in Location - mitgeben -> JA - (done) Ausrüstungsgegenstände können evtl. nur einmal pro Runde verwendet werden (bei der nächsten Anwendung muss nach Gegenständen weiter "unten" gesucht werden) #### unwichtiger - Charakter als Interface oder abstrakt? ### Abgehandelt - (done) wo speichern wir wo Überlebende sind? Im Standort oder im Charakter? -> Gedanken über Sequenzdiagramme machen - im Charakter die Location speichern - in der Location eine Charakter-Liste - jeder Spieler hat eine Charakter-Liste - Map zwischen Location und Charakter (globales Objekt) -> NEIN - (done) wie entfernen wir Charaktere? -> Observer Pattern - (done) wie Infektionen? - Liste im Charakter - mit Infektionen als Klassen -> JA - mit Infektionen als Enumeration -> nein - Infektion als Decorator -> NEIN - Anzahl Wunden, Anzahl Erfrierungen im Charakter -> eher abraten - (done) wie lassen wir die Karten ausspielen? - wo bekommen wir die Events? - wer handelt das? - als Funktion in Klasse Karten - mehrere Funktionen in Game/Game State - speichern wir das Target in der Karte? => Karte kommt als Command rein und wird dann weitergeleitet - (done) scissors kann bei krisen als stuff committed werden -> als Enumeration ### Notizen (Besprechung mit Lauritz) - SEQUENZDIAGRAMME - ConfigWrapper kein reines Singleton - Review: - von Thomas - generelles Feedback zu unserem Entwurf - informelles Reden über den Entwurf, welche Gedanken gemacht (Fokus: was ist gut, was ist schlecht) - was ist wichtig für Abnahme - sehr entspannt (!!!), angenehm - Freitag Nachmittag 16:00 (frühster Termin) ## Vortrag(Entwurfsreview) - losgehen im Server (Oliver) - State Machine (Robert) - großes Ganze, Connection/Kommunikation (Oliver) - Game, Location, Player (Elina) - Survivor-Paket (Yasmine) - Sequenzdiagramme (Iona) ### Protokoll Entwurfsreview (10.09.21 16:00-17:40) **Notizen**: -(done) es fehlt noch etwas wo das im Charakter die Ability aufgerufen wurde, (done) -ConfigWrapper noch weiter ausführen (viele Getter-Methoden etc.), -(done) es fehlt noch newRound()-Methode im Player, Game und so, (done) -vielleicht können wir das mit Location-Wechsel auch noch irgendwie in den Observer integrieren?, -Müllstapel: Karte auf Müll ablegen wie? (done) wieso wird das Game erst später komplett gefüllt? -> braucht Anzahl Player zum Erstellen einiger Sachen halten Informationen doppelt? einmal in der Config und einmal im Objekt -> teilweise jedes Mal in der Config auslesen -> mal so, mal so, einige Informationen sind auch in den Klassen gespeichert -> an sämtlichen Stellen Zugriff auf den ConfigWrapper -> eventuell schlecht?? -> fanden das ok (done) Würfel: wann werden die erstellt, wann werden die geworfen? BasisWürfel viel aneinander vorbeigeredet, hat aber eigentlich gepasst (done) muss der Charakter die Location kennen? -> Infektionchain -> Aktion ausführen muss das wirklich sein? -> unsere Meinung: JA (done) wer teilt dem Game Sachen mit? -> das machen die States (und noch einige Objekte mehr kennen das Game) Vermischung von Modell und Controller (gegenseitiges Kennen): unsere Idee: das jede Klasse sich darum kümmert was sie macht -> die vielen Referenzen-hin-und-her: nicht vergessen alles immer zu updaten (dafür an einer Stelle auch der Observer) müssen generell sehr viele Aufrufe berücksichtigen (wegen den ganzen Abhängigkeiten) (done) Frage: was passiert genau wenn sich ein Charakter bewegt? muss bei Location aus und eingetragen werden und Observer umgetragen werden und muss eigene Location ändern entityComponent führt zu Clash wegen objektorienterer Methodik (done) Müll: Müll Kartenstack kann nicht geshuffelt werden, Gemeinsamkeiten und Unterschiede von CardStack und GarbageStack überlegen, *Lösung*: CardStack abstrakt machen und dann neben dem GarbageStack noch ein NormalCardStack machen (done) Barricade-Klasse löschen (wird nie benutzt), die magische Konstante im ConfigWrapper gespeichert (done) was machen die Unterklassen von Karten? wieso existieren die überall? über alle Karten muss dann noch die play() Methode überschrieben werden (sonst könnte man generell einen Enum nehmen), in TargetfulCards gibt es eigentlich noch einen Setter für das Target ToDo: wo fehlen noch Methoden, wo müssen noch Methoden überschrieben werden, wo fehlen noch Aggregationen, wo sind vielleicht Aggregationen zu viel -> macht alles Sinn (?) Achtung: ins Repo nicht nicht-lesbare Dateien legen, nur PDF, kein anderes Gedöns Tikz: Diagramm noch schöner machen und das andere eintippen, Paddings, DocType standalone (done) noch in Ruhe am Montag mit Lauritz einige Sachen besprechen Olis Punkte: **-Config einmal durch die Sachen anpassen, erstellen von Location und so vorverschieben, Config nach Einlesen einfach Löschen** (done) -State vom Spiel speichern, teilweise in Colony, teilweise im Game -> eine schöne Datenklassen, etwas zusammen machen (done) -Location und Observer ist Zeug doppelt, nochmal anschauen -setterTarget bei TargetfulCards -> mehr Trennung von Code und Daten -> Config nochmal anschauen **Lauritz Notizen aus dem Review (Dienstag Morgen Besprechung):** - (done) PlayerState: Funktionstypen werden statisch aufgelöst, wir bekommen nur etwas vom Typ Command, nicht von den Unterklassen, es wird immer nur handleCommand(Command) aufgerufen, braucht Zugriff auf Sub-Typen - Lösung wäre CommandPattern (haben das so halb und jetzt voll machen), Handler wegwerfen, State vorwarden - State Machine Pattern ist auch irgendwie nur so halb - Command Factory ist gut, mehr in die Commands verlagern (da die so halb abarbeiten), grundlegende Logik vom Command im Command - kann noch State Machine bleiben, nur etwas abändern - noch macht die Vererbungsstruktur der Commands nicht wirklich Sinn, da es keine Attribute/Methoden hat - in State: Feld aktueller Command oder so? - (done) putCard in CardStack muss in GarbageStack - (done) wie funktioniert das alles mit Config, Random, ... - statische Sachen können bei Tests Probleme machen - (done, dagegen) resetDie im Player - Targetless/Targetful Cards, das funktioniert nicht - setTarget() fehlt - Problem: wir bekommen nur Karte, wissen nicht was, dynamische Auflösung - Command Pattern? => eher nicht - Visitor für die Karten (um dann Target oder so hinzuzufügen) - cardWithTarget, cardWithoutTarget - MVC macht keinen Sinn :) - wir haben auch reine Datenklassen, aber alle Controller Klassen haben auch Daten - (done) Location hat eindeutige Id, müssen nicht (Referenz auf) Objekt haben, nur ID speichern - über ID referenzieren ist evtl. einfacher - Location und Charakter verändern sich halt ständig, müssen immer geändert werden => dafür Observer (update) - zyklische Abhängigkeiten sind immer etwas doof, Charakter <=> Location ist ok und hier sinnvoll - (done) Character muss umbenannt werden - (done, dagegen) Game hatte noch keinen State (?) - (done) Location setzen wir im Sequenzdiagramm (fehlt noch) - (done) Erweiterung als Decorater-Pattern? - zwei (offensichtliche) Möglichkeiten - Lauritz behauptet das funktioniert ;) - Decorator macht Faltung - meine Notiz: Ausrüstung fehlen noch die Methoden und genauer Ablauf => Sequenzdiagramm - (done) Command mit fuel falsch, muss da weg - (done) Goal mit Unterklassen - scheint gut zu sein - Goal muss **nicht** das Game kennen - ***Config*** - neue Version von Robert/Elina - new Location von LocationBlueprint - direkt Config Klasse? Interface ist nicht nötig - Config direkt wegschmeißen - getConfig fällt nach Erstellung weg (?) - nur noch ein Interface das das getRandom() enthält, sodass das bekommen, Rest von Config braucht man nicht - magischen Konstante könnte jetzt auch woanders stehen, also einfach in den Klassen/Objekte setzen (Konstanten-Klasse ist ein Antipattern) - getConfigInstance wegschmeißen - static Random irgendwas - (done) Bedingungen Commands (/Aktionen) prüfen - in dem Moment wo es failt, sendet eine Methode funktioniert nicht und sendet dann CommandFailed, über den gesamten Ablauf muss Möglichkeit zur Kommunikation gegeben sein - Rückgabewert boolean und so zurückgegeben - Exceptions => nicht benutzen für etwas was dem Kontrollfluss des Programms gehört, sehr viel teurer - nur TimeOut und JSON-Parse - Exceptions führen zu einem exitCode != 0 (wenn man sie nicht fängt) - kann man System.exit() schreiben?? - in Top-Level alles entscheiden ist nicht möglich und nicht sinnvoll - irgendeinen Datentyp zurückgeben (determinischte Abhandlung möglich), ist eigentlich ok - Observer für Connection (die dann merkt wenn was schiefgelaufen ist), Observer sagen das etwas kaputt ist - MVC, Entity: einfach mal schauen was es hier bedeutet ### Lauritz fragen - **wie man etwas darstellt was zentral ist, aber keine Aggregation ist** - stark zusammengehörend - einfach Linie dazwischen ## Nützliches Material - http://www.cheat-sheets.org/saved-copy/designpatternscard1.pdf ## Fragen und Antworten - S. 10 mitte: Wenn man an einem Ort einen weiteren Überlebenden findet, schließt der sich dann der Gruppe an oder gelangt er magischerweise in die Kolonie? -> zweiteres - Wenn ein neuer Überlebender gefunden wird, welchem Spieler wird er dann zugeordnet? -> der ihn gefunden hat vermutlich, vielleicht auch niemandem? - Hat ein neuer Überlebender schon einen Charakter? -> ja - Ist ein Charakter nur durch seine Fähigkeit definiert? -> Kap. 3.2.1 - S. 11 unten: Was heißt "wenn kein neuer Überlebender nachspawnen kann"? -> vermutlich feste anzahl spieler, liste, zufall - Bei Erfrierungen: Ist es richtig, dass man, wenn nicht geheilt wird, erst die Erfrierung kriegt, nächste Runde eine Wunde, die Runde danach wieder eine Wunde, und danach stirbt? -> true - Muss man zum Heilen neben dem Verwundeten stehen? -> vermutlich ja - Macht man pro Runde mit jedem seiner Charaktere einen Zug? In welcher Reihenfolge? -> egal, egal - (S. 35, Tabelle 1: Warum steht da manchmal ein Überlebender und manchmal eine Überlebende?) vermutlich unwichtig - S. 18 unten: ein spieler oder ein charakter entsorgt karten? -> vermutlich nur ein fehler, charaktere entsorgen müll - S. 19 oben: ist mit anzahl survivors anzahl survivors in der kolonie gemeint? -> vermutlich wieder ein fehler - Landen Krisenkarten (handkarten, mit denen die krise abgewendet wird) irgendwann auf dem Müll? -> Nein - Heilt heilen alle oder eine Verletzung? -> vermutlich nur eine - Muss man in der Kolonie sein, um Müll zu entsorgen? -> wahrscheinlich ja - Warum ist das mit dem Essen so komisch (nur menschen in der kolonie haben hunger, kinder essen gleich viel, warum durch 2 teilen)? -> ist einfach so - Welchen Sinn haben die Zombies vor den Eingängen? -> keine besondere Bedeutung, Barrikaden können verhindern dass Zombies spawnen - Wann hat man gewonnen? -> nur wenn Ziel erreicht - Wann hat man verloren? (immer wenn alle tot sind, automatisch wenn Moral=0, wenn Runden vorbei) Kann man das Ziel erreichen obwohl alle tot sind? Hat man dann gewonnen oder verloren? S.7 was passiert wenn alle tot sind? -> direkt verloren, wenn Moral = 0, alle Spieler sind tot (siehe Formusbeitrag) - was passiert wenn man zum gleichen Ort geht? -> command failed, also müssen wir wohl doch wissen, wo der character sich befindet - muss man alle Würfel benutzen? -> nein, wenn am ende einer übrig ist, dann geht der verloren, man kriegt jede runde neue - wie kann man Krisen vollenden? wie genau wie viele Karten abgeben? wie wird das genau gespeichert/übergeben? -> jede krise hat genau einen kartentyp, es ist command failed, falls eine andere beigetragen wird - Wie funktioniert das mit den Clients? Bekommen wir für jeden ein Objekt? Wie funktioniert generell die Kommunikation (Events??)? -> steht in den Sequenzdiagrammen - wenn es einen freien Platz und eine Barrikade vor dem Eingang gibt: wird zuerst die Barrikade zerstört oder wird erst der freie Platz belegt? -> erst freie Plätze belegt, dann Barrikaden zerstört - kann man in der Kolonie auch Zufallsbegegnungen haben? kann überhaupt in der Kolonie durchsuchen? -> man kann nicht in der Kolonie durchsuchen (CommandFailed), Startkarten muss man danach nicht mehr beachten - kann man die Karte Fuel überhaupt ausspielen? -> man kann sie ausspielen und dann moven, der Command Move(id, id, bool fuel) ist falsch und wird entfernt - gibt es vor der ersten Runde schon Zombies? wenn ja, nur bei der Kolonie oder bei allen Locations (wo sich noch keine Leute aufhalten)? -> ja, gibt es, steht in der Konfigurations-Datei - Goal: survive = true. Bedeutung?? -> Zwei Möglichkeiten: - Gewonnen wenn alle Runden gespielt und nicht vorher gestorben - anderen Zielbedingungen: Spiel verloren, wenn Rundenzahl = 0 und Ziel noch nicht erreicht - wie funktioniert Müll rausbringen? -> jeder Charakter kann pro Runde beliebig viel Müll rausbringen, nur beschränkt durch Anzahl von Würfeln, die passive Fähigkeit darf nur einmal pro Runde genutzt werden - wie spielt man Ausrüstung aus? - UseCard(survivorID, targetID), survivorID (beliebiger Charakter eines Spielers der die Handkarte besitzt), targetID (Charakter der die Rüstung angezogen bekommt, muss nicht vom gleichen Player sein) - kann man jemanden heilen der keine Wunden hat? - sendet kein Command Failed Event - funktioniert ### offene Fragen - wie funktioniert Kill? an welchem Eingang werden Zombies getötet? ## Klassendiagramm Das aktuelle Klassendiagramm findet sich im GitLab-Branch `entwurf`. ### Ändern - [x] Aggregation - von ActionDieContainter zu Die - von CardStack zu Card - von Colony zu Card - von Location zu CardStack - von Server zu ConfigWrapper - von Connection zu Player - von Game zu Colony - von Game zu Location - von Player zu Card - [x] Aggregation falsch rum - Goal zu Game - [x] Barricade-Klasse entfernen - [x] Ausrüstungskarten hinzufügen - [x] für jeden Command erst überprüfen ob der Command nicht failed - [x] CardStack abstrakt machen, Unterklasse ShuffleCardStack - [x] play()-Methode in Karte ergänzen - [x] Observer ergänzen mit characterUpdate - [x] wie legen wir den Müll ab, Methode fehlt noch -> siehe neues (Schema)-Sequenzdiagramm ## State Machine ![](https://i.imgur.com/ItA9Yuf.png) bei PlayerPhase fehlen attack und search!! ## Ablenkung https://youtu.be/YoU3r6ZK8xQ ## Zeitplan - Freitag Abend müsste freigeschalten werden - wann fangen wir an? - insgesamt 2 Wochen - Plan: nach 1/4-1/3 der Zeit fertig, Rest für BugFixes etc. - Implementierung - top down / bottem up - erstmal groben Code schreiben - in 5 Abschnitte aufteilen - machen!!! - initiale Implementierung (1-2 Tage) - UnitTest - relativ früh anfangen (nur bedingt empfehlen, lieber Code schreiben) - für andere 5 Abschnitte schreiben - triviale Unittests (3) - mehr Unittests (4,5) - **immer wenn Bug Fix dafür eins schreiben** - Systemtest - parallelisieren mit UnitTest - wenn grundsätzlich Programm läuft - anfangen (ab Tag 4/5) - pullRequest ## Merken - Freitag Morgen - **grober Plan wer was sagt** - CommandFailed - Fuel - Zombie-Spawn - Müll (Card Play) - Card Visitor - **DIAGRAMME ANSCHAUEN** - jedes nextRound() muss super() aufrufen - die() muss auch super.die aufgrufen (notify observers) - Sequenzdiagramme - Extra: Card Play (mit Müll) -> siehe Bild Telegram - Extra: Equipment ausstatten/anlegen - player.playCard() -> Card.accept(TargetfulCardVisitor) -> TargetfulCardVisitor.visit(Card) -> EquippedCharacter(base) -> Observer.update() - Extra: Zombies spawnen - ColonyState.onEntry() 4/5 -> Colony.addZombies(colony.numSurvivors/2, Game), for l in location: l.addZombies(l.numSurvivors, Game) - Extra: Move mit Snowboot und FrostBite - nextCommand(), return moveCommand -> moveCommand.accept(playerState) -> playerState.visit(moveCommand) -> game.getPlayerById() -> player.getCharacterById() -> SnowbootCharacter.move() -> snowBootCharacter.equipmentPossible(), return true -> game.getLocationById(newLocationId), return newLocation -> newLocation.hasSpace(), return true -> überall austragen und neu eintragen (Observer geändert, ...) -> rollInfectionDie, return: Frostbite -> baseCharacter.addWound() - in Sequenzdiagramm 2 & 3: zur Übersichtlichkeit Event senden weggelassen, in Sequenzdiagramm 1 steht es drin

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully