1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 01:37:35 +00:00

Minesweeper: Add flag counter and game timer.

This commit is contained in:
Andreas Kling 2019-04-14 21:01:52 +02:00
parent adc91d92a3
commit 1503834c3b
3 changed files with 37 additions and 4 deletions

View file

@ -24,10 +24,16 @@ public:
} }
}; };
Field::Field(GButton& face_button, GWidget* parent) Field::Field(GLabel& flag_label, GLabel& time_label, GButton& face_button, GWidget* parent)
: GFrame(parent) : GFrame(parent)
, m_face_button(face_button) , m_face_button(face_button)
, m_flag_label(flag_label)
, m_time_label(time_label)
{ {
m_timer.on_timeout = [this] {
m_time_label.set_text(String::format("%u", ++m_seconds_elapsed));
};
m_timer.set_interval(1000);
set_frame_thickness(2); set_frame_thickness(2);
set_frame_shape(FrameShape::Container); set_frame_shape(FrameShape::Container);
set_frame_shadow(FrameShadow::Sunken); set_frame_shadow(FrameShadow::Sunken);
@ -88,6 +94,11 @@ void Field::for_each_neighbor_of(const Square& square, Callback callback)
void Field::reset() void Field::reset()
{ {
m_seconds_elapsed = 0;
m_time_label.set_text("0");
m_flags_left = m_mine_count;
m_flag_label.set_text(String::format("%u", m_flags_left));
m_timer.start();
set_greedy_for_hits(false); set_greedy_for_hits(false);
set_face(Face::Default); set_face(Face::Default);
srand(time(nullptr)); srand(time(nullptr));
@ -189,13 +200,25 @@ void Field::on_square_right_clicked(Square& square)
{ {
if (square.is_swept) if (square.is_swept)
return; return;
square.has_flag = !square.has_flag; if (!square.has_flag && !m_flags_left)
return;
if (!square.has_flag) {
--m_flags_left;
square.has_flag = true;
} else {
++m_flags_left;
square.has_flag = false;
}
m_flag_label.set_text(String::format("%u", m_flags_left));
square.button->set_icon(square.has_flag ? m_flag_bitmap : nullptr); square.button->set_icon(square.has_flag ? m_flag_bitmap : nullptr);
square.button->update(); square.button->update();
} }
void Field::win() void Field::win()
{ {
m_timer.stop();
set_greedy_for_hits(true); set_greedy_for_hits(true);
set_face(Face::Good); set_face(Face::Good);
reveal_mines(); reveal_mines();
@ -203,6 +226,7 @@ void Field::win()
void Field::game_over() void Field::game_over()
{ {
m_timer.stop();
set_greedy_for_hits(true); set_greedy_for_hits(true);
set_face(Face::Bad); set_face(Face::Bad);
reveal_mines(); reveal_mines();

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <LibGUI/GFrame.h> #include <LibGUI/GFrame.h>
#include <LibCore/CTimer.h>
class SquareButton; class SquareButton;
class GButton; class GButton;
@ -19,7 +20,7 @@ struct Square {
class Field final : public GFrame { class Field final : public GFrame {
public: public:
Field(GButton& face_button, GWidget* parent); Field(GLabel& flag_label, GLabel& time_label, GButton& face_button, GWidget* parent);
virtual ~Field() override; virtual ~Field() override;
int rows() const { return m_rows; } int rows() const { return m_rows; }
@ -55,5 +56,10 @@ private:
RetainPtr<GraphicsBitmap> m_flag_bitmap; RetainPtr<GraphicsBitmap> m_flag_bitmap;
RetainPtr<GraphicsBitmap> m_number_bitmap[8]; RetainPtr<GraphicsBitmap> m_number_bitmap[8];
GButton& m_face_button; GButton& m_face_button;
GLabel& m_flag_label;
GLabel& m_time_label;
CTimer m_timer;
int m_seconds_elapsed { 0 };
int m_flags_left { 0 };
Face m_face { Face::Default }; Face m_face { Face::Default };
}; };

View file

@ -6,6 +6,7 @@
#include <LibGUI/GMenu.h> #include <LibGUI/GMenu.h>
#include <LibGUI/GMenuBar.h> #include <LibGUI/GMenuBar.h>
#include <LibGUI/GAction.h> #include <LibGUI/GAction.h>
#include <LibGUI/GLabel.h>
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
@ -24,8 +25,10 @@ int main(int argc, char** argv)
container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); container->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
container->set_preferred_size({ 0, 36 }); container->set_preferred_size({ 0, 36 });
container->set_layout(make<GBoxLayout>(Orientation::Horizontal)); container->set_layout(make<GBoxLayout>(Orientation::Horizontal));
auto* flag_label = new GLabel(container);
auto* face_button = new GButton(container); auto* face_button = new GButton(container);
auto* field = new Field(*face_button, widget); auto* time_label = new GLabel(container);
auto* field = new Field(*flag_label, *time_label, *face_button, widget);
auto menubar = make<GMenuBar>(); auto menubar = make<GMenuBar>();