Пример #1
0
        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);
        }