public static bool CheckAllyKingBeAttacked(int startX, int startY, int finishX, int finishY, bool[,] chessmanPresenceSign, ControlCollection controls, object sender, bool result) { //Клонируем массив bool[,] fakeChessmanPresenceSign = new bool[8, 8]; for (var i = 0; i < 8; i++) { for (var j = 0; j < 8; j++) { fakeChessmanPresenceSign[i, j] = chessmanPresenceSign[i, j]; } } //Меняем координаты фигуры, как будто ход завершен fakeChessmanPresenceSign[startY, startX] = false; fakeChessmanPresenceSign[finishY, finishX] = true; //Проверка возможности атак на короля foreach (var control in controls) { if (control is King) { if (((Chessman)control).ChessColor == ((Chessman)sender).ChessColor) { var kingfinishX = (((King)control).Location.X - 27) / 50; var kingFinishY = (((King)control).Location.Y - 27) / 50; result = King.CheckKingBeAttacked(kingfinishX, kingFinishY, fakeChessmanPresenceSign, controls, control, result, sender); } } } if (result) { fakeChessmanPresenceSign[startY, startX] = chessmanPresenceSign[startY, startX]; fakeChessmanPresenceSign[finishY, finishX] = chessmanPresenceSign[finishY, finishX]; } return(result); }
public static void CheckEnemyKingBeAttaced(int startX, int startY, int finishX, int finishY, bool[,] chessmanPresenceSign, ControlCollection controls, object sender, Dictionary <string, int> moveOrder) { //Клонируем массив признака расположения шахмат, для фальсификации bool[,] fakeChessmanPresenceSign = new bool[8, 8]; for (var i = 0; i < 8; i++) { for (var j = 0; j < 8; j++) { fakeChessmanPresenceSign[i, j] = chessmanPresenceSign[i, j]; } } fakeChessmanPresenceSign[startY, startX] = false; fakeChessmanPresenceSign[finishY, finishX] = true; //Клонируем свойство расположения шахмат для возможности фальсификации foreach (var control in controls) { if (control is Chessman) { ((Chessman)control).FakeLocation = ((Chessman)control).Location; } } //Проверка возможности шаха foreach (var control in controls) { if (control is King) { if (((Chessman)control).ChessColor != ((Chessman)sender).ChessColor) { var kingfinishX = (((King)control).Location.X - 27) / 50; var kingFinishY = (((King)control).Location.Y - 27) / 50; ((Chessman)control).FakeCheck = true; ((Chessman)sender).ShahSigne = King.CheckKingBeAttacked(kingfinishX, kingFinishY, fakeChessmanPresenceSign, controls, control, false, sender); ((Chessman)control).FakeCheck = false; } } } //Проверка возможности мата if (((Chessman)sender).ShahSigne) { var flag = true; int chessStartX, chessStartY; bool result; //Клонируем свойство расположения шахмат для возможности фальсификации foreach (var control in controls) { if (control is Chessman) { ((Chessman)control).FakeLocation = ((Chessman)control).Location; } } foreach (var control in controls) { if (control is Chessman && flag) { ((Chessman)sender).MateSigne = true; if (((Chessman)control).ChessColor != ((Chessman)sender).ChessColor) { result = true; // Делаем фэйковые координаты chessStartX = (((Chessman)control).Location.X - 27) / 50; chessStartY = (((Chessman)control).Location.Y - 27) / 50; if (control is King) { for (var i = 0; i < 8 && flag; i++) { for (var j = 0; j < 8 && flag; j++) { var chessFinishX = i; var chessFinishY = j; if (chessFinishX != chessStartX || chessFinishY != chessStartY) { ((Chessman)control).FakeCheck = true; result = King.CheckKingMove(chessStartX, chessStartY, chessFinishX, chessFinishY, fakeChessmanPresenceSign, controls, control, sender); ((Chessman)control).FakeCheck = false; if (!result) { flag = false; break; } } } } } if (control is Queen) { for (var i = 0; i < 8 && flag; i++) { for (var j = 0; j < 8 && flag; j++) { //Задаем фэйковое положение var chessFinishX = i; var chessFinishY = j; ((Chessman)control).FakeLocation = new Point(chessFinishX * 50 + 27, chessFinishY * 50 + 27); if (chessFinishX != chessStartX || chessFinishY != chessStartY) { ((Chessman)control).FakeCheck = true; result = Queen.CheckQueenMove(chessStartX, chessStartY, chessFinishX, chessFinishY, fakeChessmanPresenceSign, controls, control, moveOrder); ((Chessman)control).FakeCheck = false; if (!result) { flag = false; break; } } } } } if (control is Castle) { for (var i = 0; i < 8 && flag; i++) { for (var j = 0; j < 8 && flag; j++) { var chessFinishX = i; var chessFinishY = j; ((Chessman)control).FakeLocation = new Point(chessFinishX * 50 + 27, chessFinishY * 50 + 27); if (chessFinishX != chessStartX || chessFinishY != chessStartY) { ((Chessman)control).FakeCheck = true; result = Castle.CheckCastleMove(chessStartX, chessStartY, chessFinishX, chessFinishY, fakeChessmanPresenceSign, controls, control, moveOrder); ((Chessman)control).FakeCheck = false; if (!result) { flag = false; break; } } } } } if (control is Elephant) { for (var i = 0; i < 8 && flag; i++) { for (var j = 0; j < 8 && flag; j++) { var chessFinishX = i; var chessFinishY = j; ((Chessman)control).FakeLocation = new Point(chessFinishX * 50 + 27, chessFinishY * 50 + 27); if (chessFinishX != chessStartX || chessFinishY != chessStartY) { ((Chessman)control).FakeCheck = true; result = Elephant.CheckElephantMove(chessStartX, chessStartY, chessFinishX, chessFinishY, fakeChessmanPresenceSign, controls, control, moveOrder); ((Chessman)control).FakeCheck = false; if (!result) { flag = false; break; } } } } } if (control is Horse) { for (var i = 0; i < 8 && flag; i++) { for (var j = 0; j < 8 && flag; j++) { var chessFinishX = i; var chessFinishY = j; ((Chessman)control).FakeLocation = new Point(chessFinishX * 50 + 27, chessFinishY * 50 + 27); if (chessFinishX != chessStartX || chessFinishY != chessStartY) { ((Chessman)control).FakeCheck = true; result = Horse.CheckHorseMove(chessStartX, chessStartY, chessFinishX, chessFinishY, fakeChessmanPresenceSign, controls, control, moveOrder); ((Chessman)control).FakeCheck = false; if (!result) { flag = false; break; } } } } } if (control is Pawn) { for (var i = 0; i < 8 && flag; i++) { for (var j = 0; j < 8 && flag; j++) { var chessFinishX = i; var chessFinishY = j; ((Chessman)control).FakeLocation = new Point(chessFinishX * 50 + 27, chessFinishY * 50 + 27); if (chessFinishX != chessStartX || chessFinishY != chessStartY) { ((Chessman)control).FakeCheck = true; result = Pawn.CheckPawnMove(chessStartX, chessStartY, chessFinishX, chessFinishY, fakeChessmanPresenceSign, controls, control, moveOrder); ((Chessman)control).FakeCheck = false; if (!result) { flag = false; break; } } } } } if (!result) { ((Chessman)sender).MateSigne = false; } } } } } }