Schiffeversenken

Guten Tag allerseits.

Ich hoffe ich bin im richtigen Forum. Wir haben momentan ein VBSeminar
und wir wollen in diesem Seminar ein Schiffeversenken spiel spielen.

Das Problem ist nun folgendes.

Wir haben per Array und schleife 100-400 PictureBoxen die wir erstellen (je nach dem wieviele Spieler mitspielen).

Wir wollen aber nun nicht für jede einzelne PictureBox ein clickevent schreiben, weil..
naja weil wir keine lust haben 100-400 Clickevents zu schreiben ^^..

Fällt euch möglerweise ein wie wir dieses Problem lösen bzw umgehen können?
Also praktisch ein clickevent für alle.

Ich hoffe ich habe mich verständlich ausgedrückt.

Maikel
 
Ich finde es keine gute Idee das mit PictureBoxen zu realisieren.
Ich würde die Kästchen statt dessen selbst auf einem "Spielfeld"-Control zeichnen (sollte auch viel schneller gehen und nicht so ruckeln), dann das Click-Event dieses Panels abfangen und da die Felder ja alle gleich groß sind kann man dann einfach ausrechnen auf welches Feld geklickt wurde.
gruß
Ringelsocke
 
Wenn ihr es dennoch mit den PictureBoxen lösen wollt:
Einfach jeder Box das selbe Click-Event zuweisen. Der erste Parameter im Event ermögtlicht euch die Identifikation des geklickten Elements.

lg,..
 
Ich habe letzens aus Spass ein kleines MineSweeper in .NET gemacht und da habe ich es mit Panels und deren Hintergrundfarbe gelöst:
Code:
Panel^ pPanel = gcnew Panel();
//pPanel->BackgroundImage = pictureBox1->BackgroundImage;
pPanel->Size = System::Drawing::Size(panelX, panelY);
pPanel->Location = Point((Width % 20) / 2 + j * panelX + 10, ((Height % 20) / 2) + 50  + i * panelY);
pPanel->BackColor = Color::White;
pPanel->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle;
pPanel->MouseEnter += gcnew System::EventHandler(this, &Form1::PanelMouseEnter);
pPanel->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::PanelMouseDown);
pPanel->MouseUp += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::PanelMouseUp);
pPanel->MouseLeave += gcnew System::EventHandler(this, &Form1::PanelMouseLeave);

Und dann entsprechend:
Code:
		System::Void PanelMouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
		{
			if(e->Button == System::Windows::Forms::MouseButtons::Left)
			{
				((Panel^)sender)->BorderStyle = System::Windows::Forms::BorderStyle::None;
				System::Collections::IEnumerator^ ien = m_panels->GetEnumerator();
				unsigned int pos = 0;
				while(ien->MoveNext())
				{
					if(sender == ien->Current)
					{
						if(m_states[pos] != FieldStates::Opened)
							((Panel^)sender)->BackColor = Color::DarkGray;
						break;
					}
					++pos;
				}			
			}
		}

FUnktioniert soweit ohne Beanstandungen.

Gruss
Cromon
 
also mit den Events ginge es so (ich kann leider nur C# deshalb halb Pseudocode halb von anderen Seite kopiert):

Beispiel für ein Funktion, die dem MouseDown Event einer PictureBox zugewiesen ist:
Private Sub PictureBox_MouseDown(ByVal sender As Object,ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

Mal kurz nachgelesen scheint man ein Event in VB anzubinden mit
AddHandler Control.Event, AddressOf Handler

also wär das denk ich sowas wie (ich geh mal davon aus dass die PictureBoxen in nem Array untergebracht sind, deshalb pictureBox[n], oder wie auch immer man das in VB schreibt)
AddHandler pictureBox[n].MouseDown AddressOf PictureBox_MouseDown

und innerhalb der PictureBox_MouseDown - Funktion sagt dir der Parameter sender, welche PictureBox genau angeklickt wurde. Also quasi müsstest du dort sender auf PictureBox casten weil der als object übergeben wird, und dann könntest du damit weiterarbeiten (picture ändern und so).

Trotzdem fände ich die gezeichnete Lösung einfacher, schöner und performanter...könnte mir vorstellen, dass das mit den vielen PictureBoxen später je nach dem ganz schön träge ist und flackert.

gruß
Ringelsocke
 
hey...

vielen dank. Ja denke auch das mit dem gezeichnet wäre schöner. Das Projekt war ja von zwei Auszubildendenkollegen und ich hab dort nur mitgeholfen. Nun haben di es aufgegeben und Programmieren zurzeit Hangman.

Trotzdem vielen vielen Dank an alle.
 

Neue Beiträge

Zurück