Ejemplo n.º 1
0
 void OnTamMoved(PublicDataType.IntegerVector2 position)
 {
     if (isPrevoiusTurnMoved || (isCurrentTurnMoved && previousTurnPosition == position))
     {
         numberOfTamenMako++;
     }
     isCurrentTurnMoved = true;
     currentPosition    = position;
 }
Ejemplo n.º 2
0
        bool IsJudgmentNecessary(IPiece movingPiece, PublicDataType.IntegerVector2 start, PublicDataType.IntegerVector2 end)
        {
            bool isInWater                     = fieldEffectChecker.IsInTammua(start);
            bool isIntoWater                   = fieldEffectChecker.IsInTammua(end);
            bool canLittuaWithoutJudge         = movingPiece.CanLittuaWithoutJudge();
            bool isNecessaryWaterEntryJudgment = !isInWater && isIntoWater && !canLittuaWithoutJudge;

            return(isNecessaryWaterEntryJudgment);
        }
Ejemplo n.º 3
0
        public async UniTask <PieceMoveResult> MovePiece(PublicDataType.IntegerVector2 startPosition,
                                                         PublicDataType.IntegerVector2 viaPosition,
                                                         PublicDataType.IntegerVector2 endPosition,
                                                         IPlayer player, IValueInputProvider <int> valueProvider)
        {
            if (isLocked)
            {
                return(new PieceMoveResult(false, false, null));
            }

            var verifiedMove = moveVerifier.VerifyMove(player, startPosition, viaPosition, endPosition);

            if (verifiedMove == VerifiedMove.InvalidMove)
            {
                return(new PieceMoveResult(false, false, null));
            }


            //1ターンに複数回動作する駒のためのロジック
            //ターン管理をここでするな!
            var movingPiece = verifiedMove.MovingPiece;

            if (movingPiece == operationStatus.PreviousPiece)
            {
                operationStatus.AddCount();
            }
            else
            {
                if (operationStatus.PreviousPiece != null)
                {
                    return(new PieceMoveResult(false, false, null));
                }
                else
                {
                    operationStatus.Reset(movingPiece);
                }
            }
            bool isTurnEnd = operationStatus.Count >= movingPiece.NumberOfMoves;

            if (isTurnEnd)
            {
                operationStatus.Reset(null);
            }

            isLocked = true;
            IPieceMoveTransaction pieceMoveAction = pieceMoveActionFactory.Create(player, verifiedMove, pieces, fieldEffectChecker, valueProvider, isTurnEnd);

            PieceMoveResult result = await pieceMoveAction.StartMove();

            if (result.isSuccess)
            {
                onEveryValueChanged.OnNext(Unit.Default);
            }
            isLocked = false;

            return(result);
        }
Ejemplo n.º 4
0
        public IReadOnlyPiece GetPiece(PublicDataType.IntegerVector2 position)
        {
            if (!IsOnBoard(position))
            {
                return(null);
            }

            return(pieces.Read(position));
        }
Ejemplo n.º 5
0
 public King(Terminologies.PieceColor color, PublicDataType.IntegerVector2 position, IPlayer owner, IExpandingMoveFieldChecker fieldChecker)
     : base(position, color, owner, Terminologies.PieceName.King, fieldChecker)
 {
     normalPieceMovements = new PieceMovement[]
     {
         new PieceMovement(new PublicDataType.IntegerVector2(0, 1), 1), new PieceMovement(new PublicDataType.IntegerVector2(0, -1), 1),
         new PieceMovement(new PublicDataType.IntegerVector2(1, 0), 1), new PieceMovement(new PublicDataType.IntegerVector2(-1, 0), 1),
         new PieceMovement(new PublicDataType.IntegerVector2(1, 1), 1), new PieceMovement(new PublicDataType.IntegerVector2(1, -1), 1),
         new PieceMovement(new PublicDataType.IntegerVector2(-1, 1), 1), new PieceMovement(new PublicDataType.IntegerVector2(-1, -1), 1)
     };
     expansionPieceMovements = normalPieceMovements;
 }
Ejemplo n.º 6
0
 public Vessel(Terminologies.PieceColor color, PublicDataType.IntegerVector2 position, IPlayer owner, IExpandingMoveFieldChecker fieldChecker)
     : base(position, color, owner, Terminologies.PieceName.Vessel, fieldChecker)
 {
     normalPieceMovements = new PieceMovement[]
     {
         new PieceMovement(new PublicDataType.IntegerVector2(0, 1), -1)
     };
     expansionPieceMovements = normalPieceMovements.Union(new PieceMovement[]
     {
         new PieceMovement(new PublicDataType.IntegerVector2(0, -1), -1), new PieceMovement(new PublicDataType.IntegerVector2(1, 0), 2), new PieceMovement(new PublicDataType.IntegerVector2(-1, 0), 2)
     }).ToArray();
 }
Ejemplo n.º 7
0
 public Chariot(Terminologies.PieceColor color, PublicDataType.IntegerVector2 position, IPlayer owner, IExpandingMoveFieldChecker fieldChecker)
     : base(position, color, owner, Terminologies.PieceName.Chariot, fieldChecker)
 {
     normalPieceMovements = new PieceMovement[]
     {
         new PieceMovement(new PublicDataType.IntegerVector2(2, 0), 1), new PieceMovement(new PublicDataType.IntegerVector2(-2, 0), 1),
         new PieceMovement(new PublicDataType.IntegerVector2(0, 2), 1), new PieceMovement(new PublicDataType.IntegerVector2(0, -2), -1),
     };
     expansionPieceMovements = new PieceMovement[]
     {
         new PieceMovement(new PublicDataType.IntegerVector2(2, 2), 1), new PieceMovement(new PublicDataType.IntegerVector2(-2, 2), 1),
         new PieceMovement(new PublicDataType.IntegerVector2(2, -2), 1), new PieceMovement(new PublicDataType.IntegerVector2(-2, -2), 1)
     };
 }
Ejemplo n.º 8
0
        public bool SetPiece(PublicDataType.IntegerVector2 position, IPiece piece)
        {
            if (!IsOnBoard(position) || pieces.Read(position) != null)
            {
                return(false);
            }

            if (piece.Position != new PublicDataType.IntegerVector2(-1, -1))
            {
                return(false);
            }

            piece.SetOnBoard(position);
            pieces.Write(position, piece);
            onEveryValueChanged.OnNext(Unit.Default);
            return(true);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 指定された駒を空いたマスに移動する.
        /// </summary>
        /// <param name="movingPiece"></param>
        /// <param name="endWorldPosition"></param>
        /// <param name="isForceMove"></param>
        /// <returns></returns>
        public bool MovePiece(IPiece movingPiece, PublicDataType.IntegerVector2 endWorldPosition, bool isForceMove = false)
        {
            PublicDataType.IntegerVector2 startWorldPosition = movingPiece.Position;

            if (pieceMap.Read(endWorldPosition) != null)
            {
                return(false);
            }

            if (!movingPiece.MoveTo(endWorldPosition, isForceMove))
            {
                return(false);
            }

            //この順で書きまないと現在いる座標と同じ座標をendWorldPositionに指定されたとき盤上から駒の判定がなくなる
            pieceMap.Write(startWorldPosition, null);
            pieceMap.Write(endWorldPosition, movingPiece);
            return(true);
        }
Ejemplo n.º 10
0
        public CaptureResult CapturePiece(IPlayer player, IPiece capturer, PublicDataType.IntegerVector2 targetPosition)
        {
            IPiece targetPiece = pieces.Read(targetPosition);

            if (targetPiece == null)
            {
                return(new CaptureResult(true, capturer, null, null, targetPosition));
            }

            if (!IsCapturable(player, capturer, targetPiece) || !targetPiece.CaptureFromBoard())
            {
                return(new CaptureResult(false, capturer, null, null, targetPosition));
            }

            IPlayer formerOwner = targetPiece.Owner;

            targetPiece.SetOwner(player);
            pieces.Write(targetPosition, null);
            return(new CaptureResult(true, capturer, targetPiece, formerOwner, targetPosition));
        }
Ejemplo n.º 11
0
 void OnTurnChanged(Unit unit)
 {
     isPrevoiusTurnMoved  = isCurrentTurnMoved;
     isCurrentTurnMoved   = false;
     previousTurnPosition = currentPosition;
 }
Ejemplo n.º 12
0
 public UniTask <PieceMoveResult> MovePiece(PublicDataType.IntegerVector2 startPosition, PublicDataType.IntegerVector2 lastPosition, IPlayer player, IValueInputProvider <int> valueProvider)
 => MovePiece(startPosition, lastPosition, lastPosition, player, valueProvider);
Ejemplo n.º 13
0
 bool IsInAroundPieces(PublicDataType.IntegerVector2 position)
 {
     return(pieces.Select(piece => piece.Position).All(piecePosition => (piecePosition - position).sqrMagnitude <= 8));
 }
Ejemplo n.º 14
0
 public bool IsInTarfe(PublicDataType.IntegerVector2 position)
 {
     return(columns.Read(position) == FieldEffect.Tarfe || columns.Read(position) == FieldEffect.Tanzo || IsInAroundPieces(position));
 }
Ejemplo n.º 15
0
 public bool IsInTammua(PublicDataType.IntegerVector2 position)
 {
     return(columns.Read(position) == FieldEffect.Tammua || columns.Read(position) == FieldEffect.Tanzo);
 }
Ejemplo n.º 16
0
 public bool IsOnBoard(PublicDataType.IntegerVector2 position)
 {
     return(position.x >= 0 && position.y >= 0 && position.x < pieces.Width && position.y < pieces.Height);
 }
Ejemplo n.º 17
0
 public async UniTask <bool> CheckWaterEntry(IPiece movingPiece, PublicDataType.IntegerVector2 start, PublicDataType.IntegerVector2 end)
 {
     return(!IsJudgmentNecessary(movingPiece, start, end) || await JudgeWaterEntry());
 }
Ejemplo n.º 18
0
 public bool IsExpandedMoveField(PublicDataType.IntegerVector2 position) => IsInTarfe(position);
Ejemplo n.º 19
0
        public (PieceMoveResult pieceMoveResult, CaptureResult captureResult) ConfirmMove(IPlayer player, IPiece movingPiece, PublicDataType.IntegerVector2 endWorldPosition, bool isTurnEnd, bool isForceMove = false)
        {
            var captureResult = capturer.CapturePiece(player, movingPiece, endWorldPosition);

            if (!captureResult.IsSuccess)
            {
                return(new PieceMoveResult(false, false, captureResult.Captured), captureResult);
            }

            mover.MovePiece(movingPiece, endWorldPosition, isForceMove);
            return(new PieceMoveResult(true, isTurnEnd, captureResult.Captured), captureResult);
        }
Ejemplo n.º 20
0
        PublicDataType.IntegerVector2 currentPosition;      //現在のtamの座標

        public TamObserver(IObservable <Unit> onTurnChanged, IObservable <Unit> onEveruValueChangedOnBoard, IReadOnlyPiece tam)
        {
            previousTurnPosition = currentPosition = tam.Position;
            onEveruValueChangedOnBoard.Select(_ => tam.Position).DistinctUntilChanged().Subscribe(OnTamMoved);
            onTurnChanged.Subscribe(OnTurnChanged);
        }