Minesweeper

0plan

Bekanntes Mitglied
Hallo,

ich programmiere gerade Minesweeper bzw versuche es ;P und habe ein 2 Dimensionales Array mit mit Zufallszahlen von 0-1 gefüllt wobei eine 1 eine Miene darstellen soll.

Der Index des Arrays ist [5][5] also habe ich 25 jToggleButton angelegt. Um nun den Arrayinhalt den einzelnen Buttons zu zuordnen habe ich eine Methode geschrieben, die anhand der Position beim Buttonklick den Text des Buttons auf den Inhalt des Arrays setzt.

Java:
	int[][] mienen = new int [5][5];
	
	public void erzeugeSpielfeld(){
		
		for(int x=0; x<5; x++){
			for(int y=0; y<5; y++){
				mienen[x][y] =(int)(Math.random()*1);
			}
		}
	}

Methode die das Array füllt.


Hier die Methode die den Buttons den Inhalt des Arrays zuordnen soll.

Java:
public void defineButtons(JToggleButton btn){
		if (btn.getModel().isSelected()){
				btn.setText(Integer.toString(mienen[btn.LEFT/43][btn.TOP/34]));
		}
			btn.setEnabled(false);
		}

Alle Buttons sind an ein Actionevent gebunden das beim Klick eines Buttons aufgerufen wird.

Java:
 	private AbstractAction getBtnClicked() {
		if(btnClicked == null) {
			btnClicked = new AbstractAction("", null) {
				public void actionPerformed(ActionEvent evt) {
				
					
				defineButtons((JToggleButton) evt.getSource());
				
				}
			};
		}
		return btnClicked;
	}

Nun zum Problem : Jeder Button zeigt die selbe Zahl an nachdem geklickt wurde, die größe der Buttons ist überall gleich, die Positionsangaben stimmen demnach. Ich denke das mit der defineButtons Methode kurz bevor die Position angegeben wird etwas nicht stimmt. Aber was?

Bitte Hilfe
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
warum fragst du andere Menschen statt dein Programm? das würde dir alles gerne erzählen wenn du nur die zugehörigen Befehle eintippst:

wie ist das Minen-Array überhaupt gefüllt? hast du anscheinend noch nicht angeschaut
hinter
> mienen[x][y] =(int)(Math.random()*1);
gehört
> System.out.println("setze Minenwert an x = .., y = .. auf ...");

und die einzig richtige Zeile nach
> btn.setText(Integer.toString(mienen[btn.LEFT/43][btn.TOP/34]))
lautet natürlich
> System.out.println("aktualisiere einen Button mit Koordinate .../.., also ArrayIndex ../.., damit verwende ich Minenwert ...");

mit diesen Informationen wüßtest du schon viel mehr, wo etwas schiefläuft,
ob du das dann selber korrigieren kannst ist eine andere Frage, aber bitte zumindest bisschen an Informationssuche arbeiten

-----

damit du nicht mit Logausgaben überschüttet wirst, fange mit 2x2-Array an oder 3x3,
falls das nicht Schwierigkeiten mit hardkodieren Koordinaten macht,
[btn.LEFT/43][btn.TOP/34] klingt ganz übel, unabhängig vom Fehler der darin versteckt ist

-----

edit:
> Nun zum Problem : Jeder Button zeigt die selbe Zahl an nachdem geklickt wurde

ändert sich unabhängig von der Minen-Anzahl bei allen Buttons gleichzeitig die Anzeige?
 
Zuletzt bearbeitet von einem Moderator:

0plan

Bekanntes Mitglied
aus welchem Grund klingt das mit dem btn.LEFT xxx übel, dieser Teil der Zeile ist nicht das Problem, bin ich mir ziemlich sicher.
Und ich möchte hier auch nicht, dass mir Arbeit abgenommen wird, nur ich denke mal für Hilfestellungen bietet sich ein Forum an. Und wenn jemand die Lösung für diesen Fehler kennt, wäre es natürlich super wenn man mir sie mitteilt.

Also, wo liegt der Fehler ?
 
S

SlaterB

Gast
siehe mein edit im letzten Posting, vielleicht habe ich falsch verstanden worum es geht,
aber worum geht es eigentlich?
Screenshot wäre hilfreich, auch bisschen Code wie die Buttons alle definiert sind, es gibt nicht zufällig nur einen Button, der 25x eingefügt wurde?
 

0plan

Bekanntes Mitglied
Nein ich habe 25 jToggleButtons erstellt sie sind namentlich alle von jToggleButton1 - 25 nummeriert.

Und beim Klick auf einen solchen, ändert sich der Text auf 1. Nicht bei allen gleichzeitig sondern wirklich nur bei dem geklickten Button.

Ich geh mal davon aus, dass ich mittlerweile ein 2d Array richtig füllen kann, da wird der Fehler nicht liegen. Irgendwo btn.setText(Integer.toString(mienen[btn.LEFT/43][btn.TOP/34])) müsste der Fehler liegen. Aber leider kenn ich keine Lösung. Eventuell liegt es daran das er bei btn.setText(..) jeden Button anspricht, da als Parameter ja JToggleButton angegeben ist, aber das könnte ich mir auch nicht erklären.

Hier noch mal die erstellung der einzelnen Buttons für dich
Java:
jPanel1 = new JPanel();
				GroupLayout jPanel1Layout = new GroupLayout((JComponent)jPanel1);
				jPanel1.setLayout(jPanel1Layout);
				jPanel1.setBackground(new java.awt.Color(128,128,128));
				{
					jToggleButton15 = new JToggleButton();
					jToggleButton15.setAction(getBtnClicked());
					jToggleButton15.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton15.setSize(50, 50);
				}
				{
					jToggleButton14 = new JToggleButton();
					jToggleButton14.setAction(getBtnClicked());
					jToggleButton14.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton14.setSize(50, 50);
				}
				{
					jToggleButton13 = new JToggleButton();
					jToggleButton13.setAction(getBtnClicked());
					jToggleButton13.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton13.setSize(50, 50);
				}
				{
					jToggleButton12 = new JToggleButton();
					jToggleButton12.setAction(getBtnClicked());
					jToggleButton12.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton12.setSize(50, 50);
				}
				{
					jToggleButton11 = new JToggleButton();
					jToggleButton11.setAction(getBtnClicked());
					jToggleButton11.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton11.setSize(50, 50);
				}
				{
					jToggleButton7 = new JToggleButton();
					jToggleButton7.setAction(getBtnClicked());
					jToggleButton7.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton7.setSize(50, 50);
				}
				{
					jToggleButton6 = new JToggleButton();
					jToggleButton6.setAction(getBtnClicked());
					jToggleButton6.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton6.setSize(50, 50);
				}
				{
					jToggleButton8 = new JToggleButton();
					jToggleButton8.setAction(getBtnClicked());
					jToggleButton8.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton8.setSize(50, 50);
				}
				{
					jToggleButton9 = new JToggleButton();
					jToggleButton9.setAction(getBtnClicked());
					jToggleButton9.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton9.setSize(50, 50);
				}
				{
					jToggleButton10 = new JToggleButton();
					jToggleButton10.setAction(getBtnClicked());
					jToggleButton10.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton10.setSize(50, 50);
				}
				{
					jToggleButton5 = new JToggleButton();
					jToggleButton5.setAction(getBtnClicked());
					jToggleButton5.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton5.setSize(50, 50);
				}
				{
					jToggleButton4 = new JToggleButton();
					jToggleButton4.setAction(getBtnClicked());
					jToggleButton4.setAction(getBtnClicked());
					jToggleButton4.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton4.setSize(50, 50);
				}
				{
					jToggleButton3 = new JToggleButton();
					jToggleButton3.setAction(getBtnClicked());
					jToggleButton3.setAction(getBtnClicked());
					jToggleButton3.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton3.setSize(50, 50);
				}
				{
					jToggleButton2 = new JToggleButton();
					jToggleButton2.setAction(getBtnClicked());
					jToggleButton2.setAction(getBtnClicked());
					jToggleButton2.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton2.setSize(50, 50);
				}
				{
					jToggleButton1 = new JToggleButton();
					jToggleButton1.setAction(getBtnClicked());
					jToggleButton1.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton1.setSize(50, 50);

				}
				{
					jToggleButton16 = new JToggleButton();
					jToggleButton16.setAction(getBtnClicked());
					jToggleButton16.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton16.setSize(50, 50);
				}
				{
					jToggleButton17 = new JToggleButton();
					jToggleButton17.setAction(getBtnClicked());
					jToggleButton17.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton17.setSize(50, 50);
				}
				{
					jToggleButton18 = new JToggleButton();
					jToggleButton18.setAction(getBtnClicked());
					jToggleButton18.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton18.setSize(50, 50);
				}
				{
					jToggleButton19 = new JToggleButton();
					jToggleButton19.setAction(getBtnClicked());
					jToggleButton19.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton19.setSize(50, 50);
				}
				{
					jToggleButton20 = new JToggleButton();
					jToggleButton20.setAction(getBtnClicked());
					jToggleButton20.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton20.setSize(50, 50);
				}
				{
					jToggleButton21 = new JToggleButton();
					jToggleButton21.setAction(getBtnClicked());
					jToggleButton21.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton21.setSize(50, 50);
				}
				{
					jToggleButton22 = new JToggleButton();
					jToggleButton22.setAction(getBtnClicked());
					jToggleButton22.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton22.setSize(50, 50);
				}
				{
					jToggleButton23 = new JToggleButton();
					jToggleButton23.setAction(getBtnClicked());
					jToggleButton23.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton23.setSize(50, 50);
				}
				{
					jToggleButton24 = new JToggleButton();
					jToggleButton24.setAction(getBtnClicked());
					jToggleButton24.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton24.setSize(50, 50);
				}
				{
					jToggleButton25 = new JToggleButton();
					jToggleButton25.setAction(getBtnClicked());
					jToggleButton25.setFont(new java.awt.Font("Arial",0,8));
					jToggleButton25.setSize(50, 50);
				}



Uploaded with ImageShack.us
 
Zuletzt bearbeitet:

0plan

Bekanntes Mitglied
ich habe ja im Actionevent rumpf angegeben, das ich von getSource() die defineButtons Methode nur auf den gedrückten Knopf anwenden will oder ist dort irgendwo der Fehler?

Methode im ersten Post
 

Marco13

Top Contributor
S

SlaterB

Gast
> ich habe ja im Actionevent rumpf angegeben, das ich von getSource() die defineButtons Methode nur auf den gedrückten Knopf anwenden will

wenn du damit irgendwas implizieren willst, dann bitte dazuschreiben, spricht eine Beobachtung dagegen?
aber anscheinend funktioniert doch die Einschränkung auf einen Button,
die Info, dass nur einer eine 1 anzeigt zusammen mit der Problembeschreibung im ersten Post 'Jeder Button zeigt die selbe Zahl an nachdem geklickt wurde' bringt mich wieder zu meinem ersten Antwort:
die Technik funktioniert, es geht nur um die Datenwerte, die angezeigt werden

----

> aus welchem Grund klingt das mit dem btn.LEFT xxx übel, dieser Teil der Zeile ist nicht das Problem, bin ich mir ziemlich sicher.
+
> Irgendwo btn.setText(Integer.toString(mienen[btn.LEFT/43][btn.TOP/34])) müsste der Fehler liegen.

;) sorry

------

also da schon so viel geschrieben wurde will ich mal nicht auf meinem Standpunkt vom ersten Posting verbleiben sondern sagen was ich da meinte:

> mienen[x][y] =(int)(Math.random()*1);
Math.random() liefert immer einen Wert 0 bis <1, auf int gerundet ist das IMMER dasselbe, nämlich 0,
einfach loggen, dann hättest du das gesehen, was gibt es einfacheres
(passt allerdings zu deiner Ausgabe 1 kaum, edit: ah, in deinem Bild ist überall 0)

> mienen[btn.LEFT/43][btn.TOP/34]
LEFT und TOP scheinen statische Konstanten zu sein, haben mit der Postition des Buttons nichts zu tun,
einfach loggen, dann hättest du das gesehen, was gibt es einfacheres

wo die Buttons im Layout positioniert sind, ist nicht so trivial zu bestimmen und dann umzurechnen,
besser die Buttons in einem 5/5-Array ablegen und dann dort per Suche den Index herausfinden
 
Zuletzt bearbeitet von einem Moderator:

0plan

Bekanntes Mitglied
Mit ActionEvents und Listenern kenn ich mich aus, das ist ja nicht das Thema, der Code für die erstellung der Buttons ist ja nicht das Problem, es liegt irgendwo in der Methode defineButtons oder im Event rumpf. Das Problem ist ja nicht das Actionevent, sondern der Inhalt.

Lg
 

0plan

Bekanntes Mitglied
Es sind statische Konstanten hast du recht, aber wenn ich btn.setText[mienen[btn.LEFT/XXXX] anwende, teile ich ja die Position durch die festgelegte Größe der Buttons wodurch ich auch den richtigen Index bekomme. Aber wie gesagt das Problem das ich überall nur die selbe Zahl bekomme besteht weiterhin.

mienen[x][y] =(int)(Math.random()*2); bei dieser Variante steht überall die 1 sorry, bei mienen[x][y] =(int)(Math.random()*1); ist es überall eine 0.

Das hatte ich vergessen bei dem Screenshot anzugeben
 
S

SlaterB

Gast
mine statt miene sollten wir langsam schreiben, auch in deutsch

> (int)(Math.random()*2)
ist besser, ob du dann (bei allen gleich) eine 1 oder eine 0 siehst sollte 50% Zufall sein, starte dein Programm mehrmals


denn durch den anderen Fehler verwendest du wie gesagt für alle Buttons denselben Index, schau dir an was LEFT ist,
ok, du weigerst dich ja, jede indirekte Arbeit zur Lösung auszuführen, also mache ich das noch:
die statische Konstante LEFT ist 2, 2/43, wie auch immer du auf 43 gekommen bist, ist 0, bei TOP genauso,
du fragst also immer den Wert von Array-Position 0/0 ab

wenn du deine irrsinnige Positionsberechnung fortführen willst, dann hilft dir vielleicht button.getLocation() weiter,
der beste Rat kann aber nur sein die Buttons in einem Array abzulegen,
 

0plan

Bekanntes Mitglied
Das kann ich dir erklären. Die größe der Buttons ist 43X34 die Buttons alle in einem JPanel der genau an die Position des Feldes angepasst ist. Wenn ich also nun den 2ten Button anklicke werden diese werte geteilt und ich bekomme die Zahl die für den Index an dieser Stelle steht. Das mit den Button Arrays habe ich schonmal probiert, jedoch wusste ich nicht, wie ich dieses dann füllen kann, dass er der Reihe nach jToggleButton1 - 25 einfügt, die Namen der Buttons sind ja Strings.
 
S

SlaterB

Gast
Java:
 for(int x=0; x<5; x++){
            for(int y=0; y<5; y++){
                JButton b = ..;
                ...
                ...  
                einfügen in GUI
                array[x][y] = b;
            }
        }
mit groupLayout usw. klingt das aber nach GUI-Builder, lass den so arbeiten wie er will,
dann fülle dein Array eben nachträglich mit
Java:
array[0][0] = button1;
array[0][1] = button2;
usw.

naja, mach wie du denkst, die Fehlerursache und zwei mögliche Lösungen sind erläutert
 

0plan

Bekanntes Mitglied
Danke für die Hilfe, die Lösung ist allerdings nicht ermittelt worden, es sind nur Möglichkeiten einer anderen Lösung vorgeschlagen worden. Aber dann muss ich halt alels umstrukturieren, hauptsache es funktioniert.

Danke für deine Mühe
 

Zenic

Mitglied
Da ich das Problem nicht ganz verstehe, weiß ich nicht ob es damit gelöst wird, aber bei einem zweidimensionalen Array ist die erste Zahl die Zeile und die zweite Zahl die Spalte. Somit ist das
Java:
mienen[btn.LEFT/43][btn.TOP/34]
verkehrt.

Bsp.: Feld: Zeile 1 Spalte 2 (Werte beginne bei 0)
btn.Left/43 => 86/43 = 2
btn.Top/34 => 34/34 = 1

Das wäre dann aber das erste Feld in Zeile 2.

Sonstige Anmerkungen:
Wie du auf 43 und 34 kommst wenn die Felder 50*50 sind, versteh ich aber nicht.

Da die Buttons alle gleich definiert sind würde ich die Erstellung in eine Methode auslagern,
Java:
  private JToggleButton createField(){
	  JToggleButton btn = new JToggleButton();
      btn.setAction(getBtnClicked());
      btn.setFont(new java.awt.Font("Arial",0,8));
      btn.setSize(50, 50);
      
      return btn;
  }
Java:
jToggleButton1 = createField();
oder gleich in ein Array.
 
S

SlaterB

Gast
nun, wer sagt denn, dass das Array nach Zeilen statt nach Spalten sortiert ist?
bei 5x5 kann man das im Moment beliebig denken
 

c_sidi90

Top Contributor
denke mal mit 43, 34 sind die position der Buttons im jPanel gemeint, wenn die Buttons alle gleichgroß sind, ist damit auch die x y Position der Buttons im Panel immer gleich bzw verdoppelt sich.

Da bei deinem Beispiel auch steht Werte beginnen bei 0, ist demnach die erste Zeile der Topwert überall 0. Demnach kommt beidem Beispiel kein Feld der 2. Spalte raus sondern btn.TOP/34 = 0 , Index also auch [0] Oder seh ich das falsch? Find das ganze Thema etwas fragwürdig
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben