Queen.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "Queen.h"
  2. #include "Position.h"
  3. #include <utility>
  4. #include <stdexcept>
  5. #include <iostream>
  6. Queen::Queen(Position pos, char c) {
  7. if (c != 'B' and c != 'W')
  8. throw std::invalid_argument("Impossible color of figure!");
  9. position = pos;
  10. color = c;
  11. }
  12. std::pair<int, Position*> Queen::get_moves()
  13. {
  14. Position* moves = new Position[28];
  15. int moveNum = 0;
  16. // Сначала ходы по диагоналям
  17. for(int i = 1; i < 8; i++) {
  18. for(int j = -1; j < 2; j+=2) {
  19. for(int k = -1; k < 2; k+=2) {
  20. // Не добавляем невозможные ходы
  21. if (not (position.posSym + i*j <= 'H' and position.posNum + i*k <= '8' and position.posSym + i*j >= 'A' and position.posNum + i*k >= '1'))
  22. continue;
  23. // Position создаст ошибку, если создать невозможный ход
  24. Position p;
  25. try {
  26. p = Position((char)(position.posSym+i*j), (char)(position.posNum+i*k));
  27. }
  28. catch (const std::invalid_argument) {
  29. p = Position();
  30. }
  31. moves[moveNum] = p;
  32. moveNum++;
  33. }
  34. }
  35. }
  36. // По прямым
  37. for (int i = 1; i < 9; i++) {
  38. Position p;
  39. Position p2;
  40. // Position создаст ошибку, если создать невозможный ход
  41. try {
  42. if ('0'+i != position.posNum) p2 = Position(position.posSym, (char)('0'+i));
  43. if ('0'+i+16 != position.posSym) p = Position((char)('0'+i+16), position.posNum);
  44. }
  45. catch (const std::invalid_argument) {
  46. continue;
  47. }
  48. if ('0'+i+16 != position.posSym) {
  49. moves[moveNum] = p;
  50. moveNum++;
  51. }
  52. if ('0'+i != position.posNum) {
  53. moves[moveNum] = p2;
  54. moveNum++;
  55. }
  56. }
  57. return std::pair<int, Position*>(28, moves);
  58. }
  59. const char* Queen::print()
  60. {
  61. const char* me;
  62. if (color == 'B')
  63. me = "♛";
  64. else
  65. me = "♕";
  66. return me;
  67. }