KI für Skatspiel - Wie können die Computerspieler eigenständig handeln?

CreaaZ

Mitglied
Hallo,

wie sich anhand meiner Überschrift schon erkennen lässt, programmiere ich derzeit ein Skatspiel inklusive KI.. Lediglich stehe ich vor einem für mich relativ großem Problem.

Wie kann ich es erreichen, dass Computer1 und Computer2 eigenständig einen neuen Zug beginnen, wenn sie an der Reihe sind, bzw. das Spiel beginnen...

Vom Prinzip möchte ich keinen Button mit ActionListener der nach jedem Spielzug vom Benutzer gedrückt werden muss, sondern es so nutzerfreundlich gestalten, dass der menschliche Spieler nur dann aktiv werden muss wenn er reizt, drückt oder seine Karte spielt..

Ich bitte sehr um Hilfe und Möglichkeiten dies zu bewerkstelligen...

Mit freundlichen Grüßen,

CreaaZ
 
Zuletzt bearbeitet:

c_sidi90

Top Contributor
booleans initialisieren, wer an der Reihe ist und Threads für jeden Spieler, die darauf warten, das ihr flag gesetzt ist und ihnen sagt, dass sie an der Reihe sind.

Hab mich bisschen kompliziert ausgedrückt :p

Du hast 3 spieler, diese kannst du in einem Array festhalten, nach jedem Spielzug wird ein anderes Objekt aus diesem Array auf boolean istAnDerReihe = true gesetzt. Der Thread der die Reihenfolge prüft, handelt dementsprechend.
 

Fu3L

Top Contributor
Oder noch einfacher: Menschliche und KI Spieler in eine Liste schreiben und in jedem Durchlauf des GameLoops einmal durch die Liste iterieren und je nach dem, ob KI selbst eine Aktion durchführen lassen oder eben bei Menschen auf eine Eingabe warten.
 

CreaaZ

Mitglied
Danke für eure schnellen antworten. Vom Prinzip her habt ihr mir schon sehr geholfen.
Da sich die Lösung von Fu3L leichter anhört denke ich, arbeite ich nach diesem Prinzip.


@Fu3L
Könntest du mir deinen Lösungsansatz eventuell etwas ausführen, ich habe den Sinn verstanden, leider noch nicht so ganz wie ich das umsetzen soll. Ich bin noch in anfänglichen Versuchen meine Java Kenntnisse auszubauen, daher mangelt es mir noch ein wenig an "Grundwissen", wie jetzt z.B. bei deinem Ansatz.

Oder hättest du eventuell für deinen Ansatz Links zu Materialien die mich beim einarbeiten unterstützen, ich muss/möchte es nicht nur programmieren sondern auch eine Dokumentation dazu schreiben.

Ich bedanke mich schon im Vorraus,

Gruß,
CreaaZ
 

Fu3L

Top Contributor
Mhh.. ich hab jetzt noch etws drüber nachgedacht und finde, dass weder mein Vorschlag, noch c_sidi's der Sache gerecht werden, insbesondere, wenn zwischen den Zügen noch kurz gewartet werden soll.

Also du solltest einen GameLoop haben:

Java:
while(running) {
	
	//noch zu füllen

	try {
		Thread.sleep(50);
	} catch(InterruptedException ex) {
		ex.printStackTrace(); //Sollte nicht passieren
	}
}

Solltest du nicht wissen, wie man den kreiert, lege ich dir Quaxlies Tutorial ans Herz.

Hier muss repaint() aufgerufen werden, sodass die von dir überschriebene paintComponent() Methode genutzt wird, um den Spielzustand auszugeben. Solltest du nicht selber zeichnen, sondern das ganze per Swing-Komponenten realisieren, müsstest du diese natürlich zum Neuzeichnen anregen (was durchaus mit repaint() klappen kann^^).

Davor musst du aber ermitteln welcher Spieler am Zug ist. Das könnte durch eine Liste realisiert sein und du merkst dir in einer extra Variablen,welcher Spieler gerade dran ist.
Je nach dem wer dran ist, zwei Fälle unterscheiden:
1)KI Spieler ist am Zug: Berechne nächsten Zug. Setze den nächsten Spieler auf den nächsten in der Liste (eine zyklische Liste wäre hier cool, aber am Ende selbst wieder auf den Anfang zu setzen dürfte auch gehen)
2)Mensch ist am Zug: Zeige an, dass der Spieler am Zug ist. Dann erstma einmal schlafen legen und warten. Im nächsten Durchlauf dann prüfen, ob eine Nutzereingabe vorliegt, wenn ja: Zug ausführen und nächsten Spieler an die Reihe bringen, sonst wieder schlafen legen.

Auf die Nutzereingaben lauscht du, indem du Variablen verwendest, die von zB einem ActionListener gesetzt werden, wenn dieser etwas empfängt.
Achte hierbei auf das Schlüsselwort volatile, da dein GameLoop in einem anderen Thread läuft und sonst evtl. die Änderung nicht sieht!

Java:
private volatile boolean stepDone;
 

c_sidi90

Top Contributor
Darum ja auch das Thema Thread in meinem ersten Post, wie du schon an deinem Beispiel gezeigt hast, gibt es die statische Sleep Methode der Threadklasse. Die kannst du auch mit einem Random Integer aufrufen und so die dauer der Spielzüge zufallsgesteuert lösen.
 

CreaaZ

Mitglied
Danke, danke, danke für die zahlreichen Hinweise,
ich habe soeben die relevanten Seiten in Quaxli's Tutorial gelesen und ich muss sagen ich habe den Sinn sehr gut verstanden.
Muss ich nun zwei Threads für die beiden KI's erstellen oder kann ich das in einem laufen lassen...

Theoretisch müsste es doch so gehen oder: ?

Java:
while(running) {
    
    int spieler = checkAnDerReihe(); //Liefert 1 oder 2 für KI1 oder KI2 oder 3 für Person
    if(spieler == 3)
    {
         aktiviereGUIEingabemöglichkeit();
    }
    else
    {
         String position = checkSpielerPosition(spieler); //Liefert Vorder/Mittel/Hinterhand
         Gametype gametype = getGametype(); //Liefert Reizen oder Spielzug (Herz, Kreuz, ...)
         Spielzug spielzug = getBestenSpielzug(position,gametype);  //holt den Besten Spielzug
         macheSpielzug(spielzug); // führt den Spielzug aus
         if(spielzugErledigt)
         {
              bestimmeStichsieger();
         }
         repaint(); // selbsterklärend ;P
         Thread.sleep(500); //damit der Spielzug nicht so Analog vorkommt[/INDENT]
    }
 
    try {
        Thread.sleep(50);
    } catch(InterruptedException ex) {
        ex.printStackTrace(); //Sollte nicht passieren
    }
}


Das ist natürlich nur von Sinn.. Die wirkliche Methode sieht so anders aus und ich befürchte die ist wesentlich größer, stimmt es denn von der Logik? Bevor ich jetzt den ganzen Quelltext implementiere und dann alles von Grund auf falsch ist ;)

Vielen Dank schonmal ;)

Gruß,
CreaaZ
 

CreaaZ

Mitglied
Ich habe gerade angefangen die o.g. Teile zu implementieren und habe testweise erstmal eine System-Ausgabe in die run()-Methode geschrieben, jedoch wird diese zu Beginn nicht ausgeführt. Ich denke es liegt daran, dass ich eine neue Klasse Spiel mit einer bidirektionalen hat/kennt Beziehung zu der Main Klasse erstellt habe und das Runnable in der Spiel Klasse implementiert habe.. Muss ich das o.g. zwingend in der Main-Klasse implementieren? Oder wie kann ich die Logik des Spiels in einer anderen Klasse schreiben?

Tut mir leid, weil es wahrscheinlich Anfängerfragen sind, aber bisher habe ich nur mit Swing-Komponenten und Listenern gearbeitet. Das ist quasi mein erstes Programm dieser Art ;)

Danke nochmal für die Hilfe ;)
 

Fu3L

Top Contributor
Java:
public static void main(String[] moep) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				GameName g = new GameName();
			}
		});
	} //End main

Java:
public class GameName implements Runnable { 
  private Thread t;
  private volatile boolean running = true;

  public GameName() {
     ....
     t = new Thread(this);
     t.start();
   }

   @Override
   public void run() {
        Ab hier kennst dus
   }
}

Solltest du alles selbst zeichnen, empfiehlt sich ein extends JPanel, sonst vllt auch, ist dann aber nicht soo wichtig^^
 
B

b0n541

Gast
Hallo,

ich bin einer der Entwickler von JSkat (JSkat).

Wir haben das etwas anders gelöst:

* Jedes Skatspiel ist ein Thread
* Jeder Spieler implementiert ein Interface, das die verschiedenen Spielzüge in einem Spiel vorgibt
* Der Spiel-Thread ruft nacheinander den Spieler, der an der Reihe ist auf
* Die Spieler liefern die Spielzüge (auch die Implementierung für den menschlichen Spieler über die GUI)
* Es sind keine Wartezeiten oder Prüfungen, wer dran ist, notwendig

Ich lade jeden ein, sich unsere Lösung einmal anzusehen. Wir suchen noch Entwickler für KI-Spieler. Die GUI und die Spielsteuerung bekommt ihr schon von uns frei Haus geliefert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Minecraft Frage für einen Minecraft Server Spiele- und Multimedia-Programmierung 2
Drachenbauer Speicher-Tool für ein Spiel schreiben Spiele- und Multimedia-Programmierung 13
B Deepmind Poker Bot für PokerStars konfigurieren? Spiele- und Multimedia-Programmierung 2
G Minecraft PlayerBot (Listener Thread für jeden Spieler?) Spiele- und Multimedia-Programmierung 3
K Wie bekomme ich eine Transition für alle Objekte zum stoppen? Spiele- und Multimedia-Programmierung 1
E Organisation für Game Spiele- und Multimedia-Programmierung 1
Excess Ballerfisch für Android Spiele- und Multimedia-Programmierung 3
coolian ich brauche irgendeine gui lib für lwjgl2 Spiele- und Multimedia-Programmierung 51
krgewb Anderer Algorithmus für Bounding Box Spiele- und Multimedia-Programmierung 9
MiMa MP3 Dateien für Metadaten abgleichen Spiele- und Multimedia-Programmierung 0
Freshy Bot für Discord Spiele- und Multimedia-Programmierung 61
R Ideen für die Backend-Entwicklung eines Games gesucht Spiele- und Multimedia-Programmierung 8
G Mikrophon-/Audiosteuerung für einen Character Spiele- und Multimedia-Programmierung 1
P Tennis- Spielstand- Zähler für Schule programmieren Spiele- und Multimedia-Programmierung 6
M Logik für ein Quiz Spiele- und Multimedia-Programmierung 7
P Hilfe für Seminar Arbeit Spiele- und Multimedia-Programmierung 9
MiMa Metadaten für Multimedia Daten ermitteln Spiele- und Multimedia-Programmierung 4
G Übungsprogramm für Matheaufgaben Spiele- und Multimedia-Programmierung 1
F Algorithmus für bessere Kollisionsabfragen Spiele- und Multimedia-Programmierung 10
S Bilder Für Schachfiguren Spiele- und Multimedia-Programmierung 14
Timo_neu_in_java Suche etwas einfaches für Anfänger Spiele- und Multimedia-Programmierung 6
I Minecraft Suche Plugin Developer für Minecraft Netzwerk! Spiele- und Multimedia-Programmierung 2
S GUI erstellen für Text Adventure Spiele- und Multimedia-Programmierung 4
S Eigene Klasse vec_t - 3 oder 4 Einheiten für x, y, z und w Spiele- und Multimedia-Programmierung 11
R Vererbbarer GameLoop für Engine Spiele- und Multimedia-Programmierung 14
J Vektor für Gravitation erzeugen Spiele- und Multimedia-Programmierung 34
I Minecraft: Craftingrecipe für Braustand ändern Spiele- und Multimedia-Programmierung 9
Z Minimax-Algorithmus für TicTacToe Spiele- und Multimedia-Programmierung 5
H KI für Spiele Spiele- und Multimedia-Programmierung 1
S Pssende Datenstruktur für ein Netz Spiele- und Multimedia-Programmierung 5
S MouseEvents für Sprites Spiele- und Multimedia-Programmierung 3
I Spectator Modus für Spiel ähnlich zu Terraria Spiele- und Multimedia-Programmierung 8
K Bestes Bildformat für Spielegrafiken und deren Einbindung in Java Spiele- und Multimedia-Programmierung 2
J mehrere Listener für einen Button / Label Spiele- und Multimedia-Programmierung 1
C Port umleiten: lesen und schreiben für MCServer-Client über Skype Spiele- und Multimedia-Programmierung 0
J Musik Bibliothek für GUI Spiele- und Multimedia-Programmierung 7
B Hauptmenü für Spiel Spiele- und Multimedia-Programmierung 1
R Ratschlag für 2D-3D Engine für die Spieleentwicklung gesucht Spiele- und Multimedia-Programmierung 4
Androbin KI für Verfolgung im Raster Spiele- und Multimedia-Programmierung 2
A Bot für Browsergame Spiele- und Multimedia-Programmierung 2
H Tutorials für Fortgeschrittene 3D-Anwedungen Spiele- und Multimedia-Programmierung 2
lord239123 suche Graphiker für ein Pokemon-Spiel Spiele- und Multimedia-Programmierung 6
Furtano Vektoren für Bewegung für eine 2D-Simulation Spiele- und Multimedia-Programmierung 3
T Sinusgenerator für eine Hp Spiele- und Multimedia-Programmierung 8
J Menü für Snakespiel in einzelnem JFrame Spiele- und Multimedia-Programmierung 5
M Minecraft weitere Java Entwickler für minecraft projekt gesucht Spiele- und Multimedia-Programmierung 0
Guybrush Threepwood Ketzerische Frage: Opus-Codec für Java Spiele- und Multimedia-Programmierung 14
L Hilfe bei Klassendesign für Spiel Spiele- und Multimedia-Programmierung 2
N Animationen für ein 2D game Spiele- und Multimedia-Programmierung 6
S Aufbau für 2D Spiele Spiele- und Multimedia-Programmierung 7
L Client für ein Browsergame Spiele- und Multimedia-Programmierung 21
Devil0s Swing Elemente für Inventar? Spiele- und Multimedia-Programmierung 9
Kenan89 Ansatzfrage: Kartenspiel für 2 Spieler Online Spiele- und Multimedia-Programmierung 3
F Ideen für spiel Spiele- und Multimedia-Programmierung 4
P Spielfeld für RPG Spiele- und Multimedia-Programmierung 15
Hoppelmann Alphamap (Bild) für 3D-Terrain generieren Spiele- und Multimedia-Programmierung 2
S Algorithmus zur Ressourcesuche für die KI Spiele- und Multimedia-Programmierung 5
M Farbwerte für Flächen aus einem Bild erkennen Spiele- und Multimedia-Programmierung 3
K Einfache Engine für einfaches 3D gesucht Spiele- und Multimedia-Programmierung 10
S Aufbau von Klassen für Spiel Spiele- und Multimedia-Programmierung 13
Kenan89 Kleines Projekt für Java Spiele- und Multimedia-Programmierung 5
M Empfehlungen für ein 2D-Jump'n'run Spiele- und Multimedia-Programmierung 4
A Grundlagensuche für Spiel Spiele- und Multimedia-Programmierung 8
C Wo ist der MP3 Plugin für JMF? Spiele- und Multimedia-Programmierung 3
qwerqer Design Pattern gesucht für Spielregeln Spiele- und Multimedia-Programmierung 2
M Java als Programmiersprache für kommerzielle Spieleentwicklung? Spiele- und Multimedia-Programmierung 3
K Game Engine für selbstprogrammiertes Spiel Spiele- und Multimedia-Programmierung 27
Y Warum Thread für Spieleprogrammierung? Spiele- und Multimedia-Programmierung 27
A Music für Android game Spiele- und Multimedia-Programmierung 3
Gossi Probleme beim Laden der Images aus dem "Tutorial für Java-Spiele" Spiele- und Multimedia-Programmierung 4
M Minecraft Suche Java Programmierer (für Minecraft) Spiele- und Multimedia-Programmierung 2
Luk10 Tipps für bessere Animationen / Grafik Engine Spiele- und Multimedia-Programmierung 2
T 2D Menü für 3D Spiel Spiele- und Multimedia-Programmierung 5
T Grundlagenwissen für den 3D Raum Spiele- und Multimedia-Programmierung 6
I getSubImage sorgt für starken Performanceeinbruch Spiele- und Multimedia-Programmierung 6
M technologie für video, webcam & co Spiele- und Multimedia-Programmierung 25
C Java für große Spiele geeignet ? Spiele- und Multimedia-Programmierung 101
D Libraryempfehlung für Effekte Spiele- und Multimedia-Programmierung 3
B Spiele programmieren für ein Fenster? Spiele- und Multimedia-Programmierung 14
D Tabelle für Spiel Spiele- und Multimedia-Programmierung 3
N Grundlagen für ein Jump&Run Spiele- und Multimedia-Programmierung 3
S Datenbank gesucht für Bilder(gif-dateien) Spiele- und Multimedia-Programmierung 5
J Suche 3D Programm für jMonkeyEngine Spiele- und Multimedia-Programmierung 5
W 3D-APIs für Java - Eine Übersicht Spiele- und Multimedia-Programmierung 8
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5
S Game Client für kleine Competition Spiele- und Multimedia-Programmierung 3
F Programm für Bildbearbeitung gesucht: Skalieren und Speichern Spiele- und Multimedia-Programmierung 6
K Lösungsansätze für ein Spiel Spiele- und Multimedia-Programmierung 2
Plastagen Frameworls für Animationen und co Spiele- und Multimedia-Programmierung 3
aze Wie Transform3D für PosPathInterpolator bestimmen Spiele- und Multimedia-Programmierung 8
M Musik für Spiel wo downloaden? Spiele- und Multimedia-Programmierung 7
R Netzwerkstruktur für ein kleines Spiel Spiele- und Multimedia-Programmierung 8
O KI (künstliche Intelligenz) für Schachlogik Spiele- und Multimedia-Programmierung 4
J Brauche denkanstoß für kleines grafikframework Spiele- und Multimedia-Programmierung 3
A Countdown-Timer für Spiel Spiele- und Multimedia-Programmierung 4
J Tips für ein kleines Pong-Applet Spiele- und Multimedia-Programmierung 4
S Ein Thread für alle Animationen oder mehrere? Spiele- und Multimedia-Programmierung 2
S Grafik erstellen für Java Spiel Spiele- und Multimedia-Programmierung 8
G Javasimulatoren für Siemenshndys Spiele- und Multimedia-Programmierung 11
Developer_X Java3D-Ungeeignet für 3D Spiele wegen Heap Space=? Spiele- und Multimedia-Programmierung 23

Ähnliche Java Themen

Neue Themen


Oben