forked from kontur-courses/clean-code
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChessProblem.cs
57 lines (54 loc) · 1.41 KB
/
ChessProblem.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
namespace Chess
{
public class ChessProblem
{
private static Board board;
public static ChessStatus ChessStatus;
public static void LoadFrom(string[] lines)
{
board = new Board(lines);
}
// Определяет мат, шах или пат белым.
public static void CalculateChessStatus()
{
var isCheck = IsCheckForWhite();
var hasMoves = false;
foreach (var locFrom in board.GetPieces(PieceColor.White))
{
foreach (var locTo in board.Get(locFrom).Piece.GetMoves(locFrom, board))
{
var old = board.Get(locTo);
board.Set(locTo, board.Get(locFrom));
board.Set(locFrom, ColoredPiece.Empty);
if (!IsCheckForWhite())
hasMoves = true;
board.Set(locFrom, board.Get(locTo));
board.Set(locTo, old);
}
}
if (isCheck)
if (hasMoves)
ChessStatus = ChessStatus.Check;
else ChessStatus = ChessStatus.Mate;
else if (hasMoves) ChessStatus = ChessStatus.Ok;
else ChessStatus = ChessStatus.Stalemate;
}
// check — это шах
private static bool IsCheckForWhite()
{
var isCheck = false;
foreach (var loc in board.GetPieces(PieceColor.Black))
{
var cell = board.Get(loc);
var moves = cell.Piece.GetMoves(loc, board);
foreach (var destination in moves)
{
if (board.Get(destination).Is(PieceColor.White, Piece.King))
isCheck = true;
}
}
if (isCheck) return true;
return false;
}
}
}