Queen.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. Figure* Queen::copy() {
  13. static Queen q(position, color);
  14. Figure* f = &q;
  15. return f;
  16. }
  17. vector<Position> Queen::get_moves()
  18. {
  19. vector<Position> moves;
  20. // Сначала ходы по диагоналям
  21. for(int i = 1; i < 8; i++) {
  22. for(int j = -1; j < 2; j+=2) {
  23. for(int k = -1; k < 2; k+=2) {
  24. // Не добавляем невозможные ходы
  25. 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'))
  26. continue;
  27. // Position создаст ошибку, если создать невозможный ход
  28. Position p;
  29. try {
  30. p = Position((char)(position.posSym+i*j), (char)(position.posNum+i*k));
  31. }
  32. catch (const std::invalid_argument) {
  33. p = Position();
  34. }
  35. moves.push_back(p);
  36. }
  37. }
  38. }
  39. // По прямым
  40. for (int i = 1; i < 9; i++) {
  41. Position p;
  42. Position p2;
  43. // Position создаст ошибку, если создать невозможный ход
  44. try {
  45. if ('0'+i != position.posNum) p2 = Position(position.posSym, (char)('0'+i));
  46. if ('0'+i+16 != position.posSym) p = Position((char)('0'+i+16), position.posNum);
  47. }
  48. catch (const std::invalid_argument) {
  49. continue;
  50. }
  51. if ('0'+i+16 != position.posSym) {
  52. moves.push_back(p);
  53. }
  54. if ('0'+i != position.posNum) {
  55. moves.push_back(p2);
  56. }
  57. }
  58. return moves;
  59. }
  60. const char* Queen::print()
  61. {
  62. const char* me;
  63. if (color == 'B')
  64. me = "♛";
  65. else
  66. me = "♕";
  67. return me;
  68. }