software-challenge / backend

Server, Client und Spiel-Plugins der Software-Challenge Germany
https://www.software-challenge.de
11 stars 10 forks source link

Klonen eines GameStates und das Ausführen von Zügen darauf funktioniert nicht. #238

Closed sunfl0w closed 4 years ago

sunfl0w commented 4 years ago

Hier mal etwas Code zum testen. Der Code an sich ist nicht unbedingt sinnvoll, löst aber den besagten Fehler aus.

GameState state = gameState.clone();
for(int i = 0; i < 30; i++) {
    List<GameState> childGameStates = GetChildGameStates(state);
    state = childGameStates.get(0);
}
private List<GameState> GetChildGameStates(GameState gameState) {
    List<GameState> childGameStates = new ArrayList<GameState>();
    List<Move> possibleMoves = GameRuleLogic.getPossibleMoves(gameState);

    for(Move move : possibleMoves) {
        GameState childGameState = gameState.clone();
        GameRuleLogic.performMove(childGameState, move);
        childGameStates.add(childGameState);
    }
    return childGameStates;
}
xeruf commented 4 years ago

@sunfl0w ah, mir war nicht bewusst, dass es hier auch ums klonen geht. Die clone-Methode war ja wie gesagt bis vor kurzem verbuggt. Bitte öffne das issue wieder, wenn es mit der in Kürze veröffentlichten neuen Version auch nicht klappt.

sunfl0w commented 4 years ago

Das Klonen des LastMove funktioniert soweit ich das beurteilen kann. Leider führt der oben aufgelistete Code immer noch zu einem Absturz des Programm mit dem Fehler: "sc.shared.InvalidMoveException: Piece is not a undeployed piece of the current player".

sunfl0w commented 4 years ago

Der rote Spieler setzt seine Biene zuerst auf (-5,0,-5). Der blaue versucht seine auf (-4,-1,5) zu setzen. Dann tritt der Fehler auf.

sunfl0w commented 4 years ago

Hier noch ein weiteres Beispiel, dass diesen Fehler verursacht:

clone

jnccd commented 4 years ago

Beide Codebeispiele funktionieren bei mir. Letzteres wirft nur ne Fehlermeldung wenn es in der 4. Runde keine Möglichkeit gibt die Biene zu setzen. Da wäre es sicherlich noch schöner wenn der Client aufgeben könnte, statt abzustürzen oder einen invaliden Move zu senden, aber das Issue kann man schließen meiner Ansicht nach.

sunfl0w commented 4 years ago

Das war aber glaube ich auch noch mit einer älteren Version. Wenn es jetzt funktioniert ist das ja sehr gut.