Frage von arnethebike, 19

Hallo, vorab es geht um Java Programmierung und um den Alpha-Beta Algorithmus?

Ich bin noch recht unerfahren wenn es um Java Programmierung geht aber wollte mich dennoch an ein größeres Projekt wagen und zwar mein eigener Computerspieler der gegen mich Twixt spielt aber ich kriege es einfach nicht hin. Ich würde mich sehr freuen wenn ihr mir helfen könntet.

Liebe Grüße Arne

Hier ist der Code: package sc.player2016.logic;

import java.security.SecureRandom; import java.util.List; import java.util.Random;

import sc.player2016.Starter; import sc.plugin2016.GameState; import sc.plugin2016.IGameHandler; import sc.plugin2016.Move; import sc.plugin2016.Player; import sc.plugin2016.PlayerColor; import sc.shared.GameResult;

public class MyLogic implements IGameHandler {

private Starter client;
private GameState gameState;
private Player currentPlayer;
    

private static final Random rand = new SecureRandom();

public MyLogic(Starter client) {
    this.client = client;
}


@Override
public void gameEnded(GameResult data, PlayerColor color,
        String errorMessage) {

    System.out.println("*** Das Spiel ist beendet");
}


@Override
public void onRequestAction() {
    System.out.println("*** Es wurde ein Zug angefordert");
        List<Move> possibleMoves = gameState.getPossibleMoves();
        System.out.println("*** sende zug: ");
        Move selection = possibleMoves.get(rand.nextInt(possibleMoves
                .size()));
             
        int AlphaBeta;
        int beta;
        int tiefe;
        int alpha;
        int wert;
        int best = 10;
      
        {
            if (tiefe == 0)
                return Bewerten();
            BOOL PVgefunden = FALSE;
            best = -unendlich;
            GeneriereMoeglicheZuege();
            while (ZuegeUebrig())
            {
                FuehreNaechstenZugAus();
                if (PVgefunden)
                {
                    wert = -AlphaBeta(tiefe-1, -alpha-1, -alpha);
                    if (wert > alpha && wert < beta)
                        wert = -AlphaBeta(tiefe-1, -beta, -wert);
                } else
                    wert = -AlphaBeta(tiefe-1, -beta, -alpha);
                MacheZugRueckgaengig();
                if (wert > best)
                {
                    if (wert >= beta)
                        return wert;
                    best = wert;
                    if (wert > alpha)
                    {
                        alpha = wert;
                        PVgefunden = TRUE;
                    }
                }
            }
            return best;
        }
        
        
        System.out.println("*** setze Strommast auf x="
                + selection.getX() + ", y="
                + selection.getY());
        sendAction(selection);
                }


@Override
public void onUpdate(Player player, Player otherPlayer) {
    currentPlayer = player;

    System.out.println("*** Spielerwechsel: " + player.getPlayerColor());

}


@Override
public void onUpdate(GameState gameState) {
    this.gameState = gameState;
    currentPlayer = gameState.getCurrentPlayer();

    System.out.print("*** Das Spiel geht vorran: Zug = "
            + gameState.getTurn());
    System.out.println(", Spieler = " + currentPlayer.getPlayerColor());
}


@Override
public void sendAction(Move move) {
    cli
Antwort
von arnethebike, 10

Der Code ist kommentiert

package sc.player2016.logic;

import java.security.SecureRandom;
import java.util.List;
import java.util.Random;

import sc.player2016.Starter;
import sc.plugin2016.GameState;
import sc.plugin2016.IGameHandler;
import sc.plugin2016.Move;
import sc.plugin2016.Player;
import sc.plugin2016.PlayerColor;
import sc.shared.GameResult;

/**
* Das Herz des Simpleclients: Eine sehr simple Logik, die ihre Zuege zufaellig
* waehlt, aber gueltige Zuege macht. Ausserdem werden zum Spielverlauf
* Konsolenausgaben gemacht.
*/
public class MyLogic implements IGameHandler {

private Starter client;
private GameState gameState;
private Player currentPlayer;

/*
* Klassenweit verfuegbarer Zufallsgenerator der beim Laden der klasse
* einmalig erzeugt wird und darn immer zur Verfuegung steht.
*/
private static final Random rand = new SecureRandom();

/**
* Erzeugt ein neues Strategieobjekt, das zufaellige Zuege taetigt.
*
* @param client
* Der Zugrundeliegende Client der mit dem Spielserver
* kommunizieren kann.
*/
public MyLogic(Starter client) {
this.client = client;
}

/**
* {@inheritDoc}
*/
@Override
public void gameEnded(GameResult data, PlayerColor color,
String errorMessage) {

System.out.println("*** Das Spiel ist beendet");
}

/**
* {@inheritDoc}
*/
@Override
public void onRequestAction() {
System.out.println("*** Es wurde ein Zug angefordert");
List possibleMoves = gameState.getPossibleMoves();
System.out.println("*** sende zug: ");
Move selection = possibleMoves.get(rand.nextInt(possibleMoves
.size()));

int AlphaBeta;
int beta;
int tiefe = 0;
int alpha;
int wert;
int best = 10;
{
if (tiefe == 0)
return Bewerten();
BOOL PVgefunden = FALSE;
best = -unendlich;
GeneriereMoeglicheZuege();
while (ZuegeUebrig())
{
FuehreNaechstenZugAus();
if (PVgefunden)
{
wert = -AlphaBeta(tiefe-1, -alpha-1, -alpha);
if (wert > alpha && wert < beta)
wert = -AlphaBeta(tiefe-1, -beta, -wert);
} else
wert = -AlphaBeta(tiefe-1, -beta, -alpha);
MacheZugRueckgaengig();
if (wert > best)
{
if (wert >= beta)
return wert;
best = wert;
if (wert > alpha)
{
alpha = wert;
PVgefunden = TRUE;
}
}
}
return' best;
}

System.out.println("*** setze Strommast auf x="
+ selection.getX() + ", y="
+ selection.getY());
sendAction(selection);
}

/**
* {@inheritDoc}
*/
@Override
public void onUpdate(Player player, Player otherPlayer) {
currentPlayer = player;

System.out.println("*** Spielerwechsel: " + player.getPlayerColor());

}

/**
* {@inheritDoc}
*/
@Override
public void onUpdate(GameState gameState) {
this.gameState = gameState;
currentPlayer = gameState.getCurrentPlayer();

System.out.print("*** Das Spiel geht vorran: Zug = "
+ gameState.getTurn());
System.out.println(", Spieler = " + currentPlayer.getPlayerColor());
}

/**
* {@inheritDoc}
*/
@Override
public void sendAction(Move move) {
client.sendMove(move);
}

}

Expertenantwort
von KnusperPudding, Community-Experte für Java, 7

Aus dem Code den du sowohl als Frage als auch zusätzlich als Antwort gepostet hast, lässt sich noch nicht allzu viel  erkennen, da:

1.  Das Beispiel unvollständig ist: Sämtliche verwendete Klassen kennst ausschließlich du. - D.h. wir können nur Raten was dahinter steckt und ausführbar ist es auch nicht.

2. Der Code auch mit Syntax-Fehlern gespickt ist: z.b:

return' best; 
BOOL PVgefunden = FALSE;

3. Du noch nicht genannt hast, was dabei eigentlich dein Problem ist: Wo kommst du nicht weiter? Woran scheitert es? Wo genau drückt der Schuh?

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten