Threads Kartenspiel - auf legen warten

D

Da-JS

Gast
Hallo,

ich bin gerade dabei ein Kartenspiel zu programmieren und bin an dem Punkt angelangt, wo das Programm darauf wartet, dass der Spieler eine Karte legt. Also habe ich mich in Threads eingelesen und auch das Consumer-Producer-Beispiel selbst programmiert. Allerdings habe ich immer noch keine Idee wie ich das jetzt in mein Kartenspiel einbauen kann. Ich habe eine Klasse Game von der ich alles steuere und auch die Klasse Grafik erstelle. Aber ich habe einfach nicht so richtig die Idee wie ich das jetzt mit dem Warten hinbekomme. Kann mir da jemand einen Tipp geben?
 

Kababär

Top Contributor
Ich habe zwar absolut keine Ahnung von all dem, ... aber geht das nicht einfach mit einer if-Abfrage?
Code:
If (cpu == gelegt && cpu2 == gelegt && cpu3 == gelegt )
   "Sie sind dran";

else 
   "warten";

?
 
G

Gelöschtes Mitglied 34244

Gast
Ne, das Problem ist, wenn man das ohne Threads programmiert, dann wird das einfach alles hintereinander abgearbeitet bis zum Schluss, da gibts keine Chance darauf zu warten, dass der User irgendeine Eingabe macht (zumindest wenn man das über eine grafische Oberfläche laufen lässt)
 

Jodo

Aktives Mitglied
Ich gehe mal davon aus, dass du bereits weisst wann der Spieler an der Reihe ist und nur auf seine Eingabe wartest.
Dann kannst du doch einfach was in untenstehender Form machen. Beim Kartenspiel brauchst du ja keine Parallelität, die anderen Spieler müssen ja warten, bis der Spieler der am Zug ist eine Eingabe gemacht hat.

Java:
boolean gelegt = false;
int gelegteKarte = -1;   //Karten wären durch int Konstanten (0-7) festgelegt

public void spielerZug() {
   while (!gelegt) {
       if (gelegteKarte > 0 && gelegteKarte < 8)
           gelegt = !gelegt   //oder ein break;
   }
   //arbeite den Spielerzug ab
}

//getter/setter für die Variablen

[EDIT]Das einzigste was du da jetzt Parallelisieren müsstest, wäre die Spielerzüge und die Programmlogik in einen Thread auslagern falls du mit einer Swing-GUI arbeitest, da sonst der EDT von der while-Schleife blockiert wird und keine anderen GUI Updates durchführen kann, falls vorhanden.(Stichwort: SwingWorker)[/EDIT]
 
Zuletzt bearbeitet:

KingOfExceptions

Bekanntes Mitglied
ich weiß jetzt nicht so genau wie du das mit den threads genau gemacht hast aber mach doch eine boolean variable die auf true gesetzt wird wenn der spieler gelegt hat und ansonsten wenn der spieler dran ist false ist....

so zum beispiel:

Java:
class FuerThread extends Runnable
{
 private void run()
  {
    while(true)
    {
      while(machKI)
      { 
         //COMPUTER IST DRAN
      } 
       else
         System.out.println("WARTE AUF SPIELER...");

    }  //SCHLIESSE WHILE
  } //SCHLIESSE RUN
} //SCHLIESSE CLASS

[WR]PSEUDOCODE[/WR]
so müsste es glaub ich klappen....
 
G

Gelöschtes Mitglied 34244

Gast
Danke für eure Antworten. Es geht mir allerdings nicht darum zu überprüfen, ob ein Spieler eine Karte gelegt hat, sondern darum das Programm anzuhalten und zu warten bis ein Spieler eine Karte gelegt hat. Wie schon gesagt: Der Hauptcode geht ja direkt weiter und wartet nicht darauf, dass der Spieler in der Grafikoberfläche eine Karte angeklickt hat.
 

Jodo

Aktives Mitglied
Es geht mir allerdings nicht darum zu überprüfen, ob ein Spieler eine Karte gelegt hat, sondern darum das Programm anzuhalten und zu warten bis ein Spieler eine Karte gelegt hat. Wie schon gesagt: Der Hauptcode geht ja direkt weiter und wartet nicht darauf, dass der Spieler in der Grafikoberfläche eine Karte angeklickt hat.

Was meinst du damit, "...das Programm anzuhalten...". Willst du es nun anhalten und warten bis der Spieler eine Karte legt oder soll das Kartenspiel weiterlaufen, ohne dass der Spieler eine Karte legt (was deine Aussage "Der Hauptcode geht ja direkt weiter..." nahelegt)???:L

Wenn du uns noch etwas mehr Information zu deiner Implementierung geben kannst/willst und auch um welches Kartenspiel es sich handelt, können wir dir eventuell besser weiter helfen. Aber für mich ist ein Kartenspiel nun mal "seriell" (die mir Bekannten jedenfalls) und daher brauch die Spiellogik auch keine Thread's die Parallelität ermöglichen.
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 34244

Gast
Okay, das war etwas unglücklich formuliert ich meinte eigentlich der Hauptcode würde direkt weitergehen und somit nicht auf die Eingabe des Spielers warten und Fehlermeldungen produzieren, da ja keine Karte gelegt wurde. Daher dachte ich, dass man das nur mit Threads und wait()/notify() lösen kann.
Es handelt sich bei dem Kartenspiel um Arschloch und es ist wirklich "seriell" wie du geschrieben hast.
Zur Implementierung: Ich habe ein Klasse Game, die eigentlich alles steuert. Hier werden die Spieler und Karten erstellt und auch das Objekt für die Grafik.
 

Jodo

Aktives Mitglied
Dann sollte der Peudocode den ich vorhin gepostet habe, dir bei deiner Aufgabe ja helfen.
Du musst eventuell auch darauf achten, dass die Spiellogik und die GUI nicht voneinander abhängen sollen. Natürlich musst du über die GUI deine Eingaben machen, aber dein Spiel sollte genauso gut über die Konsole spielbar sein.

Nochmals als Beispiel zu meinem Code, wie der Programmablauf aussehen kann:
Der Spieler (Du) bist an der Reihe und das Programm wartet. Und wartet, und wartet, ..., bis du eine Karte angeklickt hast. Die GUI schickt dann ein Event los ("Oh da wurde eine Karte gewählt, änder mal jemand den Zustand von 'nicht gelegt' auf 'gelegt'.") und in deiner Spiellogik wird der entsprechende Zustand geändert und das Programm läuft weiter und der nächste Spieler (oder NPC Gegner) ist am Zug.
 

Marco13

Top Contributor
:autsch: ahrg... So ein [c]while (irgendwas) /* do nothing*/;[/c] nennt sich "busy waiting", das macht man nur wenn's kalt ist, und man versucht durch eine sinnlos vor sich hin arbeitende CPU die Zimmertemperatur zu erhöhen.
Es wäre gut, wenn du von deiner Game-Klasse mal ein bißchen was posten würdest. Eigentlich kann man das mit wait/notify machen, aber vielleicht kann man auch eine der High-Level-Klassen aus java.util.concurrent nehmen, ein CountDownLatch bzw. eine CyclicBarrier vielleicht.
 
G

Gelöschtes Mitglied 34244

Gast
Also, ich poste jetzt einfach mal beide Klassen, da ich nicht wirklich weiß welchen Teil du da haben willst. Ich hab die betreffende Stelle mal markiert.
Ich hatte zunächst eine rein Commandozeilenbasierte Version geschrieben, daher kann es sein, dass an der ein oder anderen Stelle noch Ausgaben sind.

Game.java:
Java:
package arschloch;
import java.util.ArrayList;
import java.util.Collections;


public class Game{

	ArrayList<Spieler> alleSpieler;
	ArrayList<Karten> alleKarten;
	private ArrayList<Integer> selectedCards;
	private int numPlayers;
	private int aktPlayer;
	private int runden;
	private Stock stock;
	public static boolean dropOutRound;
	private int dropOutPlayer;
	private Grafik gui;
	public static Wait wait;
	
	Game(int numPlayers){
		dropOutRound = false;
		alleSpieler = new ArrayList<Spieler>();
		stock = new Stock();
		this.numPlayers = numPlayers;
		for(int i = 0; i<numPlayers;i++){
			alleSpieler.add(new Spieler());
		}
		alleSpieler.get(0).setName("Jonas");
		alleSpieler.get(1).setName("CPU1");
		alleSpieler.get(2).setName("CPU2");
		alleSpieler.get(3).setName("CPU3");
		
		this.generiereKarten();
		
		this.verteileKarten();
		//Wichtig: Hier muss als erstes Argument die Spielerkarten übergeben werden
		gui = new Grafik(alleSpieler);
		/*alleSpieler.get(0).addCard(alleKarten.get(0));
		alleSpieler.get(1).addCard(alleKarten.get(10));
		alleSpieler.get(2).addCard(alleKarten.get(14));
		alleSpieler.get(2).addCard(alleKarten.get(16));
		alleSpieler.get(3).addCard(alleKarten.get(20));
		alleSpieler.get(3).addCard(alleKarten.get(28));*/
		//Das Spiel beginnt
		this.start();
		
		
		/*for(int i=0;i<numPlayers;i++){
			System.out.println(alleSpieler.get(i).getName());			
		}*/
		
		
		
	}
	
	private void generiereKarten(){
		String[] kartennamen = {"7","8","9","10", "j", "q", "k", "a"};
		String[] farben = {"diamonds", "hearts", "spades", "clubs"};
		int tatsWert;
		this.alleKarten = new ArrayList<Karten>();
		for(int j=0;j<kartennamen.length;j++){
			for(int i=0;i<farben.length;i++){
				//Wert für späteren Vergleich errechnen
				tatsWert = j*farben.length+(i+1);
				alleKarten.add(new Karten(farben[i],kartennamen[j],tatsWert));
			}
		}

		
	}
	
	private void verteileKarten(){
		//Karten mischen
		Collections.shuffle(this.alleKarten);

		//Karten pro Spieler errechnen
		int kartenProSpieler = alleKarten.size()/this.numPlayers;
		
		//Karten an Spieler verteilen
		int i = 0;
		int spieler = 0;
		
		
		
		while(i<this.numPlayers*kartenProSpieler){
			//Gibt Spieler Karte und löscht diese direkt im Stock
			alleSpieler.get(spieler).addCard(alleKarten.remove(0));	
			
			//Wenn alle Karten an Spieler verteilt, nächsten Spieler auswählen
			if((i+1)%kartenProSpieler == 0){
				alleSpieler.get(spieler).sortCards();
				spieler++;
			}
			i++;
		}
		
		
	}
	
	private void start(){
		//Wer hat die niedrigste Karte
		int startSpieler = 0;
		//Der aktuell kleinste Wert, zunächst auf unendlich gesetzt
		int minWert = 1000;
		for(int i=0;i<alleSpieler.size();i++){
			if(alleSpieler.get(i).getLowCard() < minWert){
				minWert = alleSpieler.get(i).getLowCard();
				startSpieler = i;
			}
		}
		this.aktPlayer = startSpieler;
		runde();
	}
	
	private void runde(){
		this.runden++;
		System.out.println("DropOut: "+Game.dropOutRound);
		while(true){
			System.out.println("Stock:");
			stock.ausgabeStock();
			System.out.println("-------");
			System.out.println("Du bist dran, "+alleSpieler.get(aktPlayer).getName()+", bitte lege eine Karte:");
			alleSpieler.get(aktPlayer).ausgabeKarten();
			System.out.println();
			//Warte auf Eingabe
------------------------------------- HIER MÜSSTE GEWARTET WERDEN
--------------------------------------------------------------------
--------------------------------------------------------------------
---------------------------------------------------------------------
-----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
--------------------------------------------------------------------
--------------------------------------------------------------------
---------------------------------------------------------------------
-----------------------------------------------------------------------
----------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------
---------------------------------------------------------------------
-----------------------------------------------------------------------
----------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------
---------------------------------------------------------------------
-----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
			System.out.println("Weiter gehts");
			ArrayList<Integer> selectedCards = gui.getSelectedCards();
			System.out.println("Spiel geht weiter");
			if(selectedCards.size() == 0){
				System.out.println(alleSpieler.get(aktPlayer).getName()+" verlässt die Runde");
				if(alleSpieler.get(aktPlayer).quitRound()){//Wenn nur noch ein Spieler im Spiel
					Spieler.leftPlayersRound--; // Somit wird leftPlayersRound = 0, wichtig wenn hinterher roundOut zurückgesetzt wird
					nextRound(); // Gewinner der Runde ausfindig machen
					return; //Funktion abbrechen
				}
				break;
			} else{
				if(checkEingabe(selectedCards)){ // Wenn alles richtig ist, Karte legen
					Game.dropOutRound = false;
					ArrayList<Karten> gelegteKarten = new ArrayList<Karten>();
					for(int i=0;i<selectedCards.size();i++){
						gelegteKarten.add(alleSpieler.get(aktPlayer).returnCards().get(selectedCards.get(i)));
					}
					for(int i=0;i<gelegteKarten.size();i++){
						alleSpieler.get(aktPlayer).returnCards().remove(gelegteKarten.get(i));
					}
					stock.setStock(gelegteKarten);
					//stock.ausgabeStock();
					//alleSpieler.get(aktPlayer).ausgabeKarten();
					
					//Wenn Spieler keine Karten mehr hat, gewinnt er
					if(alleSpieler.get(aktPlayer).returnCards().size() == 0){
						alleSpieler.get(aktPlayer).quitRound();
						if(alleSpieler.get(aktPlayer).finished()){//Wenn nur noch ein Spieler im Spiel
							System.out.println("Das Spiel ist vorbei!");
							System.exit(0);
						}
						this.dropOutPlayer = aktPlayer;
						
					}
					break;
				} 
				System.out.println("_______________________________________________________________________");
			}
		}
		setNextPlayer();
		runde();
	}
	
	private boolean checkEingabe(ArrayList<Integer> inputKarten){
		
		//Überprüfen, ob alle drei Karten die gleichen sind (z.B. 3 sieben)
		String wert = alleSpieler.get(aktPlayer).returnCards().get(inputKarten.get(0)).getWert();
		for(int i=1; i<inputKarten.size();i++){
			if(alleSpieler.get(aktPlayer).returnCards().get(inputKarten.get(i)).getWert() != wert){
				System.out.println("Du hast zwei Karten ausgewählt, die nicht den gleichen Wert haben");
				return false;
			}
		}
		if(this.stock.getStock().size() != 0){
			//Überprüfen ob Anzahl der Karten gleich groß sind wie die liegenden
			if(this.stock.getStock().size() != inputKarten.size()){
				System.out.println("Du hast nicht die gleiche Anzahl gelegt, die im Stock liegen");
				return false;
			}
			//Überprüfen, ob gelegte Karte höher ist als momentan vorhandene
			//Letzte Karte im Stock hat den höchsten Wert, da Spielerhand sortiert wurde
			//Erste Karte auf der Hand hat niedrigsten Wert
			//   /\/\/\ Nur gültig wenn Spieler Sortierte Reihenfolge eingibt, zu lösen mit sort bei eingabe
			if(stock.getStock().get(stock.getStock().size()-1).getTatsWert() > alleSpieler.get(aktPlayer).returnCards().get(inputKarten.get(0)).getTatsWert()){
				System.out.println("Gelegte Karte niedriger als liegende Karte");
				return false;
			}
			
			//Überprüfen ob gelegte Karte gleichen Wert hat wie liegende Karte
			// (Ohne wäre es möglich eine Karo sieben mit einer Pik sieben zu überbieten
			if(stock.getStock().get(stock.getStock().size()-1).getWert() == alleSpieler.get(aktPlayer).returnCards().get(inputKarten.get(0)).getWert()){
				System.out.println("Du hast den gleichen Wert der liegt nochmal gelegt");
				return false;
			}
			
		}
		
		return true;
	}
	
	private void nextRound(){
		System.out.println("Suche Gewinner der Runde...");
		if(dropOutRound == false){
			for(int i=0; i<numPlayers;i++){
				if(!alleSpieler.get(i).hasQuitRound()){
					aktPlayer = i;
				}
				//Werte für nächste Runde zurücksetzen
				if(!alleSpieler.get(i).hasFinished()){
					alleSpieler.get(i).setNewRound();
				}
			}
		} else {
			aktPlayer = this.dropOutPlayer;
			//Der Spieler nach dem, der gewonnen hat
			while(true){
				aktPlayer++;
				if(aktPlayer>(numPlayers-1)){
					aktPlayer = 0;
				}
				//Überprüfen, ob der aktuelle Spieler noch in der Runde bzw. im Spiel ist
				if(!alleSpieler.get(aktPlayer).hasFinished()){
					break; // Spieler gefunden
				}
			}

			for(int i=0; i<numPlayers;i++){
				//Werte für nächste Runde zurücksetzen
				if(!alleSpieler.get(i).hasFinished()){
					alleSpieler.get(i).setNewRound();
				}
			}
			dropOutRound = false;
		}
		System.out.println(alleSpieler.get(aktPlayer).getName()+" gewinnt die Runde");
		//Stock zurücksetzen
		stock.getStock().clear();
		runde();
	}

	
	private void setNextPlayer(){
		System.out.println("Nächsten Spieler wählen");
		while(true){
			aktPlayer++;
			if(aktPlayer>(numPlayers-1)){
				aktPlayer = 0;
			}
			//Überprüfen, ob der aktuelle Spieler noch in der Runde bzw. im Spiel ist
			if(!alleSpieler.get(aktPlayer).hasQuitRound() || !alleSpieler.get(aktPlayer).hasFinished()){
				break; // Spieler gefunden
			}
		}
	}
	
	public void setSelectedCards(ArrayList<Integer> selectedCards){
		this.selectedCards = selectedCards;
	}
	
	public void listeAusgeben(){
		for(int i=0;i<alleKarten.size();i++){
			System.out.println(alleKarten.get(i).ausgabe());
		}
	}
	
}


Grafik.java:
Java:
package arschloch;

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

public class Grafik /*extends JPanel*/ implements ActionListener, WindowFocusListener {
	/**
	 * 
	 */
	private ArrayList<Integer> selectedCards;
	private JButton submit;
	private JButton quit;
	private JFrame frame;
	private BufferedImage bild;
	private JLabel label;
	private ArrayList<LabelKarte> labelKarte;
	private Wait wait;
	
	

	
	public Grafik(ArrayList<Spieler> alleSpieler){
		labelKarte = new ArrayList<LabelKarte>();
		frame = new JFrame("Arschloch");
		frame.setLayout(null);

		frame.setExtendedState(Frame.MAXIMIZED_BOTH);
		frame.setVisible(true);
		System.out.println("..."+frame.getHeight());
		for(int i=0;i<alleSpieler.get(0).returnCards().size();i++){
			labelKarte.add(alleSpieler.get(0).returnCards().get(i).getLabel());
			labelKarte.get(i).addMouseListener(new KartenListener());
			frame.add(labelKarte.get(i),i);
		}
		

		setupButtons();
		repaintCards();
	/*	Point neu = new Point(labelKarte.get(0).getLocation());
		neu.translate(10, 0);
		labelKarte.get(0).setLocation(neu);*/
		//frame.add(button);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.addWindowFocusListener(this);
		
	/*	Dimension groesse = frame.getSize();
		System.out.println(groesse.height);*/

		//frame.setSize(500, 500);
		//frame.setResizable(false);
		//label.addMouseListener(this);
		//labelKarte.get(0).setLocation(50, 75);
		//frame.repaint();
		//frame.pack();
	}

	public void setupButtons(){
		submit = new JButton("Karten legen");
		quit = new JButton("Aussteigen");
		
		//Berechne die Mitte des frames
		int center = frame.getWidth()/2;
		submit.setBounds(center-100, 630, 120, 50);
		submit.addActionListener(new ButtonSubmitListener());
		quit.setBounds(center+100, 630, 120, 50);
		frame.add(submit);
		frame.add(quit);
	}
	
	public void repaintCards(){
		for(int i=0;i<labelKarte.size();i++){
			labelKarte.get(i).setBounds((int) (frame.getWidth()*0.35+50*i), (int) (frame.getHeight()*0.73), labelKarte.get(i).getIcon().getIconWidth(), labelKarte.get(i).getIcon().getIconHeight());
		}
		frame.repaint();
	}
	
	public void deleteCards(){
		
		/*	frame.remove((LabelKarte)e.getSource());
			labelKarte.remove((LabelKarte)e.getSource());
			repaintCards();*/
	}
	
	public void setWait(Wait wait){
		this.wait = wait;
		//wait.waitStart();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		//frame.setLocation((int)frame.getLocation().x+50, (int)frame.getLocation().y+50);
		frame.remove((LabelKarte)e.getSource());
		System.out.println("HIER!");
	}

	@Override
	public void windowGainedFocus(WindowEvent e) {
		
	}

	@Override
	public void windowLostFocus(WindowEvent e) {
		// TODO Auto-generated method stub
		//System.exit(0);
	}

	/*--------------------------------------------------*/
	/* innere Klasse */
	public class KartenListener implements MouseListener{

		@Override
		public void mouseClicked(MouseEvent e) {
			
			Point neu = new Point(((LabelKarte)e.getSource()).getLocation());
			int vorzeichen = -1;
			if(((LabelKarte)e.getSource()).isSelected()){
				vorzeichen = 1;
			}
			((LabelKarte)e.getSource()).changeStatus();
			neu.translate(0, vorzeichen*50);
			((LabelKarte)e.getSource()).setLocation(neu);


		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
	}

	
	public class ButtonSubmitListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			System.out.println("ActionPerformed");
			Game.wait.starte();
			transferCards();
		}

		
	}

	private void transferCards(){
		selectedCards = new ArrayList<Integer>();
		for(int i=0; i<labelKarte.size();i++){
			if(labelKarte.get(i).isSelected()){
				selectedCards.add(i);
			}
		}
	}
	
	public ArrayList<Integer> getSelectedCards(){
		ArrayList<Integer> output = selectedCards;
		selectedCards = null;
		return output;
	}
	
}
 

Marco13

Top Contributor
OK... ziemlich konfus und so, aber... mal versuchen: Was genau "Wait" ist, hat sich mir nicht ganz erschlossen. Wenn ich das richtig verstanden habe, soll an der markierten Stelle gewartet werden, bis der "Submit"-Button gedrückt wurde, dh. genaugenommen bis im GUI "transferCards" ausgeführt wurde?

Falls dem so ist: Der pragmatischste Ansatz wäre da wait/notifyAll.
Java:
            //Warte auf Eingabe
            ArrayList<Integer> selectedCards = null;
            while (selectedCards == null)
            {
                synchronized(gui) 
                {
                    try
                    {
                        System.out.println("Waiting for GUI...");
                        gui.wait();
                        System.out.println("Waiting for GUI DONE");
                    }
                    catch (InterruptedException e)
                    {
                         Thread.currentThread().interrupt(); 
                         return;
                    }
                }
                selectedCards = gui.getSelectedCards();  
                System.out.println("Got "+selectedCards);
            }
und im GUI
Java:
private void transferCards()
{
    ... // Wie vorher, und am Ende dann:
    synchronized (this)
    {
        System.out.println("GUI is Notifying all");
        notifyAll();
    }
}

Das ist schon ziemlich "reingedengelt", aber ... das fällt ja kaum auf :bae: ;)
 

GUI-Programmer

Top Contributor
Achtung: Nur eine Vermutung!!!

Vielleicht reicht es ja auch aus, jegliche andere EventListener (falls deine GUI so aufgebaut ist) zu deaktivieren, also entweder removeActionListener(...), removeMouseListener(...), etc. oder mit boolean Variablen in den einzelnen Listener Methoden zu arbeiten. Nur den/die Listener noch aktiv zu lassen, sodass der Benutzer noch eine Karte legen kann. Danach wieder alle anderen aktivieren.
 
G

Gelöschtes Mitglied 34244

Gast
Vielen Dank für eure Hilfe. Ich habe jetzt mal den Code von dir, Marco13, ausprobiert. Aber es ist das gleiche Spiel wie vorher:
Der Code "hält" zwar an, und auch die Buttoneingabe wird registriert, aber es geht im Game.java-Code nicht mehr weiter.
 

JavaProfi

Aktives Mitglied
Vielen Dank für eure Hilfe. Ich habe jetzt mal den Code von dir, Marco13, ausprobiert. Aber es ist das gleiche Spiel wie vorher:
Der Code "hält" zwar an, und auch die Buttoneingabe wird registriert, aber es geht im Game.java-Code nicht mehr weiter.

Dein Problem liegt IMO nicht im Programmcode, sondern vielmehr in deiner "Denkensweise" über den Programmablauf. Ich vermute, du meinst, dass dein Spielcode innerhalb des main-Thread in einer ständigen Schleife laufen muss, und du ab und an in der Schleife warten musst, um Benutzereingaben zuzulassen. Oder irre ich da? [Siehe Methode runde() !! ]

So funktioniert aber JAVA nicht. JAVA ist ereignisgesteuert und objektorientiert.
Das heißt, dass deine Methode enden MUSS, wenn ein wohldefinierter Status erreicht worden ist.

Du musst deine Methode so schreiben, dass sie etwas tut, wenn der UserEvent ausgelöst worden ist und dann in einen neuen Status wechselt und wieder endet.

Methoden führen von einem Status in einen Nächsten usw.

Ist nur eine Vermutung, ich kann mich auch irren.

Gruß
JP
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 34244

Gast
Natürlich!!! Du hast vollkommen recht! So wird das Ganze auch viel einfacher. Vielen Dank! :toll: :applaus:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Kartenspiel Java Basics - Anfänger-Themen 8
M Kartenspiel Java Basics - Anfänger-Themen 13
P Simples Kartenspiel Java Basics - Anfänger-Themen 1
L Einfaches Kartenspiel (Spieler Klasse) Java Basics - Anfänger-Themen 14
C Frage zum Kartenspiel implementieren Java Basics - Anfänger-Themen 9
D Klassen Aufbau Kartenspiel Java Basics - Anfänger-Themen 20
R Kartenspiel Java Basics - Anfänger-Themen 8
S Kleines Kartenspiel mit Java Java Basics - Anfänger-Themen 2
Joy Kartenspiel programmieren Java Basics - Anfänger-Themen 4
V Kartenspiel Java Basics - Anfänger-Themen 12
G eine straße im kartenspiel erkennen (algorithmus) Java Basics - Anfänger-Themen 4
richis-fragen GlassPane über JScrollPane legen Java Basics - Anfänger-Themen 6
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
B großzügiges Pixelraster über Bildschirm legen Java Basics - Anfänger-Themen 7
J Methoden Mehrdimensionale Arrays übereinander legen Java Basics - Anfänger-Themen 5
S Bild über JButton legen Java Basics - Anfänger-Themen 3
M Action Event auf Textfield legen Java Basics - Anfänger-Themen 18
F Array abarbeiten und bei Fehler zurück ins Array legen Java Basics - Anfänger-Themen 1
N Mehrere berechnungen auf einem Button legen? Java Basics - Anfänger-Themen 19
C Bild ins Frame laden und Objekte drüber legen Java Basics - Anfänger-Themen 1
K Inhalt in den Zwischenspeicher legen Java Basics - Anfänger-Themen 2
L "Graphik" JPanels übereinander legen Java Basics - Anfänger-Themen 5
S Unbeschaeftigten Thread in einer Schleife schlafen legen? Schlechter Stil? Java Basics - Anfänger-Themen 7
S Buttons übereinander legen - Reihenfolge Java Basics - Anfänger-Themen 2
R JButtons in eine Array legen GUI Java Basics - Anfänger-Themen 5
M slide effekt über page legen per klick(href) Java Basics - Anfänger-Themen 5
S process - getInputStream und getErrorStream zusammen legen Java Basics - Anfänger-Themen 10
J Probleme mit Visual Editor Komponenten auf Panel legen Java Basics - Anfänger-Themen 4
G Bild auf Button legen(bzw Icon) und Bild auf JFrame legen? Java Basics - Anfänger-Themen 7
G Programm in den System-Tray legen Java Basics - Anfänger-Themen 9
G Java Threads abwechselnd schlafen legen Java Basics - Anfänger-Themen 3
E Focus auf JTextField legen Java Basics - Anfänger-Themen 11
L Ein Bild auf ein JFrame legen. nicht so einfach? =( Java Basics - Anfänger-Themen 11
M while schleife schlafen legen aber im applet weiter arbeite Java Basics - Anfänger-Themen 3
T 2 bilder übereinader legen Java Basics - Anfänger-Themen 12
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
E Richtiges Warten Java Basics - Anfänger-Themen 8
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
G Wie kann ich 1s lang warten? Java Basics - Anfänger-Themen 1
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
A Thread auf anderen warten Java Basics - Anfänger-Themen 2
C Warten auf Antwort Java Basics - Anfänger-Themen 22
S Threads Programm terminiert statt zu warten Java Basics - Anfänger-Themen 20
E ExecutorService warten bis alles fertig? Java Basics - Anfänger-Themen 5
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
D Input/Output Auf Tasteneingabe warten Java Basics - Anfänger-Themen 4
A Activity1 soll auf Activity2 warten (Camera-Intent) Java Basics - Anfänger-Themen 5
B Methode warten lassen bis Button gedrückt wird Java Basics - Anfänger-Themen 16
JAVAnnik auf Threadende warten Java Basics - Anfänger-Themen 6
H Auf Threads warten Java Basics - Anfänger-Themen 3
S Warten bis alle Threads fertig sind Java Basics - Anfänger-Themen 12
I Auf DB-Operation warten Java Basics - Anfänger-Themen 2
R Thread soll auf andere Threads warten Java Basics - Anfänger-Themen 3
T Warteschlange warten lassen bis Ereignis Java Basics - Anfänger-Themen 27
A Main warten lassen bis Variable durch Button übergeben wird Java Basics - Anfänger-Themen 2
V Warten bis die Länge eines Strings nicht mehr 0 ist Java Basics - Anfänger-Themen 13
M prozess starten und warten bis dieser sich beendet Java Basics - Anfänger-Themen 3
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
D Auf Event warten Java Basics - Anfänger-Themen 4
F Logikproblem: Auf Mouselistener warten Java Basics - Anfänger-Themen 6
E Auf Mouselistener warten?! Java Basics - Anfänger-Themen 20
M Warten bis Thread an einem Semaphore angekommen ist Java Basics - Anfänger-Themen 4
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
S Auf andere Methode warten Java Basics - Anfänger-Themen 7
B Während Schleife nicht auf Eingabe warten Java Basics - Anfänger-Themen 2
T auf vbscript warten Java Basics - Anfänger-Themen 3
S Thread warten abbrechen? Java Basics - Anfänger-Themen 5
C auf beendigung eines threads warten Java Basics - Anfänger-Themen 6
P Warten auf KeyTyped Java Basics - Anfänger-Themen 7
M warten in einer while-schleife Java Basics - Anfänger-Themen 12
L programm zum warten zwingen Java Basics - Anfänger-Themen 4
B Auf Programm warten Java Basics - Anfänger-Themen 2
S Auf Object warten Java Basics - Anfänger-Themen 2
K Auf File- Befehl warten. Java Basics - Anfänger-Themen 10
T eine Sekunde warten Java Basics - Anfänger-Themen 11
C Konsolenanwendung auf belibige Taste warten Java Basics - Anfänger-Themen 2
D Auf anderes Fenster Warten Java Basics - Anfänger-Themen 6
A Warten auf Userinput Java Basics - Anfänger-Themen 2
G Bei JDialog warten Java Basics - Anfänger-Themen 5
T Auf Selection warten Java Basics - Anfänger-Themen 7
N Java Insel 6 lesen oder auf 7 warten ? Java Basics - Anfänger-Themen 11
S Programmablauf pausieren, bzw. auf Eingabe warten Java Basics - Anfänger-Themen 4
G Warten auf Eingabe Java Basics - Anfänger-Themen 12
G Thread soll warten Java Basics - Anfänger-Themen 5
F 1 Minute warten Java Basics - Anfänger-Themen 18
S Thread auf Thread warten lassen. Java Basics - Anfänger-Themen 2
G auf ende mehrerer threads warten Java Basics - Anfänger-Themen 2
B Timer / Thread warten Java Basics - Anfänger-Themen 3
G warten Java Basics - Anfänger-Themen 10
P Warten-Fenster Java Basics - Anfänger-Themen 8
vogella *Gelöst *Im Programm warten (wait()) Java Basics - Anfänger-Themen 2
A Bitte Warten Java Basics - Anfänger-Themen 2
P Externen Proceß starten und warten bis beendet? Java Basics - Anfänger-Themen 2
J Threads: warten bis erste aktion ausgeführt wurde Java Basics - Anfänger-Themen 6
G Eine Methode zum Warten? Java Basics - Anfänger-Themen 7
G Frage zum Warten auf und Aufwecken von Threads Java Basics - Anfänger-Themen 2
L Einfaches Warten in eine Schleife Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben