From 600192054549360730be450a067648121ce9f17f Mon Sep 17 00:00:00 2001 From: Bernardo Date: Wed, 5 Mar 2025 10:57:55 +0000 Subject: [PATCH] Initial commit --- meson.build | 16 ++ resources/bomb-solid.svg | 38 ++++ resources/confetti.png | Bin 0 -> 40345 bytes resources/explosion-flag.svg | 43 +++++ resources/explosion-solid.svg | 38 ++++ resources/flag-bomb.svg | 40 ++++ resources/flag-regular.svg | 1 + resources/flag-solid.svg | 1 + resources/gresource.xml | 11 ++ src/MineField.cpp | 115 ++++++++++++ src/MineField.hpp | 46 +++++ src/Window.cpp | 339 ++++++++++++++++++++++++++++++++++ src/main.cpp | 30 +++ src/window.hpp | 62 +++++++ 14 files changed, 780 insertions(+) create mode 100644 meson.build create mode 100644 resources/bomb-solid.svg create mode 100644 resources/confetti.png create mode 100644 resources/explosion-flag.svg create mode 100644 resources/explosion-solid.svg create mode 100644 resources/flag-bomb.svg create mode 100644 resources/flag-regular.svg create mode 100644 resources/flag-solid.svg create mode 100644 resources/gresource.xml create mode 100644 src/MineField.cpp create mode 100644 src/MineField.hpp create mode 100644 src/Window.cpp create mode 100644 src/main.cpp create mode 100644 src/window.hpp diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..536ae03 --- /dev/null +++ b/meson.build @@ -0,0 +1,16 @@ +project('minesweeper', 'cpp', + version : '0.1', + default_options : ['warning_level=3']) + +gnome = import('gnome') + +res = gnome.compile_resources( + 'resources', 'resources/gresource.xml', + source_dir: 'resources', + c_name: 'gresources' +) + +deps = dependency(['gtkmm-4.0', 'sigc++-3.0']) +src = ['Window.cpp', 'window.hpp', 'MineField.hpp', 'MineField.cpp', res] +exe = executable('minesweeper', src, dependencies : deps, install : true) + diff --git a/resources/bomb-solid.svg b/resources/bomb-solid.svg new file mode 100644 index 0000000..7f7d9db --- /dev/null +++ b/resources/bomb-solid.svg @@ -0,0 +1,38 @@ + + + + + + + diff --git a/resources/confetti.png b/resources/confetti.png new file mode 100644 index 0000000000000000000000000000000000000000..4fae30071de6249a7c02856497eb54b7949ab15f GIT binary patch literal 40345 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 b*DCv|yyN}{aop1> literal 0 HcmV?d00001 diff --git a/resources/explosion-flag.svg b/resources/explosion-flag.svg new file mode 100644 index 0000000..9403eaa --- /dev/null +++ b/resources/explosion-flag.svg @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/resources/explosion-solid.svg b/resources/explosion-solid.svg new file mode 100644 index 0000000..a535b76 --- /dev/null +++ b/resources/explosion-solid.svg @@ -0,0 +1,38 @@ + + + + + + + diff --git a/resources/flag-bomb.svg b/resources/flag-bomb.svg new file mode 100644 index 0000000..6c3505a --- /dev/null +++ b/resources/flag-bomb.svg @@ -0,0 +1,40 @@ + + + + + + + + diff --git a/resources/flag-regular.svg b/resources/flag-regular.svg new file mode 100644 index 0000000..b42054c --- /dev/null +++ b/resources/flag-regular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/flag-solid.svg b/resources/flag-solid.svg new file mode 100644 index 0000000..a59b3b4 --- /dev/null +++ b/resources/flag-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/gresource.xml b/resources/gresource.xml new file mode 100644 index 0000000..c221533 --- /dev/null +++ b/resources/gresource.xml @@ -0,0 +1,11 @@ + + + + bomb-solid.svg + explosion-solid.svg + flag-regular.svg + flag-solid.svg + explosion-flag.svg + flag-bomb.svg + + diff --git a/src/MineField.cpp b/src/MineField.cpp new file mode 100644 index 0000000..9d062ec --- /dev/null +++ b/src/MineField.cpp @@ -0,0 +1,115 @@ +#include "MineField.hpp" + +MineField::MineField(int cols, int rows, int mines): m_rows(rows), + m_cols(cols), + m_totalMines(mines), + m_remainingFlags(mines), + m_exploded(false) { + for(int i=0; i< m_cols*m_rows; i++) { + std::shared_ptr cell = std::make_shared(); + m_cells.push_back(cell); + } +} + + +void MineField::initBombs(int x, int y) { + + int remainingMines = m_totalMines; + int startPos = x + y * m_rows; + + srand(time(NULL)); //initialize rand() + + while(remainingMines > 0) { + int position = rand() % (m_cols * m_rows); + if(isBomb(position % m_cols, position / m_rows) || position == startPos) { + continue; + } + m_cells.at(position)->isBomb = true; + --remainingMines; + } +} + +bool MineField::clearCell(int x, int y) { + setClearCell(x, y); + + if(isBomb(x, y)) { + m_exploded = true; + return false; + } + + if (bombsNearby(x, y) == 0) { + openNeighboorhood(x, y); + } + return true; +} + +void MineField::computeBombsNearby(int x, int y) { + int total = 0; + //compute bombs in neighboorhood + for(int i=-1; i<2; i++) { + for(int j=-1; j<2; j++) { + if(x+i >= 0 && x+i < m_cols && y+j >= 0 && y+j < m_rows) { + if(isBomb(x+i, y+j)){ + ++total; + } + } + } + } + m_cells.at(x + y * m_rows)->bombsNearby = total; +} + +void MineField::openNeighboorhood(int x, int y) { + //compute bombs in neighboorhood + for(int i=-1; i<2; i++) { + for(int j=-1; j<2; j++) { + if(x+i >= 0 && x+i < m_cols && y+j >= 0 && y+j < m_rows) { + if((isCleared(x+i, y+j) == false) && (isBomb(x+i, y+j) == false)){ + setClearCell((x+i), (y+j)); + if(bombsNearby(x+i, y+j) == 0) { + openNeighboorhood(x+i, y+j); + } + } + } + } + } +} + +bool MineField::isCleared(int x, int y) { + return m_cells.at(x + y * m_rows)->isCleared; +} + +bool MineField::isFlagged(int x, int y) { + return m_cells.at(x + y * m_rows)->isFlagged; +} + +bool MineField::isBomb(int x, int y) { + return m_cells.at(x + y * m_rows)->isBomb; +} + +int MineField::bombsNearby(int x, int y) { + if(m_cells.at(x + y * m_rows)->bombsNearby == -1) { + computeBombsNearby(x, y); + } + return m_cells.at(x + y * m_rows)->bombsNearby; +} + +void MineField::setClearCell(int x, int y) { + m_cells.at(x + y * m_rows)->isCleared = true; + clearCellSignal.emit(x, y); +} + +bool MineField::toggleFlag(int x, int y) { + if(m_cells.at(x + y * m_rows)->isFlagged == true) { + m_cells.at(x + y * m_rows)->isFlagged = false; + ++m_remainingFlags; + remainingFlagsChangedSignal.emit(m_remainingFlags); + return true; + } + else if(m_remainingFlags > 0) { + m_cells.at(x + y * m_rows)->isFlagged = true; + --m_remainingFlags; + remainingFlagsChangedSignal.emit(m_remainingFlags); + return true; + } + return false; +} diff --git a/src/MineField.hpp b/src/MineField.hpp new file mode 100644 index 0000000..4f9f276 --- /dev/null +++ b/src/MineField.hpp @@ -0,0 +1,46 @@ +#pragma once + +//#include +#include +#include +#include +#include +#include + +struct Cell { + bool isFlagged; + bool isCleared; + bool isBomb; + int bombsNearby; + Cell(): isFlagged(false), isCleared(false), isBomb(false), bombsNearby(-1) {}; +}; + +class MineField { + + std::vector> m_cells; + int m_rows; + int m_cols; + int m_totalMines; + int m_remainingFlags; + bool m_exploded; + void computeBombsNearby(int x, int y); + void openNeighboorhood(int x, int y); + void setClearCell(int x, int y); + +public: + MineField(int cols, int rows, int mines); + void initBombs(int x, int y); + bool isBomb(int x, int y); + bool isFlagged(int x, int y); + bool isCleared(int x, int y); + bool clearCell(int x, int y); + int bombsNearby(int x, int y); + bool isGameOver() {return m_exploded; }; + int getCols() {return m_cols; }; + int getRows() {return m_rows; }; + bool toggleFlag(int x, int y); + int getRemainingFlags() {return m_remainingFlags; }; + int getTotalMines() {return m_totalMines; }; + sigc::signal clearCellSignal; + sigc::signal remainingFlagsChangedSignal; +}; diff --git a/src/Window.cpp b/src/Window.cpp new file mode 100644 index 0000000..e243895 --- /dev/null +++ b/src/Window.cpp @@ -0,0 +1,339 @@ +#include "window.hpp" +#include "gdkmm/pixbuf.h" +#include "gtkmm/cssprovider.h" +#include "gtkmm/image.h" +#include "sigc++/adaptors/bind.h" +#include "sigc++/functors/mem_fun.h" +#include + + +//} +// void MainWindow::ApplyStyles() { +// // Load and apply the CSS file +// auto css_provider = Gtk::CssProvider::create(); +// css_provider->load_from_path("style.css"); +// Gtk::StyleContext::add_provider_for_display(Gdk::Display::get_default(), css_provider, GTK_STYLE_PROVIDER_PRIORITY_USER); +// } + +void MainWindow::OnCellRightClick(int n_press, double n_x, double n_y, int index) { + (void)n_press, (void)n_x, (void)n_y; + int x = index % field.getCols(); + int y = index / field.getRows(); + + if(field.isCleared(x, y) == false) { + field.toggleFlag(x, y); + if(field.isFlagged(x, y)) { + auto imgflag = Gtk::make_managed(); + imgflag->set(m_pixbufFlag); + buttons.at(x + y * field.getRows())->set_child(*imgflag); + buttons.at(x + y * field.getRows())->set_active(true); + } + else { + buttons.at(x + y * field.getRows())->unset_child(); + buttons.at(x+ y * field.getRows())->queue_draw(); + buttons.at(x + y * field.getRows())->set_active(false); + } + } + + // Glib::ustring msg = Glib::ustring::compose("Remaining flags: %1", field.getRemainingFlags()); + // flagLabel.set_label(msg); +} + +void MainWindow::updateFlagsLabel(int flags) { + Glib::ustring msg = Glib::ustring::compose("Remaining flags: %1", flags); + flagLabel.set_label(msg); +} +// void MainWindow::OnNewButtonClick() { +// newGame = true; +// gameOver = false; + +// for (auto &button : buttons) { +// button->set_active(false); +// button->set_sensitive(true); +// button->set_label(""); +// } + +// field->remainingFlags = MINES; +// Glib::ustring msg = Glib::ustring::compose("Remaining flags: %1", field->remainingFlags); +// flagLabel.set_label(msg); + +// if (clockConn.connected()) clockConn.disconnect(); +// elapsedTime = 0; +// clockConn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWindow::UpdateClockLabel), 100); +// } + + +// void MainWindow::OpenNearCells(int index, std::set &visited) { +// int cols = field->Cols(); +// int x = index % cols; +// int y = index / cols; + +// if (visited.count(index)) return; + +// Cell* cell = field->GetCell(x, y); +// if (!cell || cell->bombsNearby > 0 || cell->type == CellType::Bomb) return; + +// visited.insert(index); +// buttons[index]->set_active(true); + +// for (int i = -1; i <= 1; i++) { +// for (int j = -1; j <= 1; j++) { +// if (i == 0 && j == 0) continue; // Skip the current cell + +// int nx = x + i; +// int ny = y + j; +// int newIndex = ny * cols + nx; +// Cell* neighborCell = field->GetCell(nx, ny); + +// // Bounds check before recursive call +// if (nx >= 0 && nx < cols && ny >= 0 && ny < cols) { +// if (visited.count(newIndex) == 0) { +// OpenNearCells(newIndex, visited); +// } +// if (neighborCell && !buttons[newIndex]->get_active() && !neighborCell->isFlag) { +// OpenNearCells(newIndex, visited); +// } +// } +// } +// } +// } + + + +void MainWindow::OnCellClick(int x, int y) { + if (newGame) { + field.initBombs(x, y); + newGame = false; + } + + if(field.isFlagged(x, y)) { + buttons.at(x + y * field.getRows())->set_active(true); + } + else if(field.isBomb(x, y)) { + openBombs(); + } + else { + field.clearCell(x, y); + } +} + + +void MainWindow::openBombs() { + for(int i=0; i < field.getCols() * field.getRows(); i++) { + int x = i % field.getCols(); + int y = i / field.getRows(); + + buttons.at(i)->set_sensitive(false); + + if(field.isBomb(x, y)) { + if(field.isFlagged(x, y)) { + auto imgFlagBomb = std::make_shared(); + imgFlagBomb->set(m_pixbufFlagBomb); + buttons.at(i)->set_child(*imgFlagBomb); + } + else { + auto imgBomb = std::make_shared(); + imgBomb->set(m_pixbufBomb); + buttons.at(i)->set_child(*imgBomb); + } + buttons.at(i)->set_active(true); + } + } +} + +void MainWindow::updateCell(int x, int y) { + if(field.isCleared(x, y)) { + if (field.bombsNearby(x, y) > 0) { + switch(field.bombsNearby(x, y)) { + case 1: + buttons.at(x + y * field.getRows())->get_style_context()->add_class("label-1"); + break; + case 2: + buttons.at(x + y * field.getRows())->get_style_context()->add_class("label-2"); + break; + case 3: + buttons.at(x + y * field.getRows())->get_style_context()->add_class("label-3"); + break; + case 4: + buttons.at(x + y * field.getRows())->get_style_context()->add_class("label-4"); + break; + case 5: + buttons.at(x + y * field.getRows())->get_style_context()->add_class("label-5"); + break; + case 6: + buttons.at(x + y * field.getRows())->get_style_context()->add_class("label-6"); + break; + case 7: + buttons.at(x + y * field.getRows())->get_style_context()->add_class("label-7"); + break; + case 8: + buttons.at(x + y * field.getRows())->get_style_context()->add_class("label-8"); + break; + } + buttons.at(x + y * field.getRows())->set_label(Glib::ustring::format(field.bombsNearby(x, y))); + } + buttons.at(x + y * field.getRows())->set_active(true); + buttons.at(x + y * field.getRows())->set_sensitive(false); + } +} +// void MainWindow::ShowGameWonAnimation() { +// // Limit the number of confetti images to 10 +// int confettiCount = 10; +// for (int i = 0; i < confettiCount; ++i) { +// Glib::signal_timeout().connect_once([this]() { +// auto confetti = Gtk::make_managed(); +// confetti->set_from_resource("/mineSweeper/confetti"); +// // Randomize position on the grid or overlay. +// grid->attach(*confetti, rand() % COLS, rand() % COLS); +// grid->queue_draw(); +// }, i * 100); // Add confetti with a delay of 100ms each +// } +// } + + +// bool MainWindow::AllCellsOpened() +// { +// for(int i=0; iget_active()) +// return false; +// } +// return true; +// } + + +// bool MainWindow::UpdateClockLabel() +// { +// if(gameOver) return false; + +// elapsedTime++; + +// int deciseconds = elapsedTime % 10; +// int seconds = (elapsedTime / 10) % 60; +// int minutes = (elapsedTime /600) % 60; + +// Glib::ustring msg = Glib::ustring::compose("Elapsed time: %1:%2.%3", \ +// Glib::ustring::format(std::setfill(L'0'), std::setw(2), minutes), \ +// Glib::ustring::format(std::setfill(L'0'), std::setw(2), seconds), \ +// Glib::ustring::format(std::setfill(L'0'), std::setw(1), deciseconds)); +// clockLabel.set_label(msg); + +// return true; +// } + +MainWindow::MainWindow() +{ + // ApplyStyles(); // Load the CSS file + elapsedTime = 0; + newGame = true; + set_title("MineSweeper"); + set_default_size(400, 400); + set_resizable(false); + + boxV = Gtk::Box(Gtk::Orientation::VERTICAL); + boxH = Gtk::Box(Gtk::Orientation::HORIZONTAL); + + boxH.set_hexpand(true); + + boxV.append(boxH); + boxH.set_expand(true); + + Gtk::Label labelMines; + labelMines.set_margin_top(12); + labelMines.set_margin_start(12); + labelMines.set_label(Glib::ustring::compose("Total mines: %1", field.getTotalMines())); + //labelMines.set_hexpand(true); + + Glib::ustring msg = Glib::ustring::compose("Remaining flags: %1", field.getRemainingFlags()); + flagLabel = Gtk::Label(msg); + flagLabel.set_margin_top(12); + flagLabel.set_margin_start(12); + flagLabel.set_margin_end(12); + //flagLabel.set_hexpand(true); + + clockLabel.set_margin_top(12); + clockLabel.set_margin_start(12); + clockLabel.set_margin_end(12); + clockLabel.set_hexpand(true); + Glib::ustring clockmsg = Glib::ustring::compose("Elapsed time: 00:00.0"); + clockLabel.set_label(clockmsg); + + boxH.append(labelMines); + boxH.append(clockLabel); + boxH.append(flagLabel); + + + //TODO check if it's okay to mix std::shared_ptr with Gdk::ptr + m_pixbufBomb = Gdk::Pixbuf::create_from_resource("/minesweeper/bomb-solid"); + m_pixbufFlag = Gdk::Pixbuf::create_from_resource("/minesweeper/flag-solid"); + m_pixbufFlagBomb = Gdk::Pixbuf::create_from_resource("/minesweeper/flag-bomb"); + + // bombPix.set_from_resource("/minesweeper/bomb-solid"); + + auto css_provider = Gtk::CssProvider::create(); + css_provider->load_from_data( + ".label-1 { font-weight: bold; font-size: 1.5em; color: Blue; }\ + .label-2 { font-weight: bold; font-size: 1.5em; color: Green; }\ + .label-3 { font-weight: bold; font-size: 1.5em; color: Darkorange; }\ + .label-4 { font-weight: bold; font-size: 1.5em; color: Purple; }\ + .label-5 { font-weight: bold; font-size: 1.5em; color: Red; }\ + .label-6 { font-weight: bold; font-size: 1.5em; color: Salmon; }\ + .label-7 { font-weight: bold; font-size: 1.5em; color: Turquoise; }\ + .label-8 { font-weight: bold; font-size: 1.5em; color: Magenta; }"); + + auto display = Gdk::Display::get_default(); + Gtk::StyleContext::add_provider_for_display(display, css_provider, GTK_STYLE_PROVIDER_PRIORITY_USER); + + for (int i = 0; i < field.getCols() * field.getRows(); i++) { + auto button = std::make_shared(); + button->set_size_request(50, 40); + button->set_sensitive(true); + button->set_active(false); + int x = i % field.getCols(); + int y = i / field.getRows(); + button->signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &MainWindow::OnCellClick), x, y)); + + //button->get_style_context()->add_class("fixed-button"); + + auto gesture = Gtk::GestureClick::create(); + gesture->set_button(3); + gesture->signal_released().connect(sigc::bind(sigc::mem_fun(*this, \ + &MainWindow::OnCellRightClick), i)); + button->add_controller(gesture); + + buttons.push_back(button); + + grid.attach(*button, x, y); + } + + field.clearCellSignal.connect(sigc::bind(sigc::mem_fun(*this, &MainWindow::updateCell))); + field.remainingFlagsChangedSignal.connect(sigc::bind(sigc::mem_fun(*this, \ + &MainWindow::updateFlagsLabel))); + //newGameButton.set_label("New"); + //newGameButton.add_css_class("suggested-action"); + //newGameButton.signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::OnNewButtonClick)); + + //optionButton.set_icon_name("open-menu"); + + //create the minefield + //field = new MineField(COLS, MINES); + + //bar.pack_start(newGameButton); + //bar.pack_end(optionButton); + + //grid.set_row_homogeneous(false); + //grid.set_column_homogeneous(false); + grid.set_margin(10); + //grid.set_vexpand(true); + //grid.set_hexpand(true); + // grid.set_fill(false); + + boxV.append(grid); + + this->set_titlebar(bar); + this->set_child(boxV); +} + +int main(int argc, char **argv) { + auto app = Gtk::Application::create("eu.minesweeper"); + return app->make_window_and_run(argc, argv); +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..c13ef29 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,30 @@ +#include "MineField.hpp" +#include + +int main() { + + MineField field(160,160, 100); + + srand(time(NULL)); + + int x = rand() % 160; + int y = rand() % 160; + + field.initBombs(x, y); + + printf("Opened cell: %i %i\n", x, y); + printf("Neighboor bombs: %i\n", field.bombsNearby(x,y)); + + while(!field.isGameOver()) { + x = rand() % 160; + y = rand() % 160; + + if(field.clearCell(x, y)) { + printf("Opened cell: %i %i\n", x, y); + printf("Neighboor bombs: %i\n", field.bombsNearby(x,y)); + } + else { + printf("Bomb found in cell: %i %i\n", x, y); + } + } +} diff --git a/src/window.hpp b/src/window.hpp new file mode 100644 index 0000000..60026c5 --- /dev/null +++ b/src/window.hpp @@ -0,0 +1,62 @@ +#pragma once + +#include "MineField.hpp" +#include "gdkmm/pixbuf.h" +#include +//#include +#include +#include +#include +#include +//#include +//#include +#include +//#include +// #include +// #include +//#include +//#include +// #include +// #include +// #include +// #include +// #include + +#define PROJECT_NAME "minesweeper" + + +class MainWindow : public Gtk::Window +{ + Gtk::Box boxV{Gtk::Orientation::VERTICAL}; + Gtk::Box boxH{Gtk::Orientation::HORIZONTAL}; + std::vector> buttons; + Gtk::Grid grid; + Gtk::HeaderBar bar; + Gtk::Button newGameButton; + Gtk::Button optionButton; + Gtk::Label flagLabel; + Gtk::Label clockLabel; + MineField field {16, 16, 40}; + int elapsedTime; + bool newGame; + std::shared_ptr m_pixbufBomb; + std::shared_ptr m_pixbufFlag; + std::shared_ptr m_pixbufFlagBomb; + void updateCell(int x, int y); + void openBombs(); + void updateFlagsLabel(int flags); + +// sigc::connection clockConn; +// void OpenNearCells(int index); +// void Explode(); +// bool AllCellsOpened(); + + public: +MainWindow(); +// void OnNewButtonClick(); + void OnCellClick(int x, int y); + void OnCellRightClick(int n_press, double n_x, double n_y, int index); +// void ShowGameWonAnimation(); +// void ApplyStyles(); +// bool UpdateClockLabel(); +};