• Strich für Strich zum Fraktal – die Turtlegrafik

      0 comments

    Turtle-, Igel- oder Froschgrafik – viele Ausdrücke für eine doch recht einfache Bildbeschreibungsgrafik, genutzt bei Stiftplottern oder der vielleicht doch bekannten Programmierprache LOGO.

    Für die Programmierherausforderung wird die Turtlegrafik genutzt, um das eigentliche Fraktal zu zeichnen. Weil im gesamten Programmverlauf mehr als ein Turtle – Objekt genutzt wird, wird die Turtlegrafik als eigenstädige Klasse implementiert.

    Neben den 4 erlaubten Methoden beinhaltet die Turtle-Klasse einen Konstruktor, in dem alle wichtigen Variablen initialisiert werden.

    TurtleGrafic( Color color)
    {
         Winkel=0;
         xPos=0;
         yPos=0;
         redPen = gcnew Pen(color);
         redPen->Width=1.0F;
    }

    Neben der Initialisierung der Variablen, wird auch ein Pen – Objekt mit der vom User ausgewählten Farbe initialisiert. Dazu bekommt es noch die Strichstärke von 1. Der Pen wird genutzt, um auf unserem Graphics – Element später zu zeichnen.

    Die wichtigste Methode ist wohl neben dem Konstruktor die forward – Methode. Diese berechnet die neuen Koordinaten, zu der die Turtle “laufen” und dabei einen ganz normalen Strich zeichnen soll.

    void forward(Graphics ^gr,Int32 n)
    {
      Int32 xStart, yStart;
      xStart=xPos;
      yStart=yPos;
      g=gr;
      Double pi=System::Math::PI;
      Double rad = (pi * (Winkel-90))/180;
      xPos+= Convert::ToInt32(
    	          System::Math::Round(
    		      Convert::ToDouble(n*System::Math::Cos(rad))));
      yPos+= Convert::ToInt32(
    		  System::Math::Round(
    		      Convert::ToDouble(n*System::Math::Sin(rad))));
      g->DrawLine(redPen,xStart,yStart,xPos,yPos);
    }

    Die Berechnung des Punktes, zu dem unsere Turtle laufen soll, erfolgt in zwei bzw. drei (wenn man die Berechnung für den x und y Wert getrennt betracht) Schritten.
    Schritt 1:
    Umwandlung des gegebenen Winkels ins Bogenmaß. In der Schule wird dazu die Gleichung gelehrt
    Bogenmaß = Grad * Pi/180. Fast die gleiche benutzt die Turtle auch, nur mit dem Unterschied, dass aufgrund der Tatsache, dass der Koordinatenursprung links oben in der Ecke liegt, die Turtel noch einmal um 90° nach links gedreht wird.
    Schritt 2:
    Mithilfe des eben berechneteten Bogenmaßes wird die neue Koordinate berechnet. Um den neuen y-Wert zu berechnen, wird der sin(winkel) gezogen. Der X-Wert aus dem cos(Winkel). Da die Grundlänge einen Wert n hat und nicht dem Einheitskreis entspricht, wird die Grundlänge n noch dazu multipliziert.
    Mit den neuen Koordinaten kann die Turtle schlußendlich ihre Linie zeichnen.
    Als Dritte wichtige Methode ist noch die turn Methode zu erwähnen.

    void turn(Int32 a)
    {
        Winkel =(Winkel+a)% 360;
    }

    Die kleine Methode dreht den Blickwinkel unserer Turtle um den Winkel den wir angeben.
    Je nach Vorzeichen dreht sie sich nach links oder nach rechts.

    Um die Turtel an einer bestimmten Koordinate zu platzieren, wird die Methode SetXY genutzt.

    void setXY(Int32 x, Int32 y)
    {
        Winkel=0;
        xPos=x;
        yPos=y;
    }
  • Slotmaschine Teil 1

      0 comments

    Als Entwicklungsumgebung nutze ich das Visual Studio 2010 von Microsoft (auch wenn ich mich mit dem fehlenden IntelliSense schwer abfinden kann). Als .NET Frameworks habe ich bis zu Version 4 alle installiert. Die Entwicklung selber funktioniert auch bei ältern Versionen ohne Probleme.

    Als Projekt nutze ich eine CLR – Konsolenanwendung.
    Das Grundgerüst wird automatisch von der Entwicklungsumgebung erstellt.

    #include "stdafx.h"
     
    using namespace System;
     
    int main(array<System::String ^> ^args)
    {
        Console::WriteLine(L"Hello World");
        return 0;
    }

    Die „Hello World“ Konsolenausgabe werden wir nachher für unsere Zwecke nutzen, somit brauchen wir sie nicht zu löschen.

    Wir benötigen folgenden Variablen

    Punkte – Eine Ganzzahl, die wir mit dem Wert 100 vorbelegen
    3 Slots – 3 Ganzzahlen die mit Zufallswerten zwischen 1 und 10 „gefüttert“ werden
    Random – Das Randomobjekt, das uns die Zufallswerte ermittelt
    Wahl – Wir lesen eine Tastatureingabe ein um das Spiel am laufen zu halten

    Das Programm sollte nun so aussehen

    #include "stdafx.h"
     
    using namespace System;
     
    int main(array<System::String ^> ^args)
    {
        Int32 punkte=100;
        Int32 slot1, slot2, slot3;
        Random random;
        char wahl;
        Console::WriteLine(L"Hello World");
        return 0;
    }

    Für das Erzeugen von zufälligen Werten und die Belegung unserer Slots mit diesen Werten muss zuerst das Randomobjekt initialisiert werden.
    Nachdem dies geschehen ist weisen wir einfach mit random->Next(1,10); den einzelnen Slots die Zufallswerte hinzu.

    Damit man auch etwas im Konsolenprogramm sieht führen wir nehmen den Ausgaben unserer Slots , noch eine Abfrage ein ob wir eine weitere Runde spielen wollen.

    #include "stdafx.h"
     
    using namespace System;
     
    int main(array<System::String ^> ^args)
    {
        Int32 punkte=100;
        Int32 slot1, slot2, slot3;
        Random ^random= gcnew Random();
        char wahl;
        slot1= random->Next(1,10);
        slot2= random->Next(1,10);
        slot3= random->Next(1,10);
        Console::WriteLine("Position1 hat den wert: {0}",slot1);
        Console::WriteLine("Position2 hat den wert: {0}",slot2);
        Console::WriteLine("Position3 hat den wert: {0}",slot3);
        Console::WriteLine("Wollen sie noch eine Runde spielen?");
        Console::WriteLine("Drücken sie für JA die Taste j");  
        Console::WriteLine("und mit enter bestätigen");
        wahl=Convert::ToChar(Console::ReadLine());
        return 0;
    }

    Nun ist es fast geschafft. Nun benötigen wir nur noch eine Schleife, die es uns ermöglicht weitere runden zu spielen. Ebenso muss noch der Einsatz abgezogen und gegebenfalls der Gewinn zu unseren Punkten hinzugerechnet werden.

    #include "stdafx.h"
     
    using namespace System;
     
    int main(array<System::String ^> ^args)
    {
      Int32 punkte=100;
      Int32 slot1, slot2, slot3;
      Random ^random= gcnew Random();
      char wahl;
      do
      {
        slot1= random->Next(1,10);
        slot2=random->Next(1,10);
        slot3=random->Next(1,10);
        if (slot1==slot2 && slot2==slot3)
       {
         punkte+=5;
         Console::WriteLine("Slot1 hat den wert: {0}",slot1);
         Console::WriteLine("Slot2 hat den wert: {0}",slot2);
         Console::WriteLine("Slot3 hat den wert: {0}",slot3);
         Console::WriteLine("Sie haben jetzt {0} Punkte",punkte);
        }
        else
        {
          punkte-=5;
          Console::WriteLine("Slot1 hat den wert: {0}",slot1);
          Console::WriteLine("Slot2 hat den wert: {0}",slot2);
          Console::WriteLine("Slot3 hat den wert: {0}",slot3);
          Console::WriteLine("Sie haben jetzt {0} Punkte",punkte);
         }
        Console::WriteLine("Wollen sie noch eine Runde spielen?");
        Console::WriteLine("Drücken sie für JA die Taste j" );
        Console::WriteLine("und mit enter bestätigen");
        wahl=Convert::ToChar(Console::ReadLine());
      }
      while(wahl=='j' && punkte!=0);
      return 0;
    }

    Et Voíla die erste Version der Slotmaschine ist fertig.

    Viel Spaß mit dem 1. Teil

    littleAngel