Laden...
B
bluedragon myCSharp.de - Member
Nordrheinwestfalen Dabei seit 11.06.2008 101 Beiträge
Benutzerbeschreibung
Sei schlau, bleib dumm !

Forenbeiträge von bluedragon Ingesamt 101 Beiträge

24.09.2014 - 13:57 Uhr

Und mit einem Wasserfallmodell übernimmst Du Dich in der Ressourcen-Planung ganz schnell.

Wie gesagt, deshalb ja kein Wasserfallmodell 😄

malignate sagt das schon richtig und Du musst das schon ernst nehmen.

Tue ich doch, sonst wäre ich nicht hier -.-

Und auch wenn Webanwender immer wieder belächelt werden: es ist um längen komplizierter als eine App oder eine Desktopanwendung.

Wie gesagt, ich habe bereits 2 Projekte fertiggestellt. Eine App fürs iPhone und ein Browsergame mit PHP/HTML/CSS/(My)SQL/JavaScript und langsam will ich mich auch nichtmehr wiederholen müssen.
Klar sind die Beiträge lange, aber es ist nicht nur ein Error-Code um den es hier geht, also wäre es doch nur fair vor einer Antwort die Nachricht des Gegenübers ernst zu nehmen und komplett zu lesen oder ? :S

Du musst das alleine alles drauf haben und das ist selbst mit zig Jahren im Web und Erfahrung kaum zu schaffen. Und wenn Du jetzt erst mit Web anfängst und dann auch noch mit WebForms; dann muss man Dich einfach etwas bremsen - sorry.
[...]
Du glaubst gar nicht, wie viel Aufwand in so einem Ding steckt. Ich denke das unterschätzt Du ziemlich.
Wir helfen Dir; versuchen aber auch Dich auf den Boden zu halten. Manchmal muss man die Erfahrung aber halt auch selbst machen.

Bremsen kann ich ja noch nachvollziehen, aber ich weiß nicht, für mich ließt sich das hier mehr&weniger wie eine Vollbremsung noch bevor ich wirklilch angefangen habe und das finde ich einfach schade 😕

Du musst erst mal ein Mock (Klickstrecke) erarbeiten.
Wenn es sich schei*e spielen lässt, dann kannste auch 10 Jahre entwickeln: wird halt nicht genutzt.

Ja das stimmt absolut, deshalb quetsch ich euch aus, bis mir keiner mehr antworten will oder ich alle Antworten habe , die nicht durch eigenrecherche auffindbar warengg

Und ich wiederhol mich gerne: WebForms ist die falsche Technologie.

Du begründest das aber nicht !? Immerhin steht bei der ganzen Literatur die ich bisher darüber gelesen habe, dass es gerade genau für mein Vorhaben geeignet ist.
Oder ich verstehe einfach nicht, warum du der Meinung bist das Web Forms das Falsche sind.

Aber Du darfst Dir hier keinen Mentor erhoffen.

Das tue ich auch nicht, ich habe auf Leute gehofft die sich so sehr dafür interessieren wie ich, anstatt nur nebenbei semantische Nachteile meines Vorhabens aufzuzählen 😦
Hätte ich nämlich das Wissen, sodass ich mir hier sämtlich Fragen erübrigen könnte, dann fänd ich es toll meine Erfahrungen an andere weiterzugeben auf so einem Portal. Aber das muss ja jeder selber wissen^^

Dein Text ist wirklich sehr sehr sehr lang. Wenn das 10 Leute durchlesen ist das viel.

Das ergibt doch überhaupt keinen Sinn.
Entweder man nimmt hier dran Teil&nimmt es ernst(so wie du es zu mir meinst) oder man lässt es gleich ganz. Trotz meiner ernstgemeinten Entschuldigung kann ich auf Mitleser verzichten , die nur eine Morgenlektüre zwischen Kaffee und Aufbruch zur Arbeit wollen.

Wieso muss das hier eigentlich in Off-Topic ausarten ....

Wenn ich eine Liste von "Technologien" nennen sollte (Das ist jetzt ein bunter Haufen), die ich verwenden würde, dann würde ich folgendes nennen:

C#
ASP.NET MVC
ASP.NET WebAPI
Owin / Katana
Owin Identity Framework
Async/await Tasks
Javascript
Angular
Angular-UI
Bootstrap
CSS, LESS
MongoDB
JSON
Redis
SignalR

Du siehst die Liste ist lange. Wenn du Durchschnitt nur ein Monate mit Lernen pro Punkt verwendest, bist du das erste Jahr schon beschäftigt 😉

Okay gut danke , ja einiges davon ist mir geläufig, manches gar nicht.

Wo du vor allem daneben liegst ist alte Technologien wie IIS6 und WebForms zu verwenden.

Interessanter Einwand. Denn bei jeder Recherche via Google kam nur die eine Seite der Münze. Nachdem ich jetzt explizit nach "warum sind webforms veraltet?" gegoogled habe wird dein Punkt sofort mehrfach bestätigt, aber leider ohne Begründung.
Ich finde nur weil etwas alt ist muss es nicht schlechter sein oder weil etwas neuer ist muss es nicht besser sein, wie man bei vielen Linux packages sehen kann 😄

lG
hoffi

24.09.2014 - 13:21 Uhr

Verabschiede dich von dem Gedanken irgendwas planen zu können mit deinem Wissenstand.

Naja ich bin durch aus lernwillig ^^

Schritt 1: Du fangst dann einfach mal an, hackst den Code runter und lernst viel dabei. Irgendwann wirst du dann deinen zuerst geschriebenen Code anschauen und feststellen, dass alles Müll ist und viel besser gelöst werden kann. Eventuell wirst du Performance-Probleme oder Designfehler in deiner Architektur feststellen. Du hast zwar das Gefühl du wärst schon sehr weit, bist aber maximal bei 5%. Also fangst du von vorne an.

Schritt 1.1: Das spiel wiederholt sich, du machst 5,6 Iterationen und lernst viel dabei.

Schritt 2: Irgendwann passt eine Iteration. Mit viel Motivation kommst du über die 5% hinaus und schaffst sogar die 100%. 3 Jahre später bist du dann vll. fertig. Eventuell spielt dann niemand mehr auf dem Browser, aber das ist ein anderes Thema.

Klingt für mich nach einem standart Wasserfall Modell. Aber das ist zum kotzen und auch wenn die einzelnen Modelle nur die Durchführung beschreiben und man sich prinzipiell nicht daran halten muss.

Generell wollte ich mich aber mit Prototypes in einem Spiralmodell an die Sache annähern, sodass ich nach dem Basis-Moduls des Spiels nach&nach modular Funktionen anbaue, die aber gekapselt testbar sind.
Ich habe durchaus die Erfahrung gemacht, dass bei einer scharf vertikal gerichteten Architektur einiges schief gehen kann. Natürlich lässt sich das nicht komplett vermeiden.
Nur werde ich sicher nicht 0815 'drauf los hacken' , sondern solide mit vorhandenen Mitteln das Projekt strukturieren, bis mir nichtmehr auffällt.
Einfache Ansätze:*Klassendiagramm *Kollaborationsdiagramm als Vorlauf für Sequenzdiagamme *evt. Use-Case-Diagramm *Zustandsdiagramm *evt. Aktivitätsdiagramm je nach Komplexität des Anwendungsfalls

Mein Tipp: Fang einfach an und hoffe, dass du genug Durchhaltevermögen und Motivation hast, das zu Ende zu bringen.

Naja klingt etwas zynisch und finde eure Einstellungen schade.
Ich bin mir des Aufwands durchaus bewusst und das habe ich im ersten Beitrag genauso bewusst geschrieben.
Ich habe bereits im Alleingang 2 Spiele entwickelt, die nicht nur gerade der Trend-Idiotie, 95% aller Apps in den Stores oder sonstigen Anwendungen im Web, folgen.
Nun wollte ich gerne auf Web Forms umsteigen und sämtliche Dokumentation von MSDN überzeugt. Vor allem im direkten Vergleich zu Webanwendungen glänzen Web Forms für meine Bedürfnisse.

Und ich verstehe auch nicht wieso ich immer wieder Einwände darüber hören muss.

Ich dachte hier will man sich gegenseitig helfen und nicht runterziehen, dass etwas zu aufwändig wäre. Klar ist es aufwändig und kostet Zeit. Aber wer zu faul ist sich nach der Arbeit damit zu beschäftigen ist selber Schuld und findet immer eine Ausrede , warum 'jetzt gerade weitermachen' zu anstrengend ist.
Zumal ich auch während der Arbeitszeit effektiv an dem Projekt sitzen kann/werde.

Also ihr könnt mir gerne alles aufzählen wo ich sachlich gesehen völlig daneben liege, aber bitte schert nicht alle Threadersteller hier bzgl. großer Projekte über einen Kamm, danke.

23.09.2014 - 22:55 Uhr

Danke für die vielen Antworten, ich hab mir Zeit gelassen mit dem Beitrag um es so gut wie möglich zu beschreiben, damit ihr mir auch spezifisch euer Expertenwissen um die Ohren hauen könnt 🙂
Und zunächst möchte ich mich erst einmal entschuldigen, ich hab überreagiert :S .
Natürlich braucht ihr speziellere Infos wie ich es selber angehen würde, dann könnt ihr auch Kritik üben/Tipps geben/Verbesserungen vorschlagen gg

Abt & Coder007 haben aber schon die richtige Richtung eingeschlagen, in Bezug auf das worauf ich hinaus möchte 🙂

Alsooo noch mal alles auf Anfang, ich versuche so lückelos wie möglich mein Vorstellungen von dem Ganzen offen zu legen, ohne gleich ein Buch zu schreiben:

1. Grobe Anforderungen an die Anwendung
Ich möchte ein textbasiertes Multiplayer Kriegssimulations Spiel von mir neu aufsetzten.
Das Spiel wird mehrere Server/Welten/Runden mit unterschiedlichen Konfigurationen (Spielgeschwindigkeit, etc.) parallel bedienen.
Die Anwendung soll plattformunabhängig über jeden Browser spielbar sein.
(später sollen User eigene Runden (nicht-/endgeldlich) hosten können)

2. Programmier-/Sprachen & Plattformen
Ich möchte gerne mit Visual Studio arbeiten, weil ich mit dem System sehr vertaut bin.
Am bewandertsten bin ich im Bereich C#/.NET und dazugekommen sind dann irgendwann ASP.NET & X(A)ML.
Davor habe ich immer mit PHP/CSS/JS/HTML(5 seit kurzem) gearbeitet für zielgerichtete Webanwendungen, aber ich merke, dass ich mit C#/etc. viel schneller bin und deshalb möchte ich umsteigen und das vorerst am eigenen Projekt ausprobieren, bevor ich das professionell für Kunden anwende.

ASP.NET Web Forms+HTML5 für das Front-End aus 3 einfachen Gründen:*Server Controls, WebParts, Directives, ViewStates, Benutzterverwaltung *Plattformunabhängigkeit *Kompatibilität zu C#/.NET Back-End

Ein Bonus ist hier noch das Upgrade von ASP.NET in letzter Zeit und die Unterstützung von WCF Diensten.

Mir steht hauseigene Hardware zur Verfügung, darauf IIS6.0(und das WinServer2003 System kann gerne beliebig erweitert werden), um die Web Forms überhaupt zum laufen zu bekommen.
Dadurch, dass ASP.NET kompiliert und nicht interpretiert wird, brauch ich mir auch wenige Sorgen über Konformitäten machen. Es muss nur das .NET Framework auf meinem Server bereitstehen und der User brauch einen beliebigen Browser.

3. Feine Anforderungen an die Anwendung Front-End
-Der User kann sich auf einer Startseite registrieren/einloggen.
-Der User kann sich im Usercockpit die Server anschauen auf denen er gerade spielt/anfangen möchte zu spielen. Übersichten/Statistiken anzeigen, Profil bearbeiten, etc.
-Der User kann sich dann auf bestehenden Servern/Welten per OneClick einloggen/anfangen zu spielen.
-Der User kann dann Wirtschaft betreiben, anfangen Technologien freizuschalten und Truppen zu erstellen
-Der User kann durch Angriffe auf andere Spieler Materialien klauen oder das System des anderen Erobern, um sein Imperium weiter auszubauen
-Der User kann Freundeslisten erstellen und Allianzen beitreten/gründen mit entsprechender Oberfläche
-Der User wird je nach Rundeneinstellung mit einer KI zurecht kommen müssen, die sowohl Quest bereitstellt , als auch Attentate auf Spieler durchführt und für Spieler angriffstechnisch interaktiv ist (z.B. Rohstoffe erbeuten, das System erobern).

-Es wird eine Weltkate geben, die die Positionen der jeweiligen Spieler darstellt. In Kombination kann man sich verschiedene Anzeigemöglichkeiten zusammenstellen(Verbündete/Feinde/Freunde/Allianzmitglieder markieren, wichtige/strategische Punkte mit Notiz setzten, etc. ). Und das soll schon in Hinblick auf Grafik das Aufwändigste am ganzen Spiel sein

4. Feine Anforderungen an die Anwendung Front-End-Back-End-Grauzone
Durch die active Server Controls werde ich versuchen den Verkehr möglichst wenig zu belasten und ohne Umleitung die meisten Dinge abzufragen, so wie auf die Bestätigung durch modale Dialoge verzichten. Sondern entsprechende Einblendungen via CSS ansteuern, wenn es durch das Back-End bestätigt ist -sofern nötig. (So zumindest das grobe Vorhaben)

5. Feine Anforderungen an die Anwendung Back-End
-die Registrierung und den Login könnte ich mir vorstellen über die VS Vorlage zu realisieren. Natürlich muss ich es noch für meine Bedürfnisse erweitern, aber das stelle ich mir nicht all zu schwierig vor.
Ich habe schonmal in einer kleinen Sandbox damit rumgespielt und fand den Einstieg recht vielversprechend.
Was meint ihr dazu ? Gibt es gute Alternativen ? Ich muss nicht unbedingt das Rad neuerfinden 👍
-durch den hohen Anteil an Wirtschaft und Truppenbewegungen wird kontinuierlich mehr Belastung bei der Ausführung der Berechnungen entstehen. Zumal ich nur indirekt beeinflussen kann, wann die Spieler aktiv sind. Deshalb wird es häufiger zu Belastungspunkten kommen, wenn ihr wisst was ich meine ^^ Ich kann natürlich die Algorithmen aufs Minimum verfeinern, aber auch da stößt man doch auch irgendwo an seine Grenzen oder?
-die komplette Spiel Mechanik/Architektur werde ich mir selber zusammenbasteln und vermutlich bereits vorhandene Bibliotheken von mir nutzen, fortlaufend mit C#/.NET arbeiten
-ein wesentlicher Punkt wird sein, die regelmäßige Streuung von NPCs und deren Interaktion mit den Spielern. Hier kommt für mich WCF ins Spiel. Da die Anfrage für Attentate & Quest zufällig generiert wird und auch das nur unter bestimmten Umständen -eben auf Anfrage.-, aber das Schema wird immer das selbe bleiben. Oder ist das unnötig ?

5. Datenverwaltung
Dadurch, dass die Anwendung auf meinem WinServer läuft wollte ich einfach auf den MS SQL Sever zurückgreifen, den ich einfach in der Systemverwaltung hinzufügen kann. Bin mir wegen eurer Einwände nicht sicher, ob es nicht eine bessere Möglichkeit gibt und sollte mir nochmal Gedanken über die Skalierbarkeit machen.
Ich muss sagen da habe ich in der Vergangenheit lästige Punkte entdeckt.

Eventuell könnte ich die stupide aber doch sehr große Datensammlung von Koordinaten über ein GIF lösen.
Da wären die ersten beiden Kanäle mit Koordinaten bis zu 250 (es gehen bis zu 256, aber ich verzicht auf 6 bit für die einfachere Handhabung der Zahl) drin zu speichern und den dritten Kanal kann ich für die Art der Koordinate festlegen.
z.B.Grasland (0), Hügel (1), Wald (2), NPC Stufe 1 System (3),NPC Stufe 2 System (4), NPC Stufe 3 System (5), Spieler Stufe 1 System(6), Spieler Stufe 2 System(7), etc...
Im 4. Kanal kann ich dann bis zu 256 Farbbelegungen anlegen, für die jeweiligen Felder & Markierungen.
256 sollten im 3. & 4. Kanal vollkommen ausreichend sein.
Selbst wenn ich für den 3. Kanal berücksichtige , dass viel mehr Elemente hinzukommen, teilweise für die Landschaft angepasst/gedreht sein müssen -damit die angezeigte Karte nicht fehlerhaft aussieht- dann kann ich immernoch unter der Grenze von 256 verschiedenen Elementen für die Karte bleiben.^^

Dann muss ich das GIF/die GIFs nur in sinnvolle Anzeige-/Ausgabe-Formate mappen und entsprechende Ausschnitte(je nachdem wo sich der User gerade auf der Karte befindet) zusammenlegen.
Einmal mappen in eine Minimap mit den intuitiven(&selbstdefinierten) Farben für den weitreichenden Überblick über die Weltkarte.
Und einmal mappen für die herangezoomte Ansicht eines kleinen Kartenausschnitts. Dabei soll die Zoomstufe von der Anwendung aus vorerst nicht skalierbar sein. Allerdings können die Größen der Ausschnitte von Karte&Minimap vom User festgelegt werden. Das beeinflusst aber nur das Mapping zur Anzeigen, nicht das eigentlich Quell-GIF.

Im Anschluss kann ich für verschiedene Nutzer die selbe Quelle gebrauchen, weil sich zu 100% manche Einstellungen überschneiden werden, das liegt alleine schon daran, dass bei jeder neuen Runde die Standarteinstellungen geladen sind.

Und kurz vor der Ausgabe muss ich nochmal den Einzelfall betrachten, der eigenen Systeme, die müssen am Ende noch drübergemalt werden, da die Speicherung in dem dritten Kanal zur Folge hätte, dass sich keine Quellen überschneiden würden.

Das Workaround mag erst Arbeit bereiten, aber das ungemappte GIF muss ja nur dupliziert&angepasst werden, wenn ein Spieler eine Einstellung vornimmt. Oder spare ich unterm Strich Nichts?
Sind jetzt aber z.B. 3 Spieler in der selben Allianz (und es wäre blau makiert), dann könnte jeder auf das selbe GIF zugreifen und es muss nicht lange herumgerechnet werden an welchem Platz blau/rot/grün/... sein muss.


Ich finde das reicht erstmal.

Jetzt an euch, was übersehe ich und wo erzähle ich totalen Unsinn 😁 ?(
(den Part mit der Verschlüsselung können wir erstmal bei Seite legen)

lG
Hoffi

20.09.2014 - 15:46 Uhr

Achso, vllt verstehe ich deinen Eindruck einer "Wunschliste".
Mir ging es eher um die Rahmenbedingungen. Mich nerven diese Threads wo man erstmal 20 Beiträge lang klärt wer über was Bescheid weiß und worum es überhaupt geht.
Das artet oft und Grundsatzdiskussionen aus.
Ich sehe kein einziges Thema, dass Mal ganz solide zusammenfasst was ich eigentlich suche. Man muss sich alles doppelt und dreifach zusammnesuchen und hat nach kurzer Zeit ausschließlich äquivalente Basis-Infos, bis man Mal wieder was gutes findet.

Also können wir doch die Initiative ergreifen und selbst so einen Thread produzieren, oder?

Ich werde sicherlich auf eure Ideen eingehen und nicht einfach nur alles aufsaugen.
Für mich dient so ein Forum doch zu Generierung genau solch einer Dynamik.
Tut mir Leid wenn ich den Nutzen eines Forums falsch verstanden habe 🤔

20.09.2014 - 15:38 Uhr

Schade, die Antwort habe ich erwartet und das zeigt mir pers. , dass du den Hintergrund nicht verstehst.
Ich will kein Basiswissen.
Ich möchte Expertenwissen.
Keine X-beliebigen Links, die man nach einer Stunde googlen selber findet.

Es ist auch keine Wunschliste. Sondern der inständige Versuch im Vorfeld alle Optionen auszuschöpfen und ich weiß aus eigener Erfahrung, dass es durch aus mitteilungsbedürftige User gibt, die mir gerne weiterhelfen wollen und die gerne lange Texte schreiben wenn Sie das Thema interessiert^^

Und ich lese mir nicht nochmal "Wie poste ich richtig?" durch, denn das habe ich nach meiner Erstanmeldung vor Jahren.

Sei mir nicht böse , aber gibts auch einen Beitrag für "Wie lese ich richtig?"....

Warum soll ich das Rad neu erfinden ? Zeitverschwendung, denn ich verstehe mein Handwerk, schau mir aber gerne neues Werkzeug an und heutzutage kommt alle paar Tage ein neues Produkt raus 😉

lG
blu3

20.09.2014 - 14:44 Uhr

Hallo Community,
ich möchte gerne vorweg nehmen, dass ich schon relativ grobe Literatur zu dem Thema gefunden habe. Auch Videos auf der Seite http://www.microsoftvirtualacademy.com waren sehr aufschlussreich.

Nun möchte ich, bevor ich mein Projekt hinsichtlich geschriebenen Codes von Grund auf angehe, nochmal euren Rat einholen in Hinblick auf die verschiedenen Möglichkeiten.

Ich hatte mir überlegt eine Kombination aus
-C#/.NET
-ASP.NET
-WCF+X(A)ML
zu wählen. Mit C# und einem großen Teil der .NET-Lib bin ich aufgewachsen und hab von da an ständig weiter gemacht.
Nur möchte ich mich vergewissern, dass ich nicht sinnvollere Methode verpasse, um schneller/effektiver/qualitativ besser an mein Ziel zu kommen.

Zuerst hatte ich mich an eine App fürs Win8 Phone entschieden, doch ein Spiel über den Browser kann man auch auf dem Handy zocken und eine "Mobile"-Version kurz nach dem ersten Release rausbringen.
Zudem bereitet den meisten Leuten die Flexibilität Freude, dass sie dann auch gemütlich am PC sitzen und spielen können(ohne einen doofen Emulator zu benutzten). Aber das können die Leute dann ja mit sich selber ausmachen =D

Dadurch, dass ich schon für den Apple-Store eine App rausgebracht habe, wird mir die Erweiterung dorthin später auch nicht schwerfallen, falls die Zielgruppe eine "Mobile"-App 'wünscht'.

Nun gut, also ich möchte ein Multiplayer fähiges Browsergames schreiben.
Ich bin mir des Aufwands zu 100% bewusst.
Die Arbeit mit den verfeinerten Grafiken werde ich auf alle Fälle outsourcen. Zu einem Teil weils mir nicht liegt und andererseits, weils mir keinen Spass macht/andere Leute Spass daran haben und gerne Geld damit verdienen.

Ein Multiplayer fähiges Browsergame hab ich vor ein paar Jahren auf Basis von PHP/HTML/CSS/(My)SQL/JavaScript geschrieben und ich möchte meine alte Version in einem Remake neu rausbringen. Nur eben mit mindestens C#/-.NET.

Hardware als eigener Server steht mir auch zur Verfügung. Unter der Vorraussetzung, dass das Spiel irgendwann bekannter wird und die Userzahlen monoton steigend sind, werde ich das Projekt wohl als Software ins Netz tragen. Einfach damit die Sicherheit gegeben ist (oder aber ihr habt dort auch noch Tipps zur Hochsicherheit , zuästzlich SSL^^)

Und hier kommt ihr ins Spiel 😛 ->

Ich würde gerne von euch unter gegeben Umständen um passende Tipps bitten.:
-ich bin fortgeschrittener Nutzer von VS10 bis 13
-ich lerne sehr schnell und gerne neue Themen, die im Bezug zur Sache stehen
-wie gesagt C#/.NET sollte die Grundlage sein, alles dazugehörige/kombinierbare schaue ich mir gerne an

-ich möchte ein Multiplayer fähiges Browsergame schreiben, dass pro Spielwelt eine Userzahl von (im späteren Verlauf) 500-8.000 problemlos handhaben kann

-es müssen viele Berechnungen stattfinden, dementsprechend wollte ich auf meinem Server einen eigenen Cronejob o.ä. ablegen/programmieren (dazu bitte auch Tipps wenns geht 😃 )

-ich möchte den Datenverkehr ordentlich verschlüsseln und nicht einfach nur so WischiWaschi durchs Netz schicken. Ich hab Erfahrung mit Krpytographie, würde mir dort aber auch nochmal gerne Expertenwissen einholen

-Animationen sind erstmal gar nicht so wichtig und kleine Bewegungen von Grafiken sind gar kein Problem, der größte (grafische) Aufwand wird eher noch die Weltkarte sein, dass das dann alles aneinander passt (im Rastermuster automatisch generiert)

-die Datenbank wollte ich in einem MS SQL Server verwalten

Wenn ihr neben euren eigenen Tipps noch externe Links habt, ist das auch super, vielleicht kreuzen sich ein paar mit meinen schon Besuchten, aber das ist egal. Vorziehen tue ich dabei Videos, dann kann ich immer noch nebenbei was machen.
Aber alles andere ist auch i.O. , solange es mich weiter bringt ^^

Gibt es sowas wie eine Projektverwaltung, wo ich einfach verschdiene Etappen mit "ToDo's" belegen kann und dann abharken, wenn die Aufgabe erledigt ist etc.? (ich hoffe ihr wisst was ich meine^^)

lG
blu3

PS.: ich weiß, dass es den perfekten Start und Fortlauf in einem Projekt nicht gibt, aber ich kann zumindest versuchen alle Fehler zu vermeiden, die sich vermeiden lassen 😉

02.06.2009 - 22:55 Uhr

Wenn ich mich Recht entsinne, dann meinte der Buchautor das in etwas so(kein Wortlaut oder Zitat, sondern eine sinngemäße Reflexion):
Ein Prototyp einer Methode (Delegate) ist nur eine temporäre Methode, die als solche nicht wirklich existiert sondern nur einer kurzen Funktion dient. Das Verlangen der Funktionsweise lässt es zu keine permanenten Methode notwendig zu machen.
Daher wird temporär ein Prototyp einer sonst exestierenden Methode erstellt, benutzt und wieder verworfen, da diese Methode nur diesen einen Moment einen Existenzgrund hat.

So in etwas würde ich 4-5 Seiten zusammenfassen.

Ich hoffe jetzt wird meine Frage aus dem letzten Beitrag klar 🙁

Wenn nicht hier nochmal in Kurzform: Was erlaubt es mir eine Delegate als Parameter an Sort() zu übergeben, wenn mir die Lib von MVS doch 4 ganz andere Konstruktoren preisgibt ?

lG bluedragon

02.06.2009 - 18:02 Uhr

Ich muss erneut über die Hilfsbereitschaft stauen , die ihr hier wie immer an den Tag legt.Ein erneutes Danke sehr !

Nun fällt es mir wesentlich leichter zu verstehen was das ganze bedeutet und wie es funktioniert. Bzw. es ist mir überhaupt möglich zu verstehen was in dieser Zeile passiert.
Als ich mit C# begann hab ich mir das Buch "C# .NET mit Methode" von Heinrich Rottmann mehrmals durchgelesen und nie wirklich den Part mit den Delegaten verstanden. Das einzige was sich bei mir in den Kopf "gebrannt" hat, war zu diesem Thema das Stichwort "Prototyp" und desshalb ist mit euren beiden Lösungen die ganze Zeit bei mir im Kopf ein Zwiespalt enstanden, denn ich wusste nicht wie ich den möglichen Parameter "Comparison<Chatter> comparison" (den mir die Lib von MVS anzeigt) mit einem Prototyp in Verbindung bringen sollte 😦

Und ehrlich gesagt ist das lediglich die einzige Frage die ich noch habe, denn MSDN gibt darüber leider keinerlei Aufschluss. Warum funktioniert "das Ganze" ? Warum kann man eine Methode als Vergleichslogik an die Methode Sort() übergeben ?

Ich meine ich verstehe nun eure beiden Beispiele , bis auf die Tatsache das diese als Parameter an die Sort()-Methode übergeben werden können. Weil für mich ist es einfach nicht schlüssig, dass der Prototyp einer Methode mit einem Comparison<Chatter> - /IComparable<Chatter>-Objekt gleichziehen kann 😦

Tut mir auch Leid falls ich nerve und meine Frage für euch etwas elementares sind, aber ich möchte es gerne, wie vorhin schon erwähnt, verstehen und nicht einfach nur hinnehmen.
Und wie ebenfalls schon erwähnt gibt MSDN leider keinen Aufschluss darüber.

Es würde mich wirklich freuen, wenn sich noch einmal wer die Mühe gibt mir dieses partitielle Problem zu erklären 🙂

lG bluedragon

ps: bin wie immer für alle möglichen Verweise offen, die mir richtigen Aufschluss geben können 👍

02.06.2009 - 17:07 Uhr

Danke für eure Hilfen, muss aber ehrlich sagen das ich eure beiden Lösungen immernoch nicht verstehe, mir nun aber selber helfen konnte durch eure Stichwörter. Ich habe mir die schöne Literatur von MSDN zu dem Thema IComparable<T>-Schnittstelle einverleibt und konnte sie danach problemlos auf mein Vorhaben projezieren und mein Problem lösen 😃

Falls jemand später ein änliches Problem hat, hier mal mein Code:

Hier die Klasse "Chatter":



    class Chatter : IComparable<Chatter>
    {
        #region Eigenschaften/Klassenvariablen


        private string pNick = "";
        public string Nick
        {
            get { return pNick; }
            set { pNick = value; }
        }

       //Noch ein paar diverse andere Eigenschaften, die für die Lösung
       //unerheblich sind, habe ich rausgenommen, um es knapp zu halten


        #endregion


        #region Methoden


        public int CompareTo(Chatter chatComparer)
        {
            return pNick.CompareTo(chatComparer.pNick);
        }


        #endregion
    }

Hier die Art und Weise wie man dann ganz leicht sortieren kann:



//habe jetzt mal meinen 2. Code nicht gepastet und eben
//ein kürzeres, aber eben so effektives, Beispiel genommen

//tuen wir jetzt mal so als hätte eine Listbox keine eigene Sortiermöglichkeit

public void ListeSortieren(object sender, EventArgs e)
{
    List<Chatter> chatter = new List<Chatter>(); 
   
    foreach(string nicks in listBox1.Items)
    {
        Chatter chatTemp = new Chatter();
        chatTemp.Nick = nicks;
        chatter.Add(chatTemp);
    }

    chatter.Sort(); //hier wäre vorher eine Exception gekommen, weil es keine Sortiermerkmal ausser "Default" gab

    listBox1.Items.Clear();

    foreach(Chatter chatTemp in chatter)
    {
        listBox1.Items.Add(chatTemp.Nick);
    }

    //nun ist die Liste sortiert
}

Der 2. Codesnippet ist vielleicht unnötig, jedoch wollte ich damit nur nochmal zeigen, dass man dann nichts Weiteres mehr zu machen brauch als die normale Methode "Sort()" aufzurufen, ohne jegliche Parameter.

Danke nochmal für eure Denkanstöße und bis zum nächsten Mal.

lG bluedragon 😃

02.06.2009 - 14:04 Uhr

Wow ich muss sagen ich bin wieder überwältigt !
Die Lösung ist sowohl kurz als auch funktionell.
Ich würde nur gerne verstehen wie sie funktioniert. Denn mit dem was da steht weiß ich leider nicht viel anzufangen 😦
Ich für mich persönlich finde es doof eine Lösung einfach nur hinzunehmen, da ich ja hier bin um auch zu lernen und nicht nur für Copy&Paste 😃

Verweise auf andere Webseiten sind natürlich auch von Hilfe, wenn es nicht zuviel Mühe macht .

lG blue

01.06.2009 - 16:32 Uhr

Hallo liebe MyCSharp Gemeinde 😃

Erst einmal wünsche ich frohe Feiertage 😃

Aber ich hab mal wieder ein , ich glaube, Elementares Problem wo ich hängen bleibe.

Und zwar weiß ich nicht wie ich mit den drei Überladungen von List<T>.Sort() umgehen soll, bzw was diese können.
Ich möchte z.B. eine Liste die voller Objekte vom Typ "Chatter" , anhand des "Nicknames" sortieren. Hier ein Bespiel.


Class Chatter
{
     public string Nickname;
}

List<Chatter> chatter = new List<Chatter>();
Chatter a = new Chatter();
Chatter b = new Chatter();
Chatter c = new Chatter();
a.Nick = "hallo";
b.Nick = "test";
c.Nick = "beispiel";

chatter.AddRange(new Chatter[]{a,b,c});

chatter.Sort(); //kommt natürlich eine Exception, weil .NET nicht weiß anhand welschem Merkmal es sortieren soll 

Nun gibt es ja 3 weitere Überladungen von List<T>.Sort() und ich frage mich ob die nicht irgend wie dazu beitragen können, dass es möglich ist beim sortieren von Objekten eine public Variable(dieser Objekte) anzugeben und anhand dieser sollen dann die Objekte der Liste sortiert werden.

Womöglich ne dumme Frage, aber ich mache es mir bisher so umständlich die Nicknames in eine seperate Liste als Strings zu packen, diese dann zu sortieren und dann entsprechend Damit weiter zu arbeiten.

Lg bluedragon

19.05.2009 - 22:23 Uhr

Danke für die weiteren Anworten !

Korrekterweise müßte der Satz heissen:

"Zusätzlich erschüttert es mich ein wenig, dass ich dachte, dass es sich bei Thread-Programmierung um ein simples Problem handelt."

😃

Hehe 😃
Aber ich würde es dann eher so formulieren: "Zusätzlich erschüttert es mich, dass Thread-Programmierung nicht so umgänglich ist."
Ich kann ja wohl kaum an meinen eigenen Verstand appellieren, wo käm ich denn dahin 😉

@rechner: Wenn ich ehrlich bin hat mir der Thread nicht wirklich weiter geholfen, weil es dort um was anderes geht. Ich habe ja kein Problem mit vermissten Packeten. Lediglich damit, dass ein Thread nicht beendet wird.

Habs nun aber nach der "unschönen" Methode gelöst, da es für mich wirklich das simpelste ist. Und warum schwer machen , wenns auch einfach geht. Ausserdem wüsste ich nicht so recht was daran sooo "unschön" sein soll, nur weil ich mich mit mir selber verbinde und damit die Blockade aufhebe, ist das doch kein "unschöner" Lösungsansatz. Zumindest ist das meine Meinung 😉



        #region Programm beenden

        private void button1_Click(object sender, EventArgs e)
        {  Close();   }

        private void form_closing(object sender, FormClosingEventArgs e)
        {
            programRunning = false;
            TcpClient TcpEnd = new TcpClient();
            TcpEnd.Connect(Dns.GetHostAddresses(Dns.GetHostName()), 60000);
            TcpEnd.Client.Disconnect(false);

            Application.Exit();
        }

        #endregion


programRunning ist die Variable die bei mir die Endloschleife für ausstehende Verbindungsaufforderungen steuert. Somit wird die Schleife beendet und der Thread auch.

Bin aber für weitere Anregungen gerne offen 😃

MfG
bluedragon

19.05.2009 - 16:35 Uhr

Danke für die Antworten !
Ich muss sagen , dass ich wirklich noch eine Menge lernen muss, denn mir wird nicht so richtig klar was die Klasse jetzt vorteilhaftes bringt (was möglicherweise auch daran liegt, dass einige Codefragmente für mich unbekannte Dinge enthalten). Zusätzlich erschüttert es mich ein wenig, dass ein für mich simples Problem durch so einen Umstand behandelt werden muss und dass C# keine Möglichkeit bietet einfach einen Thread zu stoppen.

Trotzdem danke ich dafür und ich werde mich mal an den asynchronen Optionen die C# so zu bieten hat üben.

MfG
bluedragon

18.05.2009 - 18:42 Uhr

Ich glaube dann hatte ich den Sinn von asychronen Programmiertechniken nicht richtig verstanden. Ich habe mir das nur so vorgestellt, dass ich irgendwo den entsprechenden Code hinpacke und dann danach der nächste Code weiterverarbeitet wird in der CRL während im Hintergrund irgendwann ein Ereignis ausgestoßen wird, wodurch dann eine Methode aufgerufen wird. Mein Problem war dann immer (oder ist) - gedanklich, dass der Code, der dann weiterläuft, nichts mehr mit dem zu tuen hat was die Methode des Event-Handlers von dem ausgestoßenen Ereignis macht.

MfG
bluedragon

18.05.2009 - 16:24 Uhr

Danke sowas wollte ich doch hören 😃)

Asynchrone Verbindungen kenne ich, aber mag ich nicht so Recht. Ich möchte genau wissen, was wann und wo in meinem Code passiert und nicht "könnte" 😉
Aber werde mir mal die anderen Sachen anschauen.

MfG
bluedragon

17.05.2009 - 23:46 Uhr

Sorry für den Doppelpost, aber ich weiß immernoch nicht was ich dagegen tuen kann 😦

Und wie gesagt, ich find die Option im MSV Studio nicht.

MfG
bluedragon

15.05.2009 - 23:48 Uhr

Wo schaue ich mir die laufenden Threads während des debuggens an ?
Finde diese Option im MSV Studio nicht 😦

MfG
bluedragon

15.05.2009 - 23:02 Uhr

Hallo liebe myCSharp'ler,
ich habe mal wieder nen kleines Problem, was mich aber doch nervt und ich es alleine nicht behoben bekomme.

Es sieht wie folgt aus:
Ich schreibe zur Zeit an einem Chat mit Server und Client. Der Server horcht über einen ausgelagerten Thread mit den Klassen TcpListener & TcpClient nach eventuellen Verbindungsanfragen.
Nun ist das Problem, dass ich in dem Thread ne Endlosschleife habe, um nach einer eingegangenen Verbingungsaufforderung ein paar Dinge zu regeln und dann wieder erneut zu warten, und meine Application nichtmehr komplett beendet wird sobald ich auf das X oben rechts klicke oder auf meinen "Beenden"-Button.
Ich habe es auch schon mit Thread.Abort() oder Thread.Interrupt() probiert, damit er nichtmehr horcht und alles beendet wird, aber das klappt nichtmehr 😦

Hier mal die wichtigen Segmente:


    

//das hier ist die Methode für den Auslagerungsthread  
private void clientsHorchen()
{
    TcpListener listener = new TcpListener(60000);
    listener.Start();
    int chatterZähler = 0;

    while(true)
    {
        TcpClient client = listener.AcceptTcpClient();

        //noch ein paar Dinge machen, die 
        //aber auf keine Fall den Thread aufhalten        
    }
}  

///////////---------------------

//das hier ist der "Beenden"-Button
private void beenden_Click(object sender, EventArgs e)
{
     host.Abort();
     Application.ExitThread(); //auch bei Application.Exit();
}

Ich hoffe die Angaben reichen. Auf Jedenfall passiert es nicht, dass die Application nur halb beendet wird , wenn ich die Endlosschleife rausnehme.
Halb beenden heißt soviel, dass die Form geschlossen wird, jedoch der Debugger vom MS Visual Studio mir sagt, dass die Application noch nicht beendet ist.

MfG
bluedragon

14.02.2009 - 15:31 Uhr

Hallo SeeQuark,

Danke für die ausführliche Anwort =)
Habe alles verstanden und meine Frage ist beantwortet 😃

MfG
bluedragon

14.02.2009 - 01:52 Uhr

Guten Abend oder Morgen 😉

Hab mal ne kleine Frage. Und zwar habe ich eine Resizeklasse programmiert, mit der ich sämtliche Controls meiner Form (auch "Marke Eigenbau"), bei Bedarf (wenn ich die Klasse auf die Control anwende), resizen und verschieben kann. Nun soll beim resizen ein Event ausgelöst werden, bei dem die das Control der neuen größe angepasst wird. Und hier meine Frage: wo ist der Unterschied zwichen den beiden Events Control.Resize und Control.SizeChanged ?
Merkwürdigerweise funktioniert alles wunderbar, wenn ich Control.SizeChanged verwende. Bei Control.Resize, passiert nichts.

MfG
bluedragon 😃

15.12.2008 - 16:24 Uhr

Tja das ist wieder mal reine Frage der Ansicht, ich sagte, dass ich nicht annähernd gut bin in C#. Ich verstehe grundsätzliche Semantik durch bisherige Sprachen, aber die Syntax ist noch mal ne andere. Und zeige mir bitte eine Klasse in .Net die meine gewünschten Funktionen bereitstellt.
Man kann jetzt noch etlich Stunden darüber philosophieren, ob es sinnvoller ist, ne eigene Uhr zu machen oder eine vorhandene zu nehmen, aber Tatsache ist einfach, das es ja hier um mein Projekt geht, dass ich selber machen will, wenn ich mir Sachen einfach downloade (wegen des Linkes), dann brauch ich erst gar nichts machen. Ich programmiere ja wegen des programmierens, nicht damit ich einfach schnell schnell schnell an mein Ziel komme !! Und wenn ich dann irgendwann an meinem Ziel angekommen bin, kann ich sagen, dass ich was geschafft habe und bei Bedarf kann man mit leichtigkeit Kleinigkeiten verändern und muss nicht, wenn es schon beinahe zuspät ist und man merkt, dass von .Net bereitgestellte Klassen nicht ausreichen, dann erst anfangen hier und da ne eigene Klasse zu erstellen, lediglich die eigene erweitern.
Wenn ich dann mit dem Studium anfange nächstes Jahr und danach eine Ausbildung zum Anwendungsprogrammierer mache, werde ich sicher oftmals, entgegen meiner eigenen Strebung, schon vorhanden Komponenten benutzten, aber nur weil es dann vom Arbeitgeber so verlangt wurde und nicht weil ich das so für richtig halte.
Aber wie gesagt: Ansichtssache !

MfG
bluedragon

PS: Man muss nicht darüber streiten, regelrecht alles selber zu machen, das wäre schwachsinn, dann bräuchte man .Net ja nicht. Aber solche Dinge wo es merklich lohnt, ansonsten gäbe es ja noch immer die tolle Vererbung.

15.12.2008 - 00:11 Uhr

Ich weiß nicht warum ich Timer nicht so mag, irgendwie habe ich immer das Gefühl, dass da etwas im Hintergrund meine Ressourcen aufbraucht, aber wahrscheinlich bin ich nur paranoid 😁 Werds dann wohl so machen.

Und zu deiner Frage: Es ist einfach so, das es mir viel mehr Spass macht solche Dinge selber zu programmieren, zusätzlich möchte ich einige mehr Funktionen zur Verfügung stellen. Z.B. Alle 36 Zeitzonen stehen zur Verfügung (optional), die Anzeige(nur Uhrzeit oder Uhrzeit+Zeitzone), analoge oder digital Anzeige, zur Laufzeit per Drag&Drop die Uhr verschieben. Denn wenn ich auch so kleine Dinge selber mache und noch erweitere, dann habe ich nicht nur eine tolle Klasse die ich auch in anderen Projekten wiederverwenden kann, sondern dadurch erweitere ich auch mein Programmierkontingent. Leider bin ich noch nicht mal annähernd gut in C# und arbeite mich seit ich anfing damit, von Tutorial zu Tutorial und von Buch zu Buch. Ich programmiere zwar seit 6 Jahren in allen möglichen Sprachen (ca 14 an der Zahl, auch unter UNIX) aber mein Hauptaugenmerk sind PHP(und Co) und C#(seit ca 1 Jahr). Also auch so kleine Sachen selber zu programmieren ist nur förderlich um mein , ich sag mal, "Können" zu verbessern. Man könnte auch sagen, dass ich dadurch, nach und nach, erlerne eine gewisse Routine bei solchen "Problemen" zu erhalten und stehe später bei wirklichen Problemen nicht vor verschlossener Tür, weil es schon beim Start hapert. Ausserdem ist die Uhr nur ein kleiner Teil des Projektes das ich mit einem Freund programmiere, d.h. wissen wir beide woran wir sind und müssen uns später nicht um fehlende Funktionen ärgern, sondern brauchen schon vorhandenen Komponenten nur geringfügig zu erweitern.

MfG
bluedragon

14.12.2008 - 20:28 Uhr

Danke hat wunderbar geklappt, hatte vergessen ne größe zu deklarieren und die Control hinzuzufügen =)

Jetzt hab ich noch eine Frage:
Und zwar wie würdet ihr es am besten realisieren, das die Uhr sich selbst neu zeichnet. Also klar OnPaint wird ja durch Sachen aufgerufen wie, wenn man jetzt die Form deselektiert und wieder selektiert oder wenn man die ausserhalb das Bildschirmrandes zieht. Dadurch aktualisiert sich die Uhrzeit ja, aber wie kann ich am besten die Uhr kontinuierlich aktualisierbar machen. Selbstverständlich habe ich bereits an Timer gedacht, aber ich mag Timer nicht so gerne und Threading in Kombination mit Thread.Sleep(), weiß ich nicht ob sich das dafür lohnt.
Wie würdet ihr das realisieren ?

MfG
bluedragon

13.12.2008 - 19:18 Uhr

Alles klar, jetzt war es verständlicher =)

So nun habe ich das hier in meiner Klasse (ist von Control abgeleitet):


//diff, zone, x,y sind verfügbar, weil sie für die oberste Ebene private deklariert sind
protected override void OnPaint(PaintEventArgs e)
{
    //base.OnPaint(e);
    dt = DateTime.Now + new TimeSpan((int)diff, (int)((diff % 1) * 60), 0);
    MessageBox.Show(dt.ToShortTimeString());
    
    e.Graphics.DrawString(zone.PadLeft((int)(e.ClipRectangle.Width/2), ' ') + ":\n" + dt.ToShortTimeString(), new Font(new FontFamily("Arial"),12 ), new SolidBrush(Color.Black) , x,y );
}

Und das hier in der Form um es zu testen:


public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        TimezoneClock t = new TimezoneClock(50, 30);
        t.Invalidate();
    }
}

Aber er zeichnet den angegebenen String bei 50, 30 nicht.
Es kommt auch keine Fehlermeldung. Wenn ich jetzt testweise eine MessageBox in die OnPaint-Methode schreibe, kommt auch diese nicht. D.h. muss es irgendwie am Aufruf liegen.

MfG
bluedragon

13.12.2008 - 16:51 Uhr

Danke erstmal für die Antworten, werde mich daran probieren, und was genau ist der unterschied zwichen UserControl und Control. Denn "einzelne" und "neue" (deine Argumente) treffen ja beide zu oder nicht ?

MfG
bluedragon

*EDIT* schon gut. Habe deinen Post falsch gelesen. Ich habe jetzt verstanden was du meinst 😃

13.12.2008 - 16:22 Uhr

Hallo Leute,
irgendwie konnte ich keinen aussagekräftigen Titel finden [EDIT=herbivore]Titel geändert[/EDIT], was wahrscheinlich auch daran liegen kann, dass ich es nicht wirklich gut beschreiben kann. Naja egal 🙂

Es geht darum, dass ich für ein großes Projekt, dass ich mit einem Kumpel zusammen mache, gerade eine Klasse TimezoneClock erstelle. An diese Klasse kann man entweder nur Koordinatan (x,y) oder Koordianten und eine Zeitzone übergeben, sodass eine Digitale (per Methodenaufruf auch analog) Uhr generiert werden soll.
Nun die Berechnung der entsprechenden Zeitzonen habe ich bereits gelöst. Nun möcht ich, dass die Uhr an den Koordinaten angezeigt wird und weiß leider nicht genau wie ich es anstellen soll. Also mir ist klar, dass ich eine Methode dazu verwenden muss, aber mich würde interessieren ob es so etwas, wie Invalidate, für Klassen gibt, sodass intern dann die Methode (die ich dann überschreiben werde) OnPaint aufgerufen wird und sich die Klasse quasi selbst aktualisiert.
Ich habe schon häufiger gesehen, dass man einzelne Abschnitte oder Steuerelemente per Invalidate erneuern kann. Wüsste aber nicht ob das bei Klasse so möglich ist. Ich möchte es z.B. auch später ermöglichen, dass per Drag&Drop die Uhr verschiebbar wird (aber das kann warten) und da müsste ich die Uhr dann auch komplett neu zeichnen und die alte Stelle aktualisieren.

Ich weiß nicht genau wie ich mein Problem noch näher erläutern soll, aber ich hoffe es ist halbwegs verständlich gewesen, was ich vorhabe und wo ich nicht weiter komme.

MfG
bluedragon 🙂

09.12.2008 - 20:43 Uhr

Danke sehr, werde mir die Seiten nachher mal verinnerlichen.

MfG
bluedragon

*EDIT*
Danke sehr, habe mir mal den MySQL-Link angeschaut und das scheint genau das zu sein was ich gesucht habe, testen tu ich es aber Morgen, nach der Schule 🙄

09.12.2008 - 17:35 Uhr

Hallo Leute,
ich weiß nicht genau ob das hier der richtige Themenbereich ist, aber ich glaube mal schon 🙂

Es geht sich um folgendes, da ich mal Lust hatte mit was neuem anzufangen und meine Mutter großhändlerin über Ebay ist, wollte ich mal "ganz einfach" ein Verwaltungsprogramm für sie schreiben. Das soll so Sach wie Lagerbestand, Userverwaltung etc. enthalten.
Und nun mein Problem: ich habe mir schon ein paar mal verinnterlicht wie man Querys formt und Daten ausgibt. Jedoch wurde noch nie erklärt wie ich eine Datenbank in mein Programm einbinde. Eventuell möchte ich sogar eine MySQL-Datenbank benutzten da diese ja schon online sind, da frage ich mich allerdings ob das überhaupt möglich ist (ich glaube schon, wüsste nur nicht wie).

Also bitte jetzt keine Standartantwort, dass ich möchte das mir hier jemand was programmiert und ich nen Jobangebot mache oder so, dafür bin ich hier schon zulange in dem Forum, um das zu wissen 🙂 (SuFu hat auch nix ausgespuckt 🙁 )

Ich möchte lediglich ein paar Infos wie ich es anstelle - optimal wären Links zu Infoseiten/Tutorials - , wenn ich jetzt eine fiktive Datenbank hätte phpmyadmin.test.funpic.de (da ich immer alle Programme (programmiere selber ein Browsergame) auf Funpic teste und diese Seite sehr stabil läuft und sehr gute Ladezeiten vorweisen kann, würde ich es (wenn es den geht) damit testen)

MfG
bluedragon

07.12.2008 - 01:08 Uhr

Allein das zwichen "combat" und "arms" ein Leerzeichen ist, zeigt schon, dass es diese Funktion nicht gibt. Oder hast du schonmal eine Funktion mit Leerzeichen gesehen ? Ich lasse mich gerne belehren 😃

24.11.2008 - 21:45 Uhr

Sowohl HeapSort und Radixsort/Bucketsort (beide sehr ähnlich), kenne ich auch und finde ich wie du ebenfalls interessant eben wegen dieser Strukturunabhängigkeit(Radixsort/Bucketsort) der zu sortierenden Elemente. Ich habe die drei in meinem letzten Post nur nicht erwähnt, weil ich nicht zu sehr von dem eigentlichem Code abweichen wollte =)
Aber du hast Recht, wenn du sagst, das diese beiden auch sehr interessant und schnell sind !

MfG
bluedragon

PS: so etwas wie 'swap' gibt es nicht, aber lässt sich ja leicht realisieren/implementieren.

24.11.2008 - 21:03 Uhr

Danke auch für dein Lob und auch für die Seite, habe sie gerade überflogen und ich muss sagen, dass sie mir echt interessant erscheint. Vom MergeSort habe ich bis dato noch nix gehört, werde ihn mir aber auch mal einverleiben. Ausserdem finde ich den ShellSort noch sehr interessant, denn dieser scheint auch eine sehr geringe Laufzeit aufzuweisen.

Danke ersmal an euch.

Es kann sein, dass ich hier das Forum falsch verstanden habe, dachte hier kann man auch seine Programmierungen vorstellen, um sie kritisieren zu lassen, damit man sie verbessert. Ich wusste nicht, dass es lediglich für die Nutzung Anderer gut sein soll. Denn es ist mir schon klar, dass es immer bessere Methoden gibt, es gibt sogar bestimmt einen Algorithmus, der besser als der der Lib von C# ist, vielleicht wurde dieser nur noch nicht entdeckt 🙂 Wenn ich das nun auch wieder missverstanden habe, bitte ich um Aufklärung 🙂

MfG
bluedragon

24.11.2008 - 20:19 Uhr

Ja den Quicksort habe ich mir auch durchgelesen, bzw einige der Algorithmen die es zum sortieren gibt, aber ich wollte mal eine eigene Kreation rekursiv entwerfen.
Das Quicksort schneller ist, sagt einerseits der Name und andererseits die Tatsache wie er funktioniert. Mag etwas plump klingen, aber dieser ist wirklich mit Abstand der schnellste Sortieralgorithmus. Denn er unterteilt (ähnlich wie ich) auch erst die gesamte Liste und legt die Mitte mit einem sogenannten "pivo" fest. Dann wird verglichen/getauscht und die beiden Teile die sich ergeben, rekursive übergeben und wieder unterteil, mit pivo versehen, verglichen, getauscht und wieder übergeben. das Geht dann wie bei mir so weiter, bis nur noch Teile übrig bleiben, die automatisch sortiert sind.
Was den Quicksort im Gegensatz zu meinem noch einen Schritt schneller macht (meiner ist ja nicht langsam 🙂), ist die Tatsache, dass bei mir minimum 1 Element in einer ArrayList übrig bleiben darf, damit es sortiert ist, beim Quicksort ist ein Teil schon zwichen 1 und 3 Elemten fertig sortiert !

Und danke für die Kritik, das Lob und die Information darüber, dass ArrayListen veraltet sind !!!

MfG
bluedragon

24.11.2008 - 19:52 Uhr

Beschreibung:

Also da ich mal das Thema Sortieralgorithmen in der Schule behandelt habe, bzw. es 2-3 Schulstunden "angeschnitten" wurde, habe ich mich mal selbst informiert, was es so gibt und mal 4 Stück programmiert. 3 davon sind Ideen aus dem Internet (diese sind zum sortieren von Zahlen gedacht) und 1er ist von mir selber kreiert und auch (mag arrogant klingen) die schnellste Methode um (vor allem) große Datenmengen, die aus Strings bestehen (is ja oft ein Problem, das handling mit Strings bei einigen), zu sortieren.

Erst kommen die 3 "geklauten", dann mein Eigener.

Dieser trägt den Namen Bubblesort. Das rührt daher, weil immer 2 Zahlen, die direkt nebeneinander "liegen", betrachtet werden und man es sich so vorstellen kann, als sei eine Luftblase dort, die diese beiden umschließt.
Der Algorithmus funktioniert so, dass nach jedem Durchlauf, geschaut wird ob bei dem vorigem Durchlauf getauscht wurde und ob dieser schon n-mal durchgelaufen ist. Wenn das Letzte mal nicht getauscht wurde oder schon n-Durchläufe (im worse-case) geschehen sind, bedeutet das automatisch, dass alle Elemente soritert sind.


public void bubbleSort(ArrayList elemente ) 
{
  int  n = elemente.Count, help;
  bool vertauscht;
  do
  {
      vertauscht  = falsch;  
      for(int i = 0; i < n; i++)
         if(elemente[i] > elemente[i+1]) 
         {
            help = elemente[i];
            elemente[i] = elemente[i+1];
            elemente[i+1] = help; 
            vertauscht = true;
         }
    n--;
  while(vertauscht && n > 0)
}

Dieser hier trägt den Namen Selectionsort. Den Namen erhielt er, weil der Algorithmus n-mal, die zu sortierenden Elemente, durchgeht und sich jedes mal das kleineste raussucht, um es mit dem n-ten zu tauschen.
Dadurch ergibt sich nach jedem Durchlauf ein schon sortierter Teil und ein unsortierter Teil. D.h. brauch man bei jedem weiteren Durchlauf nur noch anzahl_der_elemente - n Elemente zu betrachten.



public void selectionSort(ArrayList elemente)
{
    for (int i = 0; i < elemente.Count; i++)
    {
        int min = i;
        for (int j = i + 1; j < elemente.Count; j++)
            if (elemente[j] < elemente[min])
                min = j;

        string tmp = elemente[min];
        elemente[min] = elemente[i];
        elemente[i] = tmp;
    }
}

Der Nächste heißt Insertionsort. Er bekam den Namen, weil dieser davon ausgeht, das n+1 Elemente schon sortiert sind (n = Anzahl der Durchläufe) und er sich dann das erste Element der unsortierten Elemente nimmt und direkt an die richtige Stelle in der Liste platziert.


private void insertionSort(ArrayList elemente)
{
    int i, austausch = 0, key;

    for (int j = 2; j < elemente.Count; j++)
    {
        key = elemente[j];
        i = j - 1;
        while (i >= 0 && teilmenge[i] > key)
        {
            elemente[i + 1] = elemente[i];
            i--;
        }
        elemente[i + 1] = key;
    }
}

Und hier kommt mein Algorithmus mit dem Namen Nameless 😉 Ne mir ist kein Name eingefallen =)
Bedinung ist eine Liste von n-Elementen zu haben, die rein aus Strings besteht und jeder String kann endlich viele Zeichen haben.
Das Prinzip ist, dass man beim Aufruf die Liste hat und bei allen Strings an Stelle n den kleinsten Buchstaben raussucht, dann erneut überprüft welsche Strings denn alle diesen kleinsten Buchstaben an Stelle n aufweisen können und diese dann separat in eine ArraList kommen. Alle anderen die ein anderes Zeichen an Stelle n haben, werden in eine Andere ArrayList gepackt.
Wenn man dann sortiere rekursiv Aufruft und als Parameter, die Erste Liste nimmt, wo schon die n-Zeichen gleich sind und als zweiten Parameter das n+1-te Zeichen übergibt, dann wird wieder von neu angefangen. Dadurch, dass man bei jedem Aufruf erst überprüft, ob nur noch 1 Element in der ArrayList ist, bedeutet das, dass dieses Element richtig ist und in der fertigen Liste abgelegt werden kann.
Die rekursive Aufrufs-Reihenfolge ist ja Umgangssprachlich "rufe erst den schon annähernd sortierten Teil neu auf und überprüfe ab dem nächsten Zeichen. Danach rufe den unsortierten Teil auf, mit den noch komplett unsortierten Strings."
Dadurch ergibt sich, dass autmatisch das kleinste Element nach oben rückt, weil es immer in die ArrayList mit den 'schon-sortierten-teilen' gepackt wird und das größte Element nach unten, weil diese immer in den unsortierten Teil gepackt wird.
Wenn das kleinste soweit oben ist, dass es allein im sortierten Teil ist, dann bedeutet das, dass es automatisch sortiert ist. Dann das 2-kleinste usw.



ArrayList fertig = new ArrayList(); //ArrayList wo am ende alles fertig sortiert vor zufinden ist

private void sortiere(ArrayList teil, int zeichen)
{ 
    //wenn die arraylist nur noch aus einem element besteht, dann ist dieses
    //element automatisch sortiert und soll in die fertige arrayliste gepackt werden
    if(teil.Count == 1)
        fertig.Add(teil[0]);
    else if (teil.Count > 0)
    {
        ArrayList help1 = new ArrayList(); //die ArrayList wo die, bis zu dem zeichen-stem Buchstaben richtig sortierten, Strings reinkommen 

        ArrayList help2 = new ArrayList(); //unsortierter Teil

        //es wird zu Beginn davon augegangen, dass im ersten String der zeichen-ste Buchstabe am kleinsten ist 
        string help_char = teil[0].ToString()[zeichen].ToString(); 

        for(int i = 0; i < teil.Count; i++) //kleinsten Buchstaben herrausfinden
        {                    
            if (String.Compare(help_char, teil[i].ToString()[zeichen].ToString()) > 0)
            {
                //wenn der erste teil größer ist,dann das Andere zwichenspeichern in help_char
                help_char = teil[i].ToString()[zeichen].ToString();   
            }
        }


        for(int j = 0; j < teil.Count; j++)
        {
            //die arrayliste durchlaufen lassen und schauen, ob der kleinste buchstabe
            //mit dem an der Stelle 'zeichen' übereinstimmt
            //wenn ja --> gesamten String in die sortierte ArrayList packen
            //wenn nein --> gesamten String in die unsortierte Arraylist packen
            if (String.Compare(teil[j].ToString()[zeichen].ToString(), help_char) == 0)
                help1.Add(teil[j].ToString());
            else
                help2.Add(teil[j].ToString());
        }
        //sortiere nochmal aufrufen mit der Arraylist wo bis zu dem zeichen-stem Buchstaben alles gleich ist
        //aber diesmal beim nächsten zeichen prüfen
        sortiere(help1, zeichen + 1); 
        
        //den ganzen unsortierten teil neuaufrufen und dort wieder den kleinsten
        //buchstaben rauspicken und sortieren/auf die ArrayListen verteilen
        sortiere(help2, zeichen);
    }
}

// "gestartet" wird der Algorithmus mit "sortieren(elemente, 0)" , weil 'elemente' 
//eine ArrayList mit unsortierten Strings ist und 0 das Start- oder Erst-Zeichen in einem String ist

Sorry für den vielen Text, aber ich möchte es, von vornherein, so verständlich machen wie es nur geht 🙂

Schlagwörter:*bubble sort *insertion sort *selection sort *rekursive sortierung *sortieren durch rekursion *rekursiver algorithmus

Bin wie imer für konstruktive Kritik offen =)

MfG
bluedragon

17.11.2008 - 23:03 Uhr

Zu 1. Ich weiß 😉 In anderen Programmen arbeite ich mit soetwas nicht, aber kann man damit sehr einfach realisieren. Nebenbei habe ich noch andere Projekte am laufen wo is ausschließlich mit OnPain und Invalidate arbeite.

Zu 2. Dispose kenne und benutze ich ebenfalls, wie gesagt in andere Projekten ;=)
Aber kann man ja trozdem mal einbauen.

Zu 3. hust da ich bisher nur das Programm in den Fingern hatte, ging ich immer davon aus, das eine gültige Eingabe getätigt wird. Aber man weiß ja nie, danke für den Hinweis, aber ist ja kein berauschender Fehler 🙂

Zu 4. Ich hab den Code nicht 1:1 Kopiert:Eingefügt und wohl beim Variablen umbenennen, etwas zuviel des guten getan. Aber mit richtigen Zeichen ist die Funktionalität vorhanden.

Zu 5. Das es sich dabei im einen Integer handelt war schon beabsichtigt. Da 512 ein vielfaches von 2 ist, war es egal ob man 512 1, 2,3...n mal teilt. Bis man bei 512/n=1 angelangt wäre, würde er ja problemlos zeichnen. Aber ab 512/n=1 wären dann beim nächten Mal 1/2=0 Pixel nichtmehr zeichenbar und wäre, somit immer 0. Also das war schon beabsichtigt, aber trotzdem danke ;=)

ansonsten ist es guter code und recht übersichtlich gehalten. ein wenig mehr kommentare über die schritte wären nett aber ich hab mich auch so recht gut zurechtgefunden.

Danke sehr =)
Kommentierungen mache ich eigentlich nur bei größere Projekten, da es sich hier nur um reine Funktionen handelt, ausser der Turtle, habe ich es mehr oder wengier gelassen. Bei wirklich umfangreichen Dingen, kommen auch so Dinge wie "#region Test", "#endregion", "<summary>" o.ä. ins Spiel.

MfG
bluedragon

17.11.2008 - 22:14 Uhr

Beschreibung:

Also da ich mal vor Jahren in der Schule mit einem Programm arbeitete was "Turtle" hieß und einen Stift simulierte, den man "hoch nehmen und auf das Papier absetzen" , "links drehen", "rechts drehen", "vorwärts -" und "rückwärts gehen", konnte habe ich mal so als Projekt, selbiges gemacht. Falls ihr euch nicht vorstellen könnt wie ich das meine, siehe hier http://wiki.zum.de/Turtle-Grafik .
Hinzu kommen noch 3 Codes, die diese Turtle verwenden. Einmal die Kochsche Schneeflocke mit 3*4n Seiten, einmal den Pytagorasbaum mit 2n Ästen und einmal das Sierpinski-Dreieck mit 3^n immerwieder verschachtelten Dreiecken. Wem das alles nichts sagt, kann gerne bei Wiki nachschauen. (Links sind weiter unten)

Die Turtle ist eine Klasse und die 3 Rekursionen lediglich je eine Funktion.

Die Turtle:


public class CTurtle
    {
        private Graphics g;
        private bool meinstift = false;//Stift oben 
        private Pen p = new Pen(Color.Black);
        private float meinturtlex=0;
        private float meinturtley=0;
        private float meinturtlew=0;
        public float X
        {
            get { return meinturtlex; }
            set { meinturtlex = value; }
        }

        public float Y
        {
            get { return meinturtley; }
            set { meinturtley = value; }
        }

        public float Winkel
        {
            get { return meinturtlew; }
            set { meinturtlew = value; }
        }

        private void mitte()
        {
            meinturtlex = Form1.ActiveForm.Width / 2;
            meinturtley = Form1.ActiveForm.Height / 2;
            meinturtlew = 0;
        }
        public void stiftab()
        {
            meinstift = true;
        }
        public void stiftauf()
        {
            meinstift = false;
        }

        public CTurtle()
        {
            g = Form1.ActiveForm.CreateGraphics();
            mitte();
            stiftab();
        }

        public void Clear()
        {
            g = Form1.ActiveForm.CreateGraphics();
            g.Clear(Color.White);
        }
        public void vor(float länge)
        {
            g = Form1.ActiveForm.CreateGraphics();
            float neuesx = meinturtlex + länge *(float) Math.Cos((meinturtlew - 90) / 180 * Math.PI);
           float neuesy = meinturtley + länge * (float)Math.Sin((meinturtlew - 90) / 180 * Math.PI);
            if (meinstift)//zeichnen, wenn Stift unten
            {
                g.DrawLine(p, meinturtlex, meinturtley, neuesx, neuesy);
            }
            meinturtlex = neuesx;
            meinturtley = neuesy;
        }
        public void dreherechts(float winkel)
        {
            meinturtlew += winkel;
            meinturtlew %= 360;
        }
        public void drehelinks(float winkel)
        {
            meinturtlew -= winkel;
            meinturtlew %= 360;
        }
        public void neustart()
        {
            g = Form1.ActiveForm.CreateGraphics();
            mitte();
            g.Clear(Color.White);
        }
    }

Ich habe es ganz simpel gehalten, sodass es nur 3 Buttons und eine Textbox für die Eingabe von n gibt.

Die Kochsche Schneeflocke(die Funktion an sich ist eigentlich die Kochkurve):



private void button1_Click(object sender, EventArgs e) //Button für die Schneeflocke
{
    float länge = 480; //Startseitenlänge
    länge = länge / (float)(Math.Pow(3, Convert.ToInt32(textBox1.Text))); //Schlusslänge jeder Seite
    CTurtle t2 = new CTurtle(); 
    t2.Clear();      

    if (textBox1.Text == "0") //für n=0 ist ein sonderfall und muss seperat behandelt werden
    {
        t2.dreherechts(30);
        t2.vor(länge);    
        t2.dreherechts(120);
        t2.vor(länge);
        t2.dreherechts(120);
        t2.vor(länge);
    }
    else //von 1 bis unendlich
    {
        //Da sich die Kochsche Schneeflocke aus 3 mal Koch-Kurve zusammensetzt, erfolgt der Aufruf einfach 3 mal mit je einer Drehung

        t2.dreherechts(30);                
        Kurve(Convert.ToInt32(textBox1.Text), ref t2, länge);
        t2.dreherechts(120);
        Kurve(Convert.ToInt32(textBox1.Text), ref t2, länge);
        t2.dreherechts(120);
        Kurve(Convert.ToInt32(textBox1.Text), ref t2, länge);
    }
}

public void Kurve(int n, ref CTurtle t, float schritt)
{             
        if (n > 0) Kurve(n-1, ref t, schritt);
        if(n==1) t.vor(schritt);
        t.drehelinks(60);
        if (n > 0) Kurve (n- 1, ref t, schritt);
        if (n == 1) t.vor(schritt);
        t.dreherechts(120);
        if (n > 0) Kurve- 1, ref t, schritt);
        if (n == 1) t.vor(schritt);
        t.drehelinks(60);
        if (n > 0) Kurve(n - 1, ref t, schritt);
        if (n == 1) t.vor(schritt);
}

Pythagoras - Baum:


private void button2_Click(object sender, EventArgs e) //Button für Pythagorasbaum
{
    int größe = 70; //Startseitenlänge im Anfangs-Quadrat
    CTurtle t = new CTurtle();
    t.Clear();
    Pytagoras(t, größe, Convert.ToInt32(textBox1.Text));
}

private void Quadrat(CTurtle t, int größe) //eigentlich nicht nötig, habe es aber trotzdem so gemacht
{
    for (int i = 0; i < 4; i++)
    {
        t.vor(größe);
        t.drehelinks(90);
    }
}

private void Pytagoras(CTurtle t, int größe2, int n)
{
    CTurtle t2 = new CTurtle();
    int ankathete = (int)(Math.Cos(60 * 2 * Math.PI / 360) * größe2);
    int gegenkathete = (int)(Math.Sin(60 * 2 * Math.PI / 360) * größe2);   

    Quadrat(t, größe2);

    t.vor(größe2);
    t.dreherechts(60);

    t2.Y = t.Y;
    t2.X = t.X;
    t2.Winkel = t.Winkel;

    if (n > 0) Pytagoras(t2, ankathete, n - 1);

    t.drehelinks(90);
    if (n > 0) t.vor(ankathete);

    t2.Y = t.Y;
    t2.X = t.X;
    t2.Winkel = t.Winkel;

    if (n > 0) Pytagoras(t2, gegenkathete, n - 1);
}


Das Sierspinski - Dreieck:


private void button3_Click(object sender, EventArgs e) //Button für das Dreieck
{
    int größe = 512; //Startseitenlänge des Startdreiecks
    CTurtle t = new CTurtle();
    t.Clear();
    t.dreherechts(30); //die Turtle "schaut" beim Start nach Norden, aber das Dreieck fängt im 60° Winkel an, d.h. muss sie erst 30° gedreht werden

    Dreieck(t, größe, Convert.ToInt32(textBox1.Text));
}

private void klDreieck(CTurtle t, int größe) //auch diese Funktion ist nicht nötig, könnte man alles unten einfügen
{
    t.vor(größe);
    t.dreherechts(120);
    t.vor(größe);
    t.dreherechts(120);
    t.vor(größe);
    t.dreherechts(120);
}

private void Dreieck(CTurtle t, int größe2, int n)
{
    CTurtle t2 = new CTurtle();

    t2.Y = t.Y;
    t2.X = t.X;
    t2.Winkel = t.Winkel;

    klDreieck(t, größe2);

    if (n > 0)
    {
        Dreieck(t2, größe2 / 2, n - 1);

        t2.vor(größe2 / 2);

        Dreieck(t2, größe2 / 2, n - 1);

        t2.dreherechts(180);
        t2.vor(größe2 / 2);
        t2.drehelinks(120);
        t2.vor(größe2 / 2);
        t2.drehelinks(60);

        Dreieck(t2, größe2 / 2, n - 1);
    }
}


Schlagwörter: *Zeichenturtle *Turtle *rekursion *reskursives zeichnen *Zeichenstift simulieren *Kochsche Schneeflocke *Pythagoras - Baum *Sierspinski - Dreieck

Links:
Kochsche Schneeflocke
Pythagoras - Baum
Sierpinski - Dreieck

Tja und das wars so weit. Ich bitte darum, weder so etwas zu hören wie "boahr das geht doch besser" oder "wo hast du den Code runtergeladen/kopiert, gib mir auchmal die Seite" o.ä. !! Ich habe Obiges selbst mit meinen eigenen Fingern geschrieben und nirgends, auch nur einen Ansatz von ,Hilfe bekommen oder gar gesucht !!! Lediglich der Gedanke, an vergangene Schulzeit, brachte mich auf die Idee eine Turtle zu programmieren. Daraus entstand von ganz alleine die Frage, was ich nun damit Alles, tolles machen kann.
Beim Pythagoras - Baum hätte man noch die innen-Winkel selber eingeben können, aber das habe ich mal außen vor gelassen und einfach mit 60°/90°/30° gearbeitet.

Wie gesagt, bei Fragen "wieso, weshalb, warum" stehe ich gerne zur Verfügung und konstruktive Kritik ist auch sehr gern gesehen 🙂

MfG
bluedragon

17.11.2008 - 20:52 Uhr

Ja tut mir Leid , dass ich lieber einmal zuviel frage als einmal zu wenig 🙂

17.11.2008 - 20:27 Uhr

Naja damit machen, möchte ich ihn in gewisser Weise präsentieren. Und wenn Andere möchten daran herumbasteln oder verfeinern lassen. Ich selbst finde den Code so gut oder Okay 😉 Aber lerne auch gerne dazu oder beantworte Fragen warum ich was, warum und wieso genau so gemacht habe =)
Und am Ende (oder auch direkt), möchte ich den Code für andere zur Verfügung stellen, falls man den mal gebrauchen kann.
Wie gesagt wenn ihr mir sagt wo, gibts ihn mit näheren Infos 🙂
mfg
bluedragon

17.11.2008 - 20:02 Uhr

Wie der Titel schon sagt, wüsste ich gerne wo ich bestimmten Code poste.
Es handelt sich um fertigen Code, zum Thema rekursive Programmierung.
Dieser funktioniert einwandfrei und man könnte ja eventuell noch daran rumbasteln (lassen ;=) ) oder einfach irgendwo zur Verfügung stellen.

MfG
bluedragon

28.09.2008 - 21:51 Uhr

Ich hatte tschreno geantwortet.

Ich auch ^^
Oder darf man in seinem eigenen Thread keine Fragen beantworten 😉

Die "Stufe"-Klasse gibts einfach nur, damit es einen gemeinsamen Typ gibt (Typensicherheit und so). Es könnte auch ein Interface sein.

Jop

mfg
bluedragon

28.09.2008 - 21:25 Uhr

Hab ich was anderes gesagt ? =)

Aber laut deinem UML-Diagramm, gibt es eine Klasse "Stufe", diese wird an die andern Stufen weitervererbt.

mfg
blue

28.09.2008 - 18:13 Uhr

Wenn ich das Prinzip aber richtig verstanden habe, dann steht in der jeweilig neuen Stufe schon die nächste Stufe drin, was mir die Arbeit wesentlich einfach macht und ich nur quasi sagen muss "nimm nächste Stufe" und das gleicht sich dann automatisch an. Somit muss ich von aussen gar nicht wissen, was die nächste Stufe für Attribute hat, da die automatisch schon in der von Stufe abgeleiteten Klasse drinstehen.

mfg
bluedragon

28.09.2008 - 12:11 Uhr

Hät ja sein können, dass das ein sehr gutes Programm ist. Naja dann danke dafür =)

27.09.2008 - 18:48 Uhr

Hallo JuyJuka, nochmals 😉

Wo bekomme ich denn ein so schönes Programm her ? Das ist echt klasse und würde, auch mir, so manche Aufbauten von Programmstrukturen helfen zu erklären ! Ich setz mich auch im Zug hin, mit Papier und Stift und überlege erst, bevor ich code. Papier ist immer noch das beste, aber so ein Programm, wäre auch gut, zumal man die Grafiken ja auch ausdrucken kann (glaub)!
Ich bin zwar nich der Profi in C#, aber oft fragen mich auch Bekannte oder Klassenkameraden nach solchen Strukturen. Da würde so ein Programm einiges erleichtern. Deines sieht recht gut in Punkto farblicher Darstellung aus, würdest du mir den Namen verraten oder nen Link posten ?

mfg
bluedragon

27.09.2008 - 18:13 Uhr

Ach jetzt verstehe ich auch vorauf ihr hinaus wollt. Ja darüber bin ich mir bewusst. Ich denke mal ich würde das Baumenü eh dynamisch erzeugen lassen. Eine Klasse Baumenü mit Unterklassen als Komposition o.ä. 😉
Ich kenne das mit dem nicht-einfach wartbaren Scripten.... das erinnert mich an die alte Prozedurale Codingweise in PHP 😉 . Nie wieder dahin zurück 😉 !
Aber ich bedanke mich hiermit bei allen Beteiligten ! Könnt den Thread abharken, meine Frage ist geklärt, danke nochmal JuyJuka für die Mühe mit dem UML-Diagramm.

mfg
blue

27.09.2008 - 17:28 Uhr

Das ist nicht sonderlich gut. Es sollte keine Logik in der UI sein (auch nicht in Menüs oder so).

Warum soll meine UI keine Logik haben ? Nen extra Bauarbeiter über die Bildfläche laufen zulassen find ich viel zu umständlich.... Nicht, dass ich kein Spass hätte den zu programmieren, aber "warum einfach wenns auch umständlich geht", oder was ?
Simpel und effektiv zu gleich, zumal ich wesentlich weniger Ressourcen verbrauche ^^
Einfach ein Baumenü schreiben und zack die Bohne.

Oder ich verstehe einfach nicht, auf was du die Logik, jetzt expliziet, beziehst.

Das mit dem "i" war ohne hin nur einfach so schnell hin geschmierter Code...

Tztztz ... nee Spass =)

mfg
bluedragon

27.09.2008 - 15:52 Uhr

Es soll keine Logik in der UI sein

Ich weiß, aber was hat das mit dem zu tun was ich gefragt habe ^^

darum erzeugt der Bauarbeiter selbst den neuen Turm (nicht irgend wer andres).

Nen direkten Bauarbeiter gibt es gar nicht, ich mach das über ein Menü und mit der Maus, reicht ja auch 😉

mfg
blue

26.09.2008 - 23:51 Uhr

Ja das was du da postet, ist auch logisch, da die beiden Objekte, die das Event abfeuern, vom Typ SelectFolder sind.

Text ist doch gleich "K" oder irre ich mich da ? Daran kannst es doch festmachen.

26.09.2008 - 23:38 Uhr

Huhu nochma,

"Es gibt keine dummen Fragen, nur dumme Antworten." 🙂

oki =)

Damit der Bauarbeiter den Turm bauen kann:

public Turm Bauen(int i){return this.VerfügbareTürme[i].Clone();}  

Es ginge natürlich auch mit einem Array von System.Type und System.Activator, aber mit IClonable hat der Bauarbeiter vollständige Turm-Objekte, die man Anzeigen kann.

Verstehe den Sinn dahinter leider nicht ? Wenn ich i sowieso übergebe, kenn ich doch den Turm anhand des gegebenen Indiezes. Da brauch ich doch nich extra eine Methode die mir das sagt ? Oder du erklärst mir das nochmal und ich bin grad nur verpeilt 😉

ZweiteStufe plus eine Stufe ist gleich DritteStufe. Wo ist das Problem, mhm?

Kein Problem, wollte mehr oder weniger nur ne Bestätigung dafür, ob alle Klassen in BasisTurm sind !

Da der Übergabeparameter "t" der Methode "Kaufen" vom Basistyp "Turm" ist und dieser kein Property "Schaden" hat, muss ich es erst in den konkreten Typ "BasisTurm" chasten.

Und wieder was gelernt ! Wusste nicht, dass man auch ohne Zuweisung, so etwas machen kann. Kannte das immer nur durch explizietes konvertieren und dann zuweisen 😉

mfg
blue

26.09.2008 - 23:08 Uhr

Ich bedanke mich erstmal für die Antwort und die Mühe mit dem UML-Diagramm und ich glaube ich werde auch daraus schlau.
Aber 2 Dinge verstehe ich nicht:
Warum soll Turm IClonable sein ?
Warum steht bei BasisTurm, erst "zweite Stufe" und dann auf einmal schon "dritte Stufe" ? Oder meinst du, das ich alle Stufen als je eine Klasse separerieren und in die Klasse BasisTurm einfügen soll ?
Ein Turm wird als BasisTurm deklariert und initialisiert oder Turm ist eine eigenständige Klasse und vererbt BasisTurm ?
Jede spezielle Stufe, vererbt die Klasse "Stufe" in BasisTurm ?

Ach ja, noch eine Frage: welschen Sinn hat die Zeile "((BasisTurm)t).Schaden", oder is das nur eine unvollendete Zeile ? Ich frag lieber was dummes, als etwas nicht zu vertehen und dann falsch zu coden =)

MfG
blue

Ps: Fragen über Fragen 😉

26.09.2008 - 21:44 Uhr

Hallo Leute,

ich stehe vor einer, für mich, wichtigen Entscheidung.
Also ich bin dabei eine Tower Defense zu programmieren. Wer nicht weiß was das ist: Ein paar lustige Monster laufen einen Weg entlang und man muss Türme (tower defense 😉) bauen um diese daran zu hindern, am Ziel anzukommen und einem ein Leben zu klauen. Ziel des Spieles: Solange durchzuhalten wie möglich =)

So nun aber zum Problem. Also ich habe soweit alles fertig, meine Monster laufen brav da lang wo ich will (sogar ganz dynamisch), ihr Lebenspunkte werden prima angezeigt etc..... Jetzt gehts an Tower-Programmierung, nur leider weiß ich nicht, wie ich das Aufwerten der Stufen eines Towers und seine Abzweigungen, also den Typ (Frost, Gift, Feuer o.ä.) handhaben soll.

Mir ist klar, dass ich eine Haupt(Vater)klasse "tower" schreiben muss, die steht auch schon und das ich die andern Klassen davon ableite. Aber wo bringe ich die Stufen der Tower, mit Kosten, neuer Reichweite/Schaden/Schussrate, am sinnvollsten unter ?
Ich möchte ungern immer alles in die Form-Klasse schreiben und zumüllen. Wäre ein statisches Array in den abgeleiteten Klassen sinnvoll ? Oder eher ein statisches Array in der Vaterklasse ? Nicht doch, eine neue Klasse "stufe" schreiben und als 1 zu 1 Komposition, in der Vaterklasse, einfügen ? Oder doch alles in die Form 😉

Ich weiß nicht so Recht. Kann sein das was von den Punkten kein Sinn macht, aber ich suche eben nach der besten Möglichkeit.... Würde mich aber über gute Ratschläg und konstruktive Kritiken freuen.

MfG
bluedragon