Multithreading mit JButtons

Hallo Freunde,

Ich bin in der letzten Phase meines Projektes "Schiffe versenken"

Ich habe meine Gui, Spieler kann die Schiffe setzen und Computer kann seine Schiffe setzen.

Nun habe ich ein prinzipielles Problem beim gegenseitigen Setzen. Es soll möglich sein, dass der Spieler die gegnerischen Buttons mit Mausklick aus wählt und gleich darauf soll der Computer reagieren.
Ich habe meine Matrizen (Spieler und Computer) über JButtons zusammen gebastelt und diese in meine Main-Methode reingepackt. (Ich weiß, dass es nicht die eleganteste Art ist aber naja...)

Nun war mein theoretischer Ansatz so, dass wenn der Spieler gesetzt hat und dann der Computer, dann soll der Spieler noch einen Knopf "Gefecht" drücken und die Sache geht los mit einer Schleife von gegenseitigen setzen.

Naja, denkste. Schleifen gehen nicht, da es dann nicht möglich ist mitten in der Schleife einen Button zudrücken.

Ich habe gegooglte und bin auf folgendes gestoßen:
Multithreading mit Wait() und Notify().
Jetzt wäre mein erster Gedanke gewesen so einen Thread über meine Buttons zutun und jedesmal wenn dann ein Button auf dem gegnerischen Feld gesetzt wird, soll dann der Computergegner dran sein.

Naja, das Konzept ist zugegeben nicht ausgereift.

Wollte daher euch fragen, wie man solche Probleme löst?

Wiedermal ein herzliches DANKESCHÖN an alle die mir helfen.

Euer
Adriano-Celentano
 

sMau90

Aktives Mitglied
Vielleicht wäre es hilfreich, wenn du mal ein paar Auszüge postest die bei deinem Problem eine Rolle spielen.
Wenn ich es richtig verstanden habe, und ich bin mir da nicht ganz sicher, dann hast du eine Schleife die das abwechselnde Ziehen von Spieler und Computer regelen soll. Allerdings blockiert diese das Handling der Buttons. Ich hoffe mal das war richtig so. Ein paar Dinge die dir vielleicht weiter helfen könnten (für konkretere Vorschläge müsste ich denke ich den Code sehen):

Schau mal nach was der "Event Dispatch Thread" ist und mach dir klar, dass Swing in einem Single Threaded Model entworfen wurde. Außerdem nützlich in diesem Zusammenhang ist
Java:
SwingUtilities.invokeLater(Runnable r)
.

Hier noch zwei andere gute Links zum Theme Swing und Threads.
Java ist auch eine Insel – 15.33 AWT, Swing und die Threads
Galileo Computing :: Java ist auch eine Insel – 19.26 AWT, Swing und die Threads

Auch wenn ich denke, dass das in deinem Fall nich der richtige Ansatz ist hier noch der Code wie du etwas in einem neuen Thread ausführst (also ohne etwas anderes zu blockieren)

Java:
new Thread() {
		@Override
		public void run() {
				
			doSomething();
		}
}.start();

Ich hoffe da ist jetzt was nützliches für dich dabei.

Grüße,
sMau
 

Michael...

Top Contributor
Nun war mein theoretischer Ansatz so, dass wenn der Spieler gesetzt hat und dann der Computer, dann soll der Spieler noch einen Knopf "Gefecht" drücken und die Sache geht los mit einer Schleife von gegenseitigen setzen.
Eine Schleife ist hier falsch (außer es soll Computer gegen Computer spielen), da hier ja auf eine Aktion des menschlichen Spielers reagiert werden soll. Auf die Aktion des Spielers folgt dann einfach die Reaktion des Computer Spielers und die Prüfung auf Gewonnen/Spielende. Und danach ... warten auf die Aktion des menschlichen Spielers.
 
Hallo sMau90 & Michael...,
danke für eure Vorschläge.

hier ist meine Main Methode. Da sie sehr lange ist zeige ich euch nur Teilabschnitte.
Anmerkung: das Programm ist noch nicht fertig, daher gibt es an alle Ecken noch zu schrauben....

Java:
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					CreatingField2 frame = new CreatingField2();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

Von hier aus rufe ich meine JFrame auf und füge meine JButtons ein. Das sieht wie gefolgt aus..

Java:
	for (int x = 0; x <= 99; x++) {
			final JButton btnNewButton_x = new JButton("");
			final int buttonNo = x;

			panel.add(btnNewButton_x);
			btnNewButton_x.addActionListener(new ActionListener() {
				// setzten der Arrays
				private int counter_schiff1 = 1;
				private int counter_schiff2 = 1;
				private int counter_schiff3 = 1;
				private int counter_schiff4 = 1;
				// Counter setzen mit private - anders hats nicht funktioniert??
				// für schiff1 und schiff2
				private int setSchiffOnField = 1;

				// interner Zähler für setSchiffOnField

				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					int y = buttonNo / 10;
					int x = buttonNo - (y * 10);
					try {
						if (field.getHorizontal().equals("horizontal")) {
							if (schiff_1.getName() == "SCHIFF_1"
									&& schiff_1.getSetSchiff1OnField() < 1) {
								// Schifftyp setzen
								// Prüfen wie oft schon ein Schiff gesetzt wurde
.
.
.
.
// und hier geht es noch viel weiter
Hier laufen die ganzen Logiken für das Setzen auf dem Spielerfeld ab. Im Hintergrund schreibe ich noch die Arrays mit.

Sobald der Spieler gesetzt hat, möchte ich das Gefecht starten. Das passiert über einen extra Button...
So habe ich mir das halt vorgestellt.

Anbei der Code des Gefecht Buttons

Java:
	// ================= Button für Spiel-Start =================

		btnStart.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				btnStart.setEnabled(false);
				
				field_gegner.zufallsZahlen();

				JOptionPane.showMessageDialog(null,
						"Der Computer hat seine Schiffe gesetzt");

			}
		});

Hier startet der Spieler das eigentliche Spiel...
Es muss dann abwechselend gesetzt werden.

Aber wie schaffe ich es, dass wenn der Spieler drückt, dann der Computer-gegner setzt, bis dann einer gewonnen.

Bezüglich deinen Hinweisen. Danke. Bin auf diese auch gestossen, nur leider scheitert es bei mir daran, dass ich nicht weiss wie ich es korrekt implementieren soll!

Nochmals vielen Dank.

LG
Adriano-Celentano
 

Michael...

Top Contributor
Aber wie schaffe ich es, dass wenn der Spieler drückt, dann der Computer-gegner setzt, bis dann einer gewonnen.
Wie bereits oben beschrieben löst die Aktion des Spieler den Zug des Computers und die Spielendeprüfung aus.
Spieler wählt Zielfeld z.B. Buttonklickk
--> ActionListener wird aufgerufen
in der actionPerformed wird:
1. der Zug des Spielers ausgeführt
2. überprüft ob ein Spieler gewonnen hat
3. wenn nein Zug des Computers berechnet und ausgeführt
4. überprüft ob der Computer gewonnen hat

Wenn in Schritt 2 oder 4 festgestellt wird, dass einer der Spieler gewonnen hat wird die "Spielende"-Methode aufgerufen und actionPerformed() verlassen.
 
Hallo Michael...,

danke so funktioniert es. Ich habe einfach zu kompliziert gedacht.

Ich habe es folgendermaßen gelöst:
Java:
for (int y = 0; y <= 99; y++) {
			
			final JButton btnNewButton2_y = new JButton("");
			final int buttonNo2 = y;
			panel_1.add(btnNewButton2_y);
			btnNewButton2_y.addActionListener(new ActionListener() {

				public void actionPerformed(ActionEvent e) {
					int y = buttonNo2 / 10;
					int x = buttonNo2 - (y * 10);
					if (schiff.getAktivierenComputerMatrix() == true) {
						if (field_gegner.getField_frei_gegner(x, y) == true) {
							btnNewButton2_y.setBackground(Color.red);
							field_gegner
									.setTrefferSchiffeComputer(trefferComputer);

						} else {
							btnNewButton2_y.setBackground(Color.cyan);
							field_gegner
									.setWasserSchiffComputerk(wasserComputer);
						}
						x=0;
						y=0;
						
						int buttonNo1= field_gegner.KIComputer();
						// Computer setzt seine Felder
						
						y = buttonNo1 / 10;
						x = buttonNo1 - (y * 10);
						
						if (field.getField_frei(x, y)==true)
						{
							System.out.println("treffer");
							try {
								Thread.sleep(0500);
							} catch (InterruptedException e1) {
								// Computer soll eine Sekunde warten
								e1.printStackTrace();
							}
						}
						else
						{
							System.out.println("kein Treffer");
						}
						
					}
					else
					{
						JOptionPane.showMessageDialog(null, "Das Spiel wurde noch nicht gestartet.");
					}
				}
			});
Ich rufe einfach jedesmal den Computergegner auf, wenn ich den Button drücke.

Es fehlt aber noch eine letzte Sache (das i Punktchen auf dem Projekt) und zwar wie kann ich die Hintergrundfarbe des Button auf dem Spielerfelder anpassen?
Ich erreiche zwar das Objekt der Buttons vom Spielerfeld in dem PerformAction der Gegner Buttons, jedoch kann ich die Hintergrundfarbe nicht anpassen???

Wie schaffe ich das????

Vielen Dank nochmals für deinen Denkanstoss.

LG
Adriano-Celentano
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Multithreading Alphabet Allgemeine Java-Themen 3
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
J Threads Multithreading Allgemeine Java-Themen 15
K Multithreading plattform übergreifend? Allgemeine Java-Themen 3
R Bruteforce hashes mit multithreading. Funktioniert das so? Allgemeine Java-Themen 0
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
C Ressourcensparendes Multithreading Allgemeine Java-Themen 3
S Threads Multithreading- langsamer als Singlethreading-Programm Allgemeine Java-Themen 6
D Threads Multithreading Allgemeine Java-Themen 25
A MultiThreading.. Scheduling-Problem? Allgemeine Java-Themen 10
M Multithreading Problem Allgemeine Java-Themen 3
dayaftereh Multithreading Allgemeine Java-Themen 16
E Multithreading and volatile Allgemeine Java-Themen 10
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
G multithreading, concurrency conveyor belt beispiel Allgemeine Java-Themen 2
A Problem mit Zufallszahlen und Multithreading Allgemeine Java-Themen 14
I Problem mit Multithreading Allgemeine Java-Themen 4
H Singleton und MultiThreading [erledigt] Allgemeine Java-Themen 3
C Collection Multithreading? Allgemeine Java-Themen 33
O Multithreading mit Java 5 u den Concurrency APIs Allgemeine Java-Themen 7
O Multithreading und Multiprozessor Allgemeine Java-Themen 4
K Multithreading bei statischen Methoden Allgemeine Java-Themen 2
T ungewöhnliche Exception (Multithreading und JList) Allgemeine Java-Themen 10
K Frage zu ProgressBars, Algorithmen und Multithreading ->F Allgemeine Java-Themen 2
flashfactor Multithreading-Problem Allgemeine Java-Themen 4
S Integers in jButtons weiterverwenden Allgemeine Java-Themen 8
Lord.Djerun (Taschenrechner) jButtons mit gleicher Funktion zusammenfassen Allgemeine Java-Themen 6
Developer_X JButtons werden nicht angezeigt Allgemeine Java-Themen 26
P JButtons mit JTable verknüpfen Allgemeine Java-Themen 16
H JButtons selbst gestallten Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben