/// <summary> /// Check if move is possible /// </summary> /// <remarks> /// For Pawn with State.Counter it calls: BeatChecker.CanCounterBeat(startField, endField) /// or BeatChecker.CanCounterMove(startField, endField), based on how long is move, /// and active CheckQueen(startField, endField) /// For Pawn with State.Queen it calls: BeatChecker.CanQueenMove(startField, endField) /// if its true, method return true, if not it calls beatChecker.CanQueenBeat(startField, endField); /// Based on that it ser private values move, beat, beatX, beatY, /// </remarks> /// <returns> /// True: if move is possible, /// False: if move is not possible /// </returns> /// <seealso cref="CheckQueen(Field, Field)"/> /// <seealso cref="BeatChecker"/> /// <seealso cref="BeatChecker.CanCounterMove(Field, Field)"/> /// <seealso cref="BeatChecker.CanCounterBeat(Field, Field)"/> /// <seealso cref="BeatChecker.CanQueenMove(Field, Field)"/> /// <seealso cref="BeatChecker.CanQueenBeat(Field, Field)"/> public bool CanMove() { var startField = board.fields[posStartX, posStartY]; if (posEndX > lastIndex || posEndX < firstIndex || posEndY > lastIndex || posEndY < firstIndex) { return(false); } var endField = board.fields[posEndX, posEndY]; switch (pawnController.state) { case State.Counter: CheckQueen(startField, endField); if (Math.Abs(posStartX - posEndX) > 1) { if (beatChecker.CanCounterBeat(startField, endField)) { move = true; beat = true; beatX = Math.Max(startField.X, endField.X) - 1; beatY = Math.Max(startField.Y, endField.Y) - 1; } } else if (beatChecker.CanCounterMove(startField, endField)) { move = true; } break; case State.Queen: Debug.Log("QUEEN MOVE"); if (beatChecker.CanQueenMove(startField, endField)) { move = true; } else if (beatChecker.CanQueenBeat(startField, endField)) { move = true; beat = true; beatX = beatChecker.BeatX; beatY = beatChecker.BeatY; } break; default: return(false); } if (move) { return(true); } return(false); }
/// <summary> /// Method for checking possibility of beat /// </summary> /// <remarks> /// It check every possible move for Counter and Queen, if beat was possible for specyfic pawn, /// it is added to list which is returned. /// </remarks> /// <param name="pawns">Pawns of player who was moving</param> /// <returns>List of pawns to kill</returns> public List <PawnController> CheckBeats(List <PawnController> pawns) { List <PawnController> pawnsToKill = new List <PawnController>(); foreach (var pawn in pawns) { switch (pawn.state) { case State.Dead: break; case State.Counter: if (NumberNotBig(pawn.Field.X) && NumberNotBig(pawn.Field.Y)) { if (beatChecker.CanCounterBeat(pawn.Field, board.fields[pawn.Field.X + 2, pawn.Field.Y + 2])) { pawnsToKill.Add(pawn); break; } } if (NumberNotBig(pawn.Field.X) && NumberNotSmall(pawn.Field.Y)) { if (beatChecker.CanCounterBeat(pawn.Field, board.fields[pawn.Field.X + 2, pawn.Field.Y - 2])) { pawnsToKill.Add(pawn); break; } } if (NumberNotSmall(pawn.Field.X) && NumberNotBig(pawn.Field.Y)) { if (beatChecker.CanCounterBeat(pawn.Field, board.fields[pawn.Field.X - 2, pawn.Field.Y + 2])) { pawnsToKill.Add(pawn); break; } } if (NumberNotSmall(pawn.Field.X) && NumberNotSmall(pawn.Field.Y)) { if (beatChecker.CanCounterBeat(pawn.Field, board.fields[pawn.Field.X - 2, pawn.Field.Y - 2])) { pawnsToKill.Add(pawn); break; } } break; case State.Queen: var breakC = false; var signX = 1; var signY = 1; var range = SetUpRange(); var it = 0; while (it <= 3) { var count = 1; while (count <= maxIndex) { int?x = range[it][0]; int?y = range[it][1]; if (range[it][0] == 0) { if (pawn.Field.X - count < 0) { x = null; } } if (range[it][0] == maxIndex) { if (pawn.Field.X + count > maxIndex) { x = null; } } if (range[it][1] == 0) { if (pawn.Field.Y + count > 0) { y = null; } } if (range[it][1] == maxIndex) { if (pawn.Field.Y + count > maxIndex) { y = null; } } if (x != null && y != null) { if (range[it][0] == 0) { signX = -1; } else { signX = 1; } if (range[it][1] == 0) { signY = -1; } else { signY = 1; } if (beatChecker.CanQueenBeat(pawn.Field, board.fields[pawn.Field.X + count * signX, pawn.Field.Y + count * signY])) { pawnsToKill.Add(pawn); breakC = true; break; } } count++; } if (breakC) { break; } it++; } break; } } return(pawnsToKill); }