From 4df360be8caf49851ead137c4fefa5a38c4bbab1 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 13 Apr 2019 03:57:55 +0200 Subject: [PATCH] Minesweeper: More implementation work. --- Base/res/icons/minesweeper/5.png | Bin 0 -> 138 bytes Base/res/icons/minesweeper/6.png | Bin 0 -> 150 bytes Base/res/icons/minesweeper/7.png | Bin 0 -> 135 bytes Base/res/icons/minesweeper/8.png | Bin 0 -> 143 bytes Games/Minesweeper/Field.cpp | 34 +++++++++++++++---------------- Games/Minesweeper/Field.h | 9 +++----- Games/Minesweeper/main.cpp | 26 ++++++++++++++++++++--- 7 files changed, 42 insertions(+), 27 deletions(-) create mode 100644 Base/res/icons/minesweeper/5.png create mode 100644 Base/res/icons/minesweeper/6.png create mode 100644 Base/res/icons/minesweeper/7.png create mode 100644 Base/res/icons/minesweeper/8.png diff --git a/Base/res/icons/minesweeper/5.png b/Base/res/icons/minesweeper/5.png new file mode 100644 index 0000000000000000000000000000000000000000..d64259f64b2fe4c573ce6fd6f1e576f35d523650 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0y~yVBiN~4mJh`2J356y%-o60zF+ELp07OCoEtvP%0KP zHu!UVxrLaot+1-uW`Sg8J%@>BeM&eDa^e(krRA_0Pg*5-lhx&BkM@_9;IMy3PHrOK=` zBo{wo^fZ3$J!>X=oac=D5{t^7wWePBYN9jwb&+m?gOQZeTcH literal 0 HcmV?d00001 diff --git a/Base/res/icons/minesweeper/7.png b/Base/res/icons/minesweeper/7.png new file mode 100644 index 0000000000000000000000000000000000000000..df149914e1c9f5fa824521b03c9562d293874f98 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0y~yVBiN~4mJh`2J356y%-o6{5)M8Lp07OCoEtvP%5ra zUiMdg$-~cGIy>alR^9C3R@mKgTe~DWM4fKTs?( literal 0 HcmV?d00001 diff --git a/Base/res/icons/minesweeper/8.png b/Base/res/icons/minesweeper/8.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c7427e3e820e17fc2a48aed6ab4120d631b360 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0y~yVBiN~4mJh`2J356y%-o6!aQ9ZLp07OCoEtvSj7Fo z$l%ZMWgm>iw)Py!IFic1ZP-;HdFqIR?}5_?KFHrxE3tD-7k*sd#oQw}+pUJNP3O3a vPfe2WVv8*^J2*9B5*_Csquare(r + 1, c)); if (c < (m_columns - 2)) // Right callback(this->square(r, c + 1)); + if (r > 0 && c > 0) // UpLeft + callback(this->square(r - 1, c - 1)); + if (r > 0 && c < (m_columns - 2)) // UpRight + callback(this->square(r - 1, c + 1)); + if (r < (m_rows - 2) && c > 0) // DownLeft + callback(this->square(r + 1, c - 1)); + if (r < (m_rows - 2) && c < (m_columns - 2)) // DownRight + callback(this->square(r + 1, c + 1)); } void Field::reset() @@ -84,8 +90,10 @@ void Field::reset() square.label->set_visible(false); square.label->set_icon(square.has_mine ? m_mine_bitmap : nullptr); square.label->set_background_color(Color::from_rgb(0xff4040)); + square.label->set_fill_with_background_color(false); if (!square.button) square.button = new SquareButton(this); + square.button->set_icon(nullptr); square.button->set_relative_rect(rect); square.button->set_visible(true); square.button->on_click = [this, &square] (GButton&) { @@ -107,22 +115,12 @@ void Field::reset() square.number = number; if (square.has_mine) continue; - switch (number) { - case 1: - square.label->set_icon(m_one_bitmap.copy_ref()); - break; - case 2: - square.label->set_icon(m_two_bitmap.copy_ref()); - break; - case 3: - square.label->set_icon(m_three_bitmap.copy_ref()); - break; - case 4: - square.label->set_icon(m_four_bitmap.copy_ref()); - break; - } + if (square.number) + square.label->set_icon(m_number_bitmap[square.number - 1].copy_ref()); } } + + update(); } void Field::flood_fill(Square& square) diff --git a/Games/Minesweeper/Field.h b/Games/Minesweeper/Field.h index 2798624f26..9395bd1287 100644 --- a/Games/Minesweeper/Field.h +++ b/Games/Minesweeper/Field.h @@ -40,14 +40,11 @@ private: template void for_each_neighbor_of(const Square&, Callback); - int m_rows { 10 }; - int m_columns { 10 }; + int m_rows { 9 }; + int m_columns { 9 }; int m_mine_count { 10 }; Vector m_squares; RetainPtr m_mine_bitmap; RetainPtr m_flag_bitmap; - RetainPtr m_one_bitmap; - RetainPtr m_two_bitmap; - RetainPtr m_three_bitmap; - RetainPtr m_four_bitmap; + RetainPtr m_number_bitmap[8]; }; diff --git a/Games/Minesweeper/main.cpp b/Games/Minesweeper/main.cpp index 45a4da7710..3b9dcb790a 100644 --- a/Games/Minesweeper/main.cpp +++ b/Games/Minesweeper/main.cpp @@ -1,6 +1,8 @@ #include "Field.h" #include #include +#include +#include int main(int argc, char** argv) { @@ -8,9 +10,27 @@ int main(int argc, char** argv) auto* window = new GWindow; window->set_title("Minesweeper"); - window->set_rect(100, 100, 200, 300); - auto* field = new Field(nullptr); - window->set_main_widget(field); + window->set_rect(100, 100, 135, 171); + + auto* widget = new GWidget; + window->set_main_widget(widget); + widget->set_layout(make(Orientation::Vertical)); + + auto* container = new GWidget(widget); + container->set_fill_with_background_color(true); + container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); + container->set_preferred_size({ 0, 36 }); + container->set_layout(make(Orientation::Horizontal)); + auto* face_button = new GButton(container); + face_button->set_size_policy(SizePolicy::Fixed, SizePolicy::Fixed); + face_button->set_preferred_size({ 32, 32 }); + face_button->set_icon(GraphicsBitmap::load_from_file("/res/icons/minesweeper/face-default.png")); + + auto* field = new Field(widget); + + face_button->on_click = [field] (auto&) { + field->reset(); + }; window->show();