|
|
Autor
 |
|
herbivore
myCSharp.de-Team (Admin)
Dabei seit: 11.01.2005
Beiträge: 47.571
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
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.
myCSharp.de-Mitglied
Dabei seit: 30.09.2009
Beiträge: 155
Entwicklungsumgebung: VS 2010
|
|
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
|
|
LuckyGeorge
myCSharp.de-Mitglied
Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010
|
|
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
Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional
|
|
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
myCSharp.de-Mitglied
Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010
|
|
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.
myCSharp.de-Mitglied
Dabei seit: 30.09.2009
Beiträge: 155
Entwicklungsumgebung: VS 2010
|
|
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
myCSharp.de-Mitglied
Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010
|
|
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
|
|
LuckyGeorge
myCSharp.de-Mitglied
Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010
|
|
[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
myCSharp.de-Mitglied
Dabei seit: 15.02.2008
Beiträge: 401
|
|
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: |
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 ();
}
}
public static bool[][] calcCircleArray (uint R, uint n)
{
uint xStep = R * n;
uint xMax = xStep << 1;
return calcCircleArray (R, n, xMax + 1, xMax + 1);
}
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);
bool[][] res = new bool[xLength][];
for (uint i = 0; i < res.Length; i++) {
res[i] = new bool[yLength];
}
double y;
double R2 = Math.Pow (xStep, 2.0);
double ymd = (double) ym;
for (uint i = 0; i <= xStep; i++) {
y = Math.Sqrt (R2 - Math.Pow (i, 2.0));
if(Double.IsNaN(y))
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
|
|
LuckyGeorge
myCSharp.de-Mitglied
Dabei seit: 17.12.2008
Beiträge: 72
Entwicklungsumgebung: Microsoft Visual Studio 2010
|
|
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
myCSharp.de-Team (Moderation)
Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop Herkunft: Trier -> München
|
|
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];
BuildOctant(r, res);
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];
}
}
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
myCSharp.de-Team (Moderation)
Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop Herkunft: Trier -> München
|
|
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
|
|
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)
Dabei seit: 11.01.2005
Beiträge: 47.571
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
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
Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional
|
|
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;
bool[] geheimnisIndizes = new bool[4];
bool[] versuchIndizes = new bool[4];
for (int i = 0; i < 4; i++)
{
if (geheimnis[i] == versuch[i])
{
schwarz++;
geheimnisIndizes[i] = true;
versuchIndizes[i] = true;
}
}
for (int i = 0; i < 4; i++)
{
if (geheimnisIndizes[i])
{
continue;
}
for (int j = 0; j < 4; j++)
{
if (versuchIndizes[j])
{
continue;
}
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
|
|
m0rius
myCSharp.de-Mitglied
Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional
|
|
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
Dabei seit: 13.06.2007
Beiträge: 1.130
Entwicklungsumgebung: VS 2008 Herkunft: Norddeutschland
|
|
Funkt bei mir:
C#-Code: |
public static void Main()
{
int[] zahlen = new int[6]
{
0,
0,
4,
3,
2,
1,
};
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
Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional
|
|
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
Dabei seit: 13.06.2007
Beiträge: 1.130
Entwicklungsumgebung: VS 2008 Herkunft: Norddeutschland
|
|
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();
}
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);
UpdateParticles(asteroids, timeOffset);
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)
{
}
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)
Dabei seit: 11.01.2005
Beiträge: 47.571
Entwicklungsumgebung: csc/nmake (nothing is faster) Herkunft: Berlin
|
|
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
Dabei seit: 28.08.2007
Beiträge: 994
Entwicklungsumgebung: Visual Studio 2010 Professional
|
|
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
myCSharp.de-Team (Moderation)
Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop Herkunft: Trier -> München
|
|
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
myCSharp.de-Team (Moderation)
Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop Herkunft: Trier -> München
|
|
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
Dabei seit: 13.06.2007
Beiträge: 1.130
Entwicklungsumgebung: VS 2008 Herkunft: Norddeutschland
|
|
*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.
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
myCSharp.de-Team (Moderation)
Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop Herkunft: Trier -> München
|
|
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>
{
int Count
{
get;
}
T Dequeue();
void Enqueue(T elem);
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
|
|
JAck30lena
myCSharp.de-Team (Admin)
Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.
|
|
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
myCSharp.de-Team (Moderation)
Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop Herkunft: Trier -> München
|
|
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
myCSharp.de-Team (Admin)
Dabei seit: 01.10.2006
Beiträge: 11.393
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.
|
|
| 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
|
|
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
|
|
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);
}
}
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
myCSharp.de-Team (Moderation)
Dabei seit: 27.06.2006
Beiträge: 2.718
Entwicklungsumgebung: VS 2010, MonoDevelop, #Develop Herkunft: Trier -> München
|
|
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
|
|
|