Beispiel #1
0
 void OnMouseDown()
 {
     if (gameObject.tag == "Field")
     {
         Field     fieldToMove = gameObject.GetComponent <Field>();
         MoveTobit currentMove = (MoveTobit)fieldToMove.MoveOn;
         currentMove.figure.MovePlayer(currentMove, ref GameController.Instance.CurrentBoard.board);
         EventManager.Instance.PostNotification(EVENT_TYPE.DEFAULT);
         if (currentMove.haveKill && currentFigure.figure.GetMoves(ref GameController.Instance.CurrentBoard.board).ToList().Exists(x => (x as MoveTobit).haveKill))
         {
             Move[] moves = currentFigure.figure.GetMoves(ref GameController.Instance.CurrentBoard.board);
             GameController.Instance.HighLightMoves(moves);
         }
         else
         {
             GameController.Instance.ChangePlayer();
         }
     }
     if (gameObject.tag == "Figure")
     {
         ViewFigure selectedFigure = gameObject.GetComponent <ViewFigure>();
         if (selectedFigure.figure.Color == GameController.Instance.playerColor)
         {
             if (currentFigure != selectedFigure)
             {
                 EventManager.Instance.PostNotification(EVENT_TYPE.DEFAULT);
             }
             currentFigure = selectedFigure;
             Move[] moves = selectedFigure.figure.GetMoves(ref GameController.Instance.CurrentBoard.board);
             GameController.Instance.HighLightMoves(moves);
         }
     }
 }
Beispiel #2
0
    //Методы

    public void Move(MoveTobit move, ref Figure[,] board)
    {
        board[move.row, move.col] = this;
        board[row, col]           = null;
        col = move.col;
        row = move.row;
        if (move.haveKill)
        {
            board[move.delRow, move.delCol] = null;
        }
        if (Type == FigureType.SUPER)
        {
            return;
        }
        int rows = board.GetLength(0) - 1;

        if (Color == FigureColor.WHITE && row == rows)
        {
            Type = FigureType.SUPER;
        }
        if (Color == FigureColor.BLACK && row == 0)
        {
            Type = FigureType.SUPER;
        }
    }
Beispiel #3
0
    private void MoveAI()
    {
        Move      m        = null;
        float     t        = BoardTobitAI.MiniMaxAlgorithm(CurrentBoard, CurrentBoard.GetCurrentPlayer(), 5, 0, ref m);//5 это макc глубина
        MoveTobit bestMove = (MoveTobit)m;

        Debug.Log("best score " + t);
        Figure figure = bestMove.figure;

        figure.MoveAI(bestMove, ref CurrentBoard.board);
        ChangePlayer();
    }
Beispiel #4
0
 //Ход AI
 public void MoveAI(MoveTobit move, ref Figure[,] board)
 {
     MovePlayer(move, ref board);
     if (move.haveKill)
     {
         Move[] nextKillMoves = move.figure.GetMoves(ref board);
         nextKillMoves = Array.FindAll(nextKillMoves, m => (m as MoveTobit).haveKill);
         if (nextKillMoves != null && nextKillMoves.Length > 0)
         {
             MoveTobit nextkill = (MoveTobit)nextKillMoves[0];
             MoveAI(nextkill, ref board);
         }
     }
 }
Beispiel #5
0
    //Проверка на дамку
    private float IsImrpovedType(FigureColor color, MoveTobit m)
    {
        int rows = board.GetLength(0) - 1;

        if (color == FigureColor.WHITE && m.row == rows)
        {
            return(pointType);
        }
        if (color == FigureColor.BLACK && m.row == 0)
        {
            return(pointType);
        }
        return(0f);
    }
Beispiel #6
0
    //Ход игрока
    public void MovePlayer(MoveTobit move, ref Figure[,] board)
    {
        if (move.haveKill)
        {
            board[move.delRow, move.delCol].DestroyEvent();
        }
        FigureType oldType = Type; //костыль

        Move(move, ref board);
        MovedEvent(move);
        if (oldType != Type)
        {
            BecameSuperEvent();
        }
    }
Beispiel #7
0
    // Оценка за поедание фигур
    private float DoKill(MoveTobit move, BoardTobit currentDesk)
    {
        float points = pointKill;                                                                                 // Начальное значение оценки

        FigureColor   oppositePlayer = IsOppositeColor(move.figure.Color);                                        //текущий цвет противника
        List <Figure> oldFigures     = GetListFigures(currentDesk.board).FindAll(x => x.Color == oppositePlayer); //находим все фигуры противника до хода
        BoardTobit    b          = (BoardTobit)currentDesk.MakeMove(move);                                        //Делаем ход с поеданием фигуры противника
        List <Figure> newFigures = GetListFigures(b.board).FindAll(x => x.Color == oppositePlayer);

        if (newFigures.Count == 0)// провеяем остались ли фигуры у противника
        {
            return(Mathf.Infinity);
        }
        points += pointKill * (oldFigures.Count - newFigures.Count);
        return(points);
    }
Beispiel #8
0
    //Делаем ход "фигурой"
    public override Board MakeMove(Move m)
    {
        BoardTobit movedBoard  = new BoardTobit(this);
        MoveTobit  currentMove = (MoveTobit)m;
        Figure     fig         = new Figure(currentMove.figure);

        fig.Move(currentMove, ref movedBoard.board);
        if (currentMove.haveKill)
        {
            Move[] nextKillMoves = fig.GetMoves(ref movedBoard.board);
            if (Array.Exists(nextKillMoves, x => ((MoveTobit)x).haveKill))
            {
                Move nextMove = Array.Find(nextKillMoves, x => ((MoveTobit)x).haveKill);
                movedBoard = (BoardTobit)movedBoard.MakeMove(nextMove);
            }
        }

        return(movedBoard);
    }
Beispiel #9
0
    public void MoveFigure(MoveTobit move)
    {
        Vector3 pos = GameController.Instance.deskView[move.row, move.col].transform.position;

        gameObject.transform.position = new Vector3(pos.x, pos.y, pos.z - 1);
    }
Beispiel #10
0
    /// <summary>
    /// Возвращаем все возомжные ходы для фигуры типа Super ("дамка")
    /// </summary>
    /// <param name="board">Текущее состояние игрового поле</param>
    /// <returns>Массив все доступных ходов</returns>
    private List <Move> GetMovesSuper(ref Figure[,] board)
    {
        List <Move> moves = new List <Move>();

        int[] moveX = new int[] { -1, 1 };
        int[] moveY = new int[] { -1, 1 };

        foreach (var mX in moveX)
        {
            if (row == 0 || row == board.GetLength(0) - 1) // если крайние строки, то нельзя ходить вправо или влево
            {
                break;
            }
            int       nextX    = col + mX;
            int       nextY    = row;
            MoveTobit killMove = new MoveTobit();           //Данные поедаемой фигуры, нам нужны координаты уничтожаемой с поля фигуры
            while (IsMoveInBounds(nextX, nextY, ref board)) //Идем по направляения пока не дойдем до края игрового поля
            {
                Figure p = board[nextY, nextX];
                if (p != null && p.Color == Color) // Проверка на возомжность хода
                {
                    break;
                }
                MoveTobit m = new MoveTobit();
                m.figure = this;
                if (p == null)
                {
                    m.col = nextX;
                    m.row = nextY;
                    if (killMove.haveKill) //Если имеется клетка для поедания, сохраним координаты для поедания фигуры
                    {
                        m.haveKill = killMove.haveKill;
                        m.delCol   = killMove.delCol;
                        m.delRow   = killMove.delRow;
                    }
                }
                else
                {
                    if (!killMove.haveKill)
                    {
                        int hopX = nextX + mX;
                        int hopY = nextY;
                        if (!IsMoveInBounds(hopX, hopY, ref board))
                        {
                            break;
                        }
                        if (board[hopY, hopX] != null)
                        {
                            break;
                        }
                        m.haveKill = true;
                        m.col      = hopX;
                        m.row      = hopY;
                        m.delCol   = nextX;
                        m.delRow   = nextY;
                        nextX      = hopX;
                        killMove   = m;
                    }
                    else // Если имеется клетка для поедания, выходим из цикла
                    {
                        break;
                    }
                }
                moves.Add(m);
                nextX += mX;
            }
        }
        foreach (var mY in moveY)
        {
            if (col == 0 || col == board.GetLength(1) - 1) // если крайние столбцы, то нельзя ходить вверж или вниз
            {
                break;
            }
            int       nextX    = col;
            int       nextY    = row + mY;
            MoveTobit killMove = new MoveTobit();//Данные поедаемой фигуры, нам нужны координаты уничтожаемой с поля фигуры
            while (IsMoveInBounds(nextX, nextY, ref board))
            {
                Figure p = board[nextY, nextX];
                if (p != null && p.Color == Color) // Проверка на возомжность хода
                {
                    break;
                }
                MoveTobit m = new MoveTobit();
                m.figure = this;
                if (p == null)
                {
                    m.col = nextX;
                    m.row = nextY;
                    if (killMove.haveKill) //Если имеется клетка для поедания, сохраним координаты для поедания фигуры
                    {
                        m.haveKill = killMove.haveKill;
                        m.delCol   = killMove.delCol;
                        m.delRow   = killMove.delRow;
                    }
                }
                else
                {
                    if (!killMove.haveKill)
                    {
                        int hopX = nextX;
                        int hopY = nextY + mY;
                        if (!IsMoveInBounds(hopX, hopY, ref board))
                        {
                            break;
                        }
                        if (board[hopY, hopX] != null)
                        {
                            break;
                        }
                        m.haveKill = true;
                        m.col      = hopX;
                        m.row      = hopY;
                        m.delCol   = nextX;
                        m.delRow   = nextY;
                        nextY      = hopY;
                        killMove   = m;
                    }
                    else // Если имеется клетка для поедания, выходим из цикла
                    {
                        break;
                    }
                }
                moves.Add(m);
                nextY += mY;
            }
        }
        if (moves.Exists(x => (x as MoveTobit).haveKill))
        {
            moves = moves.FindAll(x => (x as MoveTobit).haveKill);
        }
        return(moves);
    }
Beispiel #11
0
    /// <summary>
    /// Возвращаем все возомжные ходы для фигуры типа Normal
    /// </summary>
    /// <param name="board">Текущее состояние игрового поле</param>
    /// <returns>Массив все доступных ходов</returns>
    private List <Move> GetMovesNormal(ref Figure[,] board)
    {
        List <Move> moves = new List <Move>();

        int[] moveX = new int[] { -1, 1 };
        int[] moveY = new int[] { 1, -1 };
        if (Color == FigureColor.BLACK)
        {
            moveY = new int[] { -1, 1 }
        }
        ;
        //Проверяем возможность ходить вправо и влево
        foreach (int mX in moveX)
        {
            if (row == 0 || row == board.GetLength(0) - 1) // если крайние строки, то нельзя ходить вправо или влево
            {
                break;
            }
            int nextX = col + mX;
            if (!IsMoveInBounds(nextX, row, ref board)) // проверяем край игрового поля для хода
            {
                continue;
            }

            Figure f = board[row, nextX];
            if (f != null && f.Color == Color) //проверяем находится ли на клетке фигура того же цвета
            {
                continue;
            }
            MoveTobit m = new MoveTobit();
            m.figure = this;
            if (f == null) // добавляем координаты для обычного хода
            {
                m.col = nextX;
                m.row = row;
            }
            else //добавляем координаты для хода с поеданием фигуры противника
            {
                int hopX = nextX + mX;
                if (!IsMoveInBounds(hopX, row, ref board))
                {
                    continue;
                }
                if (board[row, hopX] != null)
                {
                    continue;
                }
                m.col      = hopX;
                m.row      = row;
                m.haveKill = true;
                m.delCol   = nextX;
                m.delRow   = row;
            }
            moves.Add(m);
        }

        //Проверяем возможность ходить прямо или бить назад
        for (int i = 0; i < moveY.Length; i++)
        {
            if (col == 0 || col == board.GetLength(1) - 1) // если крайние столбцы, то нельзя ходить вправо или влево
            {
                break;
            }
            int nextY = row + moveY[i];
            if (!IsMoveInBounds(col, nextY, ref board)) // проверяем край игрового поля для хода
            {
                continue;
            }
            Figure f = board[nextY, col];
            if (f != null && f.Color == Color) //проверяем находится ли на клетке фигура того же цвета
            {
                continue;
            }
            MoveTobit m = new MoveTobit();
            m.figure = this;
            if (f == null)  // добавляем координаты для обычного хода
            {
                if (i == 0) // это ход вперед
                {
                    m.col = col;
                    m.row = nextY;
                }
                else                //назад ходить нельзя
                {
                    continue;
                }
            }
            else //добавляем координаты для хода с поеданием фигуры противника
            {
                int hopY = nextY + moveY[i];
                if (!IsMoveInBounds(col, hopY, ref board))
                {
                    continue;
                }
                if (board[hopY, col] != null)
                {
                    continue;
                }
                m.col      = col;
                m.row      = hopY;
                m.haveKill = true;
                m.delCol   = col;
                m.delRow   = nextY;
            }

            moves.Add(m);
        }
        if (moves.Exists(x => (x as MoveTobit).haveKill))
        {
            moves = moves.FindAll(x => (x as MoveTobit).haveKill);
        }
        return(moves);
    }