コード例 #1
0
ファイル: Tile.cs プロジェクト: melware/fanorona
 public Tile(Tile t)
 {
     Type = t.Type;
     State = t.State;
     Row = t.Row;
     Col = t.Col;
     PossibleDirections = t.PossibleDirections;
 }
コード例 #2
0
ファイル: Board.cs プロジェクト: melware/fanorona
        public Board(Board b)
        {
            Type = b.Type;
            Pieces = new Tile[b.NumRows,b.NumCols];

            for (int i = 0; i < NumRows; i++)
            {
                for (int j = 0; j < NumCols; j++)
                {
                    Pieces[i,j] = new Tile(b.Pieces[i,j]);
                }
            }
        }
コード例 #3
0
ファイル: Game1.cs プロジェクト: melware/fanorona
        private bool MakePlayerMove(Tile start, Tile dest)
        {
            Direction d = Board.GetDirection(start, dest);

            // check whether the direction has already been used
            // and whether moving was successful
            var move = GameBoard.MovePiece(start, dest);
            if (!CurrentMoveChain.Contains(d) && move!=null)
            {

                //CurrentMoveChain.Add(d);
                if (move.CapturedTiles.Keys.Count > 1)
                {
                    possibleMove = move;
                    GameBoard.MakeMove(move, move.CapturedTiles.Keys.First());
                }
                else
                {
                    //CurrentPlayerTurnState = PlayerTurnState.Moved;
                    if (move.CapturedTiles.Keys.Any())
                    {
                        var dir = move.CapturedTiles.Keys.First();
                        GameBoard.MakeMove(move, dir);
                    }
                }
                EndTurn();
                Console.WriteLine("Added "+ d.ToString());
                return true;
            }

            return false;
        }
コード例 #4
0
ファイル: Board.cs プロジェクト: melware/fanorona
 public bool AreNeighbors(Tile a, Tile b)
 {
     // TODO: Use better implementation
     return (GetNeighbors(a.Row, a.Col).Contains(b));
 }
コード例 #5
0
ファイル: Game1.cs プロジェクト: melware/fanorona
 private void EndTurn()
 {
     CurrentPlayerTurnState = PlayerTurnState.NoMove;
     SelectedPiece = null;
     CurrentPlayer = Player.Computer;
     possibleMove = null;
 }
コード例 #6
0
ファイル: Game1.cs プロジェクト: melware/fanorona
        private void HandlePieceClick(int x, int y)
        {
            var tile = ClickedOnTile(x, y);
            switch (CurrentPlayerTurnState)
            {
                case PlayerTurnState.NoMove:
                    Console.WriteLine("NoMove");
                    if (tile != null && tile.State != TileState.Empty) // Player clicked on a piece
                    {
                        tile.State = TileState.Selected;
                        CurrentPlayerTurnState = PlayerTurnState.PieceSelected;
                        SelectedPiece = tile;
                    }
                    break;
                case PlayerTurnState.PieceSelected:
                    Console.WriteLine("PieceSelected");
                    if (tile != null && tile.State == TileState.Empty) // Player clicked on empty spot
                    {
                        bool legal = MakePlayerMove(SelectedPiece, tile);
                        if (!legal)
                        {
                            // TODO: Display error message
                            Console.WriteLine("Illegal move");
                            return;
                        }
                        CurrentPlayerTurnState = PlayerTurnState.Moved;
                    }
                break;
                case PlayerTurnState.SelectCapture:
                    Console.WriteLine("SelectCapture");
                    if (possibleMove != null)
                    {

                    }
                break;
                case PlayerTurnState.Moved:
                    if(tile != null){}
                break;
            }
        }
コード例 #7
0
ファイル: Board.cs プロジェクト: melware/fanorona
 public Move(Tile t, Direction d, IDictionary<Direction, ICollection<Tile>> captured)
 {
     startTile = t;
     direction = d;
     CapturedTiles = captured;
 }
コード例 #8
0
ファイル: Board.cs プロジェクト: melware/fanorona
        public static Direction GetDirection(Tile start, Tile dest)
        {
            Direction d = new Direction();
            int x = dest.Col - start.Col;
            int y = dest.Row - start.Row;
            if (x < 0) // left
            {
                d |= Direction.Left;
            }
            else if (x > 0) // right
            {
                d |= Direction.Right;
            }

            if (y < 0) // up
            {
                d |= Direction.Up;
            }
            else if (y > 0) // down
            {
                d |= Direction.Down;
            }

            return d;
        }
コード例 #9
0
ファイル: Board.cs プロジェクト: melware/fanorona
        private void BuildBoard(int r, int c)
        {
            Pieces = new Tile[r, c];

            PopulateMovements();

            PopulatePieces();
        }
コード例 #10
0
ファイル: Board.cs プロジェクト: melware/fanorona
 private ICollection<Tile> GetPossibleDestinations(Tile t)
 {
     return GetPossibleDestinations(t.Row, t.Col);
 }
コード例 #11
0
ファイル: Board.cs プロジェクト: melware/fanorona
        public bool TileExistsInDirection(Tile start, Direction d)
        {
            int xChange = 0;
            int yChange = 0;

            if (start.Type == TileMvt.Adjacent
                && GetTileMvt(d) == TileMvt.Diagonal)
            {
                return false;
            }

            if (d.HasFlag(Direction.Up))
            {
                yChange += -1;
            }
            if (d.HasFlag(Direction.Down))
            {
                yChange += 1;
            }
            if (d.HasFlag(Direction.Left))
            {
                xChange += -1;
            }
            if (d.HasFlag(Direction.Right))
            {
                xChange += 1;
            }

            int newRow = start.Row + yChange;
            int newCol = start.Col + xChange;

            if (!PieceExists(newRow, newCol)) return false;

            return true;
        }
コード例 #12
0
ファイル: Board.cs プロジェクト: melware/fanorona
        public IDictionary<Direction, ICollection<Tile>> GetCapturablePieces(Tile start, Direction dir)
        {
            var capturable = new Dictionary<Direction, ICollection<Tile>>();
            var piece = GetTileInDirection(start, dir);
            if(piece != null)
            {
                while (IsCapturablePiece(start, GetTileInDirection(piece, dir)))
                {
                    var target = GetTileInDirection(piece, dir);
                    if (!capturable.ContainsKey(dir))
                    {
                        capturable[dir] = new List<Tile>();
                    }
                    capturable[dir].Add(target);

                    piece = target;
                }
            }

            var oppDir = GetOppositeDirection(dir);
            piece = start;
            if(piece != null)
            {
                while (IsCapturablePiece(start, GetTileInDirection(piece, oppDir)))
                {
                    var target = GetTileInDirection(piece, oppDir);
                    if (!capturable.ContainsKey(oppDir))
                    {
                        capturable[oppDir] = new List<Tile>();
                    }
                    capturable[oppDir].Add(target);

                    piece = target;
                }
            }

            return capturable;
        }
コード例 #13
0
ファイル: Board.cs プロジェクト: melware/fanorona
        public Move MovePiece(Tile start, Tile dest)
        {
            var state = start.State == TileState.Selected || start.State == TileState.White ?
                TileState.White : TileState.Black;
            var dir = GetDirection(start, dest);
            var move = new Move(start, dir, GetCapturablePieces(start, dir));
            // Validate
            if (GetPossibleMoves(state).Contains(move))
            {
                int startR = move.startTile.Row;
                int startC = move.startTile.Col;
                int destR = dest.Row;
                int destC = dest.Col;
                Pieces[startR, startC].State = TileState.Empty;
                Pieces[destR, destC].State = state;

                return move;
            }
            return null;
        }
コード例 #14
0
ファイル: Board.cs プロジェクト: melware/fanorona
 public bool IsPaika(Tile start, Direction dir)
 {
     return IsPaika(start, GetTileInDirection(start, dir));
 }
コード例 #15
0
ファイル: Board.cs プロジェクト: melware/fanorona
 public bool IsPaika(Tile start, Tile dest)
 {
     Direction d = GetDirection(start, dest);
     var tileInDir = GetTileInDirection(dest, d);
     var tileInOppDir = GetTileInDirection(start, GetOppositeDirection(d));
     // Check if in both directions tiles are empty or nonexistant
     return !( IsCapturablePiece(start, tileInDir)
         || IsCapturablePiece(start, tileInOppDir));
 }
コード例 #16
0
ファイル: Board.cs プロジェクト: melware/fanorona
        public bool IsCapturablePiece(Tile start, Tile target)
        {
            if (target == null) return false;

            TileState a = start.State;
            TileState b = target.State;
            if (a == TileState.Selected) a = TileState.White;
            if (b == TileState.Selected) b = TileState.White;

            return (a == TileState.White && b == TileState.Black
                    || a == TileState.Black && b == TileState.White);
        }
コード例 #17
0
ファイル: Board.cs プロジェクト: melware/fanorona
 public MoveType GetMoveType(Tile start, Tile dest)
 {
     if (IsPaika(start, dest))
     {
         return MoveType.Paika;
     }
     else return MoveType.Capturing;
 }