示例#1
0
        public GameState PickAMove(Move move)
        {
            if (!PossibleMoves.Contains(move))
            {
                throw new System.Exception("Can't play an impossible move: " + move);
            }

            var newBoard = m_board.SetCellOwner(CurrentPlayer, move.Target);

            return(new GameState(CurrentPlayer.Other, newBoard));
        }
示例#2
0
        public override void Update(GameManager gameManager, int deltaTime)
        {
            var realPoint = gameManager.Input.PointerPosition.ToVector2() + gameManager.Camera.Offset;

            Coordinate = GetCoordinate(realPoint);

            if (gameManager.Input.IsLeftButtonPressed)
            {
                if (!Hexes.ContainsKey(Coordinate))
                {
                    return;
                }

                var pawn = Hexes[Coordinate].Pawn;
                if (pawn == null)
                {
                    if (_selectedPawn != null)
                    {
                        _selectedPawn.Selected = false;
                        _selectedPawn          = null;
                        PossibleMoves.Clear();
                    }

                    return;
                }

                pawn.Selected = true;
                _selectedPawn = pawn;

                var moveQueue = new Queue <Move>();

                var openingMoves = GetNeighbours(Coordinate);
                foreach (var openingMove in openingMoves)
                {
                    var hex = Hexes[openingMove];
                    if (!hex.Passable)
                    {
                        continue;
                    }

                    moveQueue.Enqueue(new Move(hex));
                }

                var possibleMoves      = new List <Coordinate>();
                var visitedCoordinates = new HashSet <Coordinate>();

                while (moveQueue.Count > 0)
                {
                    var move = moveQueue.Dequeue();
                    if (visitedCoordinates.Contains(move.Hex.Coordinate))
                    {
                        continue;
                    }

                    visitedCoordinates.Add(move.Hex.Coordinate);

                    if (move.TotalMoveCost > pawn.MoveSpeed)
                    {
                        continue;
                    }

                    possibleMoves.Add(move.Hex.Coordinate);

                    var newMoves = GetNeighbours(move.Hex.Coordinate);
                    foreach (var newMove in newMoves)
                    {
                        if (visitedCoordinates.Contains(newMove))
                        {
                            continue;
                        }

                        var hex = Hexes[newMove];
                        if (!hex.Passable)
                        {
                            continue;
                        }

                        moveQueue.Enqueue(new Move(move, hex));
                    }
                }

                PossibleMoves = possibleMoves;
            }

            if (gameManager.Input.IsRightButtonPressed && _selectedPawn != null)
            {
                if (PossibleMoves.Contains(Coordinate))
                {
                    _selectedPawn.Hex.Pawn = null;
                    _selectedPawn.Hex      = Hexes[Coordinate];
                    _selectedPawn.Hex.Pawn = _selectedPawn;
                    _selectedPawn.Selected = false;
                    PossibleMoves.Clear();
                }
            }
        }
示例#3
0
        private static int CheckForTwoInARow(List <int> myMoves)
        {
            int index  = 1;
            int count  = 1;
            int runner = 1;

            foreach (var possibleMove in PossibleMoves)
            {
                while (myMoves.Contains(possibleMove + index))
                {
                    count += 1;
                    index += 1;
                }
                while (myMoves.Contains(possibleMove - runner))
                {
                    count  += 1;
                    runner += 1;
                }
                if (count == 2 &&
                    ((PossibleMoves.Contains(possibleMove + index) &&
                      PossibleMoves.Contains(possibleMove - runner)) ||
                     (PossibleMoves.Contains(possibleMove + index) &&
                      (PossibleMoves.Contains(possibleMove + index + 1) ||
                       myMoves.Contains(possibleMove + index + 1))) ||
                     (PossibleMoves.Contains(possibleMove - runner) &&
                      (PossibleMoves.Contains(possibleMove - runner - 1) ||
                       myMoves.Contains(possibleMove - runner - 1)))))
                {
                    return(possibleMove);
                }

                index  = 1;
                count  = 1;
                runner = 1;

                while (myMoves.Contains(possibleMove + 100 * index))
                {
                    count += 1;
                    index += 1;
                }
                while (myMoves.Contains(possibleMove - 100 * runner))
                {
                    count  += 1;
                    runner += 1;
                }
                if (count == 2 &&
                    ((PossibleMoves.Contains(possibleMove + 100 * index) &&
                      PossibleMoves.Contains(possibleMove - 100 * runner)) ||
                     (PossibleMoves.Contains(possibleMove + 100 * index) &&
                      (PossibleMoves.Contains(possibleMove + 100 * (index + 1)) ||
                       myMoves.Contains(possibleMove + 100 * (index + 1)))) ||
                     (PossibleMoves.Contains(possibleMove - 100 * runner) &&
                      (PossibleMoves.Contains(possibleMove - 100 * (runner + 1)) ||
                       myMoves.Contains(possibleMove - 100 * (runner + 1))))))
                {
                    return(possibleMove);
                }

                index  = 1;
                count  = 1;
                runner = 1;

                while (myMoves.Contains(possibleMove + 100 * index + index))
                {
                    count += 1;
                    index += 1;
                }
                while (myMoves.Contains(possibleMove - 100 * runner - runner))
                {
                    count  += 1;
                    runner += 1;
                }
                if (count == 2 &&
                    ((PossibleMoves.Contains(possibleMove + 100 * index + index) &&
                      PossibleMoves.Contains(possibleMove - 100 * runner - runner)) ||
                     (PossibleMoves.Contains(possibleMove + 100 * index + index) &&
                      (PossibleMoves.Contains(possibleMove + 100 * (index + 1) + index + 1) ||
                       myMoves.Contains(possibleMove + 100 * (index + 1) + index + 1))) ||
                     (PossibleMoves.Contains(possibleMove - 100 * runner - runner) &&
                      (PossibleMoves.Contains(possibleMove - 100 * (runner + 1) - (runner + 1)) ||
                       myMoves.Contains(possibleMove - 100 * (runner + 1) - (runner + 1))))))
                {
                    return(possibleMove);
                }

                index  = 1;
                count  = 1;
                runner = 1;

                while (myMoves.Contains(possibleMove + 100 * index - index))
                {
                    count += 1;
                    index += 1;
                }
                while (myMoves.Contains(possibleMove - 100 * runner + runner))
                {
                    count  += 1;
                    runner += 1;
                }
                if (count == 2 &&
                    ((PossibleMoves.Contains(possibleMove + 100 * index - index) &&
                      PossibleMoves.Contains(possibleMove - 100 * runner + runner)) ||
                     (PossibleMoves.Contains(possibleMove + 100 * index - index) &&
                      (PossibleMoves.Contains(possibleMove + 100 * (index + 1) - (index + 1)) ||
                       myMoves.Contains(possibleMove + 100 * (index + 1) - (index + 1)))) ||
                     (PossibleMoves.Contains(possibleMove - 100 * runner + runner) &&
                      (PossibleMoves.Contains(possibleMove - 100 * (runner + 1) + runner + 1) ||
                       myMoves.Contains(possibleMove - 100 * (runner + 1) + runner + 1)))))
                {
                    return(possibleMove);
                }
            }

            return(NoSuchMove);
        }
示例#4
0
        private static int CheckForFourInARow(List <int> moves)
        {
            int index  = 1;
            int count  = 1;
            int runner = 1;

            foreach (var possibleMove in PossibleMoves)
            {
                while (moves.Contains(possibleMove + index))
                {
                    count += 1;
                    index += 1;
                }
                while (moves.Contains(possibleMove - runner))
                {
                    count  += 1;
                    runner += 1;
                }
                if (count == 4 &&
                    (PossibleMoves.Contains(possibleMove + index) ||
                     PossibleMoves.Contains(possibleMove - runner)))
                {
                    return(possibleMove);
                }

                index  = 1;
                count  = 1;
                runner = 1;

                while (moves.Contains(possibleMove + 100 * index))
                {
                    count += 1;
                    index += 1;
                }
                while (moves.Contains(possibleMove - 100 * runner))
                {
                    count  += 1;
                    runner += 1;
                }
                if (count == 4 &&
                    (PossibleMoves.Contains(possibleMove + 100 * index) ||
                     PossibleMoves.Contains(possibleMove - 100 * runner)))
                {
                    return(possibleMove);
                }

                index  = 1;
                count  = 1;
                runner = 1;

                while (moves.Contains(possibleMove + 100 * index + index))
                {
                    count += 1;
                    index += 1;
                }
                while (moves.Contains(possibleMove - 100 * runner - runner))
                {
                    count  += 1;
                    runner += 1;
                }
                if (count == 4 &&
                    (PossibleMoves.Contains(possibleMove + 100 * index + index) ||
                     PossibleMoves.Contains(possibleMove - 100 * runner - runner)))
                {
                    return(possibleMove);
                }

                index  = 1;
                count  = 1;
                runner = 1;

                while (moves.Contains(possibleMove + 100 * index - index))
                {
                    count += 1;
                    index += 1;
                }
                while (moves.Contains(possibleMove - 100 * runner + runner))
                {
                    count  += 1;
                    runner += 1;
                }
                if (count == 4 &&
                    (PossibleMoves.Contains(possibleMove + 100 * index - index) ||
                     PossibleMoves.Contains(possibleMove - 100 * runner + runner)))
                {
                    return(possibleMove);
                }
            }

            return(NoSuchMove);
        }