JGU Logo JGU Logo JGU Logo JGU Logo

Institut für Informatik

Michael Wand
David Hartmann
Sommersemester 2020DIGITAL

Blatt 07

Projektaufgabe
Einführung in die Softwareentwicklung





Projekt Verkehrssimulation

Letzte Änderung: 02. June 2020, 11:22 Uhr
Ansicht:   |  

Straßennetze sind ein hervorragendes Beispiel von eigenständiger Simulation. Es gibt viele Akteure, die miteinander über eine gemeinsame Welt mit einander interagieren müssen. Ihre Aufgabe ist jetzt, eine solche Simulation zu implementieren.


Ihre Aufgabe

Implementieren Sie eine Software zum Simulieren des Szenarios. Der Einfachheit halber können Sie die Simulation taktweise implementieren (die Akteure bewegen sich immer ein Zeichen pro Tatk, etc.).


Ihre Lösung sollte aber dabei die folgenden Designentscheidungen berüchsichtigen:


Als Beispiel ist oben eine Simulation der zufälligen Bewegung von Autos auf einer vorgegeben, aber ersetzbaren Straßenkarte dargestellt, die auf der Konsole ausgegeben wird. Ihre Simulation muss natürlich nicht so aussehen, aber wenn Sie Ihre Software ausreichend modular formulieren, sollte eine solche Simulation auch in Ihrer Software problemlos möglich sein. Bei der Visualisierung können Sie gerne kreativ werden.


Bonuspunkte:
Eigene Ideen für Features sind hierbei sehr gerne gesehen. (Für eine bessere Korrektur: Beschreiben Sie Ihre Idee in der Abgabe).



Zusatzfeature: Erst öffnen, wenn das Basisprogramm steht, und bereits Autos auf den Straßen fahren!
(Andernfalls zerstören Sie den Lerneffekt für sich selbst.)
Wählen und Implementieres Sie auch eines der im Beispiel gezeigten Features, indem Sie eine abgeleitete Klassen definieren:
  • Busse (zum Beispiel indem Sie mehrere Autos „hintereinander herfahren“ lassen
  • Ampeln (wie im Beispiel gezeigt, warten die Autos an zwei Kreuzungen, bis sie fahren dürfen.


Sofern Sie einige Hinweise haben möchten, wie man mit den Projekt anfangen könnte, lesen Sie die folgenden Hinweise.

(freiwillige) Implementierungshinweise zu oben dargestellter Simulation
Unsere Empfehlung für einen OOP-Start ins Klassendesign
Sie können, wenn Sie möchten, für die Simulation folgendes Grundgerüst aus abstrakten Klassen nutzen:
class Simulation {
public:
    virtual void draw() = 0;
    virtual void step() = 0;
};

class Tile {
public:
    virtual bool draw() = 0;
};


class Car {
public:
    virtual move() = 0;
    virtual draw() = 0;
};



Die Idee dahinter ist folgende:
Die Karte ist ein einfaches 2D-Array, bei dem jedes Element vom Objekt Tile ist. Zum Beispiel kann dies eine Straße sein, oder aber ein leeres Feld.
Im Beispiel meiner eigenen Implementierung habe ich die Karte als Datei übergeben und in ein 2D-Array von Chars übergeführt. Danach prüfe ich für jedes Feld, welches Symbol sich darunter befindet und initialisiere die Karte mit einem entsprechenden Objekt. Als Beispiel bedeutet das Symbol <, dass an dieser Stelle ein Straßenstück ist, auf dem Autos nach links fahren, müssen. Ähnliches gilt für >, ^ und v. Bei einem Punkt . kann sich der Akteur für eine andere Richtung entscheiden. Ein T markiert eine Ampelkreuzung, etc.
+-------------------------------------------------------------------------------------------+
| v<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
| v  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  -- - ^ |
| v | >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.>>>.>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>v   ^ |
| v   ^ +------------------------------------+ v | ^ +------------------------------+ v | ^ |
| v | ^ |                                    | v   ^ |                              | v   ^ |
| v   ^ |                                    | v | ^ |                              | v | ^ |
| v | ^ |                                    | v   ^ |                              | v   ^ |
| v   ^ |                                    | v | ^ |                              | v | ^ |
| v | ^ |              +---------------------+ v   ^ +------------------------------+ v   ^ |
| v   ^ |              | v<<<<<<<<<<<<<<<<<<<<<<<<<.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<<^ |
| v | ^ |              | v  --  --  --  --  --  --  --  --  --  --  --  --  --  --  - v T ^ |
| v   ^ |              | v | >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.>>>^ |
| v | ^ |              | v   ^ +----------------------------------------------------+ v   ^ |
| v   ^ |              | v | ^ |                                                    | v | ^ |
| v | ^ +--------------+ v   ^ |                                                    | v   ^ |
| v   ^<<<<<<<<<<<<<<<<<<.<<<. |                                                    | v | ^ |
| v | ^  --  --  --  --  v   ^ |                                                    | v   ^ |
| .>>>.>>>>>>>>>>>>>>>>>>.>>>^ |                                                    | v | ^ |
| v | ^ +--------------+ v   ^ |                                                    | v   ^ |
| v   ^ |              | v | ^ |                                                    | v | ^ |
| v | ^ |              | v   ^ |                                                    | v   ^ |
| v   ^ |              | v | ^ |                                                    | v | ^ |
| v | ^ |              | v   ^ |                                                    | v   ^ |
| v   ^ |              | v | ^ |                                                    | v | ^ |
| v | ^ |              | v   ^ |                                                    | v   ^ |
| v   ^ |              | v | ^ |                                                    | v | ^ |
| v | ^ |              | v   ^ |                                                    | v   ^ |
| v   ^ +--------------+ v | ^ +----------------------------------------------------+ v | ^ |
| v | ^<<<<<<<<<<<<<<<<<<.<<<.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   ^ |
| v  --  --  --  --  --  v T ^   --  --  --  --  --  --  --  --  -- ^--  --  --  --  -- - ^ |
| >>>>>>>>>>>>>>>>>>>>>>>.>>>.>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.>>>.>>>>>>>>>>>>>>>>>>>>>^ |
+----------------------+ v | ^ +------------------------------+ v   ^ +---------------------+
                       | v   ^ |                              | v | ^ |
                       | v | ^ |                              | v   ^ |
                       | v   ^ |                              | v | ^ |
                       | v | ^ |                              | v   ^ |
                       | v   ^ +------------------------------+ v | ^ |
                       | v | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   ^ |
                       | v  --  --  --  --  --  --  --  --  - --  - ^ |
                       | >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>^ |
                       +----------------------------------------------+


Objekte vom Typ Simulation kodieren die Simulation als Ganzes. Eine Unterklasse von Simulation muss sich irgendwie die beteiligten Autos speichern. Die Funktion draw gibt eine Darstellung des aktuellen Zustands auf der Konsole aus. Die Funktion step führt einen Simulationsschritt durch, dieser könnte zum Beispiel daraus bestehen, dass einmal move auf jeden Acteur auf der Karte aufgerufen wird und die Positionen entsprechend angepasst werden. Natürlich kann move in einem Schritt auch noch andere Dinge tun, etwa die Straßenkarte verändern, neue Acteure hinzufügen oder vorhandene entfernen. Simulation kann außerdem Information über das Spielfeld enthalten, etwa die Kartengröße.
Um etwa eine Datei als 2D-Gitter einzulesen könnte dieser Code behilflich sein:
#include <vector>
#include <string>
#include <iostream>
#include <fstream>

std::vector<std::vector<char>> readfile(std::string filename) {
    std::vector<std::vector<char>> streetmap;
		
    std::fstream file;
	file.open(filename, std::ios::in);
	if(!file.good())
		std::cout << "FILE OPENING ERROR!!" << std::endl;

    std::string s;
    while (std::getline(file, s)) {
        std::vector<char> line(s.begin(),s.end());
        streetmap.push_back(line);
    }
	
    return streetmap;
}