AiPlayer.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "AiPlayer.h"
  2. #include "Position.h"
  3. #include "Chessboard.h"
  4. #include "King.h"
  5. #include <iostream>
  6. #include <utility>
  7. #include <vector>
  8. std::pair<bool, vector<std::pair<Position, Position>>> get_solve(Chessboard board, char turn, int depth)
  9. {
  10. if (depth==0) {
  11. return std::pair<bool, vector<std::pair<Position, Position>>>(false, vector<std::pair<Position, Position>>());
  12. }
  13. vector<Chessboard> boards;
  14. King k(Position(), turn=='W' ? 'B' : 'W');
  15. Position uk;
  16. // Ищем фигуры своего цвета и вражеского короля
  17. vector<Figure*> my_figures;
  18. for(int i = 0; i < 8; i++) {
  19. for(int j = 0; j < 8; j++) {
  20. if (board.get_icell(i,j).get_figure() != nullptr and board.get_icell(i,j).get_figure()->get_color() == turn)
  21. my_figures.push_back(board.get_icell(i,j).get_figure());
  22. if (board.get_icell(i,j).get_figure() != nullptr and board.get_icell(i,j).get_figure()->print() == k.print())
  23. uk = board.get_icell(i,j).get_figure()->get_position();
  24. }
  25. }
  26. // Создаём новые доски
  27. vector<Position> figure_positions;
  28. Chessboard new_board;
  29. vector<Chessboard> feature_boards;
  30. std::pair<bool, vector<std::pair<Position, Position>>> result;
  31. vector<std::pair<Position, Position>> moves;
  32. for (int i = 0; i < my_figures.size(); i++) {
  33. figure_positions = my_figures[i]->get_moves();
  34. for (int j = 0; j < figure_positions.size(); j++) {
  35. if (figure_positions[j].posSym == uk.posSym and figure_positions[j].posNum == uk.posNum) {
  36. moves.push_back(std::pair<Position, Position>(my_figures[i]->get_position(), figure_positions[j]));
  37. return std::pair<bool, vector<std::pair<Position, Position>>>(true, moves);
  38. }
  39. new_board = board.copy();
  40. new_board.create_move(my_figures[i]->get_position(), figure_positions[j]);
  41. result = get_solve(new_board, turn=='W' ? 'B' : 'W', depth-1);
  42. if (result.first == true) {
  43. result.second.push_back(std::pair<Position, Position>(my_figures[i]->get_position(), figure_positions[j]));
  44. return result;
  45. }
  46. }
  47. }
  48. return std::pair<bool, vector<std::pair<Position, Position>>>(false, vector<std::pair<Position, Position>>());
  49. }
  50. std::pair<Position, Position> AiPlayer::get_move(Chessboard board, char color)
  51. {
  52. vector<std::pair<Position, Position>> p = get_solve(board, color, 3);
  53. return std::pair<Position, Position>(Position('F', '6'), Position('F', '5'));
  54. }