/// <summary> /// Raises mouse down event /// </summary> /// <param name="e">The mouse event args</param> protected override void OnMouseDown(MouseEventArgs e) { if (e.Button == MouseButtons.Left) { int position = GetPosition(e.Location); if (position > 0) { Piece piece = board[position]; if (!gameStarted) { Player humanPlayer = BoardUtilities.GetPlayer(piece); Player computerPlayer = BoardUtilities.GetOpponent(humanPlayer); presenter.SetComputer(humanPlayer, false); presenter.SetComputer(computerPlayer, true); presenter.StartGame(); } bool locked = ((blackLocked && BoardUtilities.IsBlack(piece)) || (whiteLocked && BoardUtilities.IsWhite(piece))); if ((!locked) && (piece != Piece.None)) { int offset = SquareSize / 2; floatingPiece.X = e.X - offset; floatingPiece.Y = e.Y - offset; floatingPiece.Position = position; Cursor = GrabCursor; this.RefreshBoard(); } System.Diagnostics.Trace.WriteLine(string.Format(CultureInfo.InvariantCulture, "clicked: {0}, piece={1}", position, piece)); } } base.OnMouseClick(e); }
private void GameStep(int? startPosition) { if (!boardRules.IsGameOver(board, turn.Player)) { view.LockPlayer(Player.Black, true); view.LockPlayer(Player.White, true); view.ShowPlayerChange(turn.Player); this.PromptMove(startPosition); } else { this.OnGameOver(BoardUtilities.GetOpponent(turn.Player), turn.Player); } }
//TODO: private int MiniMax(ref Move bestMove, IBoard board, Player player, int ply, int depth, TimeSpan timeout, DateTime startTime) { if (depth <= 0) { // reached ply level // достиг уровня слоя return(Evaluate(board, player)); } else if (forceMove) { return(int.MinValue); } ICollection <Move> moves = CheckerMoveRules.GetAvailableMoves(board, player); if ((moves == null) || (moves.Count == 0)) { // reached leaf // достиг листа return(Evaluate(board, player)); } int bestScore = int.MinValue; Player opponent = BoardUtilities.GetOpponent(player); IBoard boardCopy = board.Copy(); foreach (Move move in moves) { CheckerMoveRules.UpdateBoard(boardCopy, move); int score = -MiniMax(ref bestMove, boardCopy, opponent, ply, depth - 1, timeout, startTime); boardCopy.Copy(board);// undo move //отменить движение if (depth == ply) { System.Diagnostics.Trace.WriteLine(string.Format(CultureInfo.InvariantCulture, "Move: {0}. Score: {1}", move, score.ToString(CultureInfo.InvariantCulture))); if ((bestMove == null) || (score > bestScore)) { bestMove = move; } } bestScore = Math.Max(bestScore, score); } return(bestScore); }