Zum Inhalt springen

alex.h

Mitglieder
  • Gesamte Inhalte

    5
  • Benutzer seit

  • Letzter Besuch

  1. alex.h

    Algorithmus-Problem

    Hallo, ich möchte 4 Gewinnt mit einer KI programmieren und benutze dazu den Negamax-Algorithmus. Der Algorithmus funktioniert soweit, spuckt jedoch noch keine wirklichen logischen Züge aus. 3 senkrecht stehende steine erkennt er nicht. nicht von mir und nicht von ihm... Was ist denn falsch? Negamax-Aufruf: //Negamax else { negamax(depth, Integer.MIN_VALUE, Integer.MAX_VALUE); //depth = 8 return doNext; } /** * Der beste Spielzug wird mit Hilfe des Negamax-algorithmus gesucht. * Jeder Spielbaum wird bis zur Tiefe "depth" ausgewertet und dann eine Feldbewertung vorgenommen. * * @param depth die Tiefe des Spielbaumes * @return max Der Wert des Zuges */ private int negamax(int depth, int alpha, int beta) { if(depth == 0 //Abbruchbedingun der Rekursion (Tiefe erreicht, || pf.possibleMovesInt()+1 == 0) //aktueller spieler hat keine möglichen Züge -> Feld ist voll { if (pf.checkfourBoolean(2)) //Gewonnen? return 10; else if (pf.checkfourBoolean(1)) //Verloren? return -10; else //Unentschieden return 0; } for(int s = 0; s < pf.getSpalten(); s++) //for(int s = 0; s < pf.getSpalten(); s++) //Alle Züge durchprobieren { if (pf.columnFree(s)) //Alle möglichen Züge durchprobieren { player = player == 1 ? 2 : 1; pf.set(s, player); //Zug simulieren int value = -negamax(depth-1,-beta,-alpha); //Rekursionsaufruf pf.removeHighestField(s); //Zug rückgängig machen //Betacut //if (value >= beta) //{ // return beta; //} //Alphacut if (value > alpha) { alpha = value; doNext = s; } } } return alpha; }
  2. alex.h

    "Lobby"-Server

    Hi, da mein IT-Projekt(4-Gewinnt) soweit fertig ist, möchte ich zusätzlich das Spiel übers Netzwerk integrieren. Ich hab mir nun gedacht, das es einen Server gibt(Server-Applet) auf den man connecten kann und man bekommt im SPiel alle SPieler angezeigt und kann sich dann mit einem verbinden(übernimmt der Server) also der Server dient nur als Lobby und connected die SPieler dann direkt und spielen somit nicht mehr über den Server. Die SPieler sollen dann auch aus der Lobby ausgtragen werden. Ich hab jetzt aber sehr wenig Ahnung von der Netzwerkprogrammierung und wollte fragen ob jemand ein gutes Beispiel hat, src oder ne gute erklärung? Vielen Dank im voraus
  3. wie schon geschrieben wie sich der algorithmus verhält und was er macht hab ich soweit verstanden aber wo genau ich den besten spaltenwert abfangen kann ahb ich noch nicht rausgefunden... der algorithmus allein bringt ja nichts wenn er nur spielsituatioen bewertet und dann die bewertung nicht in ein ergebnis/handlung umgesetzt wird.
  4. und wie bekomm ich einen spaltenwert?
  5. Hallo, ich programmiere 4 gewinnt in Java und benötige dazu den Negamax-Algorithmus. den Algorithmus habe ich soweit verstanden und auch schon implementiert, aber aus dem allgemeinen Pseudocode von Wikipedia lässt sich mir nicht erschließen wie ich daraus schlussendlich einen konkreten Spaltenwert extrahieren kann? int NegaMax(int tiefe, int alpha, int beta) { if (tiefe == 0) return Bewerten(); GeneriereMoeglicheZuege(); while (ZuegeUebrig()) { FuehreNaechstenZugAus(); wert = -NegaMax(tiefe-1, -beta, -alpha); MacheZugRueckgaengig(); if (wert >= beta) return beta; if (wert > alpha) alpha = wert; } return alpha; } Meine Interpretation lautet wie folgt(funktoniert aber nicht richtig): private int negamax(int player, int depth, int alpha, int beta) { int score = Integer.MIN_VALUE; if(depth == 0 //Abbruchbedingun der Rekursion (Tiefe erreicht, || possibleMovesInt() == 0) //aktueller spieler hat keine möglichen Züge -> Feld ist voll { return evaluate(player); } for(int s = 0; s < pf.getSpalten(); s++) //Alle Züge durchprobieren { if (pf.getOneField(s, pf.getZeilen() - 1) == 0) //Alle möglichen Züge durchprobieren { pf.set(s, player); //Zug simulieren int actualvalue = -negamax(player, depth-1,-beta,-localalpha); //Rekursionsaufruf //ZUG rückgängig if(score < actualvalue) { score = actualvalue; doNext = s; // Bester Zug speichern } if (actualvalue >= beta) { //Betacut return beta; } if (score > alpha) { //Alphacut alpha = score; } } } return score; } doNext soll den konkreten spaltenwert darstellen. Aber was ist falsch, oder wie kann ich den originial code schnell um doNext erweitern? Vielen Dank im voraus. al3x ist gerade online Beitrag melden Beitrag bearbeiten/löschen

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...