Игра Халма на 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();
                            }
                        }
                    }
                }
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.333 из 5
Похожие ответы