Entwickler-Ecke

C# - Die Sprache - c# hilfe bei "vier gewinnt programierung" benötigt^^


mr.eddy - So 06.01.08 19:11
Titel: c# hilfe bei "vier gewinnt programierung" benötigt^^
hallo leute

ich habe in der schule die aufgabe gekriegt das spiel vier gewinnt zu
programmieren bin aber noch nicht so gut in diesem fach und frage hier
ob mir vllt jemand helfen kann^^


Christian S. - So 06.01.08 19:16

Hallo und :welcome:!

Vorweg: Ändere bitte den Titel Deines Threads, sodass er ein bisschen mehr über den Inhalt aussagt. Danke! :)

Nun zu Deinem Problem: Komplette Hausaufgaben machen wir Dir hier nicht, aber wir helfen Dir sehr gerne dabei, wenn Du irgendwo nicht weiterkommst. Wenn Du also mal schaust, wie weit Du kommst und Dich meldest, wenn es hakt, wirst Du hier sicherlich Hilfe finden. :-)

Grüße
Christian


mr.eddy - So 06.01.08 19:28

joa mit dem anfang tue ich es mir noch schwerhabe daran gedacht das spielfeld mit 2 arrays zu erstellen weiß aber noch nicht so genau wie ich auf der oberflächer darstelle und wie ich beide verbinde ^^"


Chryzler - So 06.01.08 20:02

Für das Spielfeld nimmst du am besten ein zwei-dimensionales Array [http://www.galileocomputing.de/openbook/csharp/kap16.htm#t22]. Für die Felder auf dem Spielfeld würde ich einen Aufzählungstypen deklarieren, der dafür geeignet ist. Z.B:

C#-Quelltext
1:
2:
3:
4:
5:
6:
public enum Feld
{
    Free,    // Feld ist noch frei
    Player1, // Feld ist besetzt von Spieler 1
    Player2  // Feld ist besetzt von Spieler 2
}

Dann kannst du das Spielfeld als Feld[,] spielfeld deklarieren.


mr.eddy - So 06.01.08 20:18

sieht gut und doch nen wenig kompleziert aus ^^
ich probiers mal
danke


mr.eddy - So 06.01.08 22:47

hmm ich hab mir eine oberfläche aus labels für die spielfläche erstellt und das array dafür in einer eigenen klasse
doch wie kann ich es bewerkstelligen das wenn ich ein label anklicke diese stelle im array auch den wert kriegt besonders ohne
das bei allen 42 labels einzeln zu machen???


Christian S. - Mi 09.01.08 18:34

Hallo!

Du kannst allen Labels das gleiche Klick-Ereignis zuweisen. Der Sender-Parameter des Ereignisses verrät Dir, welches Label geklickt wurde. Danach kannst Du dann die entsprechende Stelle im Array setzen. Du kannst über die Tag-Eigenschaft eines jeden Labels (die Du frei belegen kannst, dafür ist sie da) den entsprechenden Index im Array speichern, dann ist das recht kurz und bündig zu lösen.

Grüße
Christian


mr.eddy - Sa 12.01.08 16:06

oO ich blick da ehrlich gesagt nicht so durch wie geht das genau allen labels den selben code anzufügen


Christian S. - Sa 12.01.08 16:31

Also:
  1. Du kannst für das Click-Ereignis aller Labels ein und dieselbe Methode verwenden. Kannst Du dann so benutzen:

    C#-Quelltext
    1:
    2:
    3:
    4:
    5:
    public void labels_Click(object sender, EventArgs e)
    {
      Label clickedLabel = (Label) sender;
      MessageBox.Show(clickedLabel.Text);
    }

  2. Du kannst bei jedem Label in der Tag-Eigenschaft eine beliebige Information hinterlegen, so zum Beispiel den Index im Array, zu dem das Label gehört:

    C#-Quelltext
    1:
    2:
    int einIndex = 42;
    someLabel.Tag = einIndex;

    Die Tag-Eigenschaft kannst Du natürlich auch im Click-Ereignis auslesen, wie ich es oben mit der Text-Eigenschaft gemacht habe. Nur ein bisschen casten musst Du dann noch.
  3. Schonmal dran gedacht, die Labels auch in einem Array zu erstellen und nicht mit dem Form-Designer:

    C#-Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    Label[] labels = new Label[42];
    for (int i = 0; i < labels.Length-1; i++)
    {
      labels[i] = new Label();
      labels[i].Parent = this;
      labels[i].Left = i*20;
      labels[i].Tag = i;
    }

    Hier habe ich schon den Index im Array in der Tag-Eigenschaft gespeichert, sodass Du im Click-Ereignis genau weißt, an welcher Stelle im Array das Label steht.


So, anhand dieser Code-Beispiele (die Du natürlich noch für Dich anpassen musst, es sind nur Beispiele) solltest Du weiter kommen.

Grüße
Christian


mr.eddy - So 13.01.08 14:59

hmm ich häng noch einen schritt zurück
ich hab erstmal das spielfeld mit labels erstellen lassen

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
private void Form1_Load(object sender, EventArgs e)
        {
            int x = 1;
            int y = 1;

            for (int i1 = 0; i1 < 7; i1++)
            {
                for (int i2 = i2; i2 < 6; o++)
                {

                    Label mylabel = new Label();
                    mylabel.BackColor = Color.Black;
                    mylabel.Size = new Size(2020);
                    mylabel.Location = new Point(x, y);
                    this.Controls.Add(mylabel);
                    y = y + 30;
                }
                y = 1;
                x = x + 30;  
            }
          
        }

doch weiß ich derzeit nicht wie ich das event click hinzufügen kann?


Christian S. - So 13.01.08 15:48

Mit dem "+="-Operator und einer passenden Methode:

C#-Quelltext
1:
myLabel.Click += deineKlickMethode;                    


mr.eddy - So 13.01.08 17:10

geht es genauer?


Christian S. - So 13.01.08 17:13

Du musst doch nur noch eine Click-Methode für das Label anlegen. :nixweiss:


mr.eddy - So 13.01.08 17:17

xD ja aber wie? kannst du mir nicht den quellcode davon zeigen ?^^


Christian S. - So 13.01.08 17:20

Nö, musst schon noch selber was machen.

Du weißt, wie man Methoden anlegt und wie die Click-Methode aussehen muss, ist entweder aus der Doku zu erfahren oder Du lässt Dir von der IDE einfach mal eine anlegen. "Eigeninitiative" heißt hier das Stichwort :mahn:


mr.eddy - So 13.01.08 17:26

:eyes: ich habs ja versucht ...

hab zwar einiges gefunden wie z.B. http://msdn2.microsoft.com/de-de/library/microsoft.office.tools.word.action.click(VS.80).aspx
aber wurd ich daraus nicht schlau xD deswegen frag ich hier ja nach :gruebel:


Christian S. - So 13.01.08 17:34

Guck Dir doch bitte nur mal den Link an. Da steht was von Office und Word drin, das kann wohl kaum das sein, was Du suchst :roll:

Du könntest aber einfach nochmal ganz in Ruhe meine Beiträge hier durchlesen, da versteckt sich auch eine Click-Methode für Labels drin. :les:


mr.eddy - So 13.01.08 17:52

ich muss ja einmal innerhalb der for-schleife ein click-ereigniss eintragen und dann zusätzlich eine methode erstellen
nachdem ich mir anguckte wie der formdesigner dieses ereigniss einfügt :

C#-Quelltext
1:
this.label1.Click += new System.EventHandler(this.label1_Click);                    

hab ich es mal so probiert mylabel.Click += new EventHandler(...);
doch hab ich kleinen plan was in die klammer kommt


Christian S. - So 13.01.08 17:56

Die von mir mehrmals erwähnt Methode fürs Click-Ereignis ...


mr.eddy - So 13.01.08 18:09

ahhh xD ich habs


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
...
mylabel.Click += new EventHandler(labels_Click);
...
        public void labels_Click(object sender, EventArgs e)
        {
            Label clickedLabel = (Label)sender;
                if (status == 1) { clickedLabel.BackColor = Color.Red; }
                   else clickedLabel.BackColor = Color.Blue; ;
                   if (status == 1) { status = 2; }
                   else status = 1;


vielen dank


mr.eddy - So 13.01.08 18:18

hmm wie kann das programm erkennen wann 4 in einer reihe sind?


Christian S. - So 13.01.08 18:28

Da die ursprüngliche konkrete Frage (in Deinem zweiten Posting) beantwortet ist, möchte ich Dich bitten, einen neuen Thread zu erstellen. Eine neue Frage geht dann unter, außerdem kannst Du dann mal einen Titel nehmen, der konkreter den Inhalt der Frage angibt.

*closed*