Forum: PC-Programmierung 2-dimensionales Feld c++/cli


von Anti-Programmierer (Gast)


Lesenswert?

Hey,
habe ein Problem mit einem 2-dimensionalen Integer-Feld.
Ich deklariere das Array:
1
array<int ^, 2> ^ Spielstein;
In der Form1 lege ich das Array dann an:
1
Spielstein = gcnew array<int ^, 2>(8, 8);

Nun möchte ich in ein bestimmtes Feld eine "1" schreiben:
1
Buttons[i + 1,j]->BackgroundImage = Image::FromFile("Bilder\\Gelb.jpg");
2
   Spielstein[i +1,j] = 1;
Gleichzeitig liegt dahinter ein Button-Array, das mir ein Spielfeld 
simuliert. Ist also das Button-Hintergrundbild "Gelb" dann soll ne 1 
stehen.

Für das Button-Feld habe ich einen gemeinsamen Event-Handler. I und J 
sind auch richtig jedoch bei der Abfrage
1
if(Spielstein[i,j] == 1)
komme ich nie rein...
i und j stimmen, es müsste also eine 1 im Feld stehen....

mfg

von Frank M. (aktenasche)


Lesenswert?

poste mal mehr code

von Anti-Programmierer (Gast)


Lesenswert?

Das ist eig mein ganzer Code:
1
  private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
2
3
      this->Location = Point(100,20);
4
      this->Size = System::Drawing::Size(1116,666);
5
      Spielfeld->Size = System::Drawing::Size(600,600);
6
      Spielfeld->Location = Point(0,27);
7
8
      Spielstein = gcnew array<int ^, 2>(8, 8);
9
      Buttons = gcnew array<Windows::Forms::Button ^, 2>(8, 8);
10
      
11
12
      for(int i = 0; i < 8; i++)
13
        {
14
          for(int j = 0; j < 8; j++)
15
          {
16
            Buttons[i,j] = gcnew Windows::Forms::Button();
17
            Spielstein[i,j] = gcnew int;
18
            // Spielstein 1: Gelber Spielstein
19
            // Spielstein 2: Gelbe Dame
20
            // Spielstein 3: Roter Spielstein
21
            // Spielstein 4: Rote Dame
22
23
            Buttons[i,j]->Size = System::Drawing::Size(75,75);
24
            Buttons[i,j]->FlatStyle = FlatStyle::Flat;
25
            Buttons[i,j]->Margin = System::Windows::Forms::Padding(0);
26
            Buttons[i,j]->FlatAppearance->BorderSize = 0;
27
            Buttons[i,j]->BackgroundImageLayout = ImageLayout::Stretch;
28
            Buttons[i,j]->Click += gcnew EventHandler(this, &Form1::Buttons_Clicked);
29
30
            Spielfeld->Controls->Add(Buttons[i,j], i, j);
31
      
32
            if(i % 2 == 0 && j % 2 == 0 || i % 2 == 1 && j % 2 == 1)
33
              Buttons[i,j]->BackColor = Color::Black;
34
            else
35
              Buttons[i,j]->BackColor = Color::White;
36
          }
37
        }
38
       }
39
  private: System::Void Buttons_Clicked(Object ^sender, EventArgs ^e) {
40
        
41
        Button ^clickedButton = gcnew Button();
42
        clickedButton = dynamic_cast<Button^>(sender);
43
44
        for(int i = 0; i < 8; i++)
45
        {
46
          for(int j = 0; j < 8; j++)
47
          {
48
            if(clickedButton == Buttons[i,j])
49
            {
50
              if(zug == 1)
51
              {
52
                if(Spielstein[i,j] == 1)
53
                {
54
                  this->Text = "Hi";
55
                }
56
                else
57
                {
58
                  this->Text = Convert::ToString(i);
59
                }
60
              }
61
            }
62
          }
63
        }
64
          // Spiel spielen
65
          // Spielmechanik: Wenn Spieler 1 am Zug ist und einen Spielstein auswählt:
66
          // Dann abfragen ob es ein richtiger Button ist.
67
          // Wenn ja, dann abfragen ob das angewählte Feld, das voraus liegt
68
          // Leer ist, bzw das 2fach entfernte Feld leer ist und dazwischen das Button-Hintergrundbild
69
          // des anderen Spielers ist. Wenn ja, dann ist Zug gültig. das alte Feld wird nullptr 
70
          // gesetetz und wenn ein Gegner dazwischen lag, wird dieser entfernt. 
71
          // OPTIONAL: Abfrage ob von diesem Spielstein ein weiterer gegnerischer Spielstein
72
          //       übersprungen werden kann, wenn ja, dann darf nochmal gesprungen werden.
73
       }
74
  private: System::Void neuesSpielToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
75
76
         // Spielfeld initialisieren
77
78
         for(int i = 0; i < 8; i = i + 2)
79
         {
80
          for(int j = 0; j < 3; j++)
81
          {
82
            if(j == 1)
83
            {
84
              Buttons[i + 1,j]->BackgroundImage = Image::FromFile("Bilder\\Gelb.jpg");
85
              Spielstein[i +1,j] = 1;
86
            }
87
            else
88
            {
89
              Buttons[i,j]->BackgroundImage = Image::FromFile("Bilder\\Gelb.jpg");
90
              Spielstein[i,j] = 1;
91
            }
92
          }
93
            Buttons[i,4]->BackgroundImage = nullptr;
94
            Buttons[i + 1,3]->BackgroundImage = nullptr;
95
          for(int j = 5; j < 8; j++)
96
          {
97
            if(j == 6)
98
            {
99
              Buttons[i,j]->BackgroundImage = Image::FromFile("Bilder\\Rot.jpg");
100
              Spielstein[i,j] = 3;
101
            }
102
            else
103
            {
104
              Buttons[i + 1,j]->BackgroundImage = Image::FromFile("Bilder\\Rot.jpg");
105
              Spielstein[i +1,j] = 3;
106
            }
107
          }
108
         }
109
         zug = 1;
110
         freigabe = true;
111
       }

von Thaala (Gast)


Lesenswert?

Das hier ist es meiner Meinung nach:
1
      Spielstein = gcnew array<int ^, 2>(8, 8);
(Das ist ein zweidimensionales Array auf den Typ intptr!)
...
1
           Spielstein[i,j] = gcnew int;

Besser wäre:
1
      Spielstein = gcnew array<int, 2>(8, 8);
(Das ist ein zweidimensionales Array auf den Typ int!, der Speicher für 
die 64 Werte ist bereits reserviert!)


kommst Du denn hier überhaupt rein ?
1
                if(Spielstein[i,j] == 1)
2
                {
3
                  this->Text = "Hi";
4
                }
5
                else
6
                {
7
                  this->Text = Convert::ToString(i);
8
                }
Hier würde das genügen:
1
private: System::Void Buttons_Clicked(Object ^sender, EventArgs^ e)         
2
        Button ^clickedButton = dynamic_cast<Button^>(sender);
Gruß T.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.