Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
 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);
    }
 }
Ejemplo n.º 3
0
        //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);
        }