-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathSoldier.cs
134 lines (126 loc) · 5.78 KB
/
Soldier.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
namespace ChineseChess
{
class Soldier : Piece
{
#region Contructor
public Soldier(Board board, Board.Side side, int rank, int file) : base("Soldier", board, side, rank, file)
{
if (side == Board.Side.Blue)
image.Image = Properties.Resources.BlueSoldier;
else
image.Image = Properties.Resources.RedSoldier;
SelectionChanged += new SelectionChangedEventHandler(OnSelectionChanged);
relativeValue = 10;
}
#endregion
#region Methods
public void OnSelectionChanged(Object sender, EventArgs e)
{
if (isSelected)
{
if (Side == Board.Side.Blue)
image.Image = Properties.Resources.BlueSoldier_Selected;
else
image.Image = Properties.Resources.RedSoldier_Selected;
}
else
{
if (Side == Board.Side.Blue)
image.Image = Properties.Resources.BlueSoldier;
else
image.Image = Properties.Resources.RedSoldier;
}
}
public override List<Move> FindPossibleMoves()
{
List<Move> possibleMoves = new();
Cell targetCell;
if (side == Board.Side.Blue) //Blue side
{
if (rank < 5) //Not passed the river
{
//Go south
targetCell = board.Cells[rank + 1, file];
if (targetCell.Piece == null)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this));
else if (targetCell.Piece.Side != side)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this, targetCell.Piece));
}
else //Passed the river
{
//Go west
if (file > 0)
{
targetCell = board.Cells[rank, file - 1];
if (targetCell.Piece == null)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this));
else if (targetCell.Piece.Side != side)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this, targetCell.Piece));
}
//Go east
if (file < 8)
{
targetCell = board.Cells[rank, file + 1];
if (targetCell.Piece == null)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this));
else if (targetCell.Piece.Side != side)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this, targetCell.Piece));
}
//Go south
if (rank < 9)
{
targetCell = board.Cells[rank + 1, file];
if (targetCell.Piece == null)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this));
else if (targetCell.Piece.Side != side)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this, targetCell.Piece));
}
}
}
else //Red side
{
if (rank > 4) //Not passed the river
{
//Go north
targetCell = board.Cells[rank - 1, file];
if (targetCell.Piece == null)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this));
else if (targetCell.Piece.Side != side)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this, targetCell.Piece));
}
else //Passed the river
{
//Go west
if (file > 0)
{
targetCell = board.Cells[rank, file - 1];
if (targetCell.Piece == null)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this));
else if (targetCell.Piece.Side != side)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this, targetCell.Piece));
}
//Go east
if (file < 8)
{
targetCell = board.Cells[rank, file + 1];
if (targetCell.Piece == null)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this));
else if (targetCell.Piece.Side != side)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this, targetCell.Piece));
}
//Go north
if (rank > 0)
{
targetCell = board.Cells[rank - 1, file];
if (targetCell.Piece == null)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this));
else if (targetCell.Piece.Side != side)
possibleMoves.Add(new Move(rank, file, targetCell.Row, targetCell.Column, this, targetCell.Piece));
}
}
}
return possibleMoves;
}
#endregion
}
}