]> git.saurik.com Git - wxWidgets.git/commitdiff
Third part of patch #1178276 and game improvements.
authorWłodzimierz Skiba <abx@abx.art.pl>
Mon, 16 May 2005 15:32:04 +0000 (15:32 +0000)
committerWłodzimierz Skiba <abx@abx.art.pl>
Mon, 16 May 2005 15:32:04 +0000 (15:32 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34081 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

demos/bombs/bombs1.cpp
demos/bombs/game.cpp
demos/bombs/game.h

index a7724d1d2434c875782ea1d24dcad83e6cb8b390..a2d874e20dff20e798f1662422226400bb5c5760 100644 (file)
@@ -38,23 +38,15 @@ void BombsCanvas::DrawField(wxDC *dc, int xc1, int yc1, int xc2, int yc2)
     wxString buf;
     long chw, chh;
 
     wxString buf;
     long chw, chh;
 
-    wxColour wxBlack = wxTheColourDatabase->Find(wxT("BLACK"));
-    wxColour wxWhite = wxTheColourDatabase->Find(wxT("WHITE"));
-    wxColour wxRed = wxTheColourDatabase->Find(wxT("RED"));
-    wxColour wxBlue = wxTheColourDatabase->Find(wxT("BLUE"));
-    wxColour wxGrey = wxTheColourDatabase->Find(wxT("LIGHT GREY"));
+    wxColour wxYellow  = wxTheColourDatabase->Find(wxT("YELLOW"));
     wxColour wxFocused = wxTheColourDatabase->Find(wxT("GREY"));
     wxColour wxFocused = wxTheColourDatabase->Find(wxT("GREY"));
-    wxColour wxGreen = wxTheColourDatabase->Find(wxT("GREEN"));
 
 
-    wxPen *blackPen = wxThePenList->FindOrCreatePen(wxBlack, 1, wxSOLID);
-    wxPen *redPen = wxThePenList->FindOrCreatePen(wxRed, 1, wxSOLID);
-    wxPen *bluePen = wxThePenList->FindOrCreatePen(wxBlue, 1, wxSOLID);
-    wxBrush *whiteBrush = wxTheBrushList->FindOrCreateBrush(wxWhite, wxSOLID);
-    wxBrush *greyBrush = wxTheBrushList->FindOrCreateBrush(wxGrey, wxSOLID);
+    wxPen *bluePen = wxThePenList->FindOrCreatePen(*wxBLUE, 1, wxSOLID);
+
     wxBrush *focusedBrush = wxTheBrushList->FindOrCreateBrush(wxFocused, wxSOLID);
     wxBrush *focusedBrush = wxTheBrushList->FindOrCreateBrush(wxFocused, wxSOLID);
-    wxBrush *redBrush = wxTheBrushList->FindOrCreateBrush(wxRed, wxSOLID);
+    wxBrush *yellowBrush  = wxTheBrushList->FindOrCreateBrush(wxYellow, wxSOLID);
 
 
-    dc->SetPen(* blackPen);
+    dc->SetPen(*wxBLACK_PEN);
 
     int x, y;
     int xMax = this->GetGridSizeInPixels().GetWidth();
 
     int x, y;
     int xMax = this->GetGridSizeInPixels().GetWidth();
@@ -73,22 +65,22 @@ void BombsCanvas::DrawField(wxDC *dc, int xc1, int yc1, int xc2, int yc2)
         {
             if (m_game->IsMarked(x,y))
             {
         {
             if (m_game->IsMarked(x,y))
             {
-                dc->SetPen(* blackPen);
+                dc->SetPen(*wxBLACK_PEN);
 
                 if (m_game->IsFocussed(x, y))
 
                 if (m_game->IsFocussed(x, y))
-                    dc->SetBrush(* focusedBrush);
+                    dc->SetBrush(*focusedBrush);
                 else
                 else
-                    dc->SetBrush(* greyBrush);
+                    dc->SetBrush(*wxLIGHT_GREY_BRUSH);
 
                 dc->DrawRectangle( x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                     m_cellWidth*X_UNIT+1, m_cellHeight*Y_UNIT+1);
                 buf = wxT("M");
                 if (!m_game->IsHidden(x,y) && m_game->IsBomb(x,y))
 
                 dc->DrawRectangle( x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                     m_cellWidth*X_UNIT+1, m_cellHeight*Y_UNIT+1);
                 buf = wxT("M");
                 if (!m_game->IsHidden(x,y) && m_game->IsBomb(x,y))
-                    dc->SetTextForeground(wxBlue);
+                    dc->SetTextForeground(*wxBLUE);
                 else
                 else
-                    dc->SetTextForeground(wxRed);
+                    dc->SetTextForeground(*wxRED);
 
 
-                dc->SetTextBackground(wxGrey);
+                dc->SetTextBackground(*wxLIGHT_GREY);
                 dc->GetTextExtent(buf, &chw, &chh);
                 dc->DrawText( buf,
                     x*m_cellWidth*X_UNIT + (m_cellWidth*X_UNIT-chw)/2,
                 dc->GetTextExtent(buf, &chw, &chh);
                 dc->DrawText( buf,
                     x*m_cellWidth*X_UNIT + (m_cellWidth*X_UNIT-chw)/2,
@@ -96,7 +88,7 @@ void BombsCanvas::DrawField(wxDC *dc, int xc1, int yc1, int xc2, int yc2)
 
                 if (!m_game->IsHidden(x,y) && m_game->IsBomb(x,y))
                 {
 
                 if (!m_game->IsHidden(x,y) && m_game->IsBomb(x,y))
                 {
-                    dc->SetPen(*redPen);
+                    dc->SetPen(*wxRED_PEN);
                     dc->DrawLine(x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                         (x+1)*m_cellWidth*X_UNIT, (y+1)*m_cellHeight*Y_UNIT);
                     dc->DrawLine(x*m_cellWidth*X_UNIT, (y+1)*m_cellHeight*Y_UNIT,
                     dc->DrawLine(x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                         (x+1)*m_cellWidth*X_UNIT, (y+1)*m_cellHeight*Y_UNIT);
                     dc->DrawLine(x*m_cellWidth*X_UNIT, (y+1)*m_cellHeight*Y_UNIT,
@@ -105,31 +97,31 @@ void BombsCanvas::DrawField(wxDC *dc, int xc1, int yc1, int xc2, int yc2)
             }
             else if (m_game->IsHidden(x,y))
             {
             }
             else if (m_game->IsHidden(x,y))
             {
-                dc->SetPen(*blackPen);
+                dc->SetPen(*wxBLACK_PEN);
                 if (m_game->IsFocussed(x, y))
                 if (m_game->IsFocussed(x, y))
-                    dc->SetBrush(* focusedBrush);
+                    dc->SetBrush(*focusedBrush);
                 else
                 else
-                    dc->SetBrush(*greyBrush);
+                    dc->SetBrush(*wxLIGHT_GREY_BRUSH);
 
                 dc->DrawRectangle( x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                     m_cellWidth*X_UNIT+1, m_cellHeight*Y_UNIT+1);
             }
             else if (m_game->IsBomb(x,y))
             {
 
                 dc->DrawRectangle( x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                     m_cellWidth*X_UNIT+1, m_cellHeight*Y_UNIT+1);
             }
             else if (m_game->IsBomb(x,y))
             {
-                dc->SetPen(* blackPen);
-                dc->SetBrush(* redBrush);
+                dc->SetPen(*wxBLACK_PEN);
+                dc->SetBrush(*wxRED_BRUSH);
                 dc->DrawRectangle( x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                     m_cellWidth*X_UNIT+1, m_cellHeight*Y_UNIT+1);
                 buf = wxT("B");
                 dc->DrawRectangle( x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                     m_cellWidth*X_UNIT+1, m_cellHeight*Y_UNIT+1);
                 buf = wxT("B");
-                dc->SetTextForeground(wxBlack);
-                dc->SetTextBackground(wxRed);
+                dc->SetTextForeground(*wxBLACK);
+                dc->SetTextBackground(*wxRED);
                 dc->GetTextExtent(buf, &chw, &chh);
                 dc->DrawText( buf,
                     x*m_cellWidth*X_UNIT + (m_cellWidth*X_UNIT-chw)/2,
                     y*m_cellHeight*Y_UNIT + (m_cellHeight*Y_UNIT-chh)/2);
                 if (m_game->IsExploded(x,y))
                 {
                 dc->GetTextExtent(buf, &chw, &chh);
                 dc->DrawText( buf,
                     x*m_cellWidth*X_UNIT + (m_cellWidth*X_UNIT-chw)/2,
                     y*m_cellHeight*Y_UNIT + (m_cellHeight*Y_UNIT-chh)/2);
                 if (m_game->IsExploded(x,y))
                 {
-                    dc->SetPen(* bluePen);
+                    dc->SetPen(*bluePen);
                     dc->DrawLine(x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                         (x+1)*m_cellWidth*X_UNIT, (y+1)*m_cellHeight*Y_UNIT);
                     dc->DrawLine(x*m_cellWidth*X_UNIT, (y+1)*m_cellHeight*Y_UNIT,
                     dc->DrawLine(x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                         (x+1)*m_cellWidth*X_UNIT, (y+1)*m_cellHeight*Y_UNIT);
                     dc->DrawLine(x*m_cellWidth*X_UNIT, (y+1)*m_cellHeight*Y_UNIT,
@@ -138,11 +130,13 @@ void BombsCanvas::DrawField(wxDC *dc, int xc1, int yc1, int xc2, int yc2)
             }
             else   // Display a digit
             {
             }
             else   // Display a digit
             {
-                dc->SetPen(* blackPen);
+                dc->SetPen(*wxBLACK_PEN);
                 if (m_game->IsFocussed(x, y))
                 if (m_game->IsFocussed(x, y))
-                    dc->SetBrush(* focusedBrush);
-                else
-                    dc->SetBrush(* whiteBrush);
+                    dc->SetBrush(*focusedBrush);
+                else if (m_game->IsSelected(x,y))
+                    dc->SetBrush(*wxWHITE_BRUSH);
+                else 
+                    dc->SetBrush(*yellowBrush);
                 dc->DrawRectangle( x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                     m_cellWidth*X_UNIT+1, m_cellHeight*Y_UNIT+1);
 
                 dc->DrawRectangle( x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
                     m_cellWidth*X_UNIT+1, m_cellHeight*Y_UNIT+1);
 
@@ -151,19 +145,19 @@ void BombsCanvas::DrawField(wxDC *dc, int xc1, int yc1, int xc2, int yc2)
                 {
                 case 0:
                     buf = wxT("0");
                 {
                 case 0:
                     buf = wxT("0");
-                    dc->SetTextForeground(wxGreen);
+                    dc->SetTextForeground(*wxGREEN);
                     break;
                 case 1:
                     buf = wxT("1");
                     break;
                 case 1:
                     buf = wxT("1");
-                    dc->SetTextForeground(wxBlue);
+                    dc->SetTextForeground(*wxBLUE);
                     break;
                 default:
                     buf.Printf(wxT("%d"),digit_value);
                     break;
                 default:
                     buf.Printf(wxT("%d"),digit_value);
-                    dc->SetTextForeground(wxBlack);
+                    dc->SetTextForeground(*wxBLACK);
                     break;
             }
             dc->GetTextExtent(buf, &chw, &chh);
                     break;
             }
             dc->GetTextExtent(buf, &chw, &chh);
-            dc->SetTextBackground(wxWhite);
+            dc->SetTextBackground(*wxWHITE);
             dc->DrawText( buf,
                 x*m_cellWidth*X_UNIT + (m_cellWidth*X_UNIT-chw)/2,
                 y*m_cellHeight*Y_UNIT + (m_cellHeight*Y_UNIT-chh)/2);
             dc->DrawText( buf,
                 x*m_cellWidth*X_UNIT + (m_cellWidth*X_UNIT-chw)/2,
                 y*m_cellHeight*Y_UNIT + (m_cellHeight*Y_UNIT-chh)/2);
@@ -172,8 +166,9 @@ void BombsCanvas::DrawField(wxDC *dc, int xc1, int yc1, int xc2, int yc2)
     dc->SetFont(wxNullFont);
 
     wxString msg;
     dc->SetFont(wxNullFont);
 
     wxString msg;
-    msg.Printf(wxT("%d bombs  %d remaining cells"),
-        m_game->GetNumBombs(), m_game->GetNumRemainingCells() );
+    msg.Printf(wxT("%d bombs, %u marked, %d remaining cells"),
+               m_game->GetNumBombs(), m_game->GetNumMarkedCells(), 
+               m_game->GetNumRemainingCells() );
 
 #if wxUSE_LOG && wxUSE_STATUSBAR
     wxLogStatus(msg);
 
 #if wxUSE_LOG && wxUSE_STATUSBAR
     wxLogStatus(msg);
@@ -201,7 +196,7 @@ void BombsCanvas::RefreshField(int xc1, int yc1, int xc2, int yc2)
 // Called when uncovering a cell.
 void BombsCanvas::Uncover(int x, int y)
 {
 // Called when uncovering a cell.
 void BombsCanvas::Uncover(int x, int y)
 {
-    m_game->Unhide(x,y);
+    m_game->Unhide(x,y,true);
     RefreshField(x, y, x, y);
 
     const int gridWidth = m_game->GetWidth();
     RefreshField(x, y, x, y);
 
     const int gridWidth = m_game->GetWidth();
@@ -223,10 +218,11 @@ void BombsCanvas::Uncover(int x, int y)
 
         for(x=0; x<gridWidth; x++)
             for(y=0; y<gridHeight; y++)
 
         for(x=0; x<gridWidth; x++)
             for(y=0; y<gridHeight; y++)
-                m_game->Unhide(x,y);
-                    RefreshField(0, 0, gridWidth-1, gridHeight-1);
+                m_game->Unhide(x,y,false);
+
+        RefreshField(0, 0, gridWidth-1, gridHeight-1);
     }
     }
-    else if (!m_game->Get(x, y))
+    else if (0 == (m_game->Get(x, y) & BG_MASK))
     {
         int left = ( x > 0 ) ? x-1 : 0;
         int right = ( x < gridWidth - 1 )
     {
         int left = ( x > 0 ) ? x-1 : 0;
         int right = ( x < gridWidth - 1 )
index 6a76fea09b6f8d2358e99aa6c2de4f41ea88f503..9790ed67a6fde666bc7d752e57f3f92c7a2dce8e 100644 (file)
@@ -99,6 +99,7 @@ bool BombsGame::Init(int aWidth, int aHeight, bool easyCorner)
             }
 
     m_numRemainingCells = m_height*m_width-m_numBombCells;
             }
 
     m_numRemainingCells = m_height*m_width-m_numBombCells;
+    m_numMarkedCells = 0;
 
     return true;
 }
 
     return true;
 }
@@ -106,15 +107,22 @@ bool BombsGame::Init(int aWidth, int aHeight, bool easyCorner)
 void BombsGame::Mark(int x, int y)
 {
     m_field[x+y*m_width] ^= BG_MARKED;
 void BombsGame::Mark(int x, int y)
 {
     m_field[x+y*m_width] ^= BG_MARKED;
+    if (IsMarked(x, y))
+        m_numMarkedCells++;
+    else
+        m_numMarkedCells--;
 }
 
 }
 
-void BombsGame::Unhide(int x, int y)
+void BombsGame::Unhide(int x, int y, bool b_selected)
 {
     if (!IsHidden(x,y))
     {
         return;
     }
 
 {
     if (!IsHidden(x,y))
     {
         return;
     }
 
+    if (b_selected)
+        m_field[x+y*m_width] |= BG_SELECTED;
+
     m_field[x+y*m_width] &= ~BG_HIDDEN;
 
     if (!IsBomb(x,y))
     m_field[x+y*m_width] &= ~BG_HIDDEN;
 
     if (!IsBomb(x,y))
index d32f597855561bb81d050b8420b4928b51cc5a73..fc500ecd94bc21b62d9f960091d2e8bb292167bd 100644 (file)
@@ -16,7 +16,8 @@
 #define BG_BOMB     0x200
 #define BG_MARKED   0x400
 #define BG_EXPLODED 0x800
 #define BG_BOMB     0x200
 #define BG_MARKED   0x400
 #define BG_EXPLODED 0x800
-#define BG_MASK     0x0FF
+#define BG_SELECTED 0x080
+#define BG_MASK     0x03F
 
 #include <stddef.h>
 
 
 #include <stddef.h>
 
@@ -64,6 +65,11 @@ public:
         return Get(x,y) & BG_EXPLODED;
     };
 
         return Get(x,y) & BG_EXPLODED;
     };
 
+    int IsSelected(int x, int y) const
+    {
+        return Get(x,y) & BG_SELECTED;
+    };
+
     int GetNumBombs() const
     {
         return m_numBombCells;
     int GetNumBombs() const
     {
         return m_numBombCells;
@@ -74,6 +80,10 @@ public:
         return m_numRemainingCells;
     };
 
         return m_numRemainingCells;
     };
 
+    int GetNumMarkedCells() const
+    {
+        return m_numMarkedCells;
+    };
 
 
     bool Init(int width, int height, bool easyCorner = false);
 
 
     bool Init(int width, int height, bool easyCorner = false);
@@ -83,7 +93,7 @@ public:
     void Mark(int x, int y);
 
     // Unhides a cell
     void Mark(int x, int y);
 
     // Unhides a cell
-    void Unhide(int x, int y);
+    void Unhide(int x, int y, bool b_selected);
 
     // Makes a cell exploded
     void Explode(int x, int y);
 
     // Makes a cell exploded
     void Explode(int x, int y);
@@ -98,7 +108,7 @@ private:
 
     int m_width, m_height;
     short *m_field;
 
     int m_width, m_height;
     short *m_field;
-    int m_numBombCells, m_numRemainingCells;
+    int m_numBombCells, m_numRemainingCells, m_numMarkedCells;
 
 };
 
 
 };