Игра Халма на 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(); } } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д