From f54024681775731ebe9cd01203167451690eada5 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Thu, 6 Feb 2025 17:31:16 +0100 Subject: [PATCH] we're starting to get somewhere here --- cpp/Makefile | 2 +- cpp/src/controller/controller.hpp | 14 +++++ cpp/src/controller/manual.cpp | 17 ++++++ cpp/src/controller/manual.hpp | 21 +++++++ cpp/src/main.cpp | 22 ++++++-- cpp/src/view/gui.cpp | 91 +++++++++++++++++++++++++++++++ cpp/src/view/gui.hpp | 32 +++++++++++ cpp/src/view/view.hpp | 21 +++++++ 8 files changed, 213 insertions(+), 7 deletions(-) create mode 100644 cpp/src/controller/controller.hpp create mode 100644 cpp/src/controller/manual.cpp create mode 100644 cpp/src/controller/manual.hpp create mode 100644 cpp/src/view/gui.cpp create mode 100644 cpp/src/view/gui.hpp create mode 100644 cpp/src/view/view.hpp diff --git a/cpp/Makefile b/cpp/Makefile index c1e549a..e805156 100644 --- a/cpp/Makefile +++ b/cpp/Makefile @@ -28,7 +28,7 @@ obj/%.o: $(CXX) $(CXXFLAGS) -o $@ -c $< main: $(OBJFILES) - $(CXX) $(LDFLAGS) $(OBJFILES) $(LOADLIBES) $(LDLIBS) -o main + $(CXX) $(LDFLAGS) $(OBJFILES) $(LOADLIBES) $(LDLIBS) -o main -lsfml-graphics -lsfml-window -lsfml-system clean: rm -rf obj/* $(DEPFILES) test_bin/ diff --git a/cpp/src/controller/controller.hpp b/cpp/src/controller/controller.hpp new file mode 100644 index 0000000..1091e16 --- /dev/null +++ b/cpp/src/controller/controller.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "../model/board/board.hpp" + +class View; + +class Controller { + protected: + Board board; + + public: + // Controller(Board, View); + virtual void on_tile_selected(int, int) = 0; +}; diff --git a/cpp/src/controller/manual.cpp b/cpp/src/controller/manual.cpp new file mode 100644 index 0000000..53ea751 --- /dev/null +++ b/cpp/src/controller/manual.cpp @@ -0,0 +1,17 @@ +#include "manual.hpp" + +ManualController::ManualController(Board b, View& view): view(view) { + board = b; + selected_piece = Piece::None; + legal_moves = {}; + + view.update_board(b, selected_piece, legal_moves); +} + +void ManualController::on_tile_selected(int x, int y) {} + +void ManualController::reset_selection() {} + +void ManualController::show_legal_moves(Coords) {} + +void ManualController::make_move(Move) {} diff --git a/cpp/src/controller/manual.hpp b/cpp/src/controller/manual.hpp new file mode 100644 index 0000000..684e4b9 --- /dev/null +++ b/cpp/src/controller/manual.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "../model/utils/coords.hpp" +#include "../model/utils/move.hpp" +#include "../view/view.hpp" +#include "controller.hpp" + +class ManualController : public Controller { + private: + View& view; + Piece selected_piece; + std::vector legal_moves; + + void reset_selection(); + void show_legal_moves(Coords); + void make_move(Move); + + public: + ManualController(Board, View&); + void on_tile_selected(int, int) override; +}; diff --git a/cpp/src/main.cpp b/cpp/src/main.cpp index a6df091..7bd1858 100644 --- a/cpp/src/main.cpp +++ b/cpp/src/main.cpp @@ -1,14 +1,24 @@ -#include "model/ais/ai.hpp" -#include "model/board/board.hpp" -#include "model/perft/perft.hpp" - -#include +#include "controller/controller.hpp" +#include "controller/manual.hpp" +#include "view/gui.hpp" +#include "view/view.hpp" int main(int argc, char* argv[]) { std::string pos = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; - perft(); + Board b = Board::setup_fen_position(pos); + + GUI gui; + ManualController manual(b, gui); + + + View& view = gui; + Controller& controller = manual; + + view.show(); + + // perft(); // ai::v1_simple ai; // // Board b = Board::setup_fen_position(pos); diff --git a/cpp/src/view/gui.cpp b/cpp/src/view/gui.cpp new file mode 100644 index 0000000..d2dee0d --- /dev/null +++ b/cpp/src/view/gui.cpp @@ -0,0 +1,91 @@ +#include "gui.hpp" + +#include + +GUI::GUI() { + window.create(sf::VideoMode(WINDOW_SIZE, WINDOW_SIZE), "Chess Board"); + // load_textures(); +} + +void GUI::update_board( + const Board& b, int8_t selected_square, std::vector legal_moves +) { + window.clear(); + draw_board(selected_square, legal_moves); + // draw_pieces(b); + window.display(); +} + +void GUI::notify_stalemate() {} + +void GUI::notify_checkmate() {} + +void GUI::handle_events() { + sf::Event event; + while (window.pollEvent(event)) + if (event.type == sf::Event::Closed) + window.close(); + else if (event.type == sf::Event::MouseButtonPressed) + handle_click(event.mouseButton.x, event.mouseButton.y); +} + +void GUI::load_textures() { + const std::string names[6] = + {"pawn", "rook", "knight", "bishop", "queen", "king"}; + for (int i = 0; i < 6; ++i) { + textures[i][0].loadFromFile("res/white-" + names[i] + ".png"); + textures[i][1].loadFromFile("res/black-" + names[i] + ".png"); + } +} + +void GUI::handle_click(int x, int y) { + // int file = x / TILE_SIZE; + // int rank = 7 - (y / TILE_SIZE); + // controller.on_tile_selected(file, rank); +} + +void GUI::draw_board(int selected_square, std::vector legal_moves) { + sf::Color colours[2] = { + sf::Color(0xEDD6B0), + sf::Color(0xB88762) + }; // Light and dark squares + // sf::Color alt_colours[2] = { + // sf::Color(0xF6EB72), + // sf::Color(0xDCC34B) + // }; // when selected + // sf::Color circle_colours[2] = { + // sf::Color(0xCCB897), + // sf::Color(0x9E7454) + // }; // legal moves + + sf::RectangleShape square(sf::Vector2f(TILE_SIZE, TILE_SIZE)); + for (int rank = 0; rank < 8; ++rank) { + for (int file = 0; file < 8; ++file) { + square.setPosition(file * TILE_SIZE, (7 - rank) * TILE_SIZE); + square.setFillColor( + (file + rank) % 2 == 0 ? colours[0] : colours[1] + ); + window.draw(square); + } + } +} + +void GUI::draw_pieces(const Board& board) { + for (int i = 0; i < 64; ++i) { + int piece = board.piece_at(i); + if (piece != Piece::None) { + int color = board.colour_at(i) == Colour::White ? 0 : 1; + pieces[i].setTexture(textures[piece - 1][color]); + pieces[i].setPosition( + (i % 8) * TILE_SIZE, + (7 - (int) (i / 8)) * TILE_SIZE + ); + window.draw(pieces[i]); + } + } +} + +void GUI::show() { + while (window.isOpen()) + handle_events(); +} diff --git a/cpp/src/view/gui.hpp b/cpp/src/view/gui.hpp new file mode 100644 index 0000000..748b967 --- /dev/null +++ b/cpp/src/view/gui.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include "../model/board/board.hpp" +#include "view.hpp" + +#include + + +const int TILE_SIZE = 80; +const int BOARD_SIZE = 8; +const int WINDOW_SIZE = TILE_SIZE * BOARD_SIZE; + +class GUI : public View { + public: + GUI(); + + void show() override; + void update_board(const Board&, int8_t, std::vector) override; + void notify_checkmate() override; + void notify_stalemate() override; + + private: + sf::RenderWindow window; + sf::Texture textures[6][2]; + sf::Sprite pieces[64]; + + void load_textures(); + void handle_events(); + void handle_click(int, int); + void draw_board(int, std::vector); + void draw_pieces(const Board&); +}; diff --git a/cpp/src/view/view.hpp b/cpp/src/view/view.hpp new file mode 100644 index 0000000..6d03782 --- /dev/null +++ b/cpp/src/view/view.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "../controller/controller.hpp" +#include "../model/board/board.hpp" +#include "../model/pieces/piece.hpp" +#include "../model/utils/move.hpp" + +class View { + protected: + Controller* controller; + + public: + void set_controller(Controller* c) { + controller = c; + } + + virtual void show() = 0; + virtual void update_board(const Board&, int8_t, std::vector) = 0; + virtual void notify_checkmate() = 0; + virtual void notify_stalemate() = 0; +};