myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » Smalltalk » Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Seiten (17): « vorherige 1 [2] 3 4 5 6 nächste » ... letzte » Antwort erstellen
Zum Ende der Seite springen  

Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
zommi zommi ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2617.png


Dabei seit: 14.11.2007
Beiträge: 1.231
Entwicklungsumgebung: VS 2005+2010
Herkunft: Berlin


zommi ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von edsplash:
C#-Code:
(number & (number - 1)) == 0

Du musst allerdings noch die 0 ausschließen. (0 ist keine Zweierpotenz)
Siehe  Rausfinden ob eine Zahl 2^x ist.

beste Grüße
zommi
22.01.2010 09:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 47.571
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zommi, hallo edsplash,

es muss mehr ausgeschlossen werden als die 0. Bei der C#-Integer-Arithmetik, muss es heißen:

C#-Code:
number > 0 && (number & (number - 1)) == 0

Denn sonst wird zusätzlich zu dem Fehler bei der 0 bei int.MinValue (-2.147.483.648 bzw. 0x80000000) entweder eine OverflowException ausgelöst (checked) oder die Zahl fälschlich als Zweierpotenz erkannt (unchecked).

herbivore

PS: Damit habe ich wohl die erste korrekte Lösung. :-) Aber ich nehme als nächste Aufgabe einfach die, die edsplash vorgegeben hat.
22.01.2010 09:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
F.Z. F.Z. ist männlich
myCSharp.de-Mitglied

Dabei seit: 30.09.2009
Beiträge: 155
Entwicklungsumgebung: VS 2010


F.Z. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

C#-Code:
static void Main(string[] args)
        {
            int a=10,b=78;
            int[] Werte = Euklid(a, b);
            Console.WriteLine("{0} = {1} * {2} + {3} * {4}", Werte[0], Werte[1], a, Werte[2], b);
            Console.ReadLine();
        }

        private static int[] Euklid(int a, int b)
        {
            if(b==0)
                return new int[]{a,1,0};
            int[] Strich = Euklid(b, a % b);
            int[] Werte = new int[3];
            Werte[0] = Strich[0];
            Werte[1] = Strich[2];
            Werte[2] = Strich[1] - (int)(a / b) * Strich[2]; ;
            return Werte;
        }

Nächste Aufgabe:

Den erweiterten euklidischen Algorithmus iterativ implementieren.

Grüße FZ
22.01.2010 15:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
abra_joe
myCSharp.de-Mitglied

Dabei seit: 04.12.2008
Beiträge: 23

Themenstarter Thema begonnen von abra_joe

abra_joe ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

C#-Code:
        static void Main(string[] args)
        {
           int z1 = Int32.Parse(Console.ReadLine());
           int z2 = Int32.Parse(Console.ReadLine());
           while (z2!=0)
           {
               if (z1 > z2)
                   z1 -= z2;
               else
                   z2 -= z1;
           }
           Console.WriteLine(z1);
           Console.ReadLine();
        }

stimmt doch oder?
23.01.2010 13:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
m0rius
myCSharp.de-Mitglied

images/avatars/avatar-3125.png


Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional


m0rius ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo abra_joe,

es geht um den erweiterten euklidischen Algorithmus (s.  Wikipedia-Artikel).

m0rius
23.01.2010 13:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
abra_joe
myCSharp.de-Mitglied

Dabei seit: 04.12.2008
Beiträge: 23

Themenstarter Thema begonnen von abra_joe

abra_joe ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

muss ich wohl übersehen haben
tut mir leid....
23.01.2010 13:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LuckyGeorge LuckyGeorge ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3262.jpg


Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010


LuckyGeorge ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vielleicht nicht die schönste Implementierung aber das sollte es eigentlich sein:

C#-Code:
static void Main()
{
    bool parseOk = false;
    int a=0, b=0;
    while (!parseOk)
    {
        Console.WriteLine("Integer Wert a: ";);
        parseOk = Int32.TryParse(Console.ReadLine(), out a);
    }
    parseOk = false;
    while (!parseOk)
    {
        Console.WriteLine("Integer Wert b: ";);
        parseOk = Int32.TryParse(Console.ReadLine(), out b);
    }

    int ggT, x, y;

    if (a > b)
    {
        ExtendedEuclidian(a, b, out ggT, out x, out y);
        Console.WriteLine(a + " * " + x + " + " + b + " * " + y + " = " + ggT);
        Console.WriteLine(a * x + b * y == ggT ? "Stimmt!" : "Stimmt net!";);
    }
    else
    {
        ExtendedEuclidian(b, a, out ggT, out x, out y);
        Console.WriteLine(b + " * " + x + " + " + a + " * " + y + " = " + ggT);
        Console.WriteLine(b * x + a * y == ggT ? "Stimmt!" : "Stimmt net!";);
    }
    Console.ReadKey();
}

private static void ExtendedEuclidian(int a, int b, out int ggT, out int x, out int y)
{
    if (a%b == 0)
    {
        x = 0;
        y = 1;
        ggT = b*y;
        return;
    }

    int dggT, dX, dY, divRem;
    ExtendedEuclidian(b, a % b, out dggT, out dX, out dY);
    x = dY;
    y = dX - dY * Math.DivRem(a, b, out divRem);
    ggT = a * x + b * y;
}

Hatte noch ein Pseudocodeschnippsel in alten Vorlesungsunterlagen ....

*EDIT*: Formatierung angepasst.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LuckyGeorge am 26.01.2010 19:31.

26.01.2010 19:23 Beiträge des Benutzers | zu Buddylist hinzufügen
m0rius
myCSharp.de-Mitglied

images/avatars/avatar-3125.png


Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional


m0rius ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo LuckyGeorge,

deine Implementierung ist rekursiv, gewollt war eine iterative ...

m0rius

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m0rius am 26.01.2010 19:53.

26.01.2010 19:52 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LuckyGeorge LuckyGeorge ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3262.jpg


Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010


LuckyGeorge ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ok, wer lesen kann ist klar im Vorteil. Nun aber:

C#-Code:
        private static void ExtendedEuclidianIterative(int a, int b, out int ggT, out int x, out int y)
        {
            x = 0;
            y = 1;
            int dX = 1, dY = 0;

            while(b != 0)
            {
                int divRem;
                int divQuot = Math.DivRem(a, b, out divRem);
                int temp = b;
                b = divRem;
                a = temp;

                temp = x;
                x = dX - divQuot * x;
                dX = temp;

                temp = y;
                y = dY - divQuot*y;
                dY = temp;
            }

            ggT = a;
            x = dX;
            y = dY;
        }

PS: Stammt natürlich nicht von mir sondern aus der Wiki. Nur was soll man bei solchen Algorithmen denn machen ....
26.01.2010 20:18 Beiträge des Benutzers | zu Buddylist hinzufügen
F.Z. F.Z. ist männlich
myCSharp.de-Mitglied

Dabei seit: 30.09.2009
Beiträge: 155
Entwicklungsumgebung: VS 2010


F.Z. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo LuckyGeorge,

dein Algorithmus scheint in Ordnung zu sein, nun darfst du auch die nächste Aufgabe stellen.

Viel Spaß mit diese Thread wünscht
FZ
26.01.2010 21:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LuckyGeorge LuckyGeorge ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3262.jpg


Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010


LuckyGeorge ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ok, dann mal weg von den reinen Algorithmen.

Ich hätte gern die Implementierung des  Marienbad Spieles mit einem Computergegner. Als Darstellung reicht die Anzahl der Hölzer als Zahl der jeweiligen Reihe. Die Ausgangsposition sieht also so aus:

1
3
5
7

Der Computergegner soll, wenn es möglich ist, die optimale Strategie fahren. Optional kann auch noch berechnet werden ob für die jeweilige Spielsituation des Computergegners eine Gewinnstrategie existiert. Einen Hinweis dazu, wie das gehen kann findet ihr hier:

 http://www-i1.informatik.rwth-aachen.de/...hmus/algo14.php

Die Aufgabe ist ein wenig umfangreicher als ein reiner Algorithmus aber die meiste Arbeit bezieht sich eigentlich auf die Eingabe. Falls eine solche Aufgabe den Rahmen des Threads sprengt - ich hätte auch noch eine etwas kleinere.
27.01.2010 08:55 Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

die vorgabe lautet "in ca. 50 zeilen code umsetzbar".
27.01.2010 09:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LuckyGeorge LuckyGeorge ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3262.jpg


Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010


LuckyGeorge ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

[offtopic]@JAck30lena: Hmm, ich finde in diesem Thread mindestens 3 Lösungen die dieser Vorgabe nicht entsprechen und so aufwendig ist die Implementierung auch nicht.[/offtopic]

Aber gut, dann die etwas weniger spassige Aufgabe:
Das Programm muss einen Kreis "zeichnen" können durch Eingabe des Radius. Als Zeichenfeld soll ein einfaches 2 Dimensionales boolsches Array verwendet werden bei dem der Hintergrund false und der Kreis selbst true ist. Der Mittelpunkt des Kreises ist immer der Mittelpunkt des Arrays.
Die Implementierung darf nicht den naiven Ansatz verwenden, dh. einfach nur die Berechnung der Koordinaten durch:

x = R*cos(alpha) und y = R*sin(alpha)

ist nicht ausreichend. Ich schätze, daß die Implementierung in 50 Zeilen mit Eingabe möglich ist da der eigentliche Algorithmus ca. 20 Zeilen umfasst.
27.01.2010 09:25 Beiträge des Benutzers | zu Buddylist hinzufügen
Siassei Siassei ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.02.2008
Beiträge: 401


Siassei ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich erwecke das Thema mal aus dem Winterschlaf. Ich lass immer mit hohem Interesse mit.

Zitat:
Die Implementierung darf nicht den naiven Ansatz verwenden, dh. einfach nur die Berechnung der Koordinaten durch:
x = R*cos(alpha) und y = R*sin(alpha)

Am Ende lässt sich alles darauf zurück führen :-) Dennoch gibt es wohl ein paar Möglichkeiten, da du das Koordinatensystem nicht festgelegt hast ;-)
Ich benutze die ganze normale Kreisgleichung: R² = x² + y² mit: x [-R ; R]

C#-Code:
/// <summary>
///
/// </summary>
/// <param name="args">
/// A <see cref="String[]"/>
/// </param>
public static void Main(String[] args)
{
    uint R = 1;
    uint aufl = 1;
    bool[][] a = calcCircleArray (R, aufl);

    int i, j;
    for (i = 0; i < a.Length; i++) {
        for (j = 0; j < a[i].Length; j++)
            if (a[i][j])
                System.Console.Write ("+");
            else
                System.Console.Write ("#");

        System.Console.WriteLine ();
    }
}


/// <summary>
///
/// </summary>
/// <param name="R">
///     Radius des Kreises
/// </param>
/// <param name="n">
///     Auflösung: xStep = R * n
/// </param>
/// <returns>
///     
/// </returns>              
public static bool[][] calcCircleArray (uint R, uint n)
{
    uint xStep = R * n;
    uint xMax = xStep << 1;

    return calcCircleArray (R, n, xMax + 1, xMax + 1);
}


/// <summary>
///
/// </summary>
/// <param name="R">
///     Radius des Kreises
/// </param>
/// <param name="n">
///     n * R = Werte in X-Richtung für R
///     n: Bits für die Zahl 1
///
///     Auflösung: xStep = R * n
///     xmax = xStep * R <= xLength
///     xmax = xStep * R <= yLength
/// </param>
/// <param name="xLength">
///     Länge des Array in x-Richtung
///     xmax = xStep * R <= xLength
/// </param>
/// <param name="yLength">
///     Länge des Array in y-Richtung
///     xmax = xStep * R <= yLength
/// </param>
/// <returns>
///     
/// </returns>
public static bool[][] calcCircleArray (uint R, uint n, uint xLength, uint yLength)
{
    uint xStep = R * n;
    uint xMax = xStep << 1;
    uint xm = xLength >> 1;
    uint ym = yLength >> 1;

    if (xLength < xMax)
        throw new ArgumentException ("xLength = " + xLength + " < xMax = " + xMax);

    else if (yLength < xMax)
        throw new ArgumentException ("yLength = " + yLength + " < xMax = " + xMax);

    else if ((xStep << 1) >= xLength)
        throw new ArgumentException ("xStep * 2 = " + xStep * 2 + " >= xLength = " + xLength);

    else if ((xStep << 1) >= yLength)
        throw new ArgumentException ("xStep * 2 = " + xStep * 2 + " >= yLength = " + yLength);

    // init. Array
    bool[][] res = new bool[xLength][];

    for (uint i = 0; i < res.Length; i++) {
        res[i] = new bool[yLength];
    }

    // Berechne Array
    // Kreisformel: R² = x² + y²
    double y;
    double R2 = Math.Pow (xStep, 2.0);
//            double xmd = (double) xm;
            double ymd = (double) ym;

    // Optimierung noch möglich
    for (uint i = 0; i <= xStep; i++) {
        y = Math.Sqrt (R2 - Math.Pow (i, 2.0));

        if(Double.IsNaN(y)) // Außerhabl des Wertebereiches
           continue;

        res[xm + i][(int) Math.Round(ymd + Math.Round(y))] = true;
        res[xm - i][(int) Math.Round(ymd + Math.Round(y))] = true;

        res[xm + i][(int) Math.Round(ymd - Math.Round(y))] = true;
        res[xm - i][(int) Math.Round(ymd - Math.Round(y))] = true;
    }

    return res;
}

Ausgabe:

Code:
1:
2:
3:
#+#
+#+
#+#

// Edit: Rundungsfehler reduziert

@fz 7090 Das liegt daran, dass ich den y-Wert zu bald in int überführe

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Siassei am 03.02.2010 19:48.

03.02.2010 10:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
F.Z. F.Z. ist männlich
myCSharp.de-Mitglied

Dabei seit: 30.09.2009
Beiträge: 155
Entwicklungsumgebung: VS 2010


F.Z. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

dein Code ergibt für größere R kein geschlossenen Kreis...

Grü0e FZ
03.02.2010 18:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LuckyGeorge LuckyGeorge ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3262.jpg


Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010


LuckyGeorge ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sorry, hatte gestern und heute Mamutbesprechungen und habe die Antwort jetzt erst gesehen.
Grundsätzlich gilt, was fz7090 schon sagte - leider kein geschlossener Kreis. Der Grund liegt in der von Dir verwendeten Kreisformel welche sich nur bedingt auf diskrete Darstellungen übertragen lässt. Es gibt einen Weg ohne Quadrat und Wurzel .... der aber so (mit Absicht) nicht gefordert ist, also keine Angst.

Grundsätzlich bist Du schon auf dem richtigen Weg, da Du die Spiegelung an den Achsen beachtet und damit nicht den rein naiven Ansatz gewählt hast. Nun noch die Lücken schliessen und Du hast es. ;)
04.02.2010 16:16 Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Zitat:
Es gibt einen Weg ohne Quadrat und Wurzel ....

...und nennt sich Bresenham-Algorithmus.
Ich hab ihn mal für den Spezialfall angepasst.

C#-Code:
  class Program
  {
    static void BuildOctant(int r, bool[,] res)
    {
      int f = 1 - r;
      int fx = 0;
      int fy = -2*r;
      int x = 0;
      int y = r;

      res[x+r, y+r] = true;
      while (x < y)
      {
        if (f >= 0)
        {
          y--;
          fy += 2;
          f += fy;
        }
        x++;
        fx += 2;
        f += fx + 1;
        res[x+r, y+r] = true;
      }
    }
    public static void Main(string[] args)
    {
      int r = 0;
      Console.Write("Radius: ");
      while(!(int.TryParse(Console.ReadLine(), out r) && (r > 0))){
        Console.WriteLine("Der Radius muss eine Ganzzahl größer 0 sein!");
        Console.Write("Radius: ");
      }
      bool[,] res = new bool[2*r+1, 2*r+1];
      // Grundoktant
      BuildOctant(r, res);
      //Spiegelung:
      for(int y = 2*r; y >= 3*r/4; y--)
      {
        for(int x = r; x <= 2*r; x++)
        {
          res[y, x] = res[x, y];
          res[2*r-x, y] = res[x, y];
          res[x, 2*r-y] = res[x, y];
          res[2*r-x, 2*r-y] = res[x, y];
        }
      }
      // Ausgabe:
      for(int y = 0; y <= 2*r; y++)
      {
        for(int x = 0; x <= 2*r; x++)
        {
          Console.Write(res[x, y] ? "0" : "x");
        }
        Console.WriteLine();
      }
      Console.ReadKey();
    }
  }

Ausgabe mit r=1:

Code:
1:
2:
3:
x0x
0x0
x0x

Ausgabe mit r=15:

Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
xxxxxxxxxxxx0000000xxxxxxxxxxxx
xxxxxxxxx000xxxxxxx000xxxxxxxxx
xxxxxxx00xxxxxxxxxxxxx00xxxxxxx
xxxxxx0xxxxxxxxxxxxxxxxx0xxxxxx
xxxxx0xxxxxxxxxxxxxxxxxxx0xxxxx
xxxx0xxxxxxxxxxxxxxxxxxxxx0xxxx
xxx0xxxxxxxxxxxxxxxxxxxxxxx0xxx
xx0xxxxxxxxxxxxxxxxxxxxxxxxx0xx
xx0xxxxxxxxxxxxxxxxxxxxxxxxx0xx
x0xxxxxxxxxxxxxxxxxxxxxxxxxxx0x
x0xxxxxxxxxxxxxxxxxxxxxxxxxxx0x
x0xxxxxxxxxxxxxxxxxxxxxxxxxxx0x
0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx0
x0xxxxxxxxxxxxxxxxxxxxxxxxxxx0x
x0xxxxxxxxxxxxxxxxxxxxxxxxxxx0x
x0xxxxxxxxxxxxxxxxxxxxxxxxxxx0x
xx0xxxxxxxxxxxxxxxxxxxxxxxxx0xx
xx0xxxxxxxxxxxxxxxxxxxxxxxxx0xx
xxx0xxxxxxxxxxxxxxxxxxxxxxx0xxx
xxxx0xxxxxxxxxxxxxxxxxxxxx0xxxx
xxxxx0xxxxxxxxxxxxxxxxxxx0xxxxx
xxxxxx0xxxxxxxxxxxxxxxxx0xxxxxx
xxxxxxx00xxxxxxxxxxxxx00xxxxxxx
xxxxxxxxx000xxxxxxx000xxxxxxxxx
xxxxxxxxxxxx0000000xxxxxxxxxxxx

Hab leiuder heut keine Zeit mehr für was neues... das muss bis morgen warten.

Gruß, MarsStein
05.02.2010 20:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

also doch noch auf die Schnelle die nächste Aufgabe:
Schreibt eine Funtion, die aus 2 übergebenen Integer-Arrays der Länge 4 (ein Geheimnis und ein Versuch) ermittelt, wie viele schwarze und weiße Pins bei einem  Mastermind-Spiel zu setzen sind.
Gleiche Werte entsprechen gleichen Farben. Mehrfachbenutzung einer Farbe im Geheimnis ist möglich.
Die Methode soll die Signatur

C#-Code:
bool MastermindTest(int[] geheimnis, int[] versuch,
                    out int schwarz, out int weiss)

besitzen, und true zurückgeben, wenn alle Farben im Versuch mit denen im Geheimnis in der exakten Reihenfolge übereinstimmen (richtige Lösung).
Gruß, MarsStein

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von MarsStein am 05.02.2010 21:05.

05.02.2010 21:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Campac68
myCSharp.de-Mitglied

Dabei seit: 04.02.2010
Beiträge: 63
Entwicklungsumgebung: Visual Studio


Campac68 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

Ich hab genau 4minuten und 28sekunden programmiert würde mich mal interessieren ob diese tolle Funktion hier das bringt was du wolltest(Achtung: 0 ist bei mir keine Farbe d.h. falls 0 als Farbe benutzt wird, müsste man etwas ergänzen wie: wenn ein Array 0 enthält dann alles Inkrementieren):

C#-Code:
bool MastermindTest(int[] geheimnis, int[] versuch, out int schwarz, out int weiss)
        {
            schwarz = 0;
            weiss = 0;
            for (int i = 0; i < 4; i++)
            {
                if (geheimnis[i] == versuch[i])
                {
                    geheimnis[i] = 0;
                    schwarz++;
                }
                else if (geheimnis.Contains(versuch[i]))
                {
                    for (int i2 = 0; i2 < 4; i2++)
                    {
                        if (geheimnis[i2] == versuch[i])
                        {
                            geheimnis[i2] = 0;
                            break;
                        }
                    }
                    weiss++;
                }
            }
            if (schwarz == 4) return true;
            return false;
        }

Ok ich geb zu das is weder kurz noch elegant, aber dafür schnell;)

Mfg Campac
05.02.2010 22:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 47.571
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Campac68,

Zitat:
Ich hab genau 4minuten und 28sekunden programmiert

das war wohl etwas zu wenig Zeit oder du hättest zumindest nochmal soviel Zeit in den Test investieren sollen :-) denn die Funktion ist falsch, d.h. sie liefert nicht in allen Fällen das richtige Ergebnis. Sie liefert in bestimmten Situationen zuwenig schwarz, z.B. in folgendem Fall (laut Wikipedia darf eine Farbe mehr als einmal vorkommen):

C#-Code:
MastermindTest (new int [] {1, 2, 3, 3},
                new int [] {3, 1, 3, 2},
                out schwarz, out weiss);

Ergebnis ist 0 4 statt korrekt 1 3.

herbivore
06.02.2010 08:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
m0rius
myCSharp.de-Mitglied

images/avatars/avatar-3125.png


Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional


m0rius ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

hier meine Lösung. Ist ein Stück länger, dafür zum Verständnis kommentiert.

C#-Code:
private static bool MastermindTest(int[] geheimnis, int[] versuch, out int schwarz, out int weiss)
{
    schwarz = 0;
    weiss = 0;

    // Arrays zum Angeben bereits ausgewerteter Stellen
    bool[] geheimnisIndizes = new bool[4];
    bool[] versuchIndizes = new bool[4];

    // Anzahl zu setzender schwarzer Stecker ermitteln
    for (int i = 0; i < 4; i++)
    {
        if (geheimnis[i] == versuch[i])
        {
            schwarz++;

            geheimnisIndizes[i] = true;
            versuchIndizes[i] = true;
        }
    }

    // Über Geheimnis-Array iterieren
    for (int i = 0; i < 4; i++)
    {
        // Geheimnis-Ziffer wurde bereits ausgewertet
        if (geheimnisIndizes[i])
        {
            continue;
        }

        // Über Versuch-Array iterieren
        for (int j = 0; j < 4; j++)
        {
            // Versuch-Ziffer wurde bereits ausgewertet
            if (versuchIndizes[j])
            {
                continue;
            }

            // "Halb-Treffer" (weiss) gefunden
            if (geheimnis[i] == versuch[j])
            {
                weiss++;

                geheimnisIndizes[i] = true;
                versuchIndizes[j] = true;
            }
        }
    }

    return (schwarz == 4);
}

Edit: kleine Änderungen nach Anregungen von herbivore eingearbeitet.

m0rius

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von m0rius am 06.02.2010 11:46.

06.02.2010 11:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Morius,

das sieht korrekt aus. Du bist dran.

Gruß, MarsSTein
06.02.2010 14:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Campac68
myCSharp.de-Mitglied

Dabei seit: 04.02.2010
Beiträge: 63
Entwicklungsumgebung: Visual Studio


Campac68 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

tja ich sags mal so: versuch wars wert ich hatte nich viel zeit und war todmüde;)
beim nächsten mal!
06.02.2010 19:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
m0rius
myCSharp.de-Mitglied

images/avatars/avatar-3125.png


Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional


m0rius ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

okay, weiter geht's: Da wir gerade beim Thema Spiele waren, setze ich diesen Trend mal fort.

Es soll eine Methode ErzeugeSpielfeld() geschrieben werden, die ein Schiffe-Versenken-Spielfeld der Größe 10x10 generiert.
Dazu gehört die valide, zufällige Positionierung der Schiffsflotte eines Spielers (s. Link unten) sowie die anschließende Ausgabe der Schiffe ("X") und der unbesetzten Wasserfelder (".").
Es sind folgende  Spielregeln zur Aufstellung zu verwenden.

Viel Spaß!

Edit: Auf Hinweis von herbivore wurden die Regeln konkretisiert.

m0rius

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m0rius am 07.02.2010 21:53.

07.02.2010 19:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Floste
myCSharp.de-Mitglied

images/avatars/avatar-2376.jpg


Dabei seit: 13.06.2007
Beiträge: 1.130
Entwicklungsumgebung: VS 2008
Herkunft: Norddeutschland


Floste ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Funkt bei mir:

C#-Code:
public static void Main()
        {
            int[] zahlen = new int[6]
            {
                0,//0
                0,//1
                4,//Uboot(2)
                3,//Kreutzer(3)
                2,//Zerstörer(4)
                1,//Schlachtschiff(5)
            };

            int[,] feldx = new int[10, 10];
            int[,] feldy = new int[10, 10];
            for(int x=0;x<10;x++)
                for (int y = 0; y < 10; y++)
                {
                    feldx[x, y] = 10 - x;
                    feldy[x, y] = 10 - y;
                }
            Random rnd = new Random();
            for (int i = zahlen.Length - 1; i >= 0; i--)
            {
                for (int i2 = zahlen[i] - 1; i2 >= 0; i2--)
                {
                    int xcount = feldx.Cast<int>().Count((f) => f >= i);
                    int ycount = feldy.Cast<int>().Count((f) => f >= i);
                    int c = rnd.Next(xcount + ycount);
                    if (c < xcount)
                    {
                        for(int x=0;x<10;x++)
                            for (int y = 0; y < 10; y++)
                            {
                                if (feldx[x, y]>=i)
                                {
                                    if (c > 0)
                                    {
                                        c--;
                                    }
                                    else
                                    {
                                        for (int ilen = 0; ilen < i; ilen++)
                                        {
                                            Set(x,y,feldx,feldy);
                                            x++;
                                        }
                                        goto breakout;
                                    }
                                }
                            }
                    breakout:{}
                    }
                    else
                    {
                        c -= xcount;
                        for (int x = 0; x < 10; x++)
                            for (int y = 0; y < 10; y++)
                            {
                                if (feldy[x, y] >= i)
                                {
                                    if (c > 0)
                                    {
                                        c--;
                                    }
                                    else
                                    {
                                        for (int ilen = 0; ilen < i; ilen++)
                                        {
                                            Set(x, y, feldx, feldy);
                                            y++;
                                        }
                                        goto breakout;
                                    }
                                }
                            }
                    breakout: { }
                    }
                }
            }

            for (int y = 0; y < 10; y++)
            {
                for (int x = 0; x < 10; x++)
                {
                    if (feldx[x, y] == -1 && feldy[x, y] == -1)
                        Console.Write("X");
                    else
                        Console.Write(".");
                }
                Console.WriteLine();
            }
            Console.ReadLine();
        }

        private static void Set(int x, int y, int[,] feldx, int[,] feldy)
        {
            Setx(x, y, feldx);
            Setx(x, y + 1, feldx);
            Setx(x, y - 1, feldx);

            Sety(x, y, feldy);
            Sety(x + 1, y, feldy);
            Sety(x - 1, y, feldy);
        }

        private static void Setx(int x, int y, int[,] feldx)
        {
            if (y < 0 || y >= 10) return;
            if (x < 9)
            {
                feldx[x + 1, y] = 0;
            }
            int dist = -1;
            for (int x2 = x; x2 >= 0; x2--)
            {
                if (feldx[x2, y] < dist) break;
                feldx[x2, y] = dist;
                dist++;
            }
        }

        private static void Sety(int x, int y, int[,] feldy)
        {
            if (x < 0 || x >= 10) return;
            if (y < 9)
            {
                feldy[x, y+1] = 0;
            }
            int dist = -1;
            for (int y2 = y; y2 >= 0; y2--)
            {
                if (feldy[x, y2] < dist) break;
                feldy[x, y2] = dist;
                dist++;
            }
        }
07.02.2010 22:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
m0rius
myCSharp.de-Mitglied

images/avatars/avatar-3125.png


Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional


m0rius ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Floste,

ich habe mich noch nicht mit deinem Code beschäftigt bzw. mit der Funktionsweise, aber er scheint zu funktionieren - du bist dran!

m0rius
07.02.2010 22:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Floste
myCSharp.de-Mitglied

images/avatars/avatar-2376.jpg


Dabei seit: 13.06.2007
Beiträge: 1.130
Entwicklungsumgebung: VS 2008
Herkunft: Norddeutschland


Floste ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Da es programmier-SPIEL heißt, dachte ich, es kann auch mal ein spiel rauskommen.

Das wird, wenn es auch keine besonders anspruchsvolle Aufgabe ist, doch eine recht Lange.
Spielidee: Man schießt aus der Mitte mit Geschossen herumfligende Brocken ab, damit diese einem nicht zu nahe kommen.

Um die Sache einfach zu halten ist alles rechteckig:
-Das Spielfeld ist 500x500 Pixel groß
-Genau in der Mitte ist ein zu verteidigendes Quadrat, das 20x20 Pixel groß ist
-Aus der Mitte herkommend kann man zum Mauszeiger hin 10x10 große Quadrate (am besten rot) schießen, die sich mit 200px/sekunde Fortbewegen
-Von oben herab regnet es Rechtecke, die 10 bis 50px Seitenlänge haben , sich mit 50 bis 100px/Sekunde nach unten bewegen und mit -50 bis +50px/Sekunde seitwärts bewegen. Sie behalten genau wie die Geschosse ihre Richtung und Größe bei. Die Blöcke sollen sich von Geschossen und dem Hintergrund abheben. Alle Werte sollen innherhalb der Vorgaben möglichst zufällig sein.
-Wenn ein Geschoss einen Block trifft, verschwinden Beide, es wird aber ein neuer Block erzeugt, sodass die Blockanzahl konstant ist.
-Wenn ein Block das Spielfeld verlässt, wird er zerstört und ein neuer erzeugt.
-Wenn ein Geschoss das Spielfeld verlässt wird es ersatzlos zerstört.
-Alle 5 Sekunden kommt ein Block hinzu, am Anfang gibt es genau 5 Stück.
-Wenn ein Block die mitte erreicht hat man verloren und die zeit wird angezeigt.
-Man kan alle 250ms schießen.
-Blöcke haben mit anderen blöcken keine kollision, selbiges gild für geschosse. (ok, eine Variante mit Blockkollision wäre auch mal lustig.)

-Für Grafik sollte Gdi reichen (bitte flackerfrei), anderes ist erlaubt

-Markus111 ist, weil er die Lösung kennt ausgeschlossen.
-Alle, die sich das Programm von markus111 geholt haben sind ebenfalls ausgeschlossen.

Damit es nich so lange dauert, ist heir ein Stub, man muss ihn aber nicht unbedingt benutzen und kann ihn abwandeln.
Tipp1: eine for-Schleife rückwärts ist hilfreich!
Tipp2: rectangle.IntersectsWith testet Kollision!

C#-Code:
public class Asteriods : Form
    {
        public Asteriods()
        {
            this.Size = new Size(500, 500);
            this.FormBorderStyle = FormBorderStyle.FixedDialog;
            SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint,true);
            DoubleBuffered = true;
            sw = new Stopwatch();
            sw.Start();
            //TODO:Ergänzen
        }

        Stopwatch sw;
        float nowMilliseconds=0;
        float lastShot = 0;
        Random rnd = new Random();
        List<Particle> asteroids=new List<Particle>();
        List<Particle> missils=new List<Particle>();
        RectangleF center;

        protected override void OnPaint(PaintEventArgs e)
        {
            float timeOffset = sw.ElapsedMilliseconds - nowMilliseconds;
            UpdateParticles(missils, timeOffset);//bewegen und aussortieren, was aus dem Rahmen fällt
            UpdateParticles(asteroids, timeOffset);
            //TODO:Ergänzen

            using (SolidBrush sb = new SolidBrush(Color.Green))
                e.Graphics.FillRectangle(sb,center);
            foreach (Particle p in asteroids.Concat(missils))
            {
                using (SolidBrush sb = new SolidBrush(p.c))
                    e.Graphics.FillRectangle(sb, p.rect);
            }
            nowMilliseconds += timeOffset;
            Invalidate();
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            //TODO:Ergänzen
        }

        class Particle
        {
            public RectangleF rect;
            public float speedx;
            public float speedy;
            public Color c;
        }
    }

ps: inklusive gegebenen Code und using-krimskrams hab ich 122 Zeilen gebraucht
wenn man tipp1 beachtet gibts in meinen Augen auch keinerlei "fallen" mehr.

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Floste am 12.02.2010 15:30.

08.02.2010 17:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 47.571
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

Zitat:
ps: inklusive gegebenen Code hab ich 122 Zeilen gebraucht

das ist in meinen Augen eine wichtige Information. Die Aufgabe ist also nicht so aufwändig, wie man vielleicht denkt. Also probiert euch ruhig mal dran.

herbivore
12.02.2010 14:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Monat.
m0rius
myCSharp.de-Mitglied

images/avatars/avatar-3125.png


Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional


m0rius ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Floste,

um das Programmierspiel mal wieder "aufzuwecken": Vielleicht solltest du eine neue Aufgabe mit kleinerem Umfang stellen, da an der jetzigen anscheinend kein großes Interesse besteht ...

m0rius
15.03.2010 13:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

oder du wartest bis heut abend... ich hab's nämlich am WE implementiert, weil ich den Thread auch aufwecken wollte, kam aber nicht mehr zum Hochladen.

Gruß, MarsStein
15.03.2010 13:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

es geht sicherlich schöner / kürzer / besser, aber ich denke es erfüllt alle geforderten Vorgaben.
Ich hab' die Main() mal mir reingepackt, so dass sich der folgende Codeblock direkt zur .exe kompilieren lässt :)

C#-Code:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

public class Asteriods : Form
{
    static void Main()
    {
      Application.Run(new Asteriods());
    }
    Stopwatch sw;
    int lastPaint = 0;
    int lastShot = 0;
    int lastBlock = 0;
    List<Particle> asteroids=new List<Particle>();
    List<Particle> missils=new List<Particle>();
    RectangleF center = new RectangleF(240f,240f,20f,20f);
    bool end = false;

    public Asteriods()
    {
      this.Size = new Size(500, 500);
      this.FormBorderStyle = FormBorderStyle.FixedDialog;
      this.BackColor = Color.Black;
      SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint,true);
      DoubleBuffered = true;
      for(int i = 0; i < 5; i++)
      {
        asteroids.Add(new Particle());
      }
      sw = new Stopwatch();
      sw.Start();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
      int snapshot = (int)sw.ElapsedMilliseconds;
      int timeOffset = snapshot - lastPaint;
      lastPaint = snapshot;
      Particle p1;
      Particle p2;
      bool updateMissiles = true;
      for(int i = asteroids.Count-1; i>=0; i--)
      {
        p1 = asteroids[i];
        p1.rect = new RectangleF(p1.rect.Left + p1.speedx*timeOffset,
                                 p1.rect.Top + p1.speedy*timeOffset,
                                 p1.rect.Width, p1.rect.Height);
        if(p1.rect.IntersectsWith(this.ClientRectangle))
        {
          if(p1.rect.IntersectsWith(center))
          {
            end = true;
          }
          for(int j = missils.Count-1; j>=0; j--)
          {
            p2 = missils[j];
            if(updateMissiles)
            {
              p2.rect = new RectangleF(p2.rect.Left + p2.speedx*timeOffset,
                                       p2.rect.Top + p2.speedy*timeOffset,
                                       p2.rect.Width, p2.rect.Height);
              updateMissiles = (j!=0);
            }
            if(p2.rect.IntersectsWith(this.ClientRectangle))
            {
              if(p1.rect.IntersectsWith(p2.rect))
              {
                asteroids[i] = new Particle();
                missils.RemoveAt(j);
              }
            }
            else
            {
              missils.RemoveAt(j);
            }
          }
        }
        else
        {
          asteroids[i] = new Particle();
        }
        e.Graphics.FillRectangle(Brushes.Green, asteroids[i].rect);
      }
      if((lastBlock+5000) <= snapshot)
      {
        lastBlock = snapshot-(snapshot%5000);
        asteroids.Add(new Particle());
      }
      foreach(Particle p in missils)
      {
        e.Graphics.FillRectangle(Brushes.Red, p.rect);
      }
      e.Graphics.FillRectangle(Brushes.Blue, center);
      if(end)
      {
        e.Graphics.DrawString((snapshot/1000f).ToString("0.000")+"s",
                              new Font("system",25), Brushes.White,
                              Point.Empty);
      }
      else
      {
        Invalidate();
      }
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
      int snapshot = (int)sw.ElapsedMilliseconds;
      if((lastShot+250) <= snapshot)
      {
        lastShot = snapshot;
        missils.Add(new Particle(e.X-250, e.Y-250));
      }
    }

    class Particle
    {
      static Random rand = new Random();
      public RectangleF rect;
      public float speedx;
      public float speedy;

      public Particle()
      {
        float height = rand.Next(10,50);
        int width = rand.Next(10,50);
        rect = new RectangleF(rand.Next(0,500-width),1-height,rand.Next(10,50),height);
        speedx = rand.Next(-50,50)/1000f;
        speedy = rand.Next(50,100)/1000f;
      }
      public Particle(int mouseX, int mouseY)
      {
        rect = new RectangleF(245f,245f,10f,10f);
        float dia = (float)Math.Sqrt(mouseX*mouseX+mouseY*mouseY);
        speedx = mouseX/dia/5;
        speedy = mouseY/dia/5;
      }
    }
}

Gruß, MarsStein
15.03.2010 18:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Floste
myCSharp.de-Mitglied

images/avatars/avatar-2376.jpg


Dabei seit: 13.06.2007
Beiträge: 1.130
Entwicklungsumgebung: VS 2008
Herkunft: Norddeutschland


Floste ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

*Grr* das gibts doch garned! Ich kann einfach nix finden, dass ich daran auszusetzen hätte!

Spaß beiseite: MarsStein, du bist dran!

Ich hab MarsSteins code mal durch nen Compiler geschickt, das Resultat ist im Anhang.


Dateianhang:
zip MarsAsteroids.zip (4 KB, 373 mal heruntergeladen)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Floste am 15.03.2010 19:09.

15.03.2010 18:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

die nächste Aufgabe:

erstell eine Queue-Klasse, die folgendes Interface implementiert.

Haken: Die Namespaces System.Collections und System.Collections.Generic sind ausgeschlossen und dürfen nicht verwendet werden.

C#-Code:
interface IQueue<T>
{
  // gibt die Anzahl der Elemente an.
  int Count
  {
    get;
  }

  // entfernt das Element am Anfang der Queue und gibt es zurück
  T Dequeue();

  // fügt das Element "elem" am Ende der Queue an
  void Enqueue(T elem);

  // Gibt true zurück, wenn das Element elem in der Queue enthalten ist, sonst false
  bool Contains(T elem);
}

Gruß, MarsStein

Edit: Habe mich vielleicht anfangs etwas unverständlich ausgedrückt.
Nach Jack30lenas nächster Antwort habe ich die Kommentare eingefügt, um kenntlich zu machen wie die Klasse arbeiten soll.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von MarsStein am 16.03.2010 19:24.

16.03.2010 18:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
der-schlingel der-schlingel ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3239.jpg


Dabei seit: 13.10.2007
Beiträge: 758
Entwicklungsumgebung: VS 2005/ 2008 Pro
Herkunft: Österreich/Wien


der-schlingel ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sind die Namespaces auch ausgeschlossen wenn nur die Interfaces implementiert werden?
16.03.2010 18:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

C#-Code:
        class MyQueue<T> : IQueue<T>
        {
            private T[] internalArray = new T[10];
            private int queueIndex = -1;

            public int Count
            {
                get { return queueIndex + 1; }
            }

            public T Dequeue()
            {
                T result = internalArray[queueIndex];
                internalArray[queueIndex] = default(T);
                queueIndex--;
                return result;
            }

            public void Enqueue(T elem)
            {
                if(internalArray.Length == queueIndex + 1)
                {
                    T[] newArray = new T[internalArray.Length * 2];
                    Array.Copy(internalArray, newArray, internalArray.Length);
                    internalArray = newArray;
                }

                internalArray[++queueIndex] = elem;
            }

            public bool Contains(T elem)
            {
                return internalArray.Any(item => item.Equals(elem));
            }
        }

edit: der code hat keinerlei ansprüche auf robustheit ;-)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JAck30lena am 16.03.2010 18:55.

16.03.2010 18:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Jack30lena,

wenn ich es richtig blicke, hast Du einen Stack gebaut.
Unter einer Queue verstehe ich eigentlich einen FIFO.

Gruß, MarsStein

Edit: siehe "Edit" der Aufgabenstellung

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MarsStein am 16.03.2010 19:25.

16.03.2010 19:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
wenn ich es richtig blicke, hast Du einen Stack gebaut.
Unter einer Queue verstehe ich eigentlich einen FIFO.

oha... mist :-) da hab ich nciht ordendlich nachgedacht.

[edit=herbivore]Eigentlich wurde dieser Beitrag erst am 17.03.2010 um 09:38:04 gepostet, aber ich habe ihn aus Gründen der Übersichtlichkeit und des direkten Zusammenhangs an diese Stelle verschoben.[/edit]
16.03.2010 19:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Corpsegrinder
myCSharp.de-Mitglied

Dabei seit: 30.01.2007
Beiträge: 401
Entwicklungsumgebung: VS 2008 , .Net 3.5


Corpsegrinder ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Geht bestimmt schöner, aber funktioniert :D

C#-Code:
public class Queue<T> : IQueue<T>
    {
        QueueItem<T> _items;
        object _lock;
        public Queue ()
        {
            _lock = new object();
        }

        public int Count
        {
            get{
                lock(_lock) {
                    if(_items != null) {
                        return _items.Count;
                    } else {
                        return 0;
                    }
                }
            }
        }

        public T Dequeue() {
            T item = default(T);
            lock(_lock) {
                if(Count > 1) {
                    item = _items.Data;
                    _items = _items.Next;
                    _items.Parent = null;
                } else if(Count == 1) {
                    item = _items.Data;
                    _items = null;
                }
            }
            return item;
        }

        public void Enqueue(T elem) {
            lock(_lock) {
                if(_items != null)
                    _items.Add(elem);
                else
                    _items = new QueueItem<T>(null, elem);
            }
        }

        public bool Contains(T elem) {
            lock(_lock) {
                if(_items != null)
                    return _items.Contains(elem);
                else
                    return false;
            }
        }
    }

public class QueueItem<T>
    {
        object _lock = new object();
        public QueueItem<T> Parent {
            get; set;
        }
        public T Data {
            get; set;
        }
        public QueueItem<T> Next {
            get; set;
        }
        public QueueItem (QueueItem<T> parent, T data)
        {
            if(parent != null) {
                Parent = parent;
                Parent.Next = this;
            }
            Data = data;
        }
        public void Add(T item) {
            lock(_lock) {
                if(Next != null) {
                    Next.Add(item);
                } else {
                    Next = new QueueItem<T>(this, item);
                }
            }
        }

        public int Count {
            get {
                if(Next != null) {
                    return 1 + Next.Count;
                } else {
                    return 1;
                }
            }
        }

        public bool Contains(T item) {
            if(Data.Equals(item)) {
                return true;
            } else if(Next != null) {
                return Next.Contains(item);
            } else {
                return false;
            }
        }
    }

edit: kleinen Fehler behoben, der eine Exception beim Aufruf von Dequeue auf eine leere Liste erzeugt hat... danke @ MarsStein

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Corpsegrinder am 16.03.2010 22:05.

16.03.2010 19:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Campac68
myCSharp.de-Mitglied

Dabei seit: 04.02.2010
Beiträge: 63
Entwicklungsumgebung: Visual Studio


Campac68 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Tja du warst schneller, meiner sähe so aus:

C#-Code:
    class MyQueue<T> : IQueue<T>
    {
        private int _count;
        private QueueElement<T> front;

        public MyQueue()
        {
            _count = 0;
        }

        public int Count
        {
            get { return _count; }
        }

        public void Enqueue(T elem)
        {
            if (Count > 0)
            {
                front.enter(elem);
                _count++;
            }
            else
            {
                front = new QueueElement<T>(elem);
                _count++;
            }
        }

        public T Dequeue()
        {
            if (Count > 0)
            {
                T frontContent = front.Content;
                front = front.leave();
                _count--;
                return frontContent;
            }
            else
            {
                return default(T);
            }
        }

        public bool Contains(T elem)
        {
            if (Count > 0)
            {
                return front.Contains(elem);
            }
            else
            {
                return false;
            }
        }

        private class QueueElement<T>
        {
            QueueElement<T> next;
            public T Content
            {
                get;
                private set;
            }

            public QueueElement(T Content)
            {
                this.Content = Content;
            }

            public void enter(T elem)
            {
                if (next != null)
                {
                    next.enter(elem);
                }
                else
                {
                    next = new QueueElement<T>(elem);
                }

            }

            /// <summary>
            /// Gibt die nächste front zurück
            /// </summary>
            /// <returns></returns>
            public QueueElement<T> leave()
            {
                return next;
            }

            public bool Contains(T elem)
            {
                if (next != null)
                {
                    return Content.Equals(elem) || next.Contains(elem);
                }
                else
                {
                    return Content.Equals(elem);
                }
            }
        }
    }

Wurde nich lange getestet aber ich denke vom Prinzip her sollte es so ähnlich sein wie das von Corpsegrinder^^
16.03.2010 19:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Zitat von Campac68:
Tja du warst schneller,

so ist es...

@Corpsegrinder
...und deshalb bist Du jezt auch dran!

Gruß, MarsStein
16.03.2010 19:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Seiten (17): « vorherige 1 [2] 3 4 5 6 nächste » ... letzte » Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Jahre.
Antwort erstellen


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 20.06.2013 10:45