Thema: Mastermind c#
Einzelnen Beitrag anzeigen
Ungelesen 19.05.09, 22:38   #2
newlokider
Anfänger
 
Benutzerbild von newlokider
 
Registriert seit: May 2009
Ort: Thüringen
Beiträge: 17
Bedankt: 2
newlokider ist noch neu hier! | 0 Respekt Punkte
Standard

Zuerst, ich werde dir hier kein C#-Quelltext schreiben, sondern nur kurz darstellen, wie ich die Aufgabe angehen würde (schließlich hast du die Aufgabe in der Schule aufbekommen).
Außerdem muss ich noch anmerken, das ich noch nie mit C# gearbeitet habe, aber dieses sollte sich ja eigentlich nicht so stark von anderen Objektorientierten Sprachen unterscheiden.

Also, da C# nunmal den Vorteil von Klassen bietet, nutzen wir diese auch, das spart uns eine Menge schreibarbeit:

Zuerst erstellen wir das GUI (Graphical User Interface), also die Oberfläche:
Hier kannst du selber Kreativ werden, ich empfehle, das du für die Farben, die der Benutzer als Code eingeben soll 4 Canvas Elemente nebeneinander platzierst, für je eine Reihe...
Neben einer Reihe baust du je 4 runde Punkte hin (ich hab dies mit Elementen der Klasse OVAL gemacht, ich weiß nicht, ob es die in C# gibt, Canvas geht aber auch, dann musst du noch ein zusätzliches Paintevent schreiben, für Kreise, oder du hast halt kleinere 4Ecke)
Bei mir sieht das (unter MacOSX) so aus:

http://img222.imageshack.us/my.php?image=mindmaster.jpg

Nun geht es um die bennenung, die Canvaselemente, die bei mir 4eckig sind, bennenst du alle Gleich und gibst ihnen einen Index (du speicherst sie also in einem Array), das erleichtert die spätere Arbeit.
Genauso gehst du bei den anderen Elementen vor (bei mir rote Punkte)...

Nun erstellst du 2 Klassen, die du von Canvas ableitest (den Namen darfst du selber wählen), die wir jetzt mit Eigenschaften und Methoden ausstatten.
Die Steuerelemente, die du schon erstellt hast, lässt du von einer dieser beiden Klassen erben, die 4eckigen von Klasse 1 und die Runden von Klasse 2.


Klasse 1 (die für die 4eckigen Elemente):

Eigenschaften:
BgColor: Hintergrundfarbe des Elementes (As Color)
Filled: Ob dieses Element schon mit einer Farbe belegt wurde (As Boolean)
HitMode: Ob das Element von Position und Farbe übereinstimmt (dann vergibst du zum Beispiel die 2), oder nur die Farbe Richtig ist aber die Position falsch, oder beides Falsch ist (As Integer)

Methoden:
SetColor(): Dialog zur Farbauswahl aufrufen, wenn auf das Element geklickt wurde, ausgewählte Farbe als BgColor setzten für das Element, nach Überprüfung, ob noch keine Farbe gesetzt wurde [BgColor=0] (bei Realbasic wird das Element welches die Methode aufruft mit ME angesprochen, sollte in C# ähnlich sein), Compare() aufrufen


Klasse 2 (die für die runden Elemente)
Eigenschaften:
BgColor: Hintergrundfarbe des Elementes (As Color)

Methoden:
SetColor(Color): Hier wird diesmal nur die Hintergrundfarbe neu gesetzt und das Element zeigt somit den Treffer an, es wird allerdings kein Farbauswahdialog benötigt (die Farbe wird vorher von compare() übergeben)


Globales
Eigenschaften:
Felder: Ein Array in der jedes Feld an der Position seines Indexs den Wert ablegt, der seinem Treffertyp entsprcht (As Integer)
Code: Array mit 4 Stellen, in dem an jeder Stelle eine Farbe gespeichtert wird

Methoden:
Compare(Element): Vergleichen, ob das Element dieselbe Farbe und Position hat wie das entsprechende Element des geheimen Codes, entsprechend HitMode des Elements setzten und dem Element der Klasse 2,welches den selben Index hat eine neue Farbe zuweisen, also die Methode SetColor(Color) aufrufen (damit der Nutzer nachvollziehen kann, was für einen Treffer er gelandet hat), außerdem speichern in Felder.
newGame: Alle Felder (der Klasse 1 und 2) Zurücksetzten die globale Eigenschaft Felder leeren


Ich hoffe das ich mich wenigstens einigermaßen verständlich ausgedrückt habe und es nicht zu unübersichtlich geworden ist.
Ein Nachteil hierbei ist natürlich, das eine Methode mehrere Funktionen darstellt, das kann man, wenn man sauberer programmieren will, noch weiter zerlegen und somit den Wartungsaufwand und das Debbugen weniger Aufwändig gestalten...


P.s.: Damit es nur 4 Farben sind, hat jede Reihe nur 4 Felder (du solltest dann auch beim Farbauswahldialog darauf achten, das es eben nur 4 Farben gibt zwischen denen man wählen kann, ich würde Rot [RGB:FF0000], Grün [RGB:00FF00], Blau [RGB:0000FF] und Gelb [RGB:FFFF00] empfehlen.
Um das ganze Spiel auf 10 Versuche zu limitieren, kannst du entweder einen Zähler definieren, der jedesmal, wenn eine Farbe von einem Element der Klasse 1 gesetzt wird inkrementiert wird und das Spiel abbrechen, wenn dieser höher als 40 (also eigentlich 39, da die 0 mitgezählt wird in der Programmierung) ist.
Oder du überprüfst jedesmal, ob alle Elemente des globalen Arrays "Felder" ungleich 0 sind und brichst das Spiel ab, wenn dies der Fall ist.

Wenn du Fragen hast, dann schick einfach eine PM, ich versuche diese dann zu beantworten, soweit mir das als Anfänger möglich ist.


P.p.s: Was mir gerade noch auffällt, die wichtigsten Methode hab ich vergessen, du musst natürlich auch ausgeben, das wenn alle Felder einer Reihe von der Position und der Farbe mit dem Code übereinstimmen, dann sollte der Spieler gewonnen haben.
Und natürlich fehlt noch eine Funktion zum generieren eines Codes, diese ist sehr impel, du nutzt die Methode Random (möglicherweise musst du vorher einen Seed setzen, damit der Zufallsgenerator Zufallszahlen erzeugen kann, nimm hierfür am besten die aktuelle verstrichene Zeit seit der Einführung von Unix), diese rufst du in einer Schleife 4 mal auf, im Wertebereich von 1 bis 4, wobei du danach jede Zufallszahl mit einem Array deiner 4 Farben gleichsetzt und die erhaltene Farbe an der Position im Array "Code" speicherst, die identisch ist mit dem Schleifenaufruf (Schleifenaufruf n ; Code(n) = Farbe)
newlokider ist offline   Mit Zitat antworten