Memorie Pärchen erkennen und aufgedeckt lassen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Memorie Pärchen erkennen und aufgedeckt lassen

    Hallo,
    ich möchte einen Memorie mit Pictureboxen erstellen.
    das ist bis jetzt wie folgt aufgebaut:

    Es gibt eine Liste mit System.drawing.image
    Beim Click auf einer der Pictureboxen wird das zugehörige Image aufgedeckt.

    static List<System.Drawing.Image> _pictureliste = new List<System.Drawing.Image>();
    RandomizedList = _pictureliste.OrderBy(x => rnd.Next()).ToList();

    C#-Quellcode

    1. if (sender == pictureBox1)
    2. {
    3. pictureBox1.Image = RandomizedList[0];
    4. }
    5. else if (sender == pictureBox2)
    6. {
    7. pictureBox2.Image = RandomizedList[1];
    8. }



    Mithilfe eines Timers wird nach 4 Sekunden das Bilid ALLER Pictureboxen wieder in das HIntergrundbild geändert, den logischerweise alle Pictureboxen haben.
    Dieser Fall tritt ja meistens auf, den es ist warscheinlicher KEIN Paar zu finden als ein Paar.

    C#-Quellcode

    1. private void timer1_Tick(object sender, EventArgs e)
    2. {
    3. for (int i = 0; i <= 27; i++)
    4. {
    5. _Pictureboxen[i].Image = Properties.Resources._21f9503236fdacca7737fc3de28016b4;
    6. }


    Problem: Ich weiß nicht wie ich dem Programm zu verstehen geben soll, dass ein Pärchen gefunden wurde.

    Eine Idee war eine Pärchenliste zu erstellen, die immer maximal 2 karten aufnimmt. Am Ende wird einfach verglichen, ob die beiden Indezes der Pärchenliste gleich sind.

    Ein weiteres Problem wäre, dass am Ende ALLE Karten wieder mit dem Ursprungsbild wieder versehen werden.
    Man müsste also eine Ausnahme für gefundene Pärchen einbauen.
    - Einfacher wäre es, nur die gefundenen Pärchen aufgedeckt zu lassen, bloß ich wüß´te leider nicht wie ich das umsetzen soll.
    Hätte da Jemand eine Idee? Danke Gruss
    Das Problem ist, dass Du nicht mit guten Objekten arbeitest. Eine Karte sollte nicht nur eine PicBox sein. Sondern … eine Karte darstellen. Als Eigenschaften sollte sie wohl z.B. haben: Bild, BleibtAufgedeckt, ggf. Position. Und wenn dann eben 2 Karten angeklickt wurden, die das gleiche (oder das selbe?) Bild haben, setzt Du deren Eigenschaft BleibtAufgedeckt auf True und dem Wiederzudeckprogrammteil ist klar, dass diese Karten davon ausgenommen sind.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ok einen solchen Ansatz habe ich tatsächlich bereits. Habe die Klasse Boxen erstellt. Sie besitzt eine system.drawing image, eine nummer, und einen boolean fürs aufdecken.

    C#-Quellcode

    1. class boxen
    2. {
    3. public System.Drawing.Image _picture;
    4. public bool _istaufgedeckt;
    5. public int nummer;
    6. }


    Werde dann mal mit dem Ansatz versuchen umzusetzen.
    Versuche auch gerade, die Pärchen zu erkennen mit einer extra _vergleichsliste, jedoch werden sie nie als "Paar gefunden angezeigt".
    Dabei begrenze ich schon die Kapazität auf 2 indizes und cleare auch nach jedem timerdurchlauf, könnte es vielleicht sein dass system.drawing.image einfach nicht als gleich anerkannt werden können?

    C#-Quellcode

    1. if (_vergleichsliste[0] == _vergleichsliste[1])
    2. {
    3. label1.Text = "Paar gefunden!!";
    4. }
    5. else{
    6. label1.Text = "Kein Paar gefunden!!";
    7. }


    oder was auch nicht geht :

    C#-Quellcode

    1. if (_vergleichsliste[0].Equals(_vergleichsliste[1]))
    2. {
    3. label1.Text = "Paar gefunden!!";
    4. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Visual_Prog“ ()

    Naja, ob man jetzt 2 Karten als gleich ansieht, muss man ganz genau festlegen. Denn wenn Bild und aufgedeckt-Status gleich sind, aber die nummer nicht, sind zwei Karten dann gleich? Schließlich unterscheiden sie sich ja in einem Merkmal. Das ist auch das Problem des Compilers. Für ihn sind sie es nicht. Was noch dazu kommt (unter der Bedingung, dass _vergleichsliste eine List<Karte> ist, steht ja nirgends): == ist ja bei Referenztypen ein Operator, der erstmal quasi fragt: Ist A und B das selbe? (nicht das gleiche!) Und das ist definitiv hier falsch. Du musst also definieren, wann zwei Objekte als gleich angesehenwerden sollen. Entweder, indem Du nicht _vergleichsliste[x] und _vergleichsliste[y] vergleichst, sondern deren Eigenschaften, die gleich sein sollen. Oder Du überlädst den ==operator in der Kartenklasse.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Moin moin

    Meine Idee dazu. Man betrachted das Spielfeld als eine Art Schachbrett (kann man sich auch als 2-Dimensionales Array vorstellen). Jedes Quadrat auf dem Spielfeld ist daher eindeutig. Ein Pärchen liegt zB bei A1 und C4 und ein anderes bei E3 und H7 usw. Diese Quadrate bekommen eine Nummer und das dazugehörende Bild zugewiesen. Erstes Paar = 1 (A1 und C4), zweites Paar = 2 (E3 und H7) usw. Werden die Karten in A1 und C4 aufgedeckt sind die Nummern im Quadrat gleich, passen daher zusammen. Wird A1 und H7 aufgedeckt sind die Nummern im Quadrat unterschiedlich, gehören daher nicht zusammen. Ich würde auch nicht für jedes Bild eine PB verwenden. Eher eine PB die in einem Raster (2-Dimensionales Array) aufgeteilt wird in der die Paare, in Abhängigkeit der Nummern im 2-Dimensionales Array, gezeichnet werden. In welchen Quadrat sich die Maus befindet, lässt sich per PointInRect ermitteln was dann wieder zur Position im 2-Dimensionales Array passt in der die Nummern zu jedem Paar abgelegt sind.
    Mfg -Franky-
    Moin also wie von Vaporized vorgeschlagen habe ich jetzt alles mit der Klasse "Boxen" versehen.
    Darin befindet sich die variable _pärchennummer.
    Wenn diese übereinstimmt, wird dann auch das paar erkannt.

    C#-Quellcode

    1. if (_vergleichsliste[0].pärchennummer.Equals(_vergleichsliste[1].pärchennummer))
    2. {
    3. label1.Text = "Paar gefunden!!";
    4. _paargefunden = true;
    5. }
    6. else
    7. {
    8. label1.Text = "Kein Paar gefunden!!";
    9. _paargefunden = false;
    10. }


    Damit die Pärchen aufgedeckt bleiben, habe ich eine list of integer erstellt. Bei jedem click einer Picturebox wird die Pictureboxnummer an die liste weitergegeben. Sie ist auch nur gültig, wenn Pärchen gefunden werden.

    C#-Quellcode

    1. if (_paargefunden == true)
    2. {
    3. if (_nummerderpicturebox.Count <= 2)
    4. {
    5. _nummerderpicturebox02.Add(_nummerderpicturebox[0]);
    6. _nummerderpicturebox02.Add(_nummerderpicturebox[1]);
    7. }
    8. }


    Beim Anschließenden durchlaufen der Pictureboxen werden diejenigen boxen nicht zugedeckt, die in der liste der paare gefunden werden und zwar mithilfe von continue. Auf diese Weise funktioniert alles Bestens.

    C#-Quellcode

    1. if (_paargefunden == false)
    2. {
    3. for (int i = 0; i <= 27; i++)
    4. {
    5. if (_nummerderpicturebox02.Contains(i))
    6. {
    7. continue;
    8. }
    9. Boxenliste[i]._picture = Properties.Resources._21f9503236fdacca7737fc3de28016b4;
    10. _Pictureboxen[i].Image = Boxenliste[i]._picture;
    11. }


    @-Franky- Danke für deinen Ansatz, hört sich auch sehr interessant an! Kann man den Feldern dann auch eine zufällige Karte zuweisen?
    LG
    Hi

    Es wäre durchaus auch machbar den Feldern zufällige Karten zuzuweisen. Ich würde eher dazu neigen, jeder Karte eine feste Nummer zu vergeben und die Zufälligkeit, wo dann welche Karte liegt bzw dann das Pärchen, im 2-Dimensionalen Array zu erzeugen.
    Mfg -Franky-
    natürlich hat jede Karte eine feste ID.
    Und es muss eine (zufällige) Orts-Angabe geben, mit der Einschränkung, dass keine zwei Karten am selben Ort sein können.
    Die Orts-Angabe kann auch einfach ein Integer sein, weil wie man seine Memory-Karten auf dem Tisch verteilt, ob in einer Reihe, im Quadrat oder im Kreis ist Sache des GUI - für die Logik irrelevant.