소스 검색

add Queen and King, print figure

jezv 11 달 전
부모
커밋
cab7e5b147
15개의 변경된 파일256개의 추가작업 그리고 25개의 파일을 삭제
  1. 17 3
      Bishop.cpp
  2. 3 1
      Bishop.h
  3. 3 0
      Figure.h
  4. 17 3
      Horse.cpp
  5. 3 1
      Horse.h
  6. 44 0
      King.cpp
  7. 18 0
      King.h
  8. 8 2
      Makefile
  9. 15 2
      Pawn.cpp
  10. 3 1
      Pawn.h
  11. 75 0
      Queen.cpp
  12. 18 0
      Queen.h
  13. 16 4
      Rook.cpp
  14. 3 1
      Rook.h
  15. 13 7
      test_figures.cpp

+ 17 - 3
Bishop.cpp

@@ -2,10 +2,14 @@
 #include "Position.h"
 #include <utility>
 #include <stdexcept>
+#include <iostream>
 
 
-Bishop::Bishop(Position pos) {
+Bishop::Bishop(Position pos, char c) {
+    if (c != 'B' and c != 'W')
+        throw std::invalid_argument("Impossible color of figure!");
     position = pos;
+    color = c;
 }
 
 std::pair<int, Position*> Bishop::get_moves()
@@ -25,7 +29,7 @@ std::pair<int, Position*> Bishop::get_moves()
                     p = Position((char)(position.posSym+i*j), (char)(position.posNum+i*k));
                 }
                 catch (const std::invalid_argument) {
-                    p = Position();
+                    continue;
                 }
                 moves[moveNum] = p;
                 moveNum++;
@@ -33,4 +37,14 @@ std::pair<int, Position*> Bishop::get_moves()
         }
     }
     return std::pair<int, Position*>(14, moves);
-};
+}
+
+const char* Bishop::print()
+{
+    const char* me;
+    if (color == 'B')
+        me = "♝";
+    else
+        me = "♗";
+    return me;
+}

+ 3 - 1
Bishop.h

@@ -8,9 +8,11 @@
 class Bishop: public Figure
 {
     public:
-    Bishop(Position pos);
+    Bishop(Position pos, char color);
 
     virtual std::pair<int, Position*> get_moves();
+
+    virtual const char* print();
 };
 
 #endif

+ 3 - 0
Figure.h

@@ -10,6 +10,7 @@ class Figure
 {
     protected:
     Position position;
+    char color;
 
     public:
 
@@ -17,6 +18,8 @@ class Figure
     // вернёт moves_count - количество возможных ходов
     // и список из char[2] - сами ходы (вида A5, B3 и т.п.)
     virtual std::pair<int, Position*> get_moves() = 0;
+
+    virtual const char* print() = 0;
 };
 
 #endif

+ 17 - 3
Horse.cpp

@@ -5,8 +5,11 @@
 #include <cmath>
 
 
-Horse::Horse(Position pos) {
+Horse::Horse(Position pos, char c) {
+    if (c != 'B' and c != 'W')
+        throw std::invalid_argument("Impossible color of figure!");
     position = pos;
+    color = c;
 }
 
 std::pair<int, Position*> Horse::get_moves()
@@ -17,15 +20,26 @@ std::pair<int, Position*> Horse::get_moves()
         for(int j = -2; j < 3; j++) {
             if(std::abs(i) == std::abs(j) or i == 0 or j == 0) continue;
             Position p;
+            // Position выдаст ошибку если указать невозможную позицию
             try {
                 p = Position((char)(position.posSym+i), (char)(position.posNum+j));
             }
             catch (const std::invalid_argument) {
-                p = Position();
+                continue;
             }
             moves[moveNum] = p;
             moveNum++;
         }
     }
     return std::pair<int, Position*>(8, moves);
-};
+}
+
+const char* Horse::print()
+{
+    const char* me;
+    if (color == 'B')
+        me = "♞";
+    else
+        me = "♘";
+    return me;
+}

+ 3 - 1
Horse.h

@@ -8,9 +8,11 @@
 class Horse: public Figure
 {
     public:
-    Horse(Position pos);
+    Horse(Position pos, char color);
 
     virtual std::pair<int, Position*> get_moves();
+
+    virtual const char* print();
 };
 
 #endif

+ 44 - 0
King.cpp

@@ -0,0 +1,44 @@
+#include "King.h"
+#include "Position.h"
+#include <utility>
+#include <stdexcept>
+#include <iostream>
+
+
+King::King(Position pos, char c) {
+    position = pos;
+    color = c;
+}
+
+std::pair<int, Position*> King::get_moves()
+{
+    Position* moves = new Position[8];
+    int moveCounts = 0;
+    for(int i = -1; i < 2; i++) {
+        for(int j = -1; j < 2; j++) {
+            Position p;
+            if (position.posSym+i == position.posSym and position.posNum+j == position.posNum)
+                continue;
+            // Position выдаст ошибку если указать невозможную позицию
+            try {
+                p = Position((char)(position.posSym+i), (char)(position.posNum+j));
+            }
+            catch (const std::invalid_argument) {
+                continue;
+            }
+            moves[moveCounts] = p;
+            moveCounts++;
+        }
+    }
+    return std::pair<int, Position*>(8, moves);
+}
+
+const char* King::print()
+{
+    const char* me;
+    if (color == 'B')
+        me = "♚";
+    else
+        me = "♔";
+    return me;
+}

+ 18 - 0
King.h

@@ -0,0 +1,18 @@
+#ifndef _KING_H
+#define _KING_H
+
+#include "Figure.h"
+#include "Position.h"
+
+
+class King: public Figure
+{
+    public:
+    King(Position pos, char color);
+
+    virtual std::pair<int, Position*> get_moves();
+
+    virtual const char* print();
+};
+
+#endif

+ 8 - 2
Makefile

@@ -1,5 +1,11 @@
-test_figures: Position.o Pawn.o Horse.o Bishop.o Rook.o test_figures.cpp
-	g++ Position.o Pawn.o Horse.o Bishop.o Rook.o test_figures.cpp
+test_figures: Position.o Pawn.o Horse.o Bishop.o Rook.o King.o Queen.o test_figures.cpp
+	g++ Position.o Pawn.o Horse.o Bishop.o Rook.o King.o Queen.o test_figures.cpp
+
+Queen.o: Queen.cpp
+	g++ -c Queen.cpp
+
+King.o: King.cpp
+	g++ -c King.cpp
 
 Rook.o: Rook.cpp
 	g++ -c Rook.cpp

+ 15 - 2
Pawn.cpp

@@ -5,8 +5,11 @@
 #include <iostream>
 
 
-Pawn::Pawn(Position pos) {
+Pawn::Pawn(Position pos, char c) {
+    if (c != 'B' and c != 'W')
+        throw std::invalid_argument("Impossible color of figure!");
     position = pos;
+    color = c;
 }
 
 std::pair<int, Position*> Pawn::get_moves()
@@ -21,4 +24,14 @@ std::pair<int, Position*> Pawn::get_moves()
     }
     moves[0] = p;
     return std::pair<int, Position*>(1, moves);
-};
+}
+
+const char* Pawn::print()
+{
+    const char* me;
+    if (color == 'B')
+        me = "♟";
+    else
+        me = "♙";
+    return me;
+}

+ 3 - 1
Pawn.h

@@ -8,9 +8,11 @@
 class Pawn: public Figure
 {
     public:
-    Pawn(Position pos);
+    Pawn(Position pos, char color);
 
     virtual std::pair<int, Position*> get_moves();
+
+    virtual const char* print();
 };
 
 #endif

+ 75 - 0
Queen.cpp

@@ -0,0 +1,75 @@
+#include "Queen.h"
+#include "Position.h"
+#include <utility>
+#include <stdexcept>
+#include <iostream>
+
+
+Queen::Queen(Position pos, char c) {
+    if (c != 'B' and c != 'W')
+        throw std::invalid_argument("Impossible color of figure!");
+    position = pos;
+    color = c;
+}
+
+std::pair<int, Position*> Queen::get_moves()
+{
+    Position* moves = new Position[28];
+
+    int moveNum = 0;
+
+    // Сначала ходы по диагоналям
+    for(int i = 1; i < 8; i++) {
+        for(int j = -1; j < 2; j+=2) {
+            for(int k = -1; k < 2; k+=2) {
+                // Не добавляем невозможные ходы
+                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')) 
+                    continue;
+                // Position создаст ошибку, если создать невозможный ход
+                Position p;
+                try {
+                    p = Position((char)(position.posSym+i*j), (char)(position.posNum+i*k));
+                }
+                catch (const std::invalid_argument) {
+                    p = Position();
+                }
+                moves[moveNum] = p;
+                moveNum++;
+            }
+        }
+    }
+
+    // По прямым
+    for (int i = 1; i < 9; i++) {
+        Position p;
+        Position p2;
+        // Position создаст ошибку, если создать невозможный ход
+        try {
+            if ('0'+i != position.posNum) p2 = Position(position.posSym, (char)('0'+i));
+            if ('0'+i+16 != position.posSym) p = Position((char)('0'+i+16), position.posNum);
+        }
+        catch (const std::invalid_argument) {
+            continue;
+        }
+        if ('0'+i+16 != position.posSym) {
+            moves[moveNum] = p;
+            moveNum++;
+        }
+        if ('0'+i != position.posNum) {
+            moves[moveNum] = p2;
+            moveNum++;
+        }
+    }
+
+    return std::pair<int, Position*>(28, moves);
+}
+
+const char* Queen::print()
+{
+    const char* me;
+    if (color == 'B')
+        me = "♛";
+    else
+        me = "♕";
+    return me;
+}

+ 18 - 0
Queen.h

@@ -0,0 +1,18 @@
+#ifndef _QUEEN_H
+#define _QUEEN_H
+
+#include "Figure.h"
+#include "Position.h"
+
+
+class Queen: public Figure
+{
+    public:
+    Queen(Position pos, char color);
+
+    virtual std::pair<int, Position*> get_moves();
+
+    virtual const char* print();
+};
+
+#endif

+ 16 - 4
Rook.cpp

@@ -5,8 +5,11 @@
 #include <iostream>
 
 
-Rook::Rook(Position pos) {
+Rook::Rook(Position pos, char c) {
+    if (c != 'B' and c != 'W')
+        throw std::invalid_argument("Impossible color of figure!");
     position = pos;
+    color = c;
 }
 
 std::pair<int, Position*> Rook::get_moves()
@@ -21,8 +24,7 @@ std::pair<int, Position*> Rook::get_moves()
             if ('0'+i+16 != position.posSym) p = Position((char)('0'+i+16), position.posNum);
         }
         catch (const std::invalid_argument) {
-            p = Position();
-            p2 = Position();
+            continue;
         }
         if ('0'+i+16 != position.posSym) {
             moves[moveNum] = p;
@@ -34,4 +36,14 @@ std::pair<int, Position*> Rook::get_moves()
         }
     }
     return std::pair<int, Position*>(14, moves);
-};
+}
+
+const char* Rook::print()
+{
+    const char* me;
+    if (color == 'B')
+        me = "♜";
+    else
+        me = "♖";
+    return me;
+}

+ 3 - 1
Rook.h

@@ -8,9 +8,11 @@
 class Rook: public Figure
 {
     public:
-    Rook(Position pos);
+    Rook(Position pos, char color);
 
     virtual std::pair<int, Position*> get_moves();
+
+    virtual const char* print();
 };
 
 #endif

+ 13 - 7
test_figures.cpp

@@ -4,25 +4,31 @@
 #include "Horse.h"
 #include "Bishop.h"
 #include "Rook.h"
+#include "Queen.h"
+#include "King.h"
 #include <iostream>
 #include <vector>
 
 using namespace std;
 
 int main() {
-    Figure** figures = new Figure*[4];
-    Pawn p(Position('A', '1'));
+    Figure** figures = new Figure*[6];
+    Pawn p(Position('A', '1'), 'W');
     figures[0] = &p;
-    Horse h(Position('B', '1'));
+    Horse h(Position('B', '1'), 'B');
     figures[1] = &h;
-    Bishop b(Position('C', '1'));
+    Bishop b(Position('C', '1'), 'W');
     figures[2] = &b;
-    Rook r(Position('D', '1'));
+    Rook r(Position('D', '1'), 'W');
     figures[3] = &r;
-    for (int i = 0; i < 4; i++) {
+    Queen q(Position('E', '1'), 'W');
+    figures[4] = &q;
+    King k(Position('F', '1'), 'B');
+    figures[5] = &k;
+    for (int i = 0; i < 6; i++) {
         int movesCount = (figures[i])->get_moves().first;
         Position* moves = (figures[i])->get_moves().second;
-        cout << movesCount << ' ';
+        cout << figures[i]->print() << ' ' << movesCount << ' ';
         for(int j = 0; j < movesCount; j++) {
             cout << moves[j] << ';';
         }