Beispiel #1
0
        public static List <BoardVector> getInfoPos(
            MoveInfo moveInfo, BoardVector frontDirection, BoardVector piecePos, Board board, int id)
        {
            var movable = new List <BoardVector>();
            var dir     = BoardVector.rotateTo(moveInfo.Direction, frontDirection);

            if (moveInfo.IsEndless)
            {
                var goingPos = searchForEndless(id, piecePos, dir, board, moveInfo.IsJump);
                movable.AddRange(goingPos);
            }
            else
            {
                var currPos = piecePos;
                for (int i = 0; i < moveInfo.MoveAmounts; i++)
                {
                    if (canPassFrom(id, currPos, currPos + dir, board, moveInfo.IsJump))
                    {
                        movable.Add(currPos + dir);
                    }

                    currPos += dir;
                }
            }

            return(movable);
        }
Beispiel #2
0
        //UnityのVector2を使って無理矢理回転させる
        public static BoardVector rotateTo(BoardVector vec, BoardVector direction)
        {
            var vec2        = new Vector2(vec.x, vec.y);
            var direction2  = new Vector2(direction.x, direction.y);
            var rotatedVec2 = Quaternion.FromToRotation(new Vector2(0, 1), direction2) * vec2;

            return(new BoardVector(Mathf.Round(rotatedVec2.x), Mathf.Round(rotatedVec2.y)));
        }
Beispiel #3
0
        public override void movePiece(BoardVector prevPos, BoardVector newPos)
        {
            var piece = getPiece(prevPos);

            takePiece(newPos);
            piece.moveTo(getStartScreenPos(), getSquareScale(), newPos, getScreenScaleRate());
            _pieces[newPos.x][newPos.y]   = piece;
            _pieces[prevPos.x][prevPos.y] = null;
        }
Beispiel #4
0
        public override void takePiece(BoardVector piecePos)
        {
            var piece = getPiece(piecePos);

            if (piece == null)
            {
                return;
            }
            _pieces[piecePos.x][piecePos.y] = null;
            piece.takePiece(piecePos);
        }
Beispiel #5
0
        static bool isXEnteredFin(BoardVector currPos, BoardVector to, int dir)
        {
            switch (dir)
            {
            case 1:
                return(currPos.x >= to.x);

            case -1:
                return(currPos.x <= to.x);

            case 0:
                return(true);
            }

            throw new InvalidProgramException("invalid direction");
        }
Beispiel #6
0
        public override SquareStatus getStatus(int id, BoardVector pos)
        {
            if (pos.x < 0 || numOfSquare <= pos.x || pos.y < 0 || numOfSquare <= pos.y)
            {
                return(SquareStatus.OUT_BOARD);
            }

            var piece = getPiece(pos);

            if (piece == null)
            {
                return(SquareStatus.FREE);
            }

            return((piece.getOwner().getId() == id) ? SquareStatus.ALLY : SquareStatus.ENEMY);
        }
Beispiel #7
0
        public static List <BoardVector> searchForEndless(int id, BoardVector from, BoardVector direction, Board board, bool canJump = false)
        {
            var pos        = from;
            var movablePos = new List <BoardVector>();
            int looped     = 0;

            while (true)
            {
                looped++;
                if (looped > 10)
                {
                    throw new InvalidProgramException("infinity loop");
                }

                if (canJump)
                {
                    if (canMoveTo(id, pos + direction, board))
                    {
                        pos += direction;
                        movablePos.Add(pos);
                        if (board.getStatus(id, pos) != ENEMY)
                        {
                            continue;
                        }
                    }
                    break;
                }
                else
                {
                    if (canPassFrom(id, pos, pos + direction, board))
                    {
                        pos += direction;
                        movablePos.Add(pos);
                        if (board.getStatus(id, pos) != ENEMY)
                        {
                            continue;
                        }
                    }
                    break;
                }
            }

            return(movablePos);
        }
Beispiel #8
0
 public abstract void movePiece(BoardVector prevPos, BoardVector newPos);
Beispiel #9
0
 public abstract Piece getPiece(BoardVector pos);
Beispiel #10
0
 public static bool isInScale(BoardVector pos, BoardVector boardScale)
 {
     return(0 <= pos.x && pos.x < boardScale.x && 0 <= pos.y && pos.y < boardScale.y);
 }
Beispiel #11
0
        public static bool canPassFrom(int id, BoardVector from, BoardVector to, Board board, bool canJump = false)
        {
            if (canJump)
            {
                return(canMoveTo(id, to, board));
            }
            if (!canMoveTo(id, to, board))
            {
                return(false);
            }

            var                 dir         = to - from;
            var                 dirX        = getDir(dir.x);
            var                 dirY        = getDir(dir.y);
            BoardVector         currPos     = from;
            List <List <bool> > movableList = new List <List <bool> >();

            movableList.Add(new List <bool>());
            int y = 0;
            int x = 0;

            //開始地点を左下、目標到着地点を右上とした時の状況をmovableListに格納
            //あるマス(currPos)に対し、movableListの情報からそのマスに侵入する経路があるかどうかを取得
            //上の動作を左→右、上行って戻って左→右...とすることで経路を探索
            //O(x * y)で経路探索可能
            while (true)
            {
                bool canEnter =
                    canEnterFrom(movableList, x - 1, y) ||
                    canEnterFrom(movableList, x, y - 1) ||
                    canEnterFrom(movableList, x - 1, y - 1);

                if (currPos == to)
                {
                    return(canEnter && canMoveTo(id, currPos, board));
                }

                movableList[y].Add((board.getStatus(id, currPos) == FREE && canEnter) || (x == 0 && y == 0));

                if (isXEnteredFin(currPos, to, dirX))
                {
                    movableList.Add(new List <bool>());
                    currPos.y += dirY;
                    currPos.x  = from.x;
                    x          = 0;
                    y++;
                }
                else
                {
                    currPos.x += dirX;
                    x++;
                }


                if (x > 64 || y > 64)
                {
                    Debug.Log("curr:" + currPos);
                    Debug.Log("from : " + from + " to:" + to);
                    Debug.Log("dirX:" + dirX + " dirY:" + dirY);
                    throw new InvalidProgramException("infinity loop");
                }
            }
        }
Beispiel #12
0
 public bool Equals(BoardVector other)
 {
     return(x == other.x && y == other.y);
 }
Beispiel #13
0
 public static bool isInScale(BoardVector pos, Board board)
 {
     return(isInScale(pos, board.getBoardScale()));
 }
Beispiel #14
0
 public override Piece getPiece(BoardVector pos)
 {
     return(_pieces[pos.x][pos.y]);
 }
Beispiel #15
0
 public abstract void takePiece(BoardVector piecePos);
Beispiel #16
0
 public abstract SquareStatus getStatus(int id, BoardVector pos);
Beispiel #17
0
        public static bool canMoveTo(int id, BoardVector pos, Board board)
        {
            var status = board.getStatus(id, pos);

            return(status == FREE || status == ENEMY);
        }