Browse Source

Projektdateien hinzufügen.

Kolja Strohm 6 years ago
parent
commit
f6f79b8701
13 changed files with 2097 additions and 0 deletions
  1. 28 0
      Snake.sln
  2. 9 0
      Snake/Einstieg.cpp
  3. 106 0
      Snake/Game.cpp
  4. 36 0
      Snake/Game.h
  5. 184 0
      Snake/Initialisierung.cpp
  6. 28 0
      Snake/Initialisierung.h
  7. 368 0
      Snake/Map.cpp
  8. 58 0
      Snake/Map.h
  9. 878 0
      Snake/Menü.cpp
  10. 167 0
      Snake/Menü.h
  11. 184 0
      Snake/Snake.vcxproj
  12. 48 0
      Snake/Snake.vcxproj.filters
  13. 3 0
      build.bat

+ 28 - 0
Snake.sln

@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.22823.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Snake", "Snake\Snake.vcxproj", "{6F83FB3E-9489-4466-B0C3-80C9E793786F}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{6F83FB3E-9489-4466-B0C3-80C9E793786F}.Debug|Win32.ActiveCfg = Debug|Win32
+		{6F83FB3E-9489-4466-B0C3-80C9E793786F}.Debug|Win32.Build.0 = Debug|Win32
+		{6F83FB3E-9489-4466-B0C3-80C9E793786F}.Debug|x64.ActiveCfg = Debug|x64
+		{6F83FB3E-9489-4466-B0C3-80C9E793786F}.Debug|x64.Build.0 = Debug|x64
+		{6F83FB3E-9489-4466-B0C3-80C9E793786F}.Release|Win32.ActiveCfg = Release|Win32
+		{6F83FB3E-9489-4466-B0C3-80C9E793786F}.Release|Win32.Build.0 = Release|Win32
+		{6F83FB3E-9489-4466-B0C3-80C9E793786F}.Release|x64.ActiveCfg = Release|x64
+		{6F83FB3E-9489-4466-B0C3-80C9E793786F}.Release|x64.Build.0 = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

+ 9 - 0
Snake/Einstieg.cpp

@@ -0,0 +1,9 @@
+#include "Game.h"
+
+extern "C"
+{
+	__declspec( dllexport ) MiniGameV *GetMiniGame()
+	{
+		return new Game();
+	}
+}

+ 106 - 0
Snake/Game.cpp

@@ -0,0 +1,106 @@
+#include "Game.h"
+#include <Bild.h>
+
+// Inhalt der Game Klasse aus Game.h
+// Konstruktor
+Game::Game()
+{
+	schrift = 0;
+	screen = 0;
+	alpha = 0;
+	menü = 0;
+	ref = 1;
+}
+
+// Destruktor
+Game::~Game()
+{
+	if( schrift )
+		schrift->release();
+	if( screen )
+		screen->release();
+	if( menü )
+		menü->release();
+}
+
+// nicht constant
+bool Game::laden()
+{
+	return 1;
+}
+
+void Game::doMausEreignis( MausEreignis &me )
+{
+	if( menü )
+		menü->doMausEreignis( me );
+}
+
+void Game::doTastaturEreignis( TastaturEreignis &te )
+{
+	if( menü )
+		menü->doTastaturEreignis( te );
+}
+
+bool Game::tick( double zeit )
+{
+	int val = (int)( zeit * 150 );
+	if( menü && !menü->istBeendet() && alpha != 255 )
+	{
+		alpha += val;
+		if( alpha > 255 )
+			alpha = 255;
+		return 1;
+	}
+	if( menü && menü->istBeendet() && alpha )
+	{
+		alpha -= val;
+		if( alpha < 255 )
+			alpha = 0;
+	}
+	if( menü )
+		return menü->tick( zeit );
+	return 0;
+}
+
+void Game::render( Bild &zRObj )
+{
+	zRObj.setAlpha( alpha );
+	if( menü )
+		menü->render( zRObj );
+	zRObj.releaseAlpha();
+}
+
+void Game::setSchriftZ( Schrift *schrift )
+{
+	this->schrift = schrift;
+	if( !menü && this->schrift && screen )
+		menü = new Menü( schrift, screen );
+}
+
+void Game::setBildschirmZ( Bildschirm *screen )
+{
+	this->screen = screen;
+	if( !menü && schrift && screen )
+		menü = new Menü( schrift, screen );
+}
+
+// constant
+bool Game::istEnde() const
+{
+	return menü ? ( menü->istBeendet() && !alpha ) : 0;
+}
+
+// Reference Counting
+MiniGameV *Game::getThis()
+{
+	ref++;
+	return this;
+}
+
+MiniGameV *Game::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 36 - 0
Snake/Game.h

@@ -0,0 +1,36 @@
+#ifndef Game_H
+#define Game_H
+
+#include "MiniGameV.h"
+#include "Menü.h"
+
+class Game : public MiniGameV
+{
+private:
+	Schrift *schrift;
+	Bildschirm *screen;
+	Menü *menü;
+	int alpha;
+	int ref;
+
+public:
+	// Konstruktor
+	Game();
+	// Destruktor
+	~Game();
+	// nicht constant
+	virtual bool laden() override;
+	virtual void doMausEreignis( MausEreignis &me ) override;
+	virtual void doTastaturEreignis( TastaturEreignis &te ) override;
+	virtual bool tick( double zeit ) override;
+	virtual void render( Bild &zRObj ) override;
+	virtual void setSchriftZ( Schrift *schrift ) override;
+	virtual void setBildschirmZ( Bildschirm * screen ) override;
+	// constant
+	virtual bool istEnde() const override;
+	// Reference Counting
+	virtual MiniGameV *getThis() override;
+	virtual MiniGameV *release() override;
+};
+
+#endif

+ 184 - 0
Snake/Initialisierung.cpp

@@ -0,0 +1,184 @@
+#include "Initialisierung.h"
+#include <Schrift.h>
+#include <Textfeld.h>
+#include <MausEreignis.h>
+
+Knopf *initKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *titel )
+{
+	Knopf *ret = new Knopf();
+	ret->addStyle( style );
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	if( zSchrift )
+		ret->setSchriftZ( zSchrift->getThis() );
+	ret->setText( titel );
+	return ret;
+}
+
+KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt )
+{
+	KontrollKnopf *ret = new KontrollKnopf();
+	ret->setMausEreignis( _ret1ME );
+	ret->setStyle( style );
+	ret->setSchriftZ( zSchrift->getThis() );
+	ret->setText( txt );
+	ret->setSText( txt );
+	ret->setSFarbe( 0xFFFFFFFF );
+	ret->setSSize( 12 );
+	if( ret->hatStyle( TextFeld::Style::Buffered ) )
+	{
+		ret->setAlphaFeldFarbe( 0x5500FF00 );
+		ret->setAlphaFeldStrength( -5 );
+	}
+	if( ret->hatStyle( TextFeld::Style::Rahmen ) )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFF00FF00 );
+	}
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	ret->loadData( "data/bilder/system.ltdb" );
+	return ret;
+}
+
+TextFeld *initTextFeld( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt )
+{
+	TextFeld *ret = new TextFeld();
+	ret->setStyle( style );
+	ret->setSchriftZ( zSchrift->getThis() );
+	ret->setText( txt );
+	ret->setSchriftFarbe( 0xFFFFFFFF );
+	ret->setSchriftSize( 12 );
+	if( ret->hatStyle( TextFeld::Style::Buffered ) )
+	{
+		ret->setAlphaFeldFarbe( 0x5500FF00 );
+		ret->setAlphaFeldStrength( -5 );
+	}
+	if( ret->hatStyle( TextFeld::Style::Rahmen ) )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFF00FF00 );
+	}
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	return ret;
+}
+
+AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< char * > values )
+{
+	AuswahlBox *ret = new AuswahlBox();
+	ret->setStyle( style );
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	if( ( style | AuswahlBox::Style::Hintergrund ) == style )
+		ret->setHintergrundFarbe( 0xFF000000 );
+	if( ( style | AuswahlBox::Style::Erlaubt ) == style )
+		ret->setMausEreignis( _ret1ME );
+	if( zSchrift )
+		ret->setSchriftZ( zSchrift->getThis() );
+	if( ( style | AuswahlBox::Style::Rahmen ) == style )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
+	}
+	if( ( style | AuswahlBox::Style::MaxHeight ) == style )
+		ret->setMaxAuskappHeight( 100 );
+	if( ( style | AuswahlBox::Style::MausRahmen ) == style )
+	{
+		ret->setMausRahmenBreite( 1 );
+		ret->setMausRahmenFarbe( 0xFF005500 );
+	}
+	if( ( style | AuswahlBox::Style::MausBuffer ) == style )
+	{
+		ret->setMausAlphaFeldFarbe( 0x00008700 );
+		ret->setMausAlphaFeldStrength( -8 );
+	}
+	if( ( style | AuswahlBox::Style::AuswahlRahmen ) == style )
+	{
+		ret->setAuswRahmenBreite( 1 );
+		ret->setAuswRahmenFarbe( 0xFF00FF00 );
+	}
+	if( ( style | AuswahlBox::Style::AuswahlBuffer ) == style )
+	{
+		ret->setAuswAlphaFeldFarbe( 0x0000FF00 );
+		ret->setAuswAlphaFeldStrength( -8 );
+	}
+	for( auto i = values.begin(); i != values.end(); i++ )
+	{
+		ret->addEintrag( *i );
+	}
+	return ret;
+}
+
+ObjTabelle *initObjTabelle( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe )
+{
+	ObjTabelle *ret = new ObjTabelle();
+	ret->setStyle( style );
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	if( ( style | ObjTabelle::Style::Erlaubt ) == style )
+		ret->setMausEreignis( _ret1ME );
+	if( ( style | ObjTabelle::Style::Rahmen ) == style )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
+	}
+	if( ( style | ObjTabelle::Style::Raster ) == style )
+	{
+		ret->setRasterBreite( 1 );
+		ret->setRasterFarbe( 0xFFFFFFFF );
+	}
+	if( ( style | ObjTabelle::Style::VScroll ) == style )
+		ret->setVertikalKlickScroll( 5 );
+	if( ( style | ObjTabelle::Style::HScroll ) == style )
+		ret->setHorizontalKlickScroll( 5 );
+	for( auto i = spalten.begin(); i != spalten.end(); i++ )
+	{
+		ret->addSpalte( i->name );
+		ret->setSpaltenBreite( i->name, i->breite );
+		if( ( style | ObjTabelle::Style::SpaltenBreiteMin ) == style )
+			ret->setMinSpaltenBreite( i->name, i->minBreite );
+		if( ( style | ObjTabelle::Style::SpaltenBreiteMax ) == style )
+			ret->setMaxSpaltenBreite( i->name, i->maxBreite );
+		if( überschriftHöhe )
+		{
+			if( ret->getZeilenNummer( "Überschrift" ) < 0 )
+			{
+				ret->addZeile( 0, "Überschrift" );
+				ret->setZeilenHeight( 0, 20 );
+			}
+			ret->setZeichnungZ( i->name, "Überschrift", initTextFeld( 0, 0, i->breite, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, i->name ) );
+		}
+	}
+	return ret;
+}
+
+LDiag *initLinienDiagramm( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, DiagDaten *data )
+{
+	LDiag *ret = new LDiag();
+	ret->setStyle( style );
+	ret->setPosition( x, y );
+	ret->setSize( br, hö );
+	if( zSchrift )
+	{
+		ret->setSchriftZ( zSchrift->getThis() );
+		ret->setSchriftSize( 12 );
+	}
+	if( data )
+		ret->setDiagDatenZ( data );
+	if( ret->hatStyle( LDiag::Style::Rahmen ) )
+	{
+		ret->setLinienRahmenBreite( 1 );
+		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
+	}
+	if( ret->hatStyle( LDiag::Style::DatenRahmen ) )
+	{
+		ret->setDatenRahmenBreite( 1 );
+		ret->setDatenRahmenFarbe( 0xFFFFFFFF );
+	}
+	if( ret->hatStyle( LDiag::Style::Hintergrund ) )
+		ret->setHintergrundFarbe( 0xFF000000 );
+	if( ret->hatStyle( LDiag::Style::DatenHintergrund ) )
+		ret->setHintergrundFarbe( 0xFF000000 );
+	return ret;
+}

+ 28 - 0
Snake/Initialisierung.h

@@ -0,0 +1,28 @@
+#ifndef Initialisierung_H
+#define Initialisierung_H
+
+#include <Knopf.h>
+#include <Bild.h>
+#include <AuswahlBox.h>
+#include <Tabelle.h>
+#include <Diagramm.h>
+#include <initializer_list>
+
+using namespace Framework;
+
+struct OBJTabelleSpalteIni
+{
+	char *name;
+	int breite;
+	int minBreite;
+	int maxBreite;
+};
+
+Knopf *initKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *titel );
+KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt );
+TextFeld *initTextFeld( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt );
+AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< char * > values );
+ObjTabelle *initObjTabelle( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe );
+LDiag *initLinienDiagramm( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, DiagDaten *data );
+
+#endif

+ 368 - 0
Snake/Map.cpp

@@ -0,0 +1,368 @@
+#include "Map.h"
+#include <Datei.h>
+#include <InitDatei.h>
+#include <KSGTDatei.h>
+#include <Rahmen.h>
+#include <TastaturEreignis.h>
+#include <Zeit.h>
+#include <Text.h>
+
+// Inhalt der Map Klasse aus Map.h
+// Konstruktor
+Map::Map()
+{
+	schlange = new Array< Pos >();
+	ziele = new Array< Pos >();
+	feld = new LRahmen();
+	feld->setFarbe( 0xFFFFFFFF );
+	kam = new LRahmen();
+	kam->setFarbe( 0xFF777777 );
+	map = new LRahmen();
+	map->setFarbe( 0xFFFFFFFF );
+	map->setPosition( 10, 10 );
+	map->setSize( 200, 200 );
+	beendet = 1;
+	move = 1;
+	sr = 1;
+	rend = 0;
+	ref = 1;
+}
+
+// Destruktor
+Map::~Map()
+{
+	speichern();
+	schlange->release();
+	ziele->release();
+	feld->release();
+	kam->release();
+	map->release();
+}
+
+// nicht constant
+void Map::reset()
+{
+	next = 0;
+	beendet = 0;
+	richtung = 0;
+	addAnzahl = 0;
+	score = 0;
+	schlange->leeren();
+	ziele->leeren();
+	InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
+	if( !opd->laden() )
+		DateiPfadErstellen( "data/Minigames/Snake/data/optionen.ini" );
+	breite = 80;
+	if( opd->wertExistiert( "Breite" ) )
+		breite = (int)*opd->zWert( "Breite" );
+	else
+		opd->addWert( "Breite", "80" );
+	höhe = 50;
+	if( opd->wertExistiert( "Höhe" ) )
+		höhe = (int)*opd->zWert( "Höhe" );
+	else
+		opd->addWert( "Höhe", "50" );
+	zAnzahl = 1;
+	if( opd->wertExistiert( "Ziele" ) )
+		zAnzahl = (int)*opd->zWert( "Ziele" );
+	else
+		opd->addWert( "Ziele", "1" );
+	neuAnzahl = 10;
+	if( opd->wertExistiert( "Anhängen" ) )
+		neuAnzahl = (int)*opd->zWert( "Anhängen" );
+	else
+		opd->addWert( "Anhängen", "10" );
+	geschwindigkeit = 10;
+	if( opd->wertExistiert( "Geschwindigkeit" ) )
+		geschwindigkeit = (int)*opd->zWert( "Geschwindigkeit" );
+	else
+		opd->addWert( "Geschwindigkeit", "10" );
+	bool fortsetzen = 0;
+	if( opd->wertExistiert( "Fortsetzen" ) )
+		fortsetzen = (int)*opd->zWert( "Fortsetzen" ) != 0;
+	else
+		opd->addWert( "Fortsetzen", "0" );
+	opd->speichern();
+	opd->release();
+	kamPos.x = 0;
+	kamPos.y = 0;
+	if( breite > 80 )
+		kamPos.x = breite / 2 - 40;
+	if( höhe > 50 )
+		kamPos.y = höhe / 2 - 25;
+	if( fortsetzen && DateiExistiert( "data/Minigames/Snake/data/game.save" ) )
+	{
+		Datei *save = new Datei();
+		save->setDatei( "data/Minigames/Snake/data/game.save" );
+		save->open( Datei::Style::lesen );
+		int br = 0;
+		int hö = 0;
+		save->lese( (char*)&br, 4 );
+		save->lese( (char*)&hö, 4 );
+		if( br == breite && hö == höhe )
+		{
+			save->lese( (char*)&score, 4 );
+			save->lese( (char*)&richtung, 4 );
+			int anz = 0;
+			save->lese( (char*)&anz, 4 );
+			for( int i = 0; i < anz; i++ )
+			{
+				Pos p;
+				save->lese( (char*)&p.x, 2 );
+				save->lese( (char*)&p.y, 2 );
+				schlange->add( p );
+			}
+			save->lese( (char*)&anz, 4 );
+			for( int i = 0; i < anz; i++ )
+			{
+				Pos p;
+				save->lese( (char*)&p.x, 2 );
+				save->lese( (char*)&p.y, 2 );
+				ziele->add( p );
+			}
+			next = 1.0 / geschwindigkeit;
+		}
+		save->close();
+		save->release();
+	}
+	if( !schlange->getEintragAnzahl() )
+		schlange->add( Pos{ (short)( breite / 2 ), (short)( höhe / 2 ) } );
+}
+
+void Map::doMausEreignis( MausEreignis &me )
+{
+
+}
+
+void Map::doTastaturEreignis( TastaturEreignis &te )
+{
+	if( !move )
+		return;
+	if( te.taste == T_Oben && richtung != 2 )
+	{
+		move = 0;
+		richtung = 0;
+	}
+	if( te.taste == T_Rechts && richtung != 3 )
+	{
+		move = 0;
+		richtung = 1;
+	}
+	if( te.taste == T_Unten && richtung != 0 )
+	{
+		move = 0;
+		richtung = 2;
+	}
+	if( te.taste == T_Links && richtung != 1 )
+	{
+		move = 0;
+		richtung = 3;
+	}
+}
+
+bool Map::tick( double tickVal )
+{
+	if( beendet )
+		return 0;
+	if( sr )
+		srand( (unsigned int)time( 0 ) );
+	sr = 0;
+	bool ret = rend;
+	rend = 0;
+	next -= tickVal;
+	while( next < 0 && !beendet )
+	{
+		move = 1;
+		ret = 1;
+		next += 1.0 / geschwindigkeit;
+		int nx = schlange->get( 0 ).x;
+		int ny = schlange->get( 0 ).y;
+		if( richtung == 0 )
+			ny--;
+		if( richtung == 1 )
+			nx++;
+		if( richtung == 2 )
+			ny++;
+		if( richtung == 3 )
+			nx--;
+		if( breite > 80 )
+		{
+			kamPos.x = nx - 40;
+			if( kamPos.x < 0 )
+				kamPos.x = 0;
+			if( kamPos.x + 80 > breite )
+				kamPos.x = breite - 80;
+		}
+		if( höhe > 50 )
+		{
+			kamPos.y = ny - 25;
+			if( kamPos.y < 0 )
+				kamPos.y = 0;
+			if( kamPos.y + 50 > höhe )
+				kamPos.y = höhe - 50;
+		}
+		int sAnz = schlange->getEintragAnzahl();
+		for( int i = 0; i < sAnz; i++ )
+			beendet |= nx == schlange->get( i ).x && ny == schlange->get( i ).y;
+		beendet |= nx < 0 || nx >= breite;
+		beendet |= ny < 0 || ny >= höhe;
+		int zAnz = ziele->getEintragAnzahl();
+		bool neuZ = !zAnz;
+		for( int i = 0; i < zAnz; i++ )
+			neuZ |= nx == ziele->get( i ).x && ny == ziele->get( i ).y;
+		if( neuZ )
+		{
+			addAnzahl += neuAnzahl;
+			ziele->leeren();
+			for( int i = 0; i < zAnzahl; i++ )
+				ziele->add( Pos{ (short)( rand() % breite ), (short)( rand() % höhe ) } );
+			if( zAnz )
+				score++;
+		}
+		if( !beendet )
+		{
+			schlange->add( Pos{ (short)nx, (short)ny }, 0 );
+			if( !addAnzahl )
+				schlange->remove( sAnz );
+			else
+				addAnzahl--;
+		}
+		else
+		{
+			KSGTDatei *stb = new KSGTDatei( "data/Minigames/Snake/data/score.ksgt" );
+			if( !stb->laden() )
+				DateiPfadErstellen( "data/Minigames/Snake/data/score.ksgt" );
+			RCArray< Text > *zeile = new RCArray< Text >();
+			Zeit *zeit = getZeit();
+			zeile->add( zeit->getZeit( "y-m-d h:i:s" ) );
+			zeit->release();
+			Text *scoreT = new Text();
+			scoreT->append( score );
+			zeile->add( scoreT );
+			Text *breiteT = new Text();
+			breiteT->append( breite );
+			zeile->add( breiteT );
+			Text *höheT = new Text();
+			höheT->append( höhe );
+			zeile->add( höheT );
+			Text *geschwindigkeitT = new Text();
+			geschwindigkeitT->append( geschwindigkeit );
+			zeile->add( geschwindigkeitT );
+			Text *zAnzahlT = new Text();
+			zAnzahlT->append( zAnzahl );
+			zeile->add( zAnzahlT );
+			Text *nAnzahlT = new Text();
+			nAnzahlT->append( neuAnzahl );
+			zeile->add( nAnzahlT );
+			stb->addZeile( 7, zeile );
+			zeile->release();
+			stb->speichern();
+			stb->release();
+            DateiRemove( "data/Minigames/Snake/data/game.save" );
+		}
+	}
+	return ret;
+}
+
+void Map::render( Bild &zRObj )
+{
+	int xStart = 0;
+	int yStart = 0;
+	if( breite < 80 )
+		xStart = 400 - breite * 5;
+	else
+		xStart -= kamPos.x * 10;
+	if( höhe < 50 )
+		yStart = 250 - höhe * 5;
+	else
+		yStart -= kamPos.y * 10;
+	feld->setPosition( xStart, yStart );
+	feld->setSize( breite * 10, höhe * 10 );
+	feld->render( zRObj );
+	bool rMap = breite > 80 || höhe > 50;
+	int sLän = schlange->getEintragAnzahl();
+	for( int i = 0; i < sLän; i++ )
+		zRObj.fillRegion( xStart + schlange->get( i ).x * 10, yStart + schlange->get( i ).y * 10, 9, 9, 0xFFFFFFFF );
+	int zAnz = ziele->getEintragAnzahl();
+	for( int i = 0; i < zAnz; i++ )
+		zRObj.fillRegion( xStart + ziele->get( i ).x * 10, yStart + ziele->get( i ).y * 10, 9, 9, 0xFF00FF00 );
+	if( rMap )
+	{
+		const Punkt &dOff = zRObj.getDrawOff();
+		map->render( zRObj );
+		for( int i = 0; i < sLän; i++ )
+			zRObj.setPixelDP( 10 + ( 200 * schlange->get( i ).x ) / breite + dOff.x, 10 + ( 200 * schlange->get( i ).y ) / höhe + dOff.y, 0xFFFFFFFF );
+		for( int i = 0; i < zAnz; i++ )
+			zRObj.setPixelDP( 10 + ( 200 * ziele->get( i ).x ) / breite + dOff.x, 10 + ( 200 * ziele->get( i ).y ) / höhe + dOff.y, 0xFF00FF00 );
+		kam->setPosition( 10 + ( 200 * kamPos.x ) / breite, 10 + ( 200 * kamPos.y ) / höhe );
+		kam->setSize( 16000 / breite, ( 10000 ) / höhe );
+		if( kam->getBreite() > 200 )
+			kam->setSize( 200, kam->getHeight() );
+		if( kam->getHeight() > 200 )
+			kam->setSize( kam->getBreite(), 200 );
+		kam->render( zRObj );
+	}
+}
+
+// constant
+void Map::speichern() const
+{
+	if( !beendet )
+	{
+		Datei *d = new Datei();
+		d->setDatei( "data/Minigames/Snake/data/game.save" );
+		d->erstellen();
+		d->open( Datei::Style::schreiben );
+		d->schreibe( (char*)&breite, 4 );
+		d->schreibe( (char*)&höhe, 4 );
+		d->schreibe( (char*)&score, 4 );
+		d->schreibe( (char*)&richtung, 4 );
+		int anz = schlange->getEintragAnzahl();
+		d->schreibe( (char*)&anz, 4 );
+		for( int i = 0; i < anz; i++ )
+		{
+			short p = schlange->get( i ).x;
+			d->schreibe( (char*)&p, 2 );
+			p = schlange->get( i ).y;
+			d->schreibe( (char*)&p, 2 );
+		}
+		anz = ziele->getEintragAnzahl();
+		d->schreibe( (char*)&anz, 4 );
+		for( int i = 0; i < anz; i++ )
+		{
+			short p = ziele->get( i ).x;
+			d->schreibe( (char*)&p, 2 );
+			p = ziele->get( i ).y;
+			d->schreibe( (char*)&p, 2 );
+		}
+		d->close();
+		d->release();
+	}
+	else
+		DateiRemove( "data/Minigames/Snake/data/game.save" );
+}
+
+int Map::getScore() const
+{
+	return score;
+}
+
+bool Map::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+Map *Map::getThis()
+{
+	ref++;
+	return this;
+}
+
+Map *Map::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 58 - 0
Snake/Map.h

@@ -0,0 +1,58 @@
+#ifndef Map_H
+#define Map_H
+
+#include <Bild.h>
+
+using namespace Framework;
+
+struct Pos
+{
+	short x;
+	short y;
+};
+
+class Map
+{
+private:
+	Array< Pos > *schlange;
+	Array< Pos > *ziele;
+	LRahmen *feld;
+	LRahmen *kam;
+	LRahmen *map;
+	Pos kamPos;
+	bool move;
+	int score;
+	int breite;
+	int höhe;
+	int geschwindigkeit;
+	int zAnzahl;
+	double next;
+	int richtung;
+	bool beendet;
+	int addAnzahl;
+	int neuAnzahl;
+	bool sr;
+	bool rend;
+	int ref;
+
+public:
+	// Konstruktor
+	Map();
+	// Destruktor
+	~Map();
+	// nicht constant
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	void doTastaturEreignis( TastaturEreignis &te );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// constant
+	void speichern() const;
+	int getScore() const;
+	bool istBeendet() const;
+	// Reference Counting
+	Map *getThis();
+	Map *release();
+};
+
+#endif

+ 878 - 0
Snake/Menü.cpp

@@ -0,0 +1,878 @@
+#include "Menü.h"
+#include "Initialisierung.h"
+#include <MausEreignis.h>
+#include <Textfeld.h>
+#include <InitDatei.h>
+#include <Text.h>
+#include <Datei.h>
+#include <TastaturEreignis.h>
+#include <KSGTDatei.h>
+#include <Schrift.h>
+#include <DateiSystem.h>
+#include <Rahmen.h>
+
+// Inhalt der MenüVerloren Klasse aus Menü.h
+// Kontruktor
+MenüVerloren::MenüVerloren( Schrift *zSchrift )
+{
+	ram = new LRahmen();
+	ram->setSize( 160, 100 );
+	ram->setPosition( 320, 200 );
+	ram->setFarbe( 0xFFFFFFFF );
+	verloren = initTextFeld( 325, 210, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Du hast verloren." );
+	neu = initKnopf( 350, 240, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Neues Spiel" );
+	beenden = initKnopf( 350, 270, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Zurück" );
+	ref = 1;
+}
+
+// Destruktor
+MenüVerloren::~MenüVerloren()
+{
+	verloren->release();
+	neu->release();
+	beenden->release();
+	ram->release();
+}
+
+// nicht constant
+int MenüVerloren::doMausEreignis( MausEreignis &me )
+{
+	bool vera = me.verarbeitet;
+	int ret = 0;
+	neu->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+		ret = 1;
+	beenden->doMausEreignis( me );
+	if( !vera && me.verarbeitet && !ret && me.id == ME_RLinks )
+		ret = 2;
+	return ret;
+}
+
+bool MenüVerloren::tick( double tickVal )
+{
+	bool ret = verloren->tick( tickVal );
+	ret |= neu->tick( tickVal );
+	ret |= beenden->tick( tickVal );
+	return ret;
+}
+
+void MenüVerloren::render( Bild &zRObj )
+{
+	zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
+	verloren->render( zRObj );
+	neu->render( zRObj );
+	beenden->render( zRObj );
+	ram->render( zRObj );
+}
+
+// Reference Counting
+MenüVerloren *MenüVerloren::getThis()
+{
+	ref++;
+	return this;
+}
+
+MenüVerloren *MenüVerloren::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}
+
+
+// Inhalt der MenüSpiel Klasse aus Menü.h
+// Konstruktor
+MenüSpiel::MenüSpiel( Schrift *zSchrift, Bildschirm *zScreen )
+{
+	scoreT = initTextFeld( 690, 10, 100, 20, zSchrift, TextFeld::Style::Text, "Score: 0" );
+	beenden = initKnopf( 690, 40, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
+	map = new Map();
+	verloren = new MenüVerloren( zSchrift );
+	beendet = 0;
+	ref = 1;
+}
+
+// Destruktor
+MenüSpiel::~MenüSpiel()
+{
+	scoreT->release();
+	beenden->release();
+	map->release();
+	verloren->release();
+}
+
+// nicht constant
+void MenüSpiel::reset()
+{
+	map->reset();
+	beendet = 0;
+	scoreT->setText( "Score: " );
+	scoreT->zText()->append( map->getScore() );
+}
+
+void MenüSpiel::doMausEreignis( MausEreignis &me )
+{
+	bool vera = me.verarbeitet;
+	beenden->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+	{
+		map->speichern();
+		beendet = 1;
+	}
+	map->doMausEreignis( me );
+	if( map->istBeendet() )
+	{
+		int ak = verloren->doMausEreignis( me );
+		if( ak == 1 )
+			reset();
+		if( ak == 2 )
+			beendet = 1;
+	}
+}
+
+void MenüSpiel::doTastaturEreignis( TastaturEreignis &te )
+{
+	if( map->istBeendet() )
+	{
+		if( te.id == TE_Release && te.taste == T_Enter )
+			reset();
+		if( te.id == TE_Release && te.taste == T_BackSpace )
+			beendet = 1;
+		return;
+	}
+	map->doTastaturEreignis( te );
+}
+
+bool MenüSpiel::tick( double tickVal )
+{
+	bool ret = beenden->tick( tickVal );
+	ret |= map->tick( tickVal );
+	scoreT->setText( "Score: " );
+	scoreT->zText()->append( map->getScore() );
+	if( map->istBeendet() )
+		ret |= verloren->tick( tickVal );
+	return ret;
+}
+
+void MenüSpiel::render( Bild &zRObj )
+{
+	scoreT->render( zRObj );
+	beenden->render( zRObj );
+	map->render( zRObj );
+	if( map->istBeendet() )
+		verloren->render( zRObj );
+}
+
+// constant
+bool MenüSpiel::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+MenüSpiel *MenüSpiel::getThis()
+{
+	ref++;
+	return this;
+}
+
+MenüSpiel *MenüSpiel::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}
+
+
+// Inhalt der MenüStatistik Klasse aus Menü.h
+// Konstruktor
+MenüStatistik::MenüStatistik( Schrift *zSchrift, Bildschirm *zScreen )
+{
+	ansichtT = initTextFeld( 245, 10, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Ansicht:" );
+	ansicht = initAuswahlBox( 295, 10, 120, 20, zSchrift, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Tabelle", "Diagramm" } );
+	optionen = initKontrollKnopf( 425, 10, 130, 20, zSchrift, KontrollKnopf::Style::Normal, "Optionen beachten" );
+	gesammtT = initObjTabelle( 115, 40, 570, 420, zSchrift, ObjTabelle::Style::normal, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Höhe", 70, 0, 0 }, { "Ziele", 70, 0, 0 }, { "Anhängen", 70, 0, 0 }, { "Tempo", 70, 0, 0 } }, 20 );
+	optionenT = initObjTabelle( 115, 40, 570, 420, zSchrift, ObjTabelle::Style::normal, { { "Score", 70, 0, 0 }, { "Datum", 145, 0, 0 }, { "Breite", 70, 0, 0 }, { "Höhe", 70, 0, 0 }, { "Ziele", 70, 0, 0 }, { "Anhängen", 70, 0, 0 }, { "Tempo", 70, 0, 0 } }, 20 );
+	gesammtD = initLinienDiagramm( 100, 40, 600, 420, zSchrift, LDiag::Style::DatenRahmen, 0 );
+	optionenD = initLinienDiagramm( 100, 40, 600, 420, zSchrift, LDiag::Style::DatenRahmen, 0 );
+	releasen = initKnopf( 10, 470, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Zurücksetzen" );
+	zurück = initKnopf( 350, 470, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Zurück" );
+	schrift = zSchrift->getThis();
+}
+
+// Destruktor
+MenüStatistik::~MenüStatistik()
+{
+	int anz = gesammtT->getZeilenAnzahl();
+	for( int i = 0; i < anz; i++ )
+	{
+		for( int j = 0; j < 7; j++ )
+			( (TextFeld*)gesammtT->zZeichnung( j, 0 ) )->release();
+		gesammtT->removeZeile( 0 );
+	}
+	for( int j = 0; j < 7; j++ )
+		( (TextFeld*)optionenT->zZeichnung( j, 0 ) )->release();
+	ansichtT->release();
+	ansicht->release();
+	optionen->release();
+	gesammtT->release();
+	optionenT->release();
+	gesammtD->release();
+	optionenD->release();
+	releasen->release();
+	zurück->release();
+	schrift->release();
+}
+
+// nicht constant
+void MenüStatistik::reset()
+{
+	int anz = gesammtT->getZeilenAnzahl();
+	for( int i = 1; i < anz; i++ )
+	{
+		for( int j = 0; j < 7; j++ )
+			( (TextFeld*)gesammtT->zZeichnung( j, 1 ) )->release();
+		gesammtT->removeZeile( 1 );
+	}
+	anz = optionenT->getZeilenAnzahl();
+	for( int i = 1; i < anz; i++ )
+		optionenT->removeZeile( 1 );
+	InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
+	opd->laden();
+	if( !opd->wertExistiert( "Breite" ) )
+		opd->addWert( "Breite", "80" );
+	if( !opd->wertExistiert( "Höhe" ) )
+		opd->addWert( "Höhe", "50" );
+	if( !opd->wertExistiert( "Ziele" ) )
+		opd->addWert( "Ziele", "1" );
+	if( !opd->wertExistiert( "Anhängen" ) )
+		opd->addWert( "Anhängen", "10" );
+	if( !opd->wertExistiert( "Geschwindigkeit" ) )
+		opd->addWert( "Geschwindigkeit", "10" );
+	if( !opd->wertExistiert( "Fortsetzen" ) )
+		opd->addWert( "Fortsetzen", "0" );
+	opd->speichern();
+	KSGTDatei *stb = new KSGTDatei( "data/Minigames/Snake/data/score.ksgt" );
+	stb->laden();
+	anz = stb->getZeilenAnzahl();
+	bool *fertig = new bool[ anz ];
+	ZeroMemory( fertig, anz );
+	int mS = 0;
+	int omS = 0;
+	int oAnz = 0;
+	for( int i = 0; i < anz; i++ )
+	{
+		int maxScore = -1;
+		int p = -1;
+		for( int j = 0; j < anz; j++ )
+		{
+			if( !fertig[ j ] && maxScore < (int)*stb->zFeld( j, 1 ) )
+			{
+				p = j;
+				maxScore = (int)*stb->zFeld( j, 1 );
+			}
+		}
+		if( p >= 0 )
+		{
+			fertig[ p ] = 1;
+			TextFeld *scoreT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 1 )->getText() );
+			TextFeld *datumT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 0 )->getText() );
+			TextFeld *breiteT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 2 )->getText() );
+			TextFeld *höheT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 3 )->getText() );
+			TextFeld *zieleT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 5 )->getText() );
+			TextFeld *appendT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 6 )->getText() );
+			TextFeld *tempoT = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, stb->zFeld( p, 4 )->getText() );
+			gesammtT->addZeile( Text() += p );
+			gesammtT->setZeichnungZ( 0, i + 1, scoreT );
+			gesammtT->setZeichnungZ( 1, i + 1, datumT );
+			gesammtT->setZeichnungZ( 2, i + 1, breiteT );
+			gesammtT->setZeichnungZ( 3, i + 1, höheT );
+			gesammtT->setZeichnungZ( 4, i + 1, zieleT );
+			gesammtT->setZeichnungZ( 5, i + 1, appendT );
+			gesammtT->setZeichnungZ( 6, i + 1, tempoT );
+			if( breiteT->zText()->istGleich( opd->zWert( "Breite" )->getText() ) &&
+				höheT->zText()->istGleich( opd->zWert( "Höhe" )->getText() ) &&
+				zieleT->zText()->istGleich( opd->zWert( "Ziele" )->getText() ) &&
+				appendT->zText()->istGleich( opd->zWert( "Anhängen" )->getText() ) &&
+				tempoT->zText()->istGleich( opd->zWert( "Geschwindigkeit" )->getText() ) )
+			{
+				optionenT->addZeile( Text() += p );
+				int n = optionenT->getZeilenNummer( Text() += p );
+				optionenT->setZeichnungZ( 0, n, scoreT );
+				optionenT->setZeichnungZ( 1, n, datumT );
+				optionenT->setZeichnungZ( 2, n, breiteT );
+				optionenT->setZeichnungZ( 3, n, höheT );
+				optionenT->setZeichnungZ( 4, n, zieleT );
+				optionenT->setZeichnungZ( 5, n, appendT );
+				optionenT->setZeichnungZ( 6, n, tempoT );
+				if( !omS )
+					omS = maxScore;
+				oAnz++;
+			}
+		}
+		if( !mS )
+			mS = maxScore;
+	}
+	delete[] fertig;
+	DiagDaten *gd = new DiagDaten();
+	gd->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar;
+	gd->hIntervallFarbe = 0xFFFFFFFF;
+	gd->hIntervallName->setText( "Spiel" );
+	gd->rasterDicke = 1;
+	gd->rasterFarbe = 0xFF505050;
+	gd->vIntervallFarbe = 0xFFFFFFFF;
+	gd->vIntervallName->setText( "Score" );
+	gesammtD->setDiagDatenZ( gd );
+	gesammtD->addVIntervallText( mS + 1, Text() += ( mS + 1 ) );
+	gesammtD->addVIntervallText( 0, "0" );
+	gesammtD->addHIntervallText( 0, "1" );
+	if( anz > 1 )
+		gesammtD->addHIntervallText( anz - 1, Text() += anz );
+	gesammtD->addWert( "Score" );
+	gesammtD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund );
+	gesammtD->setWertFarbe( 0, 0xFF00FF00 );
+	gesammtD->zDiagWert( 0 )->hintergrund = 0xFF205050;
+	DiagDaten *od = new DiagDaten();
+	od->style = DiagDaten::Style::autoIntervall | DiagDaten::Style::autoRaster | DiagDaten::Style::intervalle | DiagDaten::Style::intervallTexte | DiagDaten::Style::Sichtbar;
+	od->hIntervallFarbe = 0xFFFFFFFF;
+	od->hIntervallName->setText( "Spiel" );
+	od->rasterDicke = 1;
+	od->rasterFarbe = 0xFF505050;
+	od->vIntervallFarbe = 0xFFFFFFFF;
+	od->vIntervallName->setText( "Score" );
+	optionenD->setDiagDatenZ( od );
+	optionenD->addVIntervallText( omS + 1, Text() += ( omS + 1 ) );
+	optionenD->addVIntervallText( 0, "0" );
+	optionenD->addHIntervallText( 0, "1" );
+	if( oAnz > 1 )
+		optionenD->addHIntervallText( oAnz - 1, Text() += oAnz );
+	optionenD->addWert( "Score" );
+	optionenD->setWertStyle( 0, DiagWert::Style::Sichtbar | DiagWert::Style::Hintergrund );
+	optionenD->setWertFarbe( 0, 0xFF00FF00 );
+	optionenD->zDiagWert( 0 )->hintergrund = 0xFF205050;
+	int j = 0;
+	for( int i = 0; i < anz; i++ )
+	{
+		gesammtD->addPunkt( 0, i, (int)*stb->zFeld( i, 1 ) );
+		if( (int)*stb->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) &&
+			(int)*stb->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) &&
+			(int)*stb->zFeld( i, 5 ) == (int)*opd->zWert( "Ziele" ) &&
+			(int)*stb->zFeld( i, 6 ) == (int)*opd->zWert( "Anhängen" ) &&
+			(int)*stb->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) )
+		{
+			optionenD->addPunkt( 0, j, (int)*stb->zFeld( i, 1 ) );
+			j++;
+		}
+	}
+	stb->release();
+	opd->release();
+	beendet = 0;
+}
+
+void MenüStatistik::doMausEreignis( MausEreignis &me )
+{
+	ansicht->doMausEreignis( me );
+	optionen->doMausEreignis( me );
+	bool vera = me.verarbeitet;
+	releasen->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+	{ // Statistik releasen
+		if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
+		{ // nur bestimmte Statistik releasen
+			InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
+			opd->laden();
+			KSGTDatei *score = new KSGTDatei( "data/Minigames/Snake/data/score.ksgt" );
+			score->laden();
+			int zeilen = score->getZeilenAnzahl();
+			for( int i = 0; i < zeilen; i++ )
+			{
+				if( (int)*score->zFeld( i, 2 ) == (int)*opd->zWert( "Breite" ) &&
+					(int)*score->zFeld( i, 3 ) == (int)*opd->zWert( "Höhe" ) &&
+					(int)*score->zFeld( i, 5 ) == (int)*opd->zWert( "Ziele" ) &&
+					(int)*score->zFeld( i, 6 ) == (int)*opd->zWert( "Anhängen" ) &&
+					(int)*score->zFeld( i, 4 ) == (int)*opd->zWert( "Geschwindigkeit" ) )
+				{
+					score->removeZeile( i );
+					i--;
+					zeilen--;
+				}
+			}
+			score->speichern();
+			score->release();
+			opd->release();
+		}
+		else // alles releasen
+			DateiRemove( "data/Minigames/Snake/data/score.ksgt" );
+		reset();
+	}
+	vera = me.verarbeitet;
+	zurück->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+		beendet = 1;
+}
+
+bool MenüStatistik::tick( double tickVal )
+{
+	bool ret = ansicht->tick( tickVal );
+	ret |= optionen->tick( tickVal );
+	ret |= releasen->tick( tickVal );
+	ret |= zurück->tick( tickVal );
+	ret |= gesammtT->tick( tickVal );
+	ret |= optionenT->tick( tickVal );
+	ret |= gesammtD->tick( tickVal );
+	ret |= optionenD->tick( tickVal );
+	return ret;
+}
+
+void MenüStatistik::render( Bild &zRObj )
+{
+	if( !ansicht->getAuswahl() )
+	{
+		if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
+			optionenT->render( zRObj );
+		else
+			gesammtT->render( zRObj );
+	}
+	else
+	{
+		if( optionen->hatStyle( KontrollKnopf::Style::Selected ) )
+			optionenD->render( zRObj );
+		else
+			gesammtD->render( zRObj );
+	}
+	ansichtT->render( zRObj );
+	ansicht->render( zRObj );
+	optionen->render( zRObj );
+	releasen->render( zRObj );
+	zurück->render( zRObj );
+}
+
+// constant
+bool MenüStatistik::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+MenüStatistik *MenüStatistik::getThis()
+{
+	ref++;
+	return this;
+}
+
+MenüStatistik *MenüStatistik::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}
+
+
+// Inhalt der MenüOptionen aus Menü.h
+// Konstruktor
+MenüOptionen::MenüOptionen( Schrift *zSchrift, Bildschirm *zScreen )
+{
+	breiteT = initTextFeld( 310, 120, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Breite:" );
+	breite = initTextFeld( 440, 120, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	breite->setTastaturEreignis( _nurNummernTE );
+	höheT = initTextFeld( 310, 160, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Spielfeld Höhe:" );
+	höhe = initTextFeld( 440, 160, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	höhe->setTastaturEreignis( _nurNummernTE );
+	zAnzahlT = initTextFeld( 310, 200, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Verschiedene Ziele:" );
+	zAnzahl = initTextFeld( 440, 200, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	zAnzahl->setTastaturEreignis( _nurNummernTE );
+	nAnzahlT = initTextFeld( 310, 240, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Länge Hinzufügen:" );
+	nAnzahl = initTextFeld( 440, 240, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	nAnzahl->setTastaturEreignis( _nurNummernTE );
+	tempoT = initTextFeld( 310, 280, 130, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Geschwindigkeit:" );
+	tempo = initTextFeld( 440, 280, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+	tempo->setTastaturEreignis( _nurNummernTE );
+	fortsetzen = initKontrollKnopf( 310, 320, 180, 20, zSchrift, KontrollKnopf::Style::Normal, "Letztes Spiel fortsetzen" );
+	fortsetzen->setMausEreignis( _ret1ME );
+	abbrechen = initKnopf( 310, 360, 85, 20, zSchrift, Knopf::Style::Sichtbar, "Abbrechen" );
+	ok = initKnopf( 405, 360, 85, 20, zSchrift, Knopf::Style::Sichtbar, "Ok" );
+	beendet = 0;
+	ref = 1;
+}
+
+// Destruktor
+MenüOptionen::~MenüOptionen()
+{
+	breiteT->release();
+	breite->release();
+	höheT->release();
+	höhe->release();
+	zAnzahlT->release();
+	zAnzahl->release();
+	nAnzahlT->release();
+	nAnzahl->release();
+	tempoT->release();
+	tempo->release();
+	fortsetzen->release();
+	abbrechen->release();
+	ok->release();
+}
+
+// nicht constant
+void MenüOptionen::reset()
+{
+	InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
+	if( !opd->laden() )
+		DateiPfadErstellen( "data/Minigames/Snake/data/optionen.ini" );
+	breite->setText( "80" );
+	if( opd->wertExistiert( "Breite" ) )
+		breite->setText( Text() += (int)*opd->zWert( "Breite" ) );
+	else
+		opd->addWert( "Breite", "80" );
+	höhe->setText( "50" );
+	if( opd->wertExistiert( "Höhe" ) )
+		höhe->setText( Text() += (int)*opd->zWert( "Höhe" ) );
+	else
+		opd->addWert( "Höhe", "50" );
+	zAnzahl->setText( "1" );
+	if( opd->wertExistiert( "Ziele" ) )
+		zAnzahl->setText( Text() += (int)*opd->zWert( "Ziele" ) );
+	else
+		opd->addWert( "Ziele", "1" );
+	nAnzahl->setText( "10" );
+	if( opd->wertExistiert( "Anhängen" ) )
+		nAnzahl->setText( Text() += (int)*opd->zWert( "Anhängen" ) );
+	else
+		opd->addWert( "Anhängen", "10" );
+	tempo->setText( "10" );
+	if( opd->wertExistiert( "Geschwindigkeit" ) )
+		tempo->setText( Text() += (int)*opd->zWert( "Geschwindigkeit" ) );
+	else
+		opd->addWert( "Geschwindigkeit", "10" );
+	fortsetzen->removeStyle( KontrollKnopf::Style::Selected );
+	if( opd->wertExistiert( "Fortsetzen" ) )
+		fortsetzen->setStyle( KontrollKnopf::Style::Selected, (int)*opd->zWert( "Fortsetzen" ) != 0 );
+	else
+		opd->addWert( "Fortsetzen", "0" );
+	beendet = 0;
+	opd->speichern();
+	opd->release();
+}
+
+void MenüOptionen::doMausEreignis( MausEreignis &me )
+{
+	breite->doMausEreignis( me );
+	höhe->doMausEreignis( me );
+	zAnzahl->doMausEreignis( me );
+	nAnzahl->doMausEreignis( me );
+	tempo->doMausEreignis( me );
+	fortsetzen->doMausEreignis( me );
+	bool vera = me.verarbeitet;
+	abbrechen->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+		beendet = 1;
+	vera = me.verarbeitet;
+	ok->doMausEreignis( me );
+	if( !vera && me.verarbeitet && me.id == ME_RLinks )
+	{
+		InitDatei *opd = new InitDatei( "data/Minigames/Snake/data/optionen.ini" );
+		if( !opd->laden() )
+			DateiPfadErstellen( "data/Minigames/Snake/data/optionen.ini" );
+		if( (int)*breite->zText() > 1000 )
+			breite->setText( "1000" );
+		if( (int)*breite->zText() < 20 )
+			breite->setText( "20" );
+		if( opd->wertExistiert( "Breite" ) )
+			opd->setWert( "Breite", Text() += (int)*breite->zText() );
+		else
+			opd->addWert( "Breite", Text() += (int)*breite->zText() );
+		if( (int)*höhe->zText() > 1000 )
+			höhe->setText( "1000" );
+		if( (int)*höhe->zText() < 20 )
+			höhe->setText( "20" );
+		if( opd->wertExistiert( "Höhe" ) )
+			opd->setWert( "Höhe", Text() += (int)*höhe->zText() );
+		else
+			opd->addWert( "Höhe", Text() += (int)*höhe->zText() );
+		if( (int)*zAnzahl->zText() > ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 )
+			zAnzahl->setText( Text() += ( ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 ) );
+		if( (int)*zAnzahl->zText() < 1 )
+			zAnzahl->setText( "1" );
+		if( opd->wertExistiert( "Ziele" ) )
+			opd->setWert( "Ziele", Text() += (int)*zAnzahl->zText() );
+		else
+			opd->addWert( "Ziele", Text() += (int)*zAnzahl->zText() );
+		if( (int)*nAnzahl->zText() > ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 )
+			nAnzahl->setText( Text() += ( ( (int)*breite->zText() * (int)*höhe->zText() ) / 100 ) );
+		if( (int)*nAnzahl->zText() < 1 )
+			nAnzahl->setText( "1" );
+		if( opd->wertExistiert( "Anhängen" ) )
+			opd->setWert( "Anhängen", Text() += (int)*nAnzahl->zText() );
+		else
+			opd->addWert( "Anhängen", Text() += (int)*nAnzahl->zText() );
+		if( (int)*tempo->zText() < 1 )
+			tempo->setText( "1" );
+		if( (int)*tempo->zText() > 10 )
+			tempo->setText( "10" );
+		if( opd->wertExistiert( "Geschwindigkeit" ) )
+			opd->setWert( "Geschwindigkeit", Text() += (int)*tempo->zText() );
+		else
+			opd->addWert( "Geschwindigkeit", Text() += (int)*tempo->zText() );
+		if( opd->wertExistiert( "Fortsetzen" ) )
+			opd->setWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) );
+		else
+			opd->addWert( "Fortsetzen", Text() += (int)fortsetzen->hatStyle( KontrollKnopf::Style::Selected ) );
+		opd->speichern();
+		opd->release();
+		beendet = 1;
+	}
+}
+
+void MenüOptionen::doTastaturEreignis( TastaturEreignis &te )
+{
+	breite->doTastaturEreignis( te );
+	höhe->doTastaturEreignis( te );
+	zAnzahl->doTastaturEreignis( te );
+	nAnzahl->doTastaturEreignis( te );
+	tempo->doTastaturEreignis( te );
+}
+
+bool MenüOptionen::tick( double tickVal )
+{
+	bool ret = breite->tick( tickVal );
+	ret |= höhe->tick( tickVal );
+	ret |= zAnzahl->tick( tickVal );
+	ret |= nAnzahl->tick( tickVal );
+	ret |= tempo->tick( tickVal );
+	ret |= fortsetzen->tick( tickVal );
+	ret |= abbrechen->tick( tickVal );
+	ret |= ok->tick( tickVal );
+	return ret;
+}
+
+void MenüOptionen::render( Bild &zRObj )
+{
+	breiteT->render( zRObj );
+	breite->render( zRObj );
+	höheT->render( zRObj );
+	höhe->render( zRObj );
+	zAnzahlT->render( zRObj );
+	zAnzahl->render( zRObj );
+	nAnzahlT->render( zRObj );
+	nAnzahl->render( zRObj );
+	tempoT->render( zRObj );
+	tempo->render( zRObj );
+	fortsetzen->render( zRObj );
+	abbrechen->render( zRObj );
+	ok->render( zRObj );
+}
+
+// constant
+bool MenüOptionen::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+MenüOptionen *MenüOptionen::getThis()
+{
+	ref++;
+	return this;
+}
+
+MenüOptionen *MenüOptionen::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}
+
+
+// Inhalt der Menü Klasse aus Menü.h
+// Konstruktor
+Menü::Menü( Schrift *zSchrift, Bildschirm *zScreen )
+{
+	spielen = initKnopf( 350, 180, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Spielen" );
+	spielenF = new MenüSpiel( zSchrift, zScreen );
+	optionen = initKnopf( 350, 220, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Optionen" );
+	optionenF = new MenüOptionen( zSchrift, zScreen );
+	statistik = initKnopf( 350, 260, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Statistik" );
+	statistikF = new MenüStatistik( zSchrift, zScreen );
+	beenden = initKnopf( 350, 300, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
+	ram = new LRahmen();
+	ram->setFarbe( 0xFFFFFFFF );
+	beendet = 0;
+	status = 0;
+	LTDBDatei *bgd = new LTDBDatei();
+	bgd->setDatei( new Text( "data/Minigames/Snake/bilder/hintergrund.ltdb" ) );
+	bgd->leseDaten( 0 );
+	hintergrund = bgd->laden( 0, new Text( "bg.jpg" ) );
+	bgd->release();
+	ref = 1;
+}
+
+// Destruktor
+Menü::~Menü()
+{
+	spielen->release();
+	spielenF->release();
+	optionen->release();
+	optionenF->release();
+	statistik->release();
+	statistikF->release();
+	beenden->release();
+	if( hintergrund )
+		hintergrund->release();
+	ram->release();
+}
+
+// nicht constant
+void Menü::reset()
+{
+	status = 0;
+	beendet = 0;
+}
+
+void Menü::doMausEreignis( MausEreignis &me )
+{
+	switch( status )
+	{
+	case 0:
+		if( 1 )
+		{
+			bool vera = me.verarbeitet;
+			spielen->doMausEreignis( me );
+			if( !vera && me.verarbeitet && me.id == ME_RLinks )
+			{
+				spielenF->reset();
+				status = 3;
+			}
+			vera = me.verarbeitet;
+			optionen->doMausEreignis( me );
+			if( !vera && me.verarbeitet && me.id == ME_RLinks )
+			{
+				optionenF->reset();
+				status = 1;
+			}
+			vera = me.verarbeitet;
+			statistik->doMausEreignis( me );
+			if( !vera && me.verarbeitet && me.id == ME_RLinks )
+			{
+				statistikF->reset();
+				status = 2;
+			}
+			vera = me.verarbeitet;
+			beenden->doMausEreignis( me );
+			if( !vera && me.verarbeitet && me.id == ME_RLinks )
+				beendet = 1;
+		}
+		break;
+	case 1:
+		optionenF->doMausEreignis( me );
+		break;
+	case 2:
+		statistikF->doMausEreignis( me );
+		break;
+	case 3:
+		spielenF->doMausEreignis( me );
+	}
+}
+
+void Menü::doTastaturEreignis( TastaturEreignis &te )
+{
+	if( status == 1 )
+		optionenF->doTastaturEreignis( te );
+	if( status == 3 )
+		spielenF->doTastaturEreignis( te );
+}
+
+bool Menü::tick( double z )
+{
+	switch( status )
+	{
+	case 0:
+		if( 1 )
+		{
+			bool ret = spielen->tick( z );
+			ret |= statistik->tick( z );
+			ret |= optionen->tick( z );
+			ret |= beenden->tick( z );
+			return ret;
+		}
+	case 1:
+		if( optionenF->istBeendet() )
+		{
+			status = 0;
+			return 1;
+		}
+		return optionenF->tick( z );
+	case 2:
+		if( statistikF->istBeendet() )
+		{
+			status = 0;
+			return 1;
+		}
+		return statistikF->tick( z );
+	case 3:
+		if( spielenF->istBeendet() )
+		{
+			status = 0;
+			return 1;
+		}
+		return spielenF->tick( z );
+	}
+	return 0;
+}
+
+void Menü::render( Bild &zRObj )
+{
+	if( status != 3 && hintergrund )
+		zRObj.drawBild( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), *hintergrund );
+	switch( status )
+	{
+	case 0:
+		ram->setPosition( 300, 170 );
+		ram->setSize( 200, 160 );
+		zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
+		ram->render( zRObj );
+		spielen->render( zRObj );
+		statistik->render( zRObj );
+		optionen->render( zRObj );
+		beenden->render( zRObj );
+		break;
+	case 1:
+		ram->setPosition( 300, 110 );
+		ram->setSize( 200, 280 );
+		zRObj.alphaRegion( ram->getX(), ram->getY(), ram->getBreite(), ram->getHeight(), 0xD0000000 );
+		ram->render( zRObj );
+		optionenF->render( zRObj );
+		break;
+	case 2:
+		if( hintergrund )
+			zRObj.alphaRegion( 0, 0, hintergrund->getBreite(), hintergrund->getHeight(), 0xD0000000 );
+		statistikF->render( zRObj );
+		break;
+	case 3:
+		spielenF->render( zRObj );
+	}
+}
+
+// constant
+bool Menü::istBeendet() const
+{
+	return beendet;
+}
+
+// Reference Counting
+Menü *Menü::getThis()
+{
+	ref++;
+	return this;
+}
+
+Menü *Menü::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 167 - 0
Snake/Menü.h

@@ -0,0 +1,167 @@
+#ifndef Menü_H
+#define Menü_H
+
+#include <Knopf.h>
+#include <Tabelle.h>
+#include <Diagramm.h>
+#include <AuswahlBox.h>
+#include "Map.h"
+
+using namespace Framework;
+
+class MenüVerloren
+{
+private:
+	LRahmen *ram;
+	TextFeld *verloren;
+	Knopf *neu;
+	Knopf *beenden;
+	int ref;
+
+public:
+	// Kontruktor
+	MenüVerloren( Schrift *zSchrift );
+	// Destruktor
+	~MenüVerloren();
+	// nicht constant
+	int doMausEreignis( MausEreignis &me );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// Reference Counting
+	MenüVerloren *getThis();
+	MenüVerloren *release();
+};
+
+class MenüSpiel
+{
+private:
+	TextFeld *scoreT;
+	Knopf *beenden;
+	Map *map;
+	MenüVerloren *verloren;
+	bool beendet;
+	int ref;
+
+public:
+	// Konstruktor
+	MenüSpiel( Schrift *zSchrift, Bildschirm *zScreen );
+	// Destruktor
+	~MenüSpiel();
+	// nicht constant
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	void doTastaturEreignis( TastaturEreignis &te );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// constant
+	bool istBeendet() const;
+	// Reference Counting
+	MenüSpiel *getThis();
+	MenüSpiel *release();
+};
+
+class MenüStatistik
+{
+private:
+	TextFeld *ansichtT;
+	AuswahlBox *ansicht;
+	KontrollKnopf *optionen;
+	ObjTabelle *gesammtT;
+	ObjTabelle *optionenT;
+	LDiag *gesammtD;
+	LDiag *optionenD;
+	Knopf *releasen;
+	Knopf *zurück;
+	Schrift *schrift;
+	bool beendet;
+	int ref = 1;
+
+public:
+	// Konstruktor
+	MenüStatistik( Schrift *zSchrift, Bildschirm *zScreen );
+	// Destruktor
+	~MenüStatistik();
+	// nicht constant
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// constant
+	bool istBeendet() const;
+	// Reference Counting
+	MenüStatistik *getThis();
+	MenüStatistik *release();
+};
+
+class MenüOptionen
+{
+private:
+	TextFeld *breiteT;
+	TextFeld *breite;
+	TextFeld *höheT;
+	TextFeld *höhe;
+	TextFeld *zAnzahlT;
+	TextFeld *zAnzahl;
+	TextFeld *nAnzahlT;
+	TextFeld *nAnzahl;
+	TextFeld *tempoT;
+	TextFeld *tempo;
+	KontrollKnopf *fortsetzen;
+	Knopf *abbrechen;
+	Knopf *ok;
+	bool beendet;
+	int ref;
+
+public:
+	// Konstruktor
+	MenüOptionen( Schrift *zSchrift, Bildschirm *zScreen );
+	// Destruktor
+	~MenüOptionen();
+	// nicht constant
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	void doTastaturEreignis( TastaturEreignis &te );
+	bool tick( double tickVal );
+	void render( Bild &zRObj );
+	// constant
+	bool istBeendet() const;
+	// Reference Counting
+	MenüOptionen *getThis();
+	MenüOptionen *release();
+};
+
+class Menü
+{
+private:
+	Knopf *spielen;
+	MenüSpiel *spielenF;
+	Knopf *optionen;
+	MenüOptionen *optionenF;
+	Knopf *statistik;
+	MenüStatistik *statistikF;
+	Knopf *beenden;
+	Bild *hintergrund;
+	LRahmen *ram;
+	bool beendet;
+	int status;
+	int ref;
+
+public:
+	// Konstruktor
+	Menü( Schrift *zSchrift, Bildschirm *zScreen );
+	// Destruktor
+	~Menü();
+	// nicht constant#
+	void reset();
+	void doMausEreignis( MausEreignis &me );
+	void doTastaturEreignis( TastaturEreignis &te );
+	bool tick( double z );
+	void render( Bild &zRObj );
+	// constant
+	bool istBeendet() const;
+	// Reference Counting
+	Menü *getThis();
+	Menü *release();
+};
+
+#endif

+ 184 - 0
Snake/Snake.vcxproj

@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{6F83FB3E-9489-4466-B0C3-80C9E793786F}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>Snake</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\x64\Debug;$(LibraryPath)</LibraryPath>
+    <CustomBuildBeforeTargets>
+    </CustomBuildBeforeTargets>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\Release;$(LibraryPath)</LibraryPath>
+    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\..\..\Include;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\x64\Release;$(LibraryPath)</LibraryPath>
+    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SNAKE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SNAKE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>Framework.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuildStep>
+      <Outputs>kopieren...;%(Outputs)</Outputs>
+      <Command>copy "..\x64\Debug\Snake.dll" "..\..\..\Fertig\Debug\Minigames\x64\Snake\bin\game.dll"</Command>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SNAKE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>Framework.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuildStep>
+      <Outputs>kopieren...;%(Outputs)</Outputs>
+      <Command>copy "..\Release\Snake.dll" "..\..\..\Fertig\Minigames\x32\Snake\bin\game.dll"</Command>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SNAKE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>Framework.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <CustomBuildStep>
+      <Outputs>kopieren...;%(Outputs)</Outputs>
+      <Command>copy "..\x64\Release\Snake.dll" "..\..\..\Fertig\Minigames\x64\Snake\bin\game.dll"</Command>
+    </CustomBuildStep>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="Game.h" />
+    <ClInclude Include="Initialisierung.h" />
+    <ClInclude Include="Map.h" />
+    <ClInclude Include="Menü.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Einstieg.cpp" />
+    <ClCompile Include="Game.cpp" />
+    <ClCompile Include="Initialisierung.cpp" />
+    <ClCompile Include="Map.cpp" />
+    <ClCompile Include="Menü.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 48 - 0
Snake/Snake.vcxproj.filters

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Quelldateien">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Headerdateien">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Ressourcendateien">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Game.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Menü.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Initialisierung.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="Map.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Game.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Menü.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Initialisierung.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Map.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="Einstieg.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+  </ItemGroup>
+</Project>

+ 3 - 0
build.bat

@@ -0,0 +1,3 @@
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "snake.sln" /p:configuration=release /p:platform=win32
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "snake.sln" /p:configuration=release /p:platform=x64
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "snake.sln" /p:configuration=debug /p:platform=x64