diff --git a/cpp/src/controller/ai_vs_ai.cpp b/cpp/src/controller/ai_vs_ai.cpp new file mode 100644 index 0000000..c6feaf6 --- /dev/null +++ b/cpp/src/controller/ai_vs_ai.cpp @@ -0,0 +1,36 @@ +#include "ai_vs_ai.hpp" + +#include "controller.hpp" + +#include + +AIvsAIController::AIvsAIController(Board b, View& v, ai::AI& p1, ai::AI& p2) + : Controller(b, v), + p1(p1), + p2(p2) {} + +void AIvsAIController::start() { + std::thread view_thread([&]() { view.show(); }); + ai::AI* current_player; + while (!board.is_terminal()) { + current_player = board.white_to_play ? &p1 : &p2; + Move move = current_player->search(board, board.white_to_play); + make_move(move); + } + + view_thread.join(); +} + +void AIvsAIController::make_move(Move move) { + board = board.make_move(move); + view.update_board(board, -1, {}); + + Colour current_colour = board.white_to_play ? White : Black; + if (board.is_checkmate_for(current_colour)) + view.notify_checkmate(current_colour); + + if (board.is_stalemate_for(current_colour)) + view.notify_stalemate(current_colour); +} + +void AIvsAIController::on_tile_selected(int, int) {} diff --git a/cpp/src/controller/ai_vs_ai.hpp b/cpp/src/controller/ai_vs_ai.hpp new file mode 100644 index 0000000..839b808 --- /dev/null +++ b/cpp/src/controller/ai_vs_ai.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "../model/ais/ai.hpp" +#include "../model/utils/coords.hpp" +#include "../model/utils/move.hpp" +#include "../view/view.hpp" +#include "controller.hpp" + +class AIvsAIController : public Controller { + ai::AI &p1, &p2; + + protected: + void make_move(Move) override; + + public: + AIvsAIController(Board, View&, ai::AI&, ai::AI&); + void on_tile_selected(int, int) override; + void start() override; +}; diff --git a/cpp/src/controller/controller.hpp b/cpp/src/controller/controller.hpp index dea5610..94e1bfa 100644 --- a/cpp/src/controller/controller.hpp +++ b/cpp/src/controller/controller.hpp @@ -8,7 +8,7 @@ class Controller { protected: Board board; View& view; - + virtual void make_move(Move) = 0; public: Controller(Board, View&); diff --git a/cpp/src/controller/manual.hpp b/cpp/src/controller/manual.hpp index f5e9e44..2a19fa6 100644 --- a/cpp/src/controller/manual.hpp +++ b/cpp/src/controller/manual.hpp @@ -13,7 +13,7 @@ class ManualController : public Controller { void reset_selection(); void show_legal_moves(Coords); - void make_move(Move); + void make_move(Move) override; public: ManualController(Board, View&); diff --git a/cpp/src/main.cpp b/cpp/src/main.cpp index b995789..3472f77 100644 --- a/cpp/src/main.cpp +++ b/cpp/src/main.cpp @@ -1,3 +1,4 @@ +#include "controller/ai_vs_ai.hpp" #include "controller/controller.hpp" #include "controller/human_vs_ai.hpp" #include "controller/manual.hpp" @@ -13,10 +14,11 @@ int main(int argc, char* argv[]) { Board b = Board::setup_fen_position(pos); - ai::v0_random ai(std::chrono::milliseconds(500)); + ai::v0_random p1(std::chrono::milliseconds(500)); + ai::v0_random p2(std::chrono::milliseconds(500)); GUI gui; - HumanVsAIController manual(b, gui, ai); + AIvsAIController manual(b, gui, p1, p2); Controller& controller = manual;