public GameMove GetNextMove(IReadOnlyGameState state) { Malom3.GameState otherState = new Malom3.GameState(); // Alle Informationen in den anderen Zustand übertragen otherState.block = false; otherState.KLE = false; otherState.phase = state.GetPhase(state.NextToMove) == Phase.Placing ? 1 : 2; otherState.over = false; otherState.LastKLE = 0; otherState.SideToMove = playerConversion[state.NextToMove]; otherState.T = Enumerable.Range(0, GameState.FIELD_SIZE).Select(x => occupationConversion[state.Board[reverseCoordinateConversion[x]]]).ToArray(); otherState.SetStoneCount = new[] { state.GetStonesPlaced(Player.White), state.GetStonesPlaced(Player.Black) }; otherState.StoneCount = new[] { state.GetCurrentStones(Player.White), state.GetCurrentStones(Player.Black) }; // otherState.MoveCount wird von keiner für uns interessanten KI verwendet // otherState.block und otherState.winner geben lediglich Informationen nach Spielende a Malom3.Move move = player.ToMove(otherState); GameMove convertedMove; // In Malom gibt die KI immer zunächst einen Zug zurück, der keine Information zum Schlagen enthält. // Wenn wir diese benötigen, müssen wir einen weiteren Zug anfordern. if (move is Malom3.MoveKorong) { var mo = move as Malom3.MoveKorong; convertedMove = mo == null ? null :GameMove.Move(reverseCoordinateConversion[mo.hon], reverseCoordinateConversion[mo.hov]); } else { var mo = move as Malom3.SetKorong; convertedMove = mo == null ? null : GameMove.Place(reverseCoordinateConversion[mo.hov]); } if (state.IsValidMove(convertedMove) == MoveValidity.ClosesMill) { // Keine Ahnung für was KLE steht, aber es bedeutet, dass der Spieler einen Zug zurückgeben soll, der einen Stein entfernt // Oder, in Malom-Terminologie, einen LeveszKorong otherState.KLE = true; Malom3.LeveszKorong mo = player.ToMove(otherState) as Malom3.LeveszKorong; convertedMove = mo == null ? null : convertedMove.WithRemove(reverseCoordinateConversion[mo.hon]); } return(convertedMove); }