Autor Beitrag
chip777
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mi 22.09.10 21:15 
Hallo,

ich hab vor ein Spiel zu programmieren, dort gibt es 64 Buttons, ich will folgendes realisieren:
Jeweils ein Button soll mit einem Bild belegt sein(7 verschiedene Bilder), wenn der Button geklickt wird soll ein anderen Button mit einem Bild belegt werden und der alte soll wieder rückgesetzt werden.
Hier ein bisschen Code dazu:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
private void Colorswitch(int arraycolor)
        {
            if (arraycolor == 1)
                button1.Image = WindowsFormsApplication1.Properties.Resources.grün;
            if (arraycolor == 2)
                button1.Image = WindowsFormsApplication1.Properties.Resources.dunkelblau;
            if (arraycolor == 3)
                button1.Image = WindowsFormsApplication1.Properties.Resources.hellblau;
            if (arraycolor == 4)
                button1.Image = WindowsFormsApplication1.Properties.Resources.lila;
            if (arraycolor == 5)
                button1.Image = WindowsFormsApplication1.Properties.Resources.orange;
            if (arraycolor == 6)
                button1.Image = WindowsFormsApplication1.Properties.Resources.rosa;
            if (arraycolor == 7)
                button1.Image = WindowsFormsApplication1.Properties.Resources.rot;
        }
// von hier aus erfolgt die auswahl
                Random number = new Random();
                int randomnumber = number.Next(064) + 1;
                Random color = new Random();
                int arraycolor = color.Next(07) + 1;
                label3.Text = randomnumber.ToString();
                //randomnumber = 1;
                if (randomnumber == 1)
                {
                    Colorswitch(arraycolor);
                }


Nun zu meinem Problem, ich würde gerne in der Methode Colorswitch das button1 ersetzen, und zwar so das der button der per Zufallszahl gewählt wurde die neue Farbe bekommt, allerdings weiß ich nicht wie ich aus einer Zufallszahl(1-64) einen button(auch 1-64) mache.

Hoffe ich konnte mich verständlich genug ausdrücken.

Gruß Martin
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 22.09.10 22:39 
Hi,

also. das Ganze wäre ja eigentlich einfach zu lösen. Wenn denn die Buttons in einer Collection wären, wie z.B. einem Arry oder einer List. Dann könntest Du einfach den Index in dieser Collection anhand der Zufallszahl wählen, und das Objekt dementsprechend ändern.

Wenn sich allerdings die Buttons nicht in einer Collection befinden (also durch den Designer einfach nur auf die Form platziert sind) [ja, ich weiß, eine ControlCollection ist auch eine Collection] wird es schon schwieriger. Denn in this.Controls sind halt alle Controls enthalten, bis zur 1. Stufe. Soll heißen, wenn sich z.B. weitere Controls auf einem Panel der Form befinden, so ist in der Collection zwar das Panel, aber nicht die Controls auf diesem Panel.

Wenn sich die Buttons auf der Form befinden, so könntest Du die Controls, die vom Typ Button sind und einen Namen besitzen, der identifiziert, das es halt solche Buttons sind, die die Farbe bekommen sollen, per LinQ abfragen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var buttonControls = from control in this.Controls.Cast<Control>()
                     .Where(control => control.Name.ToLower().Contains("yourIdentifier") &&
                     control.GetType().Equals(typeof(Button)))
                     select control;

if (buttonControls != null)
{
  //ZufallszahlGenerator
  buttonControls.ElementAt(GenerierteZahl).BackColor = Color.AliceBlue;
}


Und dann kannst Du den Button auf die neue Farbe setzen. Aber besser wäre es wirklich, die Buttons, die farblich geändert werden sollen (bzw. können) in einer Collection zu halten (bei der Anzahl von 64 empfiehlt es sich eh, die Buttons dynamisch zu generiern, denke ich mal).

Hoffe, ich konnte Dir helfen.
LG, Marko
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 23.09.10 08:40 
Hallo,

also das halte ich schon für gemurkse mit dem Identifikator. Auch die Buttons per Designer zu definieren halte ich für Unsinnig, weil der Code dann viel zu statisch ist.

Ich würde die Anzahl an Buttons dynamisch erzeugen. Dann ist es auch keinen Aufwand sie (wie Trashkid) schon angesprochen hat sie in eine Liste zu packen. Wenn du diese Konstellation hast, benötigst du nur die Zufallszahl einen Mapper von Zufallszahl auf Image und eine Methode die dies deinem Button zuweißt.

Könnte dann so aussehen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// Erzeugen
List<Button> buttons = new List<Button>();
for (int x = 0; x < rows; x++)
{
   for (int y = 0; y < columns; y++)
   {
      Button newButton = new Button();
      newButton.Click ...
      buttons.Add(newButton);
   }
}


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// Zufälliges Bild auswählen
Image randomImage = ImagePool[random.Next(0,ImagePool.Count)];

// Bild einem Button zuweisen
buttons[3].Image = randomImage;

// oder zufälligem Button
buttons[random.Next(0,buttons.Count)].Image = randomImage;


Keep it simple.

Gruß

Für diesen Beitrag haben gedankt: chip777
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mi 06.10.10 11:05 
Hi,

sorry erstmal das ich mich solange nicht gemeldet habe, hatte noch einige andere Dinge zu tun. Jetzt drängt dieses Projekt allerdings^^
Ich werd es mit Daniels Idee versuchen und die Buttons dynamisch erzeugen, da ich sowas noch nicht gemacht habe, werden da wohl Schwierigkeiten auftreten, falls dem so sein sollte werd ich mich wieder melden.
Erstmal danke für die ausführlichen Antworten.

Gleich mal noch ne Frage: Kann ich den Klick Event für alle Buttons gleich machen? Also alle auf einen Event registrieren? Und wenn ja, bekomme ich immer noch raus welcher Button den Event ausgelöst hat?

Gruß Martin
Necaremus
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: Mi 06.10.10 11:16 
Zitat:
Kann ich den Klick Event für alle Buttons gleich machen? Also alle auf einen Event registrieren?

Ja, du kannst in der for schleife von danielf den buttons einfach ein event zu weisen, wie danielf in seinem code beispiel schon andeutet.
Zitat:
Und wenn ja, bekomme ich immer noch raus welcher Button den Event ausgelöst hat?

Ja.
Stichwort "sender": MyClickEvent(object sender, EventArgs e)