Laden...

Vier gewinnt

Erstellt von Söckchen vor 16 Jahren Letzter Beitrag vor 15 Jahren 11.468 Views
S
Söckchen Themenstarter:in
50 Beiträge seit 2006
vor 16 Jahren
Vier gewinnt

Hallo zusammen,

wir haben als Schulaufgabe die Programmierung von dem Spiel "Vier gewinnt" bekommen und am besten sollte das auch noch OO sein. Jetzt habe ich mich erstmal ran gesetzt und das ganze bewusst nicht OO programmiert. Jetzt könnt ihr euch aber auch sicher denken was draus geworden ist. Ich habe das Spiel fertig jedoch 1000de Zeilen Code.

Das ist natürlich überhaupt nicht das was erwartet wird, jedoch haperts bei mir jetzt an der Umsetzung.

Die Darstellung erfolgt über Buttons (42 Stück) welche je nachdem wer dran ist Gelb oder Rot gefärbt werden. Das soll nach Möglichkeit auch nicht geändert werden, weil für eine bessere Umsetzung einfach mein Wissen nicht reicht.

Ich habe jetzt dran gedacht ein zwei-deminsionales Array zu erstellen, welches das Spielfeld simuliert. Aber wenn ich jetzt sagen an der Position [0,0] setzt Spieler1 seinen Stein wie färbe ich dann diesen Button, der an dieser Stelle ist?

Ich habe es bisher so gelöst das nur die unterste Reihe enabled ist und sobald z.B der Button ganz unten links gedrückt wird der Button darüber auch enabled wird.

private void button1_Click(object sender, EventArgs e)
        {
            if (!ry)
            {
                button1.BackColor = Color.Red;
                button1.Enabled = false;
                button2.Enabled = true;
                ry = true;
            }
            else if (ry)
            {
                button1.BackColor = Color.Yellow;
                button1.Enabled = false;
                button2.Enabled = true;
                ry = false;
            }

            rot_gewinnt();
            gelb_gewinnt();
            unentschieden();
        }

Die Gewinnabfrage sieht dann so aus (Auszug):

private void rot_gewinnt()
        {
            // HORIZONTAL
            if (button1.BackColor == Color.Red
            && button7.BackColor == Color.Red
            && button13.BackColor == Color.Red
            && button19.BackColor == Color.Red)
            {
                textBox1.Text = "Rot gewinnt!";
            }

Ich weiß nur nicht wie ich das jetzt besser lösen kann.

Bin dankbar für Denkanstöße. 🙂

Jeder fängt mal klein an!

O
778 Beiträge seit 2007
vor 16 Jahren

Hm, die Variante das Ganze komplett ueber Buttons zu realisieren halte ich persoenlich fuer schlecht. Der Aufwand, den du hast, wenn du einfach ein UserControl nimmst, bei dem du OnPaint ueberschreibst und die Steine mit e.Graphics.DrawEllipse zeichnest, ist nicht wirklich gross. In welche Spalte der user clickt musst du nur die x koordinate durch ein siebtel der Breite des Controls teilen und abrunden. Insgesamt ist der Aufwand, da ueber Buttons zu gehen viel groesser, als wenn du dich ein kleines bisschen in gdi+ einarbeitest, und schoener ist die variante mit gdi+ allemal (auch oo-orientierter)

S
Söckchen Themenstarter:in
50 Beiträge seit 2006
vor 16 Jahren

Erstmal danke für deine Antwort onlinegurke....jetzt ist es nur so:

Mit dem Thema gdi+ haben wir uns in der Schule noch nie befasst, wir sollen eigentlich mit dem Arbeiten was wir wissen, kennen und können sollten 😉

Ich hätte kein Problem damit, mich dort einzulesen und das ganze zu versuchen, ich möchte jedoch auch nicht, dass es nachher heißt: Sieht zwar nett aus, aber überhaupt nicht das, was gefordert war, setzen 6 😉

Daher, auch wenn es viel Aufwand ist, möchte ich wenigstens einmal den Denkansatz für die Umsetzung mit Buttons machen, sobald ich dann mit meiner Lehrerin Rücksprache gehalten habe, kann ich das immer noch mit gdi+ realisieren.

Jeder fängt mal klein an!

344 Beiträge seit 2007
vor 16 Jahren

würde mich interessieren wie das programm aussieht.
Kannst du mal nen Screenshot machen?

  • Was passiert wenn jemand 4 Steine nebeneinander in seiner Farbe
    hat, also gewonnen hat? Merkt das Programm dies oder muss man es
    manuell erkennen?

👶-> :]-> 8o-> 🙂

S
Söckchen Themenstarter:in
50 Beiträge seit 2006
vor 16 Jahren

Ja das Programm erkennt automatisch ob jemand gewonnen hat, habe ja auch im ersten Beitrag ein Beispiel der Gewinnabfrage gemacht, jedoch sind das 69 Abfragen und damit unmengen an Code.

Jeder fängt mal klein an!

1.378 Beiträge seit 2006
vor 16 Jahren

Ein paar ineinander verschachtelte schleifen über spalten/zeilen würden diesen Job wohl auch zufriedenstellend erledigen 😉

S
Söckchen Themenstarter:in
50 Beiträge seit 2006
vor 16 Jahren

@xxxprod: Du meinst für die Gewinnabfrage? Wenn ja: daran habe ich noch gar nicht gedacht, da hast du Recht, das würde das ganze enorm vereinfachen, aber damit wäre noch nicht das Thema gelöst wie ich das ganze OO realisieren kann.

Ist denn wenigstens mein Ansatz mit dem zwei-demensionalen Array richtig? 🤔

Jeder fängt mal klein an!

D
171 Beiträge seit 2008
vor 16 Jahren

Hallo

Was hälst du davon, wenn die eine z.B. 7x7 Matrix aus Labels erzeugst. Darüber setzt du eine Reihe mit Buttons. Damit kannst du die Spalte auswählen, in die du deinen Stein Plazierst. Du erzeugst ein Arrey, Welches 7x7 Objekte enthält,. Jedes davon enthält widerum ein Label und Funktionen get und Set für die Hintergrund Farbe, wegen OO. Du änderst einfach die Hintergrund Farbe, oder nimmst 7x7 Image-Felder, weiß gerade nicht den Namen, wo du mit der Funktion dann ein Bild von einem Gelben oder Roten Kreis nimmst. Ich denke, das ist nicht wirklich Komplizierten und OO und du hast weniger Buttons.

Gruß Daniel

Ps. Wenn du ein Array nimmst, kannst du mit 2 Geschachtelten Forschleifen und einer Abfrage arbeiten.

O
778 Beiträge seit 2007
vor 16 Jahren

Naja, im Prinzip entscheidet ja bei Vier gewinnt immer nur die Spalte, in die man die Steinchen legt. Wenn du das ganze objektorientiert runterbrechen willst, dann ist hier das MVC Pattern angesagt. Das heisst, die Buttons sind Views, das heisst, ihre Funktion besteht im wesentlichen darin, dem User zu sagen wo bereits welche Steine liegen. Ausserdem delegieren sie den Input, soll heissen, sie schreien laut auf dass jemand einen Stein in die entsprechende Spalte geschmissen hat. Damit darauf was passiert muessen sie natuerlich entweder gezielt jemanden anschreien (Methodenaufruf) oder in die Welt hinausschreien und irgendjemand hoert dann zu (Ereignisbasiert).

Der, der angeschriene wird oder zuhoert ist der Controller, d.h., der, der das ganze steuert. Der Controller (eigene Klasse) muss dann erkennen wer den Stein gelegt hat, ob die Spalte schon voll ist, ob sonst irgendjemand irgendwelche Einwaende hat, ob derjenige, der am Zug war, damit vielleicht gewonnen hat, ob er damit irgendwelche boesartigen Fallen stellen will, etc.

Falls es nichts einzuwenden gibt, dann aendert der Controller das Datenmodell (wiederum eigene Klasse), d.h., in der zweiten Reihe dritte Spalte ist jetzt ein neuer gelber Stein. Dazu muss muss das Datenmodell nun eine Methode bereitstellen, mit der man ihm sagen kann, dass in der zweiten Reihe dritte Spalte jetzt ein gelber Stein ist. Das Datenmodell muss dann alle relevanten Datenaenderungen, die dadurch entstanden sind (Hey, da ist ein gelber Stein zweite Reihe dritte Spalte!), na ch aussen geben. Das geht theoretisch auch wieder per Methodenaufruf oder Ereignisorientierung, aber praktisch muss das immer Ereignisorientiert abgefackelt werden, weil das Datenmodell den View, der darauf dann natuerlich wieder reagieren muss, nicht kennen darf. Die dazu passenden Grafiken findest du in jedem guten Tutorial ueber Objektorientierung.

W
196 Beiträge seit 2007
vor 15 Jahren

Hallo falls du noch immer nach einer Lösung suchst, solltest du mal mein Beispielprogramm anschauen. Dabei kann man im Panel zwischen runden und eckigen Steinen wählen. Du kannst die Reihen, Spalten und Größen angeben. Leider hab ich noch keine Funktion eingebaut die überprüft ob ein Spieler gewonnen hat, also Steine mit Schleifen vergleichen ...

Ich denke aber sonst ist das ganze recht nett ^^ Anzumerken ist, dass ich das grad schnell runter geschrieben hab also erwarte nichts besonderes!

mfg wizer

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo wizer,

willst du dein Programm nicht lieber unter Projekte stellen und hier nur einen Link darauf setzen?

herbivore

W
196 Beiträge seit 2007
vor 15 Jahren

Ja ok werd ich machen. War mir eigentlich nicht so wichtig, wollte primär nur Stöckchen helfen. Aber ist keine schlechte Idee. Mach ich aber erst dann wenn ich die Gewinn-Abfrage dabei hab!

mfg wizer

W
196 Beiträge seit 2007
vor 15 Jahren

Hier mein Projekt: Klick mich