Exemplo n.º 1
0
        public JsonResult StartGame(PraetorianGameState playerSideChoosen)
        {
            var jResult = new JsonResult();
            if(playerSideChoosen == PraetorianGameState.ASSASSINTURN)
            {
                //Human needs to make the first move, so set the game state and return out
                _Board.IsAssassinComputer = false;
                _Board.IsLegalMove = true;
                _Board.GameState = PraetorianGameState.ASSASSINTURN;
                PraetorianBoard.ComputerState = PraetorianGameState.PRAETORIANTURN;
            }
            else
            {
                _Board.IsAssassinComputer = true;
                PraetorianBoard.ComputerState = PraetorianGameState.ASSASSINTURN;
                PraetorianGameSetup pGame = new PraetorianGameSetup(_Board.Pieces.ToList(), new KeyValuePair<int, PraetorianPieceViewModel>(0, new PraetorianPieceViewModel() { }));
                var newBoard = pGame.ComputerMakeMove(GAMEDEPTH, true);
                _LastMove = new KeyValuePair<int, PraetorianPieceViewModel>(_iMoveNumber++, GetLastMovedPieceFromComputer(newBoard.BoardPieces, _Board.Pieces.ToList()));
                _MasterMoveList.Add(_LastMove);
                _Board.Pieces = newBoard.BoardPieces;
                _Board.GameState = PraetorianGameState.PRAETORIANTURN;
                _Board.IsLegalMove = true;
            }

            jResult = Json(_Board);
            return jResult;
        }
Exemplo n.º 2
0
        public JsonResult PlayerMove(string fromPosition, string toPosition, PraetorianGameState playerSideChoosen)
        {
            var jResult = new JsonResult();
            bool bIsLegal = false;
            PraetorianPieceViewModel piece = _Board.Pieces.ToList().First(f => f.Position == "sq_" + fromPosition);

            if (_LastMove.Value != null && piece.Piece == _LastMove.Value.Piece)
            {
                _Board.IsLegalMove = bIsLegal;
                return Json(_Board);
            }

            if (string.IsNullOrEmpty(toPosition))
            {
                _Board.IsLegalMove = bIsLegal;
                return Json(_Board);
            }

            //Regardless of the playersideChoosen we just need to know that it was a legal move
            if (playerSideChoosen == PraetorianGameState.ASSASSINTURN )
            {

                if (piece.Piece != CellState.PRAETORIAN)
                {
                    List<int> possibleMoves = new List<int>() { piece.Index - 9, piece.Index - 8, piece.Index - 7, piece.Index - 1, piece.Index + 1, piece.Index + 7, piece.Index + 8, piece.Index + 9 };
                    List<List<int>> linesToEvaluate = new List<List<int>>();
                    linesToEvaluate.AddRange(PraetorianBoard.gameLines.FindAll(PraetorianBoard.ByGridForPraetorian(piece.Index)));
                    linesToEvaluate.AddRange(PraetorianBoard.diagonalLines.FindAll(PraetorianBoard.ByGridForPraetorian(piece.Index)));

                    int iPossible = possibleMoves.Find(PraetorianBoard.ByInt(int.Parse(toPosition)));
                    int iIndex = possibleMoves.FindIndex(PraetorianBoard.ByInt(int.Parse(toPosition)));

                    var possibleLine = linesToEvaluate.FindAll(PraetorianBoard.ByGridForPraetorian(iPossible));
                    if (possibleLine.Count >= 1 && iIndex >= 0)
                    {
                        if (possibleLine.Count > 1)
                        {
                            throw new Exception("Possible lines count was greater 1");
                        }

                        if (Math.Abs(possibleLine[0].FindIndex(PraetorianBoard.ByInt(iPossible)) - possibleLine[0].FindIndex(PraetorianBoard.ByInt(piece.Index))) == 1)
                        {
                            PraetorianPieceViewModel posPiece = _Board.Pieces.FirstOrDefault(f => f.Index == iPossible);
                            if (posPiece != null && posPiece.Piece == CellState.EMPTY)
                            {
                                var piecesBefore = _Board.Pieces.ToList().Clone();
                                SwapPosition(_Board.Pieces.ToList(), iPossible, piece.Index, _iMoveNumber++);
                                _Board.Pieces = _Board.Pieces.OrderBy(o => o.Index);
                                _Board.GameState = PraetorianGameState.PRAETORIANTURN;
                                bIsLegal = true;
                            }
                        }
                    }
                }

                _Board.IsLegalMove = bIsLegal;
            }
            else
            {
                if (piece.Piece != CellState.PRAETORIAN)
                {
                    List<int> possibleMoves = new List<int>() { piece.Index - 9, piece.Index - 8, piece.Index - 7, piece.Index - 1, piece.Index + 1, piece.Index + 7, piece.Index + 8, piece.Index + 9 };
                    List<List<int>> linesToEvaluate = new List<List<int>>();
                    linesToEvaluate.AddRange(PraetorianBoard.gameLines.FindAll(PraetorianBoard.ByGridForPraetorian(piece.Index)));
                    linesToEvaluate.AddRange(PraetorianBoard.diagonalLines.FindAll(PraetorianBoard.ByGridForPraetorian(piece.Index)));

                    int iPossible = possibleMoves.Find(PraetorianBoard.ByInt(int.Parse(toPosition)));
                    int iIndex = possibleMoves.FindIndex(PraetorianBoard.ByInt(int.Parse(toPosition)));

                    var possibleLine = linesToEvaluate.FindAll(PraetorianBoard.ByGridForPraetorian(iPossible));
                    if (possibleLine.Count >= 1 && iIndex >= 0)
                    {
                        if (possibleLine.Count > 1)
                        {
                            throw new Exception("Possible lines count was greater than 1");
                        }

                        if (Math.Abs(possibleLine[0].FindIndex(PraetorianBoard.ByInt(iPossible)) - possibleLine[0].FindIndex(PraetorianBoard.ByInt(piece.Index))) == 1)
                        {
                            PraetorianPieceViewModel posPiece = _Board.Pieces.FirstOrDefault(f => f.Index == iPossible);
                            if (posPiece != null && posPiece.Piece == CellState.EMPTY)
                            {
                                var piecesBefore = _Board.Pieces.ToList().Clone();
                                SwapPosition(_Board.Pieces.ToList(), iPossible, piece.Index, _iMoveNumber++);
                                _Board.Pieces = _Board.Pieces.OrderBy(o => o.Index);
                                _Board.GameState = PraetorianGameState.ASSASSINTURN;
                                bIsLegal = true;
                            }
                        }
                    }
                }
                else
                {
                    List<List<int>> linesToEvaluate = new List<List<int>>();
                    linesToEvaluate = PraetorianBoard.gameLines.FindAll(PraetorianBoard.ByGridForPraetorian(piece.Index));

                    var possLine = linesToEvaluate.FindAll(findLine(int.Parse(fromPosition), int.Parse(toPosition)));
                    if(possLine.Count != 1)
                    {
                        if(possLine.Count == 0)
                        {
                            _Board.IsLegalMove = bIsLegal;
                            return Json(_Board);
                        }
                        else
                        {
                            throw new Exception("Possible lines count was greater than 1");
                        }
                    }

                    int iFrom = possLine[0].FindIndex(PraetorianBoard.ByInt(int.Parse(fromPosition)));
                    int iTo = possLine[0].FindIndex(PraetorianBoard.ByInt(int.Parse(toPosition)));
                    int iSpace = 0;
                    if (int.Parse(fromPosition) < int.Parse(toPosition))
                    {
                        for (int index = iFrom + 1; index <= iTo; index++)
                        {
                            iSpace = possLine[0][index];
                            if (_Board.Pieces.ToList()[iSpace].Piece == CellState.EMPTY)
                            {
                                bIsLegal = true;
                            }
                            else
                            {
                                bIsLegal = false;
                                break;
                            }
                        }
                    }
                    else
                    {
                        for (int index = iFrom - 1; index >= iTo; index--)
                        {
                            iSpace = possLine[0][index];
                            if (_Board.Pieces.ToList()[iSpace].Piece == CellState.EMPTY)
                            {
                                bIsLegal = true;
                            }
                            else
                            {
                                bIsLegal = false;
                                break;
                            }
                        }
                    }

                    if(bIsLegal)
                    {
                        var newBoard = _Board.Pieces.ToList().Clone().ToList();
                        SwapPosition(_Board.Pieces.ToList(), int.Parse(toPosition), int.Parse(fromPosition), _iMoveNumber++);
                        _Board.Pieces = _Board.Pieces.OrderBy(o => o.Index);
                        _Board.GameState = PraetorianGameState.ASSASSINTURN;
                    }
                }

                _Board.IsLegalMove = bIsLegal;
            }

            jResult = Json(_Board);
            return jResult;
        }
Exemplo n.º 3
0
        public JsonResult ComputerMove(PraetorianGameState playerSideChoosen)
        {
            var jResult = new JsonResult();

            PraetorianGameSetup pGame = new PraetorianGameSetup(_Board.Pieces.ToList(), _MasterMoveList[_MasterMoveList.Count - 1]);
            if (playerSideChoosen == PraetorianGameState.ASSASSINTURN)
            {
                var newBoard = pGame.ComputerMakeMove(GAMEDEPTH, false);
                _iMoveNumber++;
                var movePiece = GetLastMovedPieceFromComputer(newBoard.BoardPieces, _Board.Pieces.ToList());
                _LastMove = new KeyValuePair<int, PraetorianPieceViewModel>(_iMoveNumber, movePiece);
                _MasterMoveList.Add(_LastMove);
                _Board.Pieces = newBoard.BoardPieces.OrderBy(o => o.Index);
                _Board.GameState = PraetorianGameState.ASSASSINTURN;
                _Board.IsLegalMove = true;
            }
            else
            {
                var newBoard = pGame.ComputerMakeMove(GAMEDEPTH, true);
                _iMoveNumber++;
                var movePiece = GetLastMovedPieceFromComputer(newBoard.BoardPieces, _Board.Pieces.ToList());
                _LastMove = new KeyValuePair<int, PraetorianPieceViewModel>(_iMoveNumber, movePiece);
                _MasterMoveList.Add(_LastMove);
                _Board.Pieces = newBoard.BoardPieces.OrderBy(o => o.Index);
                _Board.GameState = PraetorianGameState.PRAETORIANTURN;
                _Board.IsLegalMove = true;
            }

             jResult = Json(_Board);
            return jResult;
        }