public GamePlayerMoveResult MakeMove(PieceColour pieceColour, GameState gameState) { var currentMoves = gameState.CalculateAvailableMoves(pieceColour).ToList(); if (!currentMoves.Any()) { return(new GamePlayerMoveResult(null, MoveStatus.NoLegalMoves)); } var moveWeights = new List <Tuple <double, GameMove> >(); foreach (var move in currentMoves) { var moveMetric = move.CalculateGameMoveMetrics(pieceColour); double weightedResult = 0; weightedResult += KingWeight * moveMetric.CreatedFriendlyKings; weightedResult += NextAvailableMoveCountWeight * moveMetric.FriendlyMovesAvailable; weightedResult += OpponentNextAvailableMoveCountWeight * moveMetric.OpponentMovesAvailable; weightedResult += NextMovePiecesAtRiskWeight * moveMetric.NextMoveFriendlyPiecesAtRisk; weightedResult += NextMovePiecesToTakeWeight * moveMetric.NextMoveOpponentPiecesAtRisk; weightedResult += NextMoveKingWeight * moveMetric.NextMoveFriendlyKingsCreated; weightedResult += OpponentNextMoveKingWeight * moveMetric.NextMoveOpponentKingsCreated; var resultTuple = new Tuple <double, GameMove>(weightedResult, move); moveWeights.Add(resultTuple); } var selectedMove = moveWeights.OrderByDescending(m => m.Item1).First().Item2; var selectedGameState = selectedMove.PerformMove(); var result = new GamePlayerMoveResult(selectedGameState, MoveStatus.SuccessfulMove); return(result); }
public GamePlayerMoveResult MakeMove(PieceColour pieceColour, GameState gameState) { CurrentTurn = true; GamePlayerMoveResult gamePlayerMoveResult; // check if human has lost if (gameState.CalculateAvailableMoves(pieceColour).Count > 0) { if (null == SelectedMove) { throw new ArgumentException("SelectedMove is null."); } gamePlayerMoveResult = new GamePlayerMoveResult(SelectedMove.PerformMove(), MoveStatus.SuccessfulMove); } else { gamePlayerMoveResult = new GamePlayerMoveResult(gameState, MoveStatus.NoLegalMoves); } SelectedMove = null; CurrentTurn = false; return gamePlayerMoveResult; }
public GamePlayerMoveResult MakeMove(PieceColour pieceColour, GameState gameState) { CurrentTurn = true; GamePlayerMoveResult gamePlayerMoveResult; // check if human has lost if (gameState.CalculateAvailableMoves(pieceColour).Count > 0) { while (null == SelectedMove) { Thread.Sleep(10); } gamePlayerMoveResult = new GamePlayerMoveResult(SelectedMove.PerformMove(), MoveStatus.SuccessfulMove); } else { gamePlayerMoveResult = new GamePlayerMoveResult(gameState, MoveStatus.NoLegalMoves); } SelectedMove = null; CurrentTurn = false; return(gamePlayerMoveResult); }
public GamePlayerMoveResult MakeMove(PieceColour pieceColour, GameState gameState) { // build list of previous game states var previousGameStates = new HashSet <GameState>(); GameState lastGameState = gameState; while ((lastGameState = lastGameState.PreviousGameState) != null) { previousGameStates.Add(lastGameState); } var currentMoves = gameState.CalculateAvailableMoves(pieceColour).ToList(); if (!currentMoves.Any()) { return(new GamePlayerMoveResult(null, MoveStatus.NoLegalMoves)); } var distinctMoves = currentMoves.Where(gm => !previousGameStates.Contains(gm.GameState)).ToList(); if (!distinctMoves.Any()) { return(new GamePlayerMoveResult(null, MoveStatus.Resign)); } var moveWeights = new List <Tuple <double, GameMove> >(); foreach (var move in distinctMoves) { var moveMetric = move.CalculateGameMoveMetrics(pieceColour); var inputs = new double[] { moveMetric.CreatedFriendlyKings, moveMetric.FriendlyMovesAvailable, moveMetric.OpponentMovesAvailable, moveMetric.NextMoveFriendlyPiecesAtRisk, moveMetric.NextMoveOpponentPiecesAtRisk, moveMetric.NextMoveFriendlyKingsCreated, moveMetric.NextMoveOpponentKingsCreated, moveMetric.TotalPieces / 100.0, moveMetric.TotalFriendlyPieces / 100.0, moveMetric.TotalOpponentPieces / 100.0, moveMetric.TotalMinionPieces / 100.0, moveMetric.TotalFriendlyMinionPieces / 100.0, moveMetric.TotalOpponentMinionPieces / 100.0, moveMetric.TotalKingPieces / 100.0, moveMetric.TotalFriendlyKingPieces / 100.0, moveMetric.TotalOpponentKingPieces / 100.0, moveMetric.FriendlyMinionsHome / 100.0, moveMetric.OpponentMinionsHome / 100.0, moveMetric.FriendlyMinionsAway / 100.0, moveMetric.OpponentMinionsAway / 100.0, moveMetric.OpponentPiecesTaken / 100.0 }; double weightedResult = Net.Calculate(inputs).Single(); var resultTuple = new Tuple <double, GameMove>(weightedResult, move); moveWeights.Add(resultTuple); } var selectedMove = moveWeights.OrderByDescending(m => m.Item1).First().Item2; var selectedGameState = selectedMove.PerformMove(); var result = new GamePlayerMoveResult(selectedGameState, MoveStatus.SuccessfulMove); return(result); }