DIGITAL
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.
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).
Sofern Sie einige Hinweise haben möchten, wie man mit den Projekt anfangen könnte, lesen Sie die folgenden Hinweise.
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;
};
Tile
ist. Zum Beispiel kann dies eine Straße sein, oder aber ein leeres Feld. <
, 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 -- -- -- -- -- -- -- -- - -- - ^ |
| >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>^ |
+----------------------------------------------+
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.#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;
}