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); }
//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))); }
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; }
public override void takePiece(BoardVector piecePos) { var piece = getPiece(piecePos); if (piece == null) { return; } _pieces[piecePos.x][piecePos.y] = null; piece.takePiece(piecePos); }
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"); }
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); }
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); }
public abstract void movePiece(BoardVector prevPos, BoardVector newPos);
public abstract Piece getPiece(BoardVector pos);
public static bool isInScale(BoardVector pos, BoardVector boardScale) { return(0 <= pos.x && pos.x < boardScale.x && 0 <= pos.y && pos.y < boardScale.y); }
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"); } } }
public bool Equals(BoardVector other) { return(x == other.x && y == other.y); }
public static bool isInScale(BoardVector pos, Board board) { return(isInScale(pos, board.getBoardScale())); }
public override Piece getPiece(BoardVector pos) { return(_pieces[pos.x][pos.y]); }
public abstract void takePiece(BoardVector piecePos);
public abstract SquareStatus getStatus(int id, BoardVector pos);
public static bool canMoveTo(int id, BoardVector pos, Board board) { var status = board.getStatus(id, pos); return(status == FREE || status == ENEMY); }