Zum Inhalt springen
  • 0

C# 4-Gewinnt Amateurversuch


Frage

Geschrieben (bearbeitet)

Moin moin!

Wie mein Nutzername vermuten lässt habe ich kürzlich erst mit dem Programmieren angefangen. Aktuell versuche ich mich an einem 4-Gewinnt Modell. Bereits beim Programmieren ist mir aufgefallen, dass es vermutlich extrem umständlich und aufwendig geschrieben ist und es mit Sicherheit an so einigen Stellen gekürzt werden könnte. Leider ist das Programm nicht 100% funktionsfähig, es kommt öfter vor, dass er beim Wechseln der Farbe einfach 2x hintereinander die selbe Farbe wählt, meist beim Legen der ersten Steine in einem Gatter. Ich habe beim Programmieren selbstgemalte Paintbilder für die "kästchen" verwendet, habe diese einfach mal im Anhang angefügt falls einer von euch das mal durchprobieren möchte. Danke schonmal im Voraus !

 

hier der Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp6
{
    public partial class Form1 : Form
    {
        
        int allbuttoncounter = 0;
        int button1counter = 0;
        int button2counter = 0;
        int button3counter = 0;
        int button4counter = 0;
        int button5counter = 0;
        int button6counter = 0;
        int button7counter = 0;



        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (button1counter == 0 && allbuttoncounter %2 ==0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox1.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button1counter == 0 && allbuttoncounter % 2 != 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox1.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button1counter == 1 && allbuttoncounter % 2 == 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox14.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button1counter == 1 && allbuttoncounter % 2 != 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox14.Image = Properties.Resources.kästchen_rot;
            }
            else if (button1counter == 2 && allbuttoncounter % 2 == 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox21.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button1counter == 2 && allbuttoncounter % 2 != 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox21.Image = Properties.Resources.kästchen_rot;
            }
            else if (button1counter == 3 && allbuttoncounter % 2 == 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox28.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button1counter == 3 && allbuttoncounter % 2 != 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox28.Image = Properties.Resources.kästchen_rot;
            }
            else if (button1counter == 4 && allbuttoncounter % 2 == 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox35.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button1counter == 4 && allbuttoncounter % 2 != 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox35.Image = Properties.Resources.kästchen_rot;
            }
            else if (button1counter == 5 && allbuttoncounter % 2 == 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox42.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button1counter == 5 && allbuttoncounter % 2 != 0)
            {
                button1counter++;
                allbuttoncounter++;

                pictureBox42.Image = Properties.Resources.kästchen_rot;
            }

        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (button5counter == 0 && allbuttoncounter % 2 == 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox5.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button5counter == 0 && allbuttoncounter % 2 != 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox5.Image = Properties.Resources.kästchen_rot;
            }
            else if (button5counter == 1 && allbuttoncounter % 2 == 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox10.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button5counter == 1 && allbuttoncounter % 2 != 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox10.Image = Properties.Resources.kästchen_rot;
            }
            else if (button5counter == 2 && allbuttoncounter % 2 == 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox17.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button5counter == 2 && allbuttoncounter % 2 != 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox17.Image = Properties.Resources.kästchen_rot;
            }
            else if (button5counter == 3 && allbuttoncounter % 2 == 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox24.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button2counter == 3 && allbuttoncounter % 2 != 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox24.Image = Properties.Resources.kästchen_rot;
            }
            else if (button5counter == 4 && allbuttoncounter % 2 == 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox31.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button5counter == 4 && allbuttoncounter % 2 != 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox31.Image = Properties.Resources.kästchen_rot;
            }
            else if (button5counter == 5 && allbuttoncounter % 2 == 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox38.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button5counter == 5 && allbuttoncounter % 2 != 0)
            {
                button5counter++;
                allbuttoncounter++;

                pictureBox38.Image = Properties.Resources.kästchen_rot;
            }
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {
           
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (button2counter == 0 && allbuttoncounter % 2 == 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox2.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button2counter == 0 && allbuttoncounter % 2 != 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox2.Image = Properties.Resources.kästchen_rot;
            }
            else if (button2counter == 1 && allbuttoncounter % 2 == 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox13.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button2counter == 1 && allbuttoncounter % 2 != 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox13.Image = Properties.Resources.kästchen_rot;
            }
            else if (button2counter == 2 && allbuttoncounter % 2 == 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox20.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button2counter == 2 && allbuttoncounter % 2 != 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox20.Image = Properties.Resources.kästchen_rot;
            }
            else if (button2counter == 3 && allbuttoncounter % 2 == 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox27.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button2counter == 3 && allbuttoncounter % 2 != 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox27.Image = Properties.Resources.kästchen_rot;
            }
            else if (button2counter == 4 && allbuttoncounter % 2 == 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox34.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button2counter == 4 && allbuttoncounter % 2 != 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox34.Image = Properties.Resources.kästchen_rot;
            }
            else if (button2counter == 5 && allbuttoncounter % 2 == 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox41.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button2counter == 5 && allbuttoncounter % 2 != 0)
            {
                button2counter++;
                allbuttoncounter++;

                pictureBox41.Image = Properties.Resources.kästchen_rot;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (button3counter == 0 && allbuttoncounter % 2 == 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox3.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button3counter == 0 && allbuttoncounter % 2 != 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox3.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button3counter == 1 && allbuttoncounter % 2 == 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox12.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button3counter == 1 && allbuttoncounter % 2 != 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox12.Image = Properties.Resources.kästchen_rot;
            }
            else if (button3counter == 2 && allbuttoncounter % 2 == 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox19.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button3counter == 2 && allbuttoncounter % 2 != 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox19.Image = Properties.Resources.kästchen_rot;
            }
            else if (button3counter == 3 && allbuttoncounter % 2 == 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox26.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button3counter == 3 && allbuttoncounter % 2 != 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox26.Image = Properties.Resources.kästchen_rot;
            }
            else if (button3counter == 4 && allbuttoncounter % 2 == 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox33.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button1counter == 4 && allbuttoncounter % 2 != 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox33.Image = Properties.Resources.kästchen_rot;
            }
            else if (button3counter == 5 && allbuttoncounter % 2 == 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox40.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button3counter == 5 && allbuttoncounter % 2 != 0)
            {
                button3counter++;
                allbuttoncounter++;

                pictureBox40.Image = Properties.Resources.kästchen_rot;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (button4counter == 0 && allbuttoncounter % 2 == 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox4.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button4counter == 0 && allbuttoncounter % 2 != 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox4.Image = Properties.Resources.kästchen_rot;
            }
            else if (button4counter == 1 && allbuttoncounter % 2 == 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox11.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button4counter == 1 && allbuttoncounter % 2 != 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox11.Image = Properties.Resources.kästchen_rot;
            }
            else if (button4counter == 2 && allbuttoncounter % 2 == 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox18.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button4counter == 2 && allbuttoncounter % 2 != 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox18.Image = Properties.Resources.kästchen_rot;
            }
            else if (button4counter == 3 && allbuttoncounter % 2 == 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox25.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button4counter == 3 && allbuttoncounter % 2 != 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox25.Image = Properties.Resources.kästchen_rot;
            }
            else if (button4counter == 4 && allbuttoncounter % 2 == 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox32.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button4counter == 4 && allbuttoncounter % 2 != 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox32.Image = Properties.Resources.kästchen_rot;
            }
            else if (button4counter == 5 && allbuttoncounter % 2 == 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox39.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button4counter == 5 && allbuttoncounter % 2 != 0)
            {
                button4counter++;
                allbuttoncounter++;

                pictureBox39.Image = Properties.Resources.kästchen_rot;
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (button6counter == 0 && allbuttoncounter % 2 == 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox6.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button6counter == 0 && allbuttoncounter % 2 != 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox6.Image = Properties.Resources.kästchen_rot;
            }
            else if (button6counter == 1 && allbuttoncounter % 2 == 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox9.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button6counter == 1 && allbuttoncounter % 2 != 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox9.Image = Properties.Resources.kästchen_rot;
            }
            else if (button6counter == 2 && allbuttoncounter % 2 == 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox16.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button6counter == 2 && allbuttoncounter % 2 != 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox16.Image = Properties.Resources.kästchen_rot;
            }
            else if (button6counter == 3 && allbuttoncounter % 2 == 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox23.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button6counter == 3 && allbuttoncounter % 2 != 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox23.Image = Properties.Resources.kästchen_rot;
            }
            else if (button6counter == 4 && allbuttoncounter % 2 == 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox30.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button6counter == 4 && allbuttoncounter % 2 != 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox30.Image = Properties.Resources.kästchen_rot;
            }
            else if (button6counter == 5 && allbuttoncounter % 2 == 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox37.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button6counter == 5 && allbuttoncounter % 2 != 0)
            {
                button6counter++;
                allbuttoncounter++;

                pictureBox37.Image = Properties.Resources.kästchen_rot;
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (button7counter == 0 && allbuttoncounter % 2 == 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox7.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button7counter == 0 && allbuttoncounter % 2 != 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox7.Image = Properties.Resources.kästchen_rot;
            }
            else if (button7counter == 1 && allbuttoncounter % 2 == 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox8.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button7counter == 1 && allbuttoncounter % 2 != 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox8.Image = Properties.Resources.kästchen_rot;
            }
            else if (button7counter == 2 && allbuttoncounter % 2 == 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox15.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button7counter == 2 && allbuttoncounter % 2 != 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox15.Image = Properties.Resources.kästchen_rot;
            }
            else if (button7counter == 3 && allbuttoncounter % 2 == 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox22.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button7counter == 3 && allbuttoncounter % 2 != 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox22.Image = Properties.Resources.kästchen_rot;
            }
            else if (button7counter == 4 && allbuttoncounter % 2 == 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox29.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button7counter == 4 && allbuttoncounter % 2 != 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox29.Image = Properties.Resources.kästchen_rot;
            }
            else if (button7counter == 5 && allbuttoncounter % 2 == 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox36.Image = Properties.Resources.kästchen_gelb;
            }
            else if (button7counter == 5 && allbuttoncounter % 2 != 0)
            {
                button7counter++;
                allbuttoncounter++;

                pictureBox36.Image = Properties.Resources.kästchen_rot;
            }
        }
    }
}

 

kästchen.jpg

kästchen_gelb.jpg

kästchen_rot.jpg

bugged.jpg

Bearbeitet von Kackboon

19 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
Geschrieben (bearbeitet)

Da gibt's tatsächlich das ein oder andere zu optimieren ;)

Hast du schonmal etwas mit Arrays gemacht? Das ist eine grundlegenden Datenstrukturen, mit denen sich ein Programmierer auf jeden Fall auskennen sollte. Arrays erlauben dir, mehrere Werte in einer "Liste" zu führen (es gibt auch Listen als Datenstruktur, brauchst du hier aber nicht unbedingt). Das könnte dann so aussehen (sehr verkürzt):

// Image[] bedeutet: Ein Array von Bildern, 'new Image[6]' bedeutet, dass du ein Array der Länge 6 initialisierst
Image[] spalte1 = new Image[6]; 
Image[] spalte2 = new Image[6];
// und so weiter...

Jetzt könntest du deinen Button-Klick vereinfachen, indem du Schleifen anwendest:

//Button1_Click

for(int i = 0; i < spalte1.Length; i++)
{
    if(spalte1[i] == null) // "null" ist der Standardwert, wenn noch kein Bild zugewiesen wurde
    {
    	spalte1[i] = new Image(imagePath); // imagePath ist der Pfad zum Bild, 
      					 // idealerweise woanders festgelegt
    }
}

Die for-Schleife ist ebenfalls ein grundlegendes Konstrukt, das man kennen sollte. Das liest sich ungefähr so: Starte bei 0 und zähle i solange hoch, bis i nicht mehr kleiner ist als die Länge von spalte1.

Im "Schleifenkörper" (der Code, der zwischen den geschweiften Klammern kommt), gucken wir dann, ob das Bild an der Stelle i schon gesetzt wurde. Wenn ja, gucken wir beim nächsten weiter. Wenn nicht, setzen wir an die Stelle das passende Bild.

Das soll als erster kleiner Anstoß erstmal genügen. Wenn du genau hinguckst, wirst du sehen, dass die beiden Code-Beispiele, die ich hier habe, bei weitem noch nicht die eleganteste oder sinnvollste Lösung darstellen (Stichwort mehrdimensionale Arrays; wieso sechs Arrays haben, wenn du eines haben kannst, das 6x6 Felder hat?).

Bearbeitet von arlegermi
  • 0
Geschrieben

Hilfreich wäre auch Vererbung. So könnte man z.B. die Buttons mit weiteren Informationen ausstatten:

public class MyButton : Button
{
    public int Spalte { get; set; }
}

So hätte man z.B. einen Button, der die Spalten-Information besitzt und so könnte man jeden Button mit dem selben Event ausstatten. Man hat also nur noch eine Event-Implementierung, anstatt zig kopierte.

  • 0
Geschrieben

Danke für die schnelle Antwort !

 

Ich habe bisher c.a. 3x Tippfehler gefunden (button1 und button3 falls es wen interessiert). Das Programm läuft mitlerweile ohne Fehler nach 5x probieren. Allerdings fehlt noch die Gewinnauswertung. Ich werde mich deinen Tipps mal annehmen und morgen an einer vereinfachten Version mit Arrays, Schleifen und Kommentaren arbeiten. Ich poste das Ergebnis bzw. weitere Fragen dann mal hier rein.

 

Ansonsten erstmal vielen Dank und schönen Feierabend!

  • 0
Geschrieben (bearbeitet)

So da bin ich wieder !

Ich versuche grade das Raster anhand von einem zweidimensionalen Array zu erstellen. Leider will das nicht so ganz hinhauen.. kann mir da jemand helfen?

Hier der Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Testlauf
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int x = 50;
            int y = 100;
            

            PictureBox[,] picbox = new PictureBox[6,5];
            for (int i = 0; i < 7; i++)
            {
                picbox[i,0] = new PictureBox();
                picbox[i,0].Name = "number_" + i.ToString();
                picbox[i,0].Location = new Point(x , y);
                picbox[i,0].Size = new Size(45, 45);
                picbox[i,0].BackColor = Color.Blue;
                picbox[i,0].Image = Image.FromFile("C://Images/kästchen.jpg");
                this.Controls.Add(picbox[i,0]);
                x += 50;
            }
           for (int f = 0; f < 6; f++)
            {
                picbox[6, f] = new PictureBox();
                picbox[6, f].Name = "number_" + f.ToString();
                picbox[6, f].Location = new Point(x, y);
                picbox[6, f].Size = new Size(45, 45);
                picbox[6, f].BackColor = Color.Blue;
                picbox[6, f].Image = Image.FromFile("C://Images/kästchen.jpg");
                this.Controls.Add(picbox[6, f]);
                y += 50;
            }
    }
    }
}

Wenn ich das ganze im Debug-Modus laufen lasse stelle ich fest, dass er gar nicht erst in die zweite for-Schleife rein geht! Ist das evtl. ein Syntaxfehler ? ich bin mir nicht sicher wie genau man die beiden Dimensionen des Arrays voneinander unterscheiden lässt, hab's einfach mal versucht wie im Code geschrieben - funktioniert nur leider nicht.. :(

 

Danke schon einmal im Voraus!

Bearbeitet von Kackboon
  • 0
Geschrieben

Es kommt eine IndexOutOfRangeException, wenn i = 6 ist. 

Der Grund ist, du hast zwar die erste Dimension vom Array mit einer Größe von 6 definiert aber der Index fängt bei 0 an zu zählen. D.h. wenn i gleich 6 ist, greifst du somit quasi auf das 7. Element zu und das liegt außerhalb des Bereichs und es kommt zu einer Exception.

Das gleiche gilt auch für f.

Allerdings sehe ich noch einen weiteren Fehler:

picbox[6, f]

Die 6 müsste erst mal eine 5 sein aber das ist nicht der Fehler, den ich meinte. Mit der ersten for-Schleife definierst du nur die oberste Zeile und mit der zweiten for-Schleife die letzte Spalte.

Zumal ist das Codeverdoppelung, was man vermeiden sollte. Es hat also noch Verbesserungspotenzial. Du kannst auch Schleifen in einer Schleife schreiben. Also:

for(...)
{
    for(...)
    {
        ...
    }
}

 

  • 0
Geschrieben

Danke für die Antwort, leider kann ich damit nicht so recht was anfangen... Ich habe bereits mehrmals versucht verschachtelte for-Schleifen zu verwenden, aber leider endet auch das mit einem fehlerhaften Resultat.

for (int i = 0; i < 8; i++)
            {
                for (int f = 0; f < 7; f++)
                {
                    picbox[i, f] = new PictureBox();
                    picbox[i, f].Name = "number_" + f.ToString();
                    picbox[i, f].Location = new Point(x, y);
                    picbox[i, f].Size = new Size(45, 45);
                    picbox[i, f].BackColor = Color.Blue;
                    picbox[i, f].Image = Image.FromFile("C://Images/kästchen.jpg");
                    this.Controls.Add(picbox[i, f]);
                    y += 50;
                    x += 50;
                }
               
            }
           

das ist einer meiner vielen Versuche das umzusetzen, leider resultiert das in einer diagonalen Anreihung von "einer Dimension" des Arrays. Ich bin mir nicht sicher welche werte ich in die "picbox[   ,  ]" schreiben muss. Wenn ich diese mit "[  6;  0  ]" bestücke resultiert das in 7 in reihe angereihten PicBoxen. Vllt. könnte man dann einfach diesen Vorgang 5x kopieren nur mit unterschiedlichen Y-Wert, das soll ja aber nicht Sinn der Sache sein.

  • 0
Geschrieben

Der Ansatz ist schon mal richtig. Schaue dir aber mal x und y an und versuche mit dem Debugger mal herauszufinden, welche Werte sie bei jedem Durchlauf haben. Vielleicht kommst du selber drauf, was los ist. ;)

Allerdings brauchst du x und y im Grunde gar nicht. Die Werte lassen sich auch mit einer einfachen Multiplikation errechnen:
1 * 50 = 50
2 * 50 = 100
3 * 50 = 150

 

 

  • 0
Geschrieben

x nimmt immer um den Wert 50 zu bei jedem durchlauf (funktionsgemäß), aber y nimmt nicht zu. Beim durchlaufen des Debuggers stelle ich ja auch fest, dass er in die erste (obere) for-Schleife nicht einmal rein geht. Geplant war eigentlich, dass er dort den Y-wert um 50 addiert, und das ganze 5x sodass ich 6 Reihen mit jeweils 7 Kästchen habe.. Ich stehe auf dem Schlauch.

PictureBox[,] picbox = new PictureBox[6,7];

            for (int i = 0; i < 7; i++)
            {
                for (int f = 0; f < 8; f++)
                {
                    picbox[i, f] = new PictureBox();
                    picbox[i, f].Name = "number_" + f.ToString();
                    picbox[i, f].Location = new Point(x, y);
                    picbox[i, f].Size = new Size(45, 45);
                    picbox[i, f].BackColor = Color.Blue;
                    picbox[i, f].Image = Image.FromFile("C://Images/kästchen.jpg");
                    this.Controls.Add(picbox[i, f]);
                    x += 50;
                    
                }
                    y += 50;
            }

Nach wie vor gibt er mir nur die obere Reihe an. Die int i for-Schleife wird nicht durchlaufen, woran liegt das ?

Den Hinweis, dass ich x und y weglassen kann und stattdessen Multiplikation nutze kann ich auch nicht verwerten. Soll das heißen ich trage bei den Parametern für die .Location fixe werte ein und multipliziere die? sowas wie new Point(50*1, 100*1) ? das funktioniert jedenfalls nicht. Abgesehen davon, dass er dann gar keine box mehr ausgibt, beim nächsten durchlauf der Schleife würden sich die Werte dann auch nicht verändern.

 

  • 0
Geschrieben (bearbeitet)
vor 5 Minuten schrieb Kackboon:

Den Hinweis, dass ich x und y weglassen kann und stattdessen Multiplikation nutze kann ich auch nicht verwerten.

Dir steht in der Schleife ja i zur Verfügung, du könntest also statt x += 50 auch einfach .Location = new Point((i + 1) * 50, (f + 1) * 50) schreiben, wenn sich sowohl x und y jedes mal um 50 steigern (+1 jeweils, weil i und f ja bei 0 starten).

Und dass er in die Schleife nicht einsteigt liest du entweder falsch im Debugger oder du hast eine Bedingung, die das verhindert.

Bearbeitet von arlegermi
  • 0
Geschrieben

Verstehe, ja das könnte man so machen mit der Multiplikation. Von der Funktionsweise jedoch soll sich erst nur x um jeweils 50 verschieben, und dann nachdem die erste reihe komplett ist soll sich nur noch y um 50 verschieben, sodass aus einer Reihe ein ganzes Raster wird.

Bezüglich der i-Schleife: er geht in die obere Schleife rein, und zwar genau 1x. dann führt er ja den Inhalt der i-schleife aus (und zwar die f-schleife). Nachdem die f-Schleife jedoch 7x durchgelaufen ist soll er ja noch die unteren Reihen generieren. Aktuell sieht es so aus:

1.Reihe.jpg.b1976b95b1b9105600ef5678fa7d3aa8.jpg

Ich Benötige jetzt noch 5 weitere solcher Reihen untereinander. Das könnte ich dann evtl. durch zusätzliche Arrays lösen. Ziel war es aber eigentlich ein zweidimensionales Array zu nutzen. Leider scheitere ich an der Ausführung. Ich bin davon ausgegangen, dass die verschachtelte for-schleife dafür sorgt, dass ich jeweils beide Dimensionen des Arrays damit abbilden kann. Lag ich damit falsch oder liegt es tatsächlich an der Ausführung?

 

  • 0
Geschrieben (bearbeitet)

Grundsätzlich sollte das so laufen:

int hoehe = 6;
int breite = 6;
string[,] myArray = new string[hoehe,breite];

for(var x = 0; x < breite; x++)
{
  for(var y = 0; y < hoehe; y++)
  {
    myArray[y, x] = $"[{x}, {y}]";
  }
}

//Ausgabe:
//[0,0] [1,0] [2,0] [3,0] [4,0] [5,0] 
//[0,1] [1,1] [2,1] [3,1] [4,1] [5,1] 
//[0,2] [1,2] [2,2] [3,2] [4,2] [5,2] 
//[0,3] [1,3] [2,3] [3,3] [4,3] [5,3] 
//[0,4] [1,4] [2,4] [3,4] [4,4] [5,4] 
//[0,5] [1,5] [2,5] [3,5] [4,5] [5,5] 

Was bei dir dann noch fehlt, ist die Berechnung des Punktes, an dem das Bild gezeichnet werden soll:

//innerhalb der y-Schleife:
Point p = new Location((x+1) * 50, (y+1) * 50);
picture.Location = p;

Ich würde dir raten, einfach mal ein wenig mit Arrays rumzuprobieren, um ein Gefühl dafür zu entwickeln, wie man da rangehen muss. Wenn das einmal "Klick" gemacht hat, ist's eigentlich gar nicht mehr so schwer.

Bearbeitet von arlegermi
  • 0
Geschrieben
vor 36 Minuten schrieb Kackboon:

Bezüglich der i-Schleife: er geht in die obere Schleife rein, und zwar genau 1x. dann führt er ja den Inhalt der i-schleife aus (und zwar die f-schleife). Nachdem die f-Schleife jedoch 7x durchgelaufen ist soll er ja noch die unteren Reihen generieren.

Es wird eine Exception geworfen. Sprich es kommt zu einem Fehler. Deswegen macht er nicht weiter. Allerdings bekommst du die Exception nicht mit, da sie vom Debugger nicht abgefangen wird. Aktiviere mal alle Exceptions unter Debuggen -> Fenster -> Ausnahmeeinstellungen (auf englisch: Debug -> Window -> Exception Settings). Dann solltest du auch die Exceptions bekommen, warum er nicht weitermacht.

  • 0
Geschrieben

Moin Leute!

 

Ich hab's mitlerweile geschafft das Array abzubilden!

namespace Testlauf
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int höhe = 6;
            int breite = 7;


            PictureBox[,] picbox = new PictureBox[höhe, breite];

            for (int i = 0; i < breite; i++)
            {
                for (int f = 0; f < höhe; f++)
                {
                    picbox[i, f] = new PictureBox();
                    picbox[i, f].Name = "number_" + i.ToString();
                    picbox[i, f].Location = new Point((i + 1) * 50, (f + 1) * 50);
                    picbox[i, f].Size = new Size(45, 45);
                    picbox[i, f].BackColor = Color.Blue;
                    picbox[i, f].Image = Image.FromFile("C://Images/kästchen.jpg");
                    this.Controls.Add(picbox[i, f]);
                }
            }
        }

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

Wie im Code zu sehen ist habe ich einen Button hinzugefügt, der mir das Raster einblenden soll. Also habe ich versuch den Code der aktuell unter der Form1_Load Geschichte ist einfach unter den Button_Click Event zu kopieren. Merkwürdigerweise führt das allerdings zu einer IndexOutOfRangeException.. ich habe nichts am Code selbst geändert, nur die Position. Weiß jemand was da los ist ??

  • 0
Geschrieben

Wenn du tatsächlich den identischen Code in einer anderen Methode ausführst, kann das Verhalten egtl. nicht anders sein. Ich nehme eher an, dass dir beim Kopieren etwas entwischt bzw. durcheinander gekommen ist.

Was die button1_Click Methode angeht: Wieso willst du da nochmal dasselbe machen? Geschickt wär's doch, auf die bestehenden PictureBoxen zuzugreifen und nur das Bild in ihnen zu ändern. Dazu musst du ja aber nicht das gesamte Gitter nochmal neu erzeugen.

Dazu gibt's verschiedene Ansätze: Entweder du suchst anhand des Namens in deinem Fenster die passende Box, oder du machst das Array picBox aus Form1_Load in der ganzen Klasse bekannt, so dass andere Methoden ebenfalls darauf zugreifen können (es gibt sicher noch andere Möglichkeiten, aber das sind so die beiden einfachen, die mir spontan einfallen).

  • 0
Geschrieben (bearbeitet)

Ich hatte mir gedacht, dass ich eine Forms Anwendung habe mit mehreren Buttons. Einer dieser Buttons sollte "4-Gewinnt" heißen. Dieser Erzeugt dann das Raster und lässt mich 4-Gewinnt spielen. Beim erneuten Klick auf den Button soll das Raster dann wieder verschwinden, sodass ich einen anderen "Spielmodus" wählen kann.

Aktuell ist es so, dass ich den Code 1:1 aus der Form1_Load ausschneide (nicht kopiere) und unter den Buttonclick einfüge. Danach lässt sich das Programm auch problemlos starten, allerdings sobald ich den Button > betätige < gibt er mir die OutOfRange exception. Hier ein Screenshot:

OOR.jpg.45d5d244dd4dac5b4332d005be84fbc5.jpg

 

Bearbeitet von Kackboon
  • 0
Geschrieben
vor einer Stunde schrieb Kackboon:

Ich hatte mir gedacht, dass ich eine Forms Anwendung habe mit mehreren Buttons. Einer dieser Buttons sollte "4-Gewinnt" heißen. Dieser Erzeugt dann das Raster und lässt mich 4-Gewinnt spielen. Beim erneuten Klick auf den Button soll das Raster dann wieder verschwinden, sodass ich einen anderen "Spielmodus" wählen kann.

Okay, macht grundsätzlich Sinn. Ich würde dir aber erstmal empfehlen, das ganze überhaupt zum Laufen zu bekommen. Verschiedene Modi kann man dann nachträglich auch immer noch einbauen. Denkbar wäre auch, dass du für jedes Spiel ein eigenes Fenster aufmachst - so kommst du mit den Oberflächen nicht durcheinander.

  • 0
Geschrieben
vor 4 Minuten schrieb arlegermi:

Denkbar wäre auch, dass du für jedes Spiel ein eigenes Fenster aufmachst - so kommst du mit den Oberflächen nicht durcheinander.

Dann könnte man sich auch überlegen, die Spiellogik in eigene Klassen auszulagern, anstatt sie in eine Form zu schreiben, damit das Spiel von der grafischen Oberfläche unabhängig wird.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...