Шашки. Это код для прыжка вперед влево. изначально это выглядело так:
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| private List<List<int>> _CanJump(List<int> GameBoard, int X, int Y, int Player)
{
List<List<int>> ValidPositions = new List<List<int>> { }; // store valid board locations at end of the move
if (GameBoard[8 * X + Y] != -1)
{
// Jump forward and left
// X = row on board Y = column. both have limits 0<X<8 & 0<Y<8
// valid if opponent piece is placed diagonally next to player piece, and square behind is free.
List<int> JumpFL = new List<int> { };
if ((X - 2 >= 0 && X - 2 < 8) && (Y - 2 >= 0) && (GameBoard[8 * (X - 1) + (Y - 1)] == -Player || GameBoard[8 * (X - 1) + (Y - 1)] == -2 * Player) && GameBoard[8 * (X - 2) + (Y - 2)] == 0)
{
// List<int> JumpFL = new List<int> { 8 * X + Y, 8 * (X - 1) + (Y - 1), 8 * (X - (2)) + (Y - 2) };
JumpFL.Add(8 * X + Y);
JumpFL.Add(8 * (X - 1) + (Y - 1));
JumpFL.Add(8 * (X - (2)) + (Y - 2));
ValidPositions.Add(JumpFL);
}
. . . .
} |
|
Но дамка не может рубить шашки, которые находятся по диагонали. (1 картинка)
И я попытался добавить это. Сначала я попытался реализовать это первым способом (который сейчас закомментирован).Но результат остался прежним. затем я попытался сделать то же самое вторым способом, но где-то определенно есть ошибка, так как произошло следующее (то есть дамка не может идти вперед влево..да что уж там..теперь я не могу ходить вниз вправо и вниз влево.. )(2 картинка)
(-1 и 1 - обычные шашки, -2 и 2 - дамки соответственно)
C# |
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
| private List<List<int>> _CanJump(List<int> GameBoard, int X, int Y, int Player)
{
List<List<int>> ValidPositions = new List<List<int>> { }; // store valid board locations at end of the move
if (GameBoard[8 * X + Y] != -1)
{
// Jump forward and left
// X = row on board Y = column. both have limits 0<X<8 & 0<Y<8
// valid if opponent piece is placed diagonally next to player piece, and square behind is free.
List<int> JumpFL = new List<int> { };
if ((X - 2 >= 0 && X - 2 < 8) && (Y - 2 >= 0) && (GameBoard[8 * (X - 1) + (Y - 1)] == -Player || GameBoard[8 * (X - 1) + (Y - 1)] == -2 * Player) && GameBoard[8 * (X - 2) + (Y - 2)] == 0)
{
// List<int> JumpFL = new List<int> { 8 * X + Y, 8 * (X - 1) + (Y - 1), 8 * (X - (2)) + (Y - 2) };
JumpFL.Add(8 * X + Y);
JumpFL.Add(8 * (X - 1) + (Y - 1));
JumpFL.Add(8 * (X - (2)) + (Y - 2));
/* if ((GameBoard[8 * X + Y] == 2 * Player))
{
int saveY = Y-2;
int index = (8 * X + Y) - 2 * 9;
while (saveY >= 0)
{
if ((GameBoard[index] == -Player) && (GameBoard[index - 9] == 0))
{
int saveindex = index;
int intnumber = saveindex / 8;
int remains = saveindex % 8;
JumpFL.Add(8 * intnumber + remains);
JumpFL.Add(8 * (intnumber - 1) + (remains - 1));
JumpFL.Add(8 * (intnumber - (2)) + (remains - 2));
}
index = index - 9;
saveY--;
}
}*/
if ((GameBoard[8 * X + Y] == 2 * Player))
{
int saveY = Y - 2;
int shift_index = 2;
while (saveY >= 0)
{
if ((GameBoard[8 * (X - shift_index) + (Y - shift_index)] == -Player) && (GameBoard[8 * (X - shift_index - 1) + (Y - shift_index - 1)] == 0))
{
JumpFL.Add(8 * X + Y);
JumpFL.Add(8 * (X - shift_index) + (Y - shift_index));
JumpFL.Add(8 * (X - shift_index - 1) + (Y - shift_index - 1));
}
shift_index++;
saveY--;
}
}
ValidPositions.Add(JumpFL);
}
. . . . .
} |
|
Подскажите пожалуйста, как сделать так, чтобы дамка могла рубить шашки по диагонали? так как я, видимо, напутал в тех алгоритмах, которые должны это делать. Но я пока не могу понять, в чем дело.
Идея, которую я хотел осуществить, была следующая: Внутри сделать дополнительное условие, если это дамка.И если у нас на диагонали( а именно которая направлена вперед влево) есть шашка противника, добавить движения. Но видать напортачил.
Сразу скажу, что я свободно могу ходить по диагонали, с этим проблем нет.Но если на пути есть шашка, при том, не на "соседней" клетке диагонали, то перепрыгнуть и захватить я её не могу. На это сейчас и направлены мои попытки.
Напомню, что этот кусочек только для движения вперед влево.
Я буду благодарен вам за помощь. Заранее спасибо.
(также определитель прыжка)
C# |
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
| private List<List<int>> DeterminJumps(List<int> GameBoard, int X, int Y, int Player)
{
List<List<int>> Moves = new List<List<int>> { };
// Determine all aviable Jumping moves by recussion.
List<List<int>> Jump = _CanJump(GameBoard, X, Y, Player);
if (Jump.Any())
{
for (int i = 0; i < Jump.Count; i++)
{
// convert jump cordinates into new game board
List<int> NewGameState = new List<int> { };
NewGameState.AddRange(GameBoard);
NewGameState[Jump[i][2]] = NewGameState[Jump[i][0]];
NewGameState[Jump[i][0]] = 0;
NewGameState[Jump[i][1]] = 0;
// promote peice if needed
if (Jump[i][2] / 8 == 0 && Player == 1) { NewGameState[Jump[i][2]] = 2; }
else if (Jump[i][2] / 8 == 7 && Player == -1) { NewGameState[Jump[i][2]] = -2; }
List<List<int>> FutureJumps = DeterminJumps(NewGameState, Jump[i][2] / 8, Jump[i][2] % 8, Player);
if (FutureJumps.Any()) { Moves.AddRange(FutureJumps); }
else { Moves.Add(NewGameState); }
}
}
return Moves;
} |
|