Игра Халма на C#: помогите сделать более удобный алгоритм движения
Формулировка задачи:
Здравствуйте,
Мне необходимо создать игру халма, правила которой описаны тут http://en.wikipedia.org/wiki/Halma
Насчет движения, на данный момент сделал алгоритм движения на одну клетку в любую сторону, если она не занята. Но, по правилам игры, пешка может перепрыгивать другую пешку (примерно как в шашках, только пешка, которую перепрыгнули, не удаляется с поля), и я как-то не могу придумать удобный алгоритм, кроме как прописать каждый вариант хода. Помогите решить данную проблему. Если можете то посоветуйте более эффективный обработчик движений.
Вот собственно мною написанный код:
List<Position> list = new List<Position>();
private Position temPos;
private Position tempPos2;
protected override void OnMouseDown(MouseEventArgs e)
{
Position pos;
pos = getPiecePos(e.X, e.Y);
try
{
if (pos == temPos) // If selected the same pawn, deselect it.
{
tempPos2.isSelected = false;
temPos = null;
Invalidate();
Update();
}
else if (pos.isEmpty == false && temPos == null) // if selected pawn, select it.
{
foreach (Position position in list)
{
if (position.getX() == pos.getX() && position.getY() == pos.getY())
{
tempPos2 = position;
tempPos2.isSelected = true;
Invalidate();
Update();
}
}
temPos = pos;
}
else if (pos.isEmpty == true && temPos != null) // move pawn to empty space
{
bool validMove = false;
if (
(temPos.getX() + 1 == pos.getX() && temPos.getY() + 1 == pos.getY()) || // rigt-down
(temPos.getX() + 1 == pos.getX() && temPos.getY() + 0 == pos.getY()) || // right
(temPos.getX() + 1 == pos.getX() && temPos.getY() - 1 == pos.getY()) || // right-up
(temPos.getX() + 0 == pos.getX() && temPos.getY() + 1 == pos.getY()) || // up
(temPos.getX() + 0 == pos.getX() && temPos.getY() - 1 == pos.getY()) || // down
(temPos.getX() - 1 == pos.getX() && temPos.getY() + 1 == pos.getY()) || // left-down
(temPos.getX() - 1 == pos.getX() && temPos.getY() + 0 == pos.getY()) || // left
(temPos.getX() - 1 == pos.getX() && temPos.getY() - 1 == pos.getY()) // left-up
)
{
validMove = true;
pos.setPawn(temPos.getPawn()); // set pawn on position
}
if (validMove == true)
{
foreach (Position position in list) // delete pawn
{
if (position.getX() == temPos.getX() && position.getY() == temPos.getY())
{
position.isEmpty = true;
position.setPawn(null);
}
}
foreach (Position position in list) // unselect temp pos
{
if (position.getX() == tempPos2.getX() && position.getY() == tempPos2.getY())
{
tempPos2.isSelected = false;
}
}
temPos = null;
Invalidate();
Update(); // update client
}
}
else if (pos.isEmpty == true && temPos != null)
{
}
}
catch (Exception ex)
{
Console.Write(ex.ToString());
}
//base.OnMouseDown(e);
}Решение задачи: «Игра Халма на C#: помогите сделать более удобный алгоритм движения»
textual
Листинг программы
protected override void OnMouseDown(MouseEventArgs e)
{
Position currPos = getPiecePosition(e.X, e.Y);
if (currPos == tempPos) // If selected the same pawn, deselect it.
{
deselectPawn();
}
else if (currPos.isEmpty == false && tempPos == null) // if selected pawn, select it.
{
tempPos = currPos;
selectPawn(tempPos);
}
else if (currPos.isEmpty == true && tempPos != null) // move pawn to empty space
{
int tempX = tempPos.getX() - currPos.getX();
int tempY = tempPos.getY() - currPos.getY();
if (checkPosition(tempX, tempY, 1) && currPos.isEmpty)
{
currPos.setPawn(tempPos.getPawn()); // set pawn on position
foreach (Position position in positions)
{
if (tempPos != null && isPositionsEqual(position, tempPos)) // delete pawn
{
position.isEmpty = true;
}
if (isPositionsEqual(position, selectedPosition)) // unselect temp pos
{
deselectPawn();
}
}
}
else if (checkPosition(tempX, tempY, 2) && currPos.isEmpty)
{
if (!positions[currPos.getX() + ((tempX != 0 ? (tempX > 0 ? tempX - 1 : tempX + 1) : 0)),
currPos.getY() +(( tempY != 0 ? (tempY > 0 ? tempY -1 : tempY +1) : 0))].isEmpty)
{
currPos.setPawn(tempPos.getPawn()); // set pawn on position
foreach (Position position in positions)
{
if (tempPos != null && isPositionsEqual(position, tempPos)) // delete pawn
{
position.isEmpty = true;
}
if (isPositionsEqual(position, selectedPosition)) // unselect temp pos
{
deselectPawn();
}
}
}
}
}
}