Browse Source

last commit PLEEASE

jezvgg 10 months ago
parent
commit
d0d69e58cb
20 changed files with 264 additions and 102 deletions
  1. 63 0
      AiPlayer.cpp
  2. 16 0
      AiPlayer.h
  3. 7 0
      Bishop.cpp
  4. 1 0
      Bishop.h
  5. 12 0
      Chessboard.cpp
  6. 1 0
      Chessboard.h
  7. 32 32
      Chessengine.cpp
  8. 1 0
      Figure.h
  9. 6 0
      Horse.cpp
  10. 1 0
      Horse.h
  11. 6 0
      King.cpp
  12. 1 0
      King.h
  13. 5 2
      Makefile
  14. 6 0
      Pawn.cpp
  15. 1 0
      Pawn.h
  16. 6 0
      Queen.cpp
  17. 1 0
      Queen.h
  18. 6 0
      Rook.cpp
  19. 1 0
      Rook.h
  20. 91 68
      game.cpp

+ 63 - 0
AiPlayer.cpp

@@ -0,0 +1,63 @@
+#include "AiPlayer.h"
+#include "Position.h"
+#include "Chessboard.h"
+#include "King.h"
+#include <iostream>
+#include <utility>
+#include <vector>
+
+std::pair<bool, vector<std::pair<Position, Position>>> get_solve(Chessboard board, char turn, int depth)
+{
+    if (depth==0) {
+        return std::pair<bool, vector<std::pair<Position, Position>>>(false, vector<std::pair<Position, Position>>());
+    }
+
+    vector<Chessboard> boards;
+    King k(Position(), turn=='W' ? 'B' : 'W');
+    Position uk;
+
+    // Ищем фигуры своего цвета и вражеского короля
+    vector<Figure*> my_figures;
+    for(int i = 0; i < 8; i++) {
+        for(int j = 0; j < 8; j++) {
+            if (board.get_icell(i,j).get_figure() != nullptr and board.get_icell(i,j).get_figure()->get_color() == turn)
+                my_figures.push_back(board.get_icell(i,j).get_figure());
+            if (board.get_icell(i,j).get_figure() != nullptr and board.get_icell(i,j).get_figure()->print() == k.print())
+                uk = board.get_icell(i,j).get_figure()->get_position();
+        }
+    }
+
+    // Создаём новые доски
+    vector<Position> figure_positions;
+    Chessboard new_board;
+    vector<Chessboard> feature_boards;
+    std::pair<bool, vector<std::pair<Position, Position>>> result;
+    vector<std::pair<Position, Position>> moves;
+    for (int i = 0; i < my_figures.size(); i++) {
+        figure_positions = my_figures[i]->get_moves();
+        for (int j = 0; j < figure_positions.size(); j++) {
+            if (figure_positions[j].posSym == uk.posSym and figure_positions[j].posNum == uk.posNum) {
+                moves.push_back(std::pair<Position, Position>(my_figures[i]->get_position(), figure_positions[j]));
+                return std::pair<bool, vector<std::pair<Position, Position>>>(true, moves);
+            }
+            new_board = board.copy();
+            new_board.create_move(my_figures[i]->get_position(), figure_positions[j]);
+            result = get_solve(new_board, turn=='W' ? 'B' : 'W', depth-1);
+            if (result.first == true) {
+                result.second.push_back(std::pair<Position, Position>(my_figures[i]->get_position(), figure_positions[j]));
+                return result;
+            }
+        }
+    }
+
+    return std::pair<bool, vector<std::pair<Position, Position>>>(false, vector<std::pair<Position, Position>>());
+
+}
+
+
+std::pair<Position, Position> AiPlayer::get_move(Chessboard board, char color)
+{
+    vector<std::pair<Position, Position>> p = get_solve(board, color, 3);
+
+    return std::pair<Position, Position>(Position('F', '6'), Position('F', '5'));
+}

+ 16 - 0
AiPlayer.h

@@ -0,0 +1,16 @@
+#ifndef _AIPLAYER_H
+#define _AIPLAYER_H
+
+#include "Player.h"
+#include "Position.h"
+#include "Chessboard.h"
+#include <utility>
+
+class AiPlayer: public Player
+{
+    public:
+    vector<std::pair<Position, Position>> get_solve(Chessboard board, char turn, int depth);
+    virtual pair<Position, Position> get_move(Chessboard board, char color);
+};
+
+#endif

+ 7 - 0
Bishop.cpp

@@ -12,6 +12,13 @@ Bishop::Bishop(Position pos, char c) {
     color = c;
 }
 
+Figure* Bishop::copy()
+{
+    static Bishop b(position, color);
+    Figure* f = &b;
+    return f;
+}
+
 vector<Position> Bishop::get_moves()
 {
     // У ладьи всегда 14 ходов, если нет преград

+ 1 - 0
Bishop.h

@@ -12,6 +12,7 @@ class Bishop: public Figure
     Bishop(Position pos, char color);
 
     virtual vector<Position> get_moves();
+    virtual Figure* copy();
 
     virtual const char* print();
 };

+ 12 - 0
Chessboard.cpp

@@ -115,6 +115,18 @@ Chessboard::Chessboard(vector<Figure*> figures)
     }
 }
 
+Chessboard Chessboard::copy() {
+    vector<Figure*> my_figures;
+    for(int i = 0; i < 8; i++) {
+        for(int j = 0; j < 8; j++) {
+            if (get_icell(i,j).get_figure() != nullptr)
+                my_figures.push_back(get_icell(i,j).get_figure()->copy());
+        }
+    }
+
+    return Chessboard(my_figures);
+}
+
 void Chessboard::create_move(Position pos1, Position pos2)
 {
     Figure* fig = get_cell(pos1).get_figure();

+ 1 - 0
Chessboard.h

@@ -21,6 +21,7 @@ class Chessboard
     Chessboard(vector<Figure*>);
 
     void create_move(Position pos1, Position pos2);
+    Chessboard copy();
 
     Cell get_cell(Position pos);
     Cell get_icell(int index, int jindex);

+ 32 - 32
Chessengine.cpp

@@ -68,22 +68,22 @@ void Chessengine::load_base()
     vector<Figure*> figures;
     
     // Создание чёрных
-    Pawn bp1(Position('A', '7'), 'B');
-    Pawn bp2(Position('B', '7'), 'B');
-    Pawn bp3(Position('C', '7'), 'B');
-    Pawn bp4(Position('D', '7'), 'B');
-    Pawn bp5(Position('E', '7'), 'B');
-    Pawn bp6(Position('F', '7'), 'B');
-    Pawn bp7(Position('G', '7'), 'B');
-    Pawn bp8(Position('H', '7'), 'B');
-    Rook br1(Position('A', '8'), 'B');
-    Rook br2(Position('H', '8'), 'B');
-    Horse bh1(Position('B', '8'), 'B');
-    Horse bh2(Position('G', '8'), 'B');
-    Bishop bb1(Position('C', '8'), 'B');
-    Bishop bb2(Position('F', '8'), 'B');
-    King bk1(Position('E', '8'), 'B');
-    Queen bq1(Position('D', '8'), 'B');
+    static Pawn bp1(Position('A', '7'), 'B');
+    static Pawn bp2(Position('B', '7'), 'B');
+    static Pawn bp3(Position('C', '7'), 'B');
+    static Pawn bp4(Position('D', '7'), 'B');
+    static Pawn bp5(Position('E', '7'), 'B');
+    static Pawn bp6(Position('F', '7'), 'B');
+    static Pawn bp7(Position('G', '7'), 'B');
+    static Pawn bp8(Position('H', '7'), 'B');
+    static Rook br1(Position('A', '8'), 'B');
+    static Rook br2(Position('H', '8'), 'B');
+    static Horse bh1(Position('B', '8'), 'B');
+    static Horse bh2(Position('G', '8'), 'B');
+    static Bishop bb1(Position('C', '8'), 'B');
+    static Bishop bb2(Position('F', '8'), 'B');
+    static King bk1(Position('E', '8'), 'B');
+    static Queen bq1(Position('D', '8'), 'B');
 
     figures.push_back(&bp1);
     figures.push_back(&bp2);
@@ -103,22 +103,22 @@ void Chessengine::load_base()
     figures.push_back(&bq1);
 
     // Создание белых
-    Pawn wp1(Position('A', '2'), 'W');
-    Pawn wp2(Position('B', '2'), 'W');
-    Pawn wp3(Position('C', '2'), 'W');
-    Pawn wp4(Position('D', '2'), 'W');
-    Pawn wp5(Position('E', '2'), 'W');
-    Pawn wp6(Position('F', '2'), 'W');
-    Pawn wp7(Position('G', '2'), 'W');
-    Pawn wp8(Position('H', '2'), 'W');
-    Rook wr1(Position('A', '1'), 'W');
-    Rook wr2(Position('H', '1'), 'W');
-    Horse wh1(Position('B', '1'), 'W');
-    Horse wh2(Position('G', '1'), 'W');
-    Bishop wb1(Position('C', '1'), 'W');
-    Bishop wb2(Position('F', '1'), 'W');
-    King wk1(Position('E', '1'), 'W');
-    Queen wq1(Position('D', '1'), 'W');
+    static Pawn wp1(Position('A', '2'), 'W');
+    static Pawn wp2(Position('B', '2'), 'W');
+    static Pawn wp3(Position('C', '2'), 'W');
+    static Pawn wp4(Position('D', '2'), 'W');
+    static Pawn wp5(Position('E', '2'), 'W');
+    static Pawn wp6(Position('F', '2'), 'W');
+    static Pawn wp7(Position('G', '2'), 'W');
+    static Pawn wp8(Position('H', '2'), 'W');
+    static Rook wr1(Position('A', '1'), 'W');
+    static Rook wr2(Position('H', '1'), 'W');
+    static Horse wh1(Position('B', '1'), 'W');
+    static Horse wh2(Position('G', '1'), 'W');
+    static Bishop wb1(Position('C', '1'), 'W');
+    static Bishop wb2(Position('F', '1'), 'W');
+    static King wk1(Position('E', '1'), 'W');
+    static Queen wq1(Position('D', '1'), 'W');
 
     figures.push_back(&wp1);
     figures.push_back(&wp2);

+ 1 - 0
Figure.h

@@ -19,6 +19,7 @@ class Figure
     // вернёт moves_count - количество возможных ходов
     // и список из char[2] - сами ходы (вида A5, B3 и т.п.)
     virtual vector<Position> get_moves() = 0;
+    virtual Figure* copy() = 0;
 
     virtual const char* print() = 0;
 

+ 6 - 0
Horse.cpp

@@ -12,6 +12,12 @@ Horse::Horse(Position pos, char c) {
     color = c;
 }
 
+Figure* Horse::copy() {
+    static Horse h(position, color);
+    Figure* f = &h;
+    return f;
+}
+
 vector<Position> Horse::get_moves()
 {
     vector<Position> moves;

+ 1 - 0
Horse.h

@@ -11,6 +11,7 @@ class Horse: public Figure
     Horse(Position pos, char color);
 
     virtual vector<Position> get_moves();
+    virtual Figure* copy();
 
     virtual const char* print();
 };

+ 6 - 0
King.cpp

@@ -10,6 +10,12 @@ King::King(Position pos, char c) {
     color = c;
 }
 
+Figure* King::copy() {
+    static King k(position, color);
+    Figure* f = &k;
+    return f;
+}
+
 vector<Position> King::get_moves()
 {
     vector<Position> moves;

+ 1 - 0
King.h

@@ -11,6 +11,7 @@ class King: public Figure
     King(Position pos, char color);
 
     virtual vector<Position> get_moves();
+    virtual Figure* copy();
 
     virtual const char* print();
 };

+ 5 - 2
Makefile

@@ -1,5 +1,5 @@
-game: Position.o Pawn.o Horse.o Bishop.o Rook.o King.o Queen.o Cell.o Chessboard.o RealPlayer.o Chessengine.o game.cpp
-	g++ Position.o Pawn.o Horse.o Bishop.o Rook.o King.o Queen.o Cell.o Chessboard.o RealPlayer.o Chessengine.o game.cpp
+game: Position.o Pawn.o Horse.o Bishop.o Rook.o King.o Queen.o Cell.o Chessboard.o RealPlayer.o AiPlayer.o Chessengine.o game.cpp
+	g++ Position.o Pawn.o Horse.o Bishop.o Rook.o King.o Queen.o Cell.o Chessboard.o RealPlayer.o AiPlayer.o Chessengine.o game.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
@@ -10,6 +10,9 @@ test_board: Position.o Pawn.o Horse.o Bishop.o Rook.o King.o Queen.o Cell.o Ches
 Chessengine.o: Chessengine.cpp
 	g++ -c Chessengine.cpp
 
+AiPlayer.o: AiPlayer.cpp
+	g++ -c AiPlayer.cpp
+
 RealPlayer.o: RealPlayer.cpp
 	g++ -c RealPlayer.cpp
 

+ 6 - 0
Pawn.cpp

@@ -12,6 +12,12 @@ Pawn::Pawn(Position pos, char c) {
     color = c;
 }
 
+Figure* Pawn::copy() {
+    static Pawn p(position, color);
+    Figure* f = &p;
+    return f;
+}
+
 vector<Position> Pawn::get_moves()
 {
     vector<Position> moves;

+ 1 - 0
Pawn.h

@@ -11,6 +11,7 @@ class Pawn: public Figure
     Pawn(Position pos, char color);
 
     virtual vector<Position> get_moves();
+    virtual Figure* copy();
 
     virtual const char* print();
 };

+ 6 - 0
Queen.cpp

@@ -12,6 +12,12 @@ Queen::Queen(Position pos, char c) {
     color = c;
 }
 
+Figure* Queen::copy() {
+    static Queen q(position, color);
+    Figure* f = &q;
+    return f;
+}
+
 vector<Position> Queen::get_moves()
 {
     vector<Position> moves;

+ 1 - 0
Queen.h

@@ -11,6 +11,7 @@ class Queen: public Figure
     Queen(Position pos, char color);
 
     virtual vector<Position> get_moves();
+    virtual Figure* copy();
 
     virtual const char* print();
 };

+ 6 - 0
Rook.cpp

@@ -12,6 +12,12 @@ Rook::Rook(Position pos, char c) {
     color = c;
 }
 
+Figure* Rook::copy() {
+    static Rook r(position, color);
+    Figure* f = &r;
+    return f;
+}
+
 vector<Position> Rook::get_moves()
 {
     vector<Position> moves;

+ 1 - 0
Rook.h

@@ -11,6 +11,7 @@ class Rook: public Figure
     Rook(Position pos, char color);
 
     virtual vector<Position> get_moves();
+    virtual Figure* copy();
 
     virtual const char* print();
 };

+ 91 - 68
game.cpp

@@ -1,6 +1,7 @@
 #include "Chessboard.h"
 #include "Chessengine.h"
 #include "RealPlayer.h"
+#include "AiPlayer.h"
 #include "Position.h"
 #include "Figure.h"
 #include "Pawn.h"
@@ -14,82 +15,104 @@
 
 int main() {
     vector<Figure*> figures;
-    Pawn bp1(Position('A', '7'), 'B');
-    Pawn bp2(Position('B', '7'), 'B');
-    Pawn bp3(Position('C', '7'), 'B');
-    Pawn bp4(Position('D', '7'), 'B');
-    Pawn bp5(Position('E', '7'), 'B');
-    Pawn bp6(Position('F', '7'), 'B');
-    Pawn bp7(Position('G', '7'), 'B');
-    Pawn bp8(Position('H', '7'), 'B');
-    Rook br1(Position('A', '8'), 'B');
-    Rook br2(Position('H', '8'), 'B');
-    Horse bh1(Position('B', '8'), 'B');
-    Horse bh2(Position('G', '8'), 'B');
-    Bishop bb1(Position('C', '8'), 'B');
-    Bishop bb2(Position('F', '8'), 'B');
-    King bk1(Position('E', '8'), 'B');
-    Queen bq1(Position('D', '8'), 'B');
+    // Pawn bp1(Position('A', '7'), 'B');
+    // Pawn bp2(Position('B', '7'), 'B');
+    // Pawn bp3(Position('C', '7'), 'B');
+    // Pawn bp4(Position('D', '7'), 'B');
+    // Pawn bp5(Position('E', '7'), 'B');
+    // Pawn bp6(Position('F', '7'), 'B');
+    // Pawn bp7(Position('G', '7'), 'B');
+    // Pawn bp8(Position('H', '7'), 'B');
+    // Rook br1(Position('A', '8'), 'B');
+    // Rook br2(Position('H', '8'), 'B');
+    // Horse bh1(Position('B', '8'), 'B');
+    // Horse bh2(Position('G', '8'), 'B');
+    // Bishop bb1(Position('C', '8'), 'B');
+    // Bishop bb2(Position('F', '8'), 'B');
+    // King bk1(Position('E', '8'), 'B');
+    // Queen bq1(Position('D', '8'), 'B');
 
-    figures.push_back(&bp1);
-    figures.push_back(&bp2);
-    figures.push_back(&bp3);
-    figures.push_back(&bp4);
-    figures.push_back(&bp5);
-    figures.push_back(&bp6);
-    figures.push_back(&bp7);
-    figures.push_back(&bp8);
-    figures.push_back(&br1);
-    figures.push_back(&br2);
-    figures.push_back(&bh1);
-    figures.push_back(&bh2);
-    figures.push_back(&bb1);
-    figures.push_back(&bb2);
-    figures.push_back(&bk1);
-    figures.push_back(&bq1);
+    // figures.push_back(&bp1);
+    // figures.push_back(&bp2);
+    // figures.push_back(&bp3);
+    // figures.push_back(&bp4);
+    // figures.push_back(&bp5);
+    // figures.push_back(&bp6);
+    // figures.push_back(&bp7);
+    // figures.push_back(&bp8);
+    // figures.push_back(&br1);
+    // figures.push_back(&br2);
+    // figures.push_back(&bh1);
+    // figures.push_back(&bh2);
+    // figures.push_back(&bb1);
+    // figures.push_back(&bb2);
+    // figures.push_back(&bk1);
+    // figures.push_back(&bq1);
 
-    // Создание белых
-    Pawn wp1(Position('A', '2'), 'W');
-    Pawn wp2(Position('B', '2'), 'W');
-    Pawn wp3(Position('C', '2'), 'W');
-    Pawn wp4(Position('D', '2'), 'W');
-    Pawn wp5(Position('E', '2'), 'W');
-    Pawn wp6(Position('F', '2'), 'W');
-    Pawn wp7(Position('G', '2'), 'W');
-    Pawn wp8(Position('H', '2'), 'W');
-    Rook wr1(Position('A', '1'), 'W');
-    Rook wr2(Position('H', '1'), 'W');
-    Horse wh1(Position('B', '1'), 'W');
-    Horse wh2(Position('G', '1'), 'W');
-    Bishop wb1(Position('C', '1'), 'W');
-    Bishop wb2(Position('F', '1'), 'W');
-    King wk1(Position('E', '1'), 'W');
-    Queen wq1(Position('D', '1'), 'W');
+    // // Создание белых
+    // Pawn wp1(Position('A', '2'), 'W');
+    // Pawn wp2(Position('B', '2'), 'W');
+    // Pawn wp3(Position('C', '2'), 'W');
+    // Pawn wp4(Position('D', '2'), 'W');
+    // Pawn wp5(Position('E', '2'), 'W');
+    // Pawn wp6(Position('F', '2'), 'W');
+    // Pawn wp7(Position('G', '2'), 'W');
+    // Pawn wp8(Position('H', '2'), 'W');
+    // Rook wr1(Position('A', '1'), 'W');
+    // Rook wr2(Position('H', '1'), 'W');
+    // Horse wh1(Position('B', '1'), 'W');
+    // Horse wh2(Position('G', '1'), 'W');
+    // Bishop wb1(Position('C', '1'), 'W');
+    // Bishop wb2(Position('F', '1'), 'W');
+    // King wk1(Position('E', '1'), 'W');
+    // Queen wq1(Position('D', '1'), 'W');
 
-    figures.push_back(&wp1);
-    figures.push_back(&wp2);
-    figures.push_back(&wp3);
-    figures.push_back(&wp4);
-    figures.push_back(&wp5);
-    figures.push_back(&wp6);
-    figures.push_back(&wp7);
-    figures.push_back(&wp8);
-    figures.push_back(&wr1);
-    figures.push_back(&wr2);
-    figures.push_back(&wh1);
-    figures.push_back(&wh2);
-    figures.push_back(&wb1);
-    figures.push_back(&wb2);
-    figures.push_back(&wk1);
-    figures.push_back(&wq1);
+    // figures.push_back(&wp1);
+    // figures.push_back(&wp2);
+    // figures.push_back(&wp3);
+    // figures.push_back(&wp4);
+    // figures.push_back(&wp5);
+    // figures.push_back(&wp6);
+    // figures.push_back(&wp7);
+    // figures.push_back(&wp8);
+    // figures.push_back(&wr1);
+    // figures.push_back(&wr2);
+    // figures.push_back(&wh1);
+    // figures.push_back(&wh2);
+    // figures.push_back(&wb1);
+    // figures.push_back(&wb2);
+    // figures.push_back(&wk1);
+    // figures.push_back(&wq1);
+
+    // Pawn bp1(Position('A', '5'), 'B');
+    // Pawn bp2(Position('C', '7'), 'B');
+    // Pawn bp3(Position('D', '7'), 'B');
+    // Pawn bp4(Position('F', '6'), 'B');
+    // Bishop bb1(Position('C', '8'), 'B');
+    // King bk1(Position('D', '8'), 'B');
+
+    // figures.push_back(&bp1);
+    // figures.push_back(&bp2);
+    // figures.push_back(&bp3);
+    // figures.push_back(&bp4);
+    // figures.push_back(&bb1);
+    // figures.push_back(&bk1);
+
+    // King wk1(Position('F', '8'), 'W');
+    // Horse wh1(Position('C', '4'), 'W');
+    // Queen wq1(Position('A', '4'), 'W');
+
+    // figures.push_back(&wk1);
+    // figures.push_back(&wh1);
+    // figures.push_back(&wq1);
 
     RealPlayer player1;
-    RealPlayer player2;
+    AiPlayer player2;
 
     Chessengine engine(&player1, &player2);
 
-    engine.load(figures, 'W');
-    // engine.load_base();
+    // engine.load(figures, 'W');
+    engine.load_base();
 
     engine.start();