Как реализовать родительский метод для C # - PullRequest
0 голосов
/ 05 мая 2018

Этот метод делает все ходы для текущей доски, затем делает все ходы противника, затем делает ход в будущем для игрока 1 и оценивает лучший ход. как получить корень или родитель этого лучшего хода?

вот мой код;

public override Move GetMove(Board board)
{
    List<Move> moves = board.getMoveList();
    double bestValue, currentValue; ;
    Move bestMove = moves.First();
    Board firstBoard = board.DeepClone();
    firstBoard.Move(bestMove);
    bestValue = Evaluator(firstBoard);

    List<Move> tieMoves = new List<Move>();

    foreach (Move aMove in moves)
    {
        Board board2 = board.DeepClone();
        board2.Move(aMove);
        // If there is a move in one take it and leave
        if (board2.WhoWon() == side)
            return aMove;

    // check player 2 moves
    foreach (Move bMove in moves)
        {
         Board board3 = board2.DeepClone();
         board3.Move(bMove);
         // If there is a move in one take it and leave
         if (board3.WhoWon() == side)
             return aMove;
        // check player 1 future moves
        foreach (Move bMove in moves)
            {
             Board board4 = board3.DeepClone();
             board4.Move(cMove);
             // If there is a move in one take it and leave
             if (board4.WhoWon() == side)
               return aMove;

           currentValue = Evaluator(board4);
          if (
               (side == Pieces.ATTACK && currentValue > bestValue)
               || (side == Pieces.DEFEND && currentValue < bestValue)
               )
            {
                tieMoves = new List<Move>();
        tieMoves.Add(aMove);
                bestMove = aMove;
                bestValue = currentValue;
                }
        }
    }
    }
    // Pick one from the candidate moves with the same value
    return tieMoves.ElementAt(random.Next(tieMoves.Count));
}

1 Ответ

0 голосов
/ 05 мая 2018

Вы должны когда-либо добавлять aMove только в список tieMoves, так как вы всегда хотите выполнить только одно из aMoves, однако bestValue останется bMove, cMove, aMove или любым другим по вашему выбору. Таким образом, вы сравниваете лучший дочерний результат (т. Е. Это результат создания A, затем B, а затем C), но вы сохраняете родительский ход (A - это первый ход, который вам нужно сделать)

...