]> git.saurik.com Git - wxWidgets.git/commitdiff
Partially applied patch #8618848 ("adjustment of bombs demo to wxBombsCE"). Applied...
authorDimitri Schoolwerth <dimitri.schoolwerth@gmail.com>
Fri, 19 Dec 2003 01:34:40 +0000 (01:34 +0000)
committerDimitri Schoolwerth <dimitri.schoolwerth@gmail.com>
Fri, 19 Dec 2003 01:34:40 +0000 (01:34 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24919 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

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

index 1094797a7eb8088fdb5fddac81be631c86c433e4..846f692072f272b3a30354ab65b5d6fc870be448 100644 (file)
@@ -2,7 +2,7 @@
 // Name:        bombs.cpp
 // Purpose:     Bombs game
 // Author:      P. Foggia 1996
-// Modified by:
+// Modified by: Wlodzimierz Skiba (ABX) 2003
 // Created:     1996
 // RCS-ID:      $Id$
 // Copyright:   (c) 1996 P. Foggia
 ///////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation
+#   pragma implementation
 #endif
 
 #include "wx/wxprec.h"
 
+#ifdef __BORLANDC__
+#   pragma hdrstop
+#endif
+
 #ifndef  WX_PRECOMP
-  #include "wx/wx.h"
+#   include "wx/wx.h"
 #endif //precompiled headers
 
 #include "bombs.h"
 
-#include <time.h>
 #include <stdlib.h>
 
-#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__)
-#include "bombs.xpm"
+#ifndef __WXWINCE__
+#   include <time.h>
+#endif
+
+#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) \
+    || defined(__WXMAC__) || defined(__WXMGL__)
+#   include "bombs.xpm"
 #endif
 
-IMPLEMENT_APP(AppClass)
+IMPLEMENT_APP(BombsApp)
+
+#ifdef __WXWINCE__
+    STDAPI_(__int64) CeGetRandomSeed();
+#endif
 
 // Called to initialize the program
-bool AppClass::OnInit()
+bool BombsApp::OnInit()
 {
-  srand((unsigned)time(NULL));
-
-  // Initialize all the top-level window members to NULL.
-  BombsFrame = NULL;
-  level=IDM_EASY;
+#ifdef __WXWINCE__
+    srand((unsigned) CeGetRandomSeed());
+#else
+    srand((unsigned) time(NULL));
+#endif
 
-  BombsFrame = 
-    new BombsFrameClass(NULL, _T("wxBombs"), wxPoint(155, 165), wxSize(300, 300), wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX );
+    m_frame = new BombsFrame(&m_game);
 
-  int xmax=BombsFrame->BombsCanvas->field_width*BombsFrame->BombsCanvas->x_cell*X_UNIT;
-  int ymax=BombsFrame->BombsCanvas->field_height*BombsFrame->BombsCanvas->y_cell*Y_UNIT;
-  BombsFrame->SetClientSize(xmax, ymax);
+    m_frame->NewGame(bombsID_EASY);
 
-  return TRUE;
+    return true;
 }
 
-BEGIN_EVENT_TABLE(BombsFrameClass, wxFrame)
-    EVT_MENU(IDM_EASY, BombsFrameClass::OnEasy)
-    EVT_MENU(IDM_MEDIUM, BombsFrameClass::OnMedium)
-    EVT_MENU(IDM_DIFFICULT, BombsFrameClass::OnDifficult)
-    EVT_MENU(IDM_EXIT, BombsFrameClass::OnExit)
-    EVT_MENU(IDM_ABOUT, BombsFrameClass::OnAbout)
-    EVT_MENU(IDM_RESTART, BombsFrameClass::OnRestart)
-    EVT_CLOSE(BombsFrameClass::OnCloseWindow)
+BEGIN_EVENT_TABLE(BombsFrame, wxFrame)
+    EVT_MENU(bombsID_EASY, BombsFrame::OnNewEasyGame)
+    EVT_MENU(bombsID_MEDIUM, BombsFrame::OnNewMediumGame)
+    EVT_MENU(bombsID_HARD, BombsFrame::OnNewHardGame)
+    EVT_MENU(wxID_EXIT, BombsFrame::OnExit)
+    EVT_MENU(wxID_ABOUT, BombsFrame::OnAbout)
 END_EVENT_TABLE()
 
-BombsFrameClass::BombsFrameClass(wxFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, long style):
-  wxFrame(parent, -1, title, pos, size, style)
+BombsFrame::BombsFrame(BombsGame *game)
+    : wxFrame(NULL, wxID_ANY, wxT("wxBombs"), wxDefaultPosition,
+        wxSize(300, 300), wxDEFAULT_DIALOG_STYLE|wxMINIMIZE_BOX)
 {
-  // Initialize child subwindow members.
-  BombsCanvas = NULL;
-
-  SetIcon(wxICON(bombs));
-
-  CreateStatusBar();
-  
-  // Create a menu bar for the frame
-  wxMenuBar *menuBar1 = new wxMenuBar;
-  wxMenu *menu1 = new wxMenu;
-  menu1->Append(IDM_EXIT, _T("E&xit")); // , "Quit the program");
-  menu1->AppendSeparator();
-  menu1->Append(IDM_ABOUT, _T("&About...")); // , "Infos on wxBombs");
-  menuBar1->Append(menu1, _T("&File"));
-  wxMenu *menu2 = new wxMenu;
-  menu2->Append(IDM_RESTART, _T("&Restart")); // , "Clear the play field");
-  menu2->AppendSeparator();
-  menu2->Append(IDM_EASY, _T("&Easy"), wxEmptyString, TRUE); // "10x10 play field", TRUE);
-  menu2->Append(IDM_MEDIUM, _T("&Medium"), wxEmptyString, TRUE); // "15x15 play field", TRUE);
-  menu2->Append(IDM_DIFFICULT, _T("&Difficult"), wxEmptyString, TRUE); // "25x20 play field", TRUE);
-  menuBar1->Append(menu2, _T("&Game"));
-  SetMenuBar(menuBar1);
-  menuBar=menuBar1;
-  menuBar->Check(wxGetApp().level, TRUE);
-
-  // Create child subwindows.
-  BombsCanvas = new BombsCanvasClass(this);
-
-  // Ensure the subwindows get resized o.k.
-//  OnSize(width, height);
-
-  // Centre frame on the screen.
-  Centre(wxBOTH);
-
-  // Show the frame.
-  Show(TRUE);
-}
+    m_game = game;
 
-BombsFrameClass::~BombsFrameClass(void)
-{
-}
+    SetIcon(wxICON(bombs));
 
-void BombsFrameClass::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
-{
-  this->Destroy();
+#if wxUSE_STATUSBAR
+    CreateStatusBar();
+#endif
+
+    // Create a menu bar for the frame
+    wxMenuBar *menuBar = new wxMenuBar;
+    wxMenu *menuFile = new wxMenu;
+    wxMenu *menuLevel = new wxMenu;
+    menuLevel->AppendRadioItem(bombsID_EASY, wxT("&Easy (10x10)\tCtrl-1"));
+    menuLevel->AppendRadioItem(bombsID_MEDIUM, wxT("&Medium (15x15)\tCtrl-2"));
+    menuLevel->AppendRadioItem(bombsID_HARD, wxT("&Hard (25x20)\tCtrl-3"));
+
+    menuFile->Append(bombsID_NEWGAME, wxT("&New Game"),
+        menuLevel, wxT("Starts a new game"));
+
+    menuFile->AppendSeparator();
+    menuFile->Append(wxID_EXIT, wxT("E&xit"), wxT("Quits the application"));
+
+    menuBar->Append(menuFile, wxT("&File"));
+
+
+    wxMenu *menuHelp = new wxMenu;
+    menuHelp->Append(wxID_ABOUT, wxT("&About"),
+        wxT("Displays the program information") );
+
+    menuBar->Append(menuHelp, wxT("&Help"));
+
+    SetMenuBar(menuBar);
+
+    // Create child subwindows.
+    m_canvas = new BombsCanvas(this, m_game);
+
+    // Ensure the subwindows get resized o.k.
+    //  OnSize(width, height);
+
+    // Centre frame on the screen.
+    Centre(wxBOTH);
+
+    // Show the frame.
+    Show();
 }
 
-void BombsFrameClass::OnExit(wxCommandEvent& WXUNUSED(event))
+void BombsFrame::OnExit(wxCommandEvent& WXUNUSED(event))
 {
-    this->Destroy();
+    Close();
 }
 
-void BombsFrameClass::OnRestart(wxCommandEvent& WXUNUSED(event))
+void BombsFrame::NewGame(int level)
 {
-    BombsCanvas->UpdateFieldSize();
-    int xmax=BombsCanvas->field_width*BombsCanvas->x_cell*X_UNIT;
-    int ymax=BombsCanvas->field_height*BombsCanvas->y_cell*Y_UNIT;
-    wxGetApp().BombsFrame->SetClientSize(xmax, ymax);
+
+    int numHorzCells = 20, numVertCells = 20;
+
+    switch(level)
+    {
+    case bombsID_EASY:
+        numHorzCells = numVertCells = 10;
+        break;
+
+    case bombsID_MEDIUM:
+        numHorzCells = numVertCells = 15;
+        break;
+
+    case bombsID_HARD:
+        numHorzCells = 25; numVertCells = 20;
+        break;
+
+    default :
+        wxFAIL_MSG(wxT("Invalid level"));
+        break;
+    }
+
+    m_game->Init(numHorzCells, numVertCells);
+
+    GetMenuBar()->Check(level, true);
+
+    m_canvas->UpdateGridSize();
+    SetClientSize(m_canvas->GetGridSizeInPixels());
 }
 
-void BombsFrameClass::OnAbout(wxCommandEvent& WXUNUSED(event))
+void BombsFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 {
-    wxMessageBox(_T("wxBombs (c) 1996 by P. Foggia\n<foggia@amalfi.dis.unina.it>"), _T("About wxBombs"));
+    wxMessageBox(
+        wxT("wxBombs (c) 1996 by P. Foggia\n<foggia@amalfi.dis.unina.it>"),
+        wxT("About wxBombs") );
 }
 
-void BombsFrameClass::OnEasy(wxCommandEvent& WXUNUSED(event))
+void BombsFrame::OnNewEasyGame(wxCommandEvent& WXUNUSED(event))
 {
-    menuBar->Check(wxGetApp().level, FALSE);
-    wxGetApp().level=IDM_EASY;
-    menuBar->Check(wxGetApp().level, TRUE);
+    NewGame(bombsID_EASY);
 }
 
-void BombsFrameClass::OnMedium(wxCommandEvent& WXUNUSED(event))
+void BombsFrame::OnNewMediumGame(wxCommandEvent& WXUNUSED(event))
 {
-    menuBar->Check(wxGetApp().level, FALSE);
-    wxGetApp().level=IDM_MEDIUM;
-    menuBar->Check(wxGetApp().level, TRUE);
+    NewGame(bombsID_MEDIUM);
 }
 
-void BombsFrameClass::OnDifficult(wxCommandEvent& WXUNUSED(event))
+void BombsFrame::OnNewHardGame(wxCommandEvent& WXUNUSED(event))
 {
-    menuBar->Check(wxGetApp().level, FALSE);
-    wxGetApp().level=IDM_DIFFICULT;
-    menuBar->Check(wxGetApp().level, TRUE);
+    NewGame(bombsID_HARD);
 }
 
-BEGIN_EVENT_TABLE(BombsCanvasClass, wxWindow)
-    EVT_PAINT(BombsCanvasClass::OnPaint)
-    EVT_MOUSE_EVENTS(BombsCanvasClass::OnEvent)
+BEGIN_EVENT_TABLE(BombsCanvas, wxPanel)
+    EVT_PAINT(BombsCanvas::OnPaint)
+    EVT_MOUSE_EVENTS(BombsCanvas::OnMouseEvent)
+    EVT_CHAR(BombsCanvas::OnChar)
 END_EVENT_TABLE()
 
-BombsCanvasClass::BombsCanvasClass(wxFrame *parent, const wxPoint& pos, const wxSize& size, long style):
-  wxWindow(parent, -1, pos, size, style)
-{ 
-  int sx, sy;
-  wxClientDC dc(this);
-  wxFont font= BOMBS_FONT;
-  dc.SetFont(font);
+BombsCanvas::BombsCanvas(wxFrame *parent, BombsGame *game)
+    : wxPanel(parent, wxID_ANY)
+{
+    m_game = game;
+    int sx, sy;
+    wxClientDC dc(this);
+    wxFont font= BOMBS_FONT;
+    dc.SetFont(font);
 
-  long chw, chh;
-  wxChar buf[]=_T("M");
+    long chw, chh;
+    wxString buf = wxT("M");
 
-  dc.GetTextExtent(buf, &chw, &chh);
-  dc.SetFont(wxNullFont);
+    dc.GetTextExtent(buf, &chw, &chh);
+    dc.SetFont(wxNullFont);
 
-  dc.SetMapMode(wxMM_METRIC);
+    dc.SetMapMode(wxMM_METRIC);
 
-  int xcm = dc.LogicalToDeviceX(10);
-  int ycm = dc.LogicalToDeviceY(10);
+    int xcm = dc.LogicalToDeviceX(10);
+    int ycm = dc.LogicalToDeviceY(10);
     // To have a square cell, there must be :
     //    sx*ycm == sy*xcm
-  if (chw*ycm < chh*xcm)
-    { sy=chh;
-      sx=chh*xcm/ycm;
+    if (chw*ycm < chh*xcm)
+    {
+        sy = chh;
+        sx = chh*xcm/ycm;
     }
-  else
-    { sx=chw;
-      sy=chw*ycm/xcm;
+    else
+    {
+        sx = chw;
+        sy = chw*ycm/xcm;
     }
-  x_cell = (sx+3+X_UNIT)/X_UNIT;
-  y_cell = (sy+3+Y_UNIT)/Y_UNIT;
-  dc.SetMapMode(wxMM_TEXT);
-  bmp=NULL;
-  UpdateFieldSize();
+
+    m_cellWidth = (sx+3+X_UNIT)/X_UNIT;
+    m_cellHeight = (sy+3+Y_UNIT)/Y_UNIT;
+    dc.SetMapMode(wxMM_TEXT);
+    m_bmp = NULL;
 }
 
-BombsCanvasClass::~BombsCanvasClass(void)
+BombsCanvas::~BombsCanvas()
 {
-  if (bmp)
-    delete bmp;
+    if (m_bmp)
+    {
+        delete m_bmp;
+        m_bmp = NULL;
+    }
 }
 
 // Called when canvas needs to be repainted.
-void BombsCanvasClass::OnPaint(wxPaintEvent& WXUNUSED(event))
+void BombsCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
-  wxPaintDC dc(this);
-
-  // Insert your drawing code here.
-  if (!bmp)
-    { bmp=new wxBitmap(field_width*x_cell*X_UNIT+1,
-                       field_height*y_cell*Y_UNIT+1);
-      if (bmp)
-        { wxMemoryDC memDC;
-          memDC.SelectObject(* bmp);
-          DrawField(&memDC, 0, 0, field_width-1, field_height-1);
-          memDC.SelectObject(wxNullBitmap);
+    wxPaintDC dc(this);
+
+    const int numHorzCells = m_game->GetWidth();
+    const int numVertCells = m_game->GetHeight();
+    // Insert your drawing code here.
+    if (!m_bmp)
+    {
+        wxSize size = dc.GetSize();
+        m_bmp = new wxBitmap(size.GetWidth(), size.GetHeight());
+        if (m_bmp)
+        {
+            wxMemoryDC memDC;
+            memDC.SelectObject(*m_bmp);
+            DrawField(&memDC, 0, 0, numHorzCells-1, numVertCells-1);
+            memDC.SelectObject(wxNullBitmap);
         }
     }
-  if (bmp)
-    { wxMemoryDC memDC;
-      memDC.SelectObject(* bmp);
-      dc.Blit(0, 0, field_width*x_cell*X_UNIT+1,
-                          field_height*y_cell*Y_UNIT+1,
-                    &memDC, 0, 0, wxCOPY);
+
+    if (m_bmp)
+    {
+        wxMemoryDC memDC;
+        memDC.SelectObject(*m_bmp);
+        wxSize size = dc.GetSize();
+        dc.Blit(0, 0, size.GetWidth(), size.GetHeight(),
+            &memDC, 0, 0, wxCOPY);
       memDC.SelectObject(wxNullBitmap);
     }
-  else
-    DrawField(& dc, 0, 0, field_width-1, field_height-1);
+    else
+    {
+        DrawField(&dc, 0, 0, numHorzCells-1, numVertCells-1);
+    }
+}
+
+void BombsCanvas::UpdateGridSize()
+{
+
+    if (m_bmp)
+    {
+        delete m_bmp;
+        m_bmp = NULL;
+    }
+
+    Refresh();
+}
+
+wxSize BombsCanvas::GetGridSizeInPixels() const
+{
+    return wxSize(m_cellWidth*X_UNIT*m_game->GetWidth(),
+        m_cellHeight*Y_UNIT*m_game->GetHeight());
 }
 
-// Updates the field size depending on wxGetApp().level and
-// redraws the canvas
-void BombsCanvasClass::UpdateFieldSize()
-  { field_width=20;
-    field_height=20;
-
-    switch(wxGetApp().level)
-      { case IDM_EASY:
-          field_width=10;
-          field_height=10;
-          break;
-        case IDM_MEDIUM:
-          field_width=15;
-          field_height=15;
-          break;
-        case IDM_DIFFICULT:
-          field_width=25;
-          field_height=20;
-          break;
-      }
-    wxGetApp().Game.Init(field_width, field_height);
-
-    if (bmp)
-      delete bmp;
-    bmp=NULL;
-    
-    wxWindow::Refresh();
-  }
index f34edc6c956efdc2a83d8de9ba6568bda8b1a915..d56f528f0a2464887148a542bf24dec27e2f7c2b 100644 (file)
 // Name:        bombs.h
 // Purpose:     Bombs game
 // Author:      P. Foggia 1996
-// Modified by:
+// Modified by: Wlodzimierz Skiba (ABX) 2003
 // Created:     1996
 // RCS-ID:      $Id$
 // Copyright:   (c) 1996 P. Foggia
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifndef _INC_BOMBS_H
-#define _INC_BOMBS_H
+#ifndef _WX_DEMOS_BOMBS_BOMBS_H_
+#define _WX_DEMOS_BOMBS_BOMBS_H_
 
 #include "game.h"
 
-/*
- * Forward declarations of all top-level window classes.
- */
-class  BombsFrameClass;
-class  AboutFrameClass;
+class BombsFrame;
 
 /*
  * Class representing the entire Application
  */
-class AppClass: public wxApp
+class BombsApp: public wxApp
 {
- public:
-  BombsFrameClass *BombsFrame;
-  int level;
-  BombsGame Game;
+public:
+    virtual bool OnInit();
+
+private :
+    BombsFrame *m_frame;
+
+    BombsGame m_game;
 
-  bool OnInit();
 };
 
-DECLARE_APP(AppClass)
+DECLARE_APP(BombsApp)
 
-class BombsCanvasClass;
+class BombsCanvas;
 
-class BombsFrameClass: public wxFrame
+class BombsFrame : public wxFrame
 {
- private:
- protected:
- public:
-  // Subwindows for reference within the program.
-  BombsCanvasClass *BombsCanvas;
-  wxMenuBar *menuBar;
-
-  // Constructor and destructor
-  BombsFrameClass(wxFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, long style);
-  ~BombsFrameClass(void);
-
- void OnCloseWindow(wxCloseEvent& event);
- void OnExit(wxCommandEvent& event);
- void OnRestart(wxCommandEvent& event);
- void OnAbout(wxCommandEvent& event);
- void OnEasy(wxCommandEvent& event);
- void OnMedium(wxCommandEvent& event);
- void OnDifficult(wxCommandEvent& event);
-
-DECLARE_EVENT_TABLE()
+public:
+
+    BombsFrame(BombsGame *bombsGame);
+
+    void NewGame(int level);
+
+private:
+
+    void OnNewEasyGame(wxCommandEvent& event);
+    void OnNewMediumGame(wxCommandEvent& event);
+    void OnNewHardGame(wxCommandEvent& event);
+
+    void OnExit(wxCommandEvent& event);
+
+    void OnAbout(wxCommandEvent& event);
+
+    BombsGame *m_game;
+
+    // Subwindows for reference within the program.
+    BombsCanvas *m_canvas;
+
+    DECLARE_EVENT_TABLE()
 };
 
-/* Menu identifiers
- */
-// File
-#define BOMBSFRAMECLASS_FILE 1
-// E&xit
-#define IDM_EXIT 2
-// About...
-#define IDM_ABOUT 3
-// Game
-#define BOMBSFRAMECLASS_GAME 4
-// &Restart
-#define IDM_RESTART 5
-// &Easy
-#define IDM_EASY 6
-// &Medium
-#define IDM_MEDIUM 7
-// &Difficult
-#define IDM_DIFFICULT 8
-
-class BombsCanvasClass: public wxWindow
+// App specific menu identifiers
+enum
 {
- private:
- protected:
- public:
-   int field_width, field_height;
-   int x_cell, y_cell;
-   wxBitmap *bmp;
-  // Constructor and destructor
-  BombsCanvasClass(wxFrame *parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0);
-  ~BombsCanvasClass(void);
-
- void OnPaint(wxPaintEvent& event);
- void DrawField(wxDC *, int xc1, int yc1, int xc2, int yc2);
- void RefreshField(int xc1, int yc1, int xc2, int yc2);
- void Uncover(int x, int y);
- void OnEvent(wxMouseEvent& event);
- void UpdateFieldSize();
-
-DECLARE_EVENT_TABLE()
+    bombsID_NEWGAME = wxID_HIGHEST,
+    bombsID_EASY,
+    bombsID_MEDIUM,
+    bombsID_HARD
 };
 
-/* Menu identifiers
- */
+class BombsCanvas : public wxPanel
+{
+public:
+
+    // Constructor and destructor
+
+    BombsCanvas(wxFrame *parent, BombsGame *game);
+
+    void UpdateGridSize();
+
+    wxSize GetGridSizeInPixels() const;
+
+    ~BombsCanvas();
+
+private:
+
+    void OnPaint(wxPaintEvent& event);
+    void DrawField(wxDC *, int xc1, int yc1, int xc2, int yc2);
+    void RefreshField(int xc1, int yc1, int xc2, int yc2);
+    void Uncover(int x, int y);
+    void OnMouseEvent(wxMouseEvent& event);
+    void OnChar(wxKeyEvent& event);
+
+    BombsGame *m_game;
+
+    wxBitmap *m_bmp;
+
+    // Cell size in pixels
+    int m_cellWidth;
+    int m_cellHeight;
+
+    DECLARE_EVENT_TABLE()
+};
 
 /* The following sizes should probably be redefined */
 /* dimensions of a scroll unit, in pixels */
@@ -111,10 +110,14 @@ DECLARE_EVENT_TABLE()
 #define Y_UNIT 4
 
 /* the dimensions of a cell, in scroll units are in
- * BombsCanvasClass::x_cell and y_cell
+ * BombsCanvas::x_cell and y_cell
  */
 
+#ifdef __WXWINCE__
+#define BOMBS_FONT wxFont(12, wxSWISS, wxNORMAL, wxNORMAL)
+#else
 #define BOMBS_FONT wxFont(14, wxROMAN, wxNORMAL, wxNORMAL)
+#endif
 
-#endif /* mutual exclusion */
+#endif // #ifndef _WX_DEMOS_BOMBS_BOMBS_H_
 
index fba51ace6eac10b56eeaa91670d860b8cb152913..cb1a9cc99560c16ee1aa3dfa41c3e96813dc2738 100644 (file)
@@ -2,7 +2,7 @@
 // Name:        bombs1.cpp
 // Purpose:     Bombs game
 // Author:      P. Foggia 1996
-// Modified by:
+// Modified by: Wlodzimierz Skiba (ABX) 2003
 // Created:     1996
 // RCS-ID:      $Id$
 // Copyright:   (c) 1996 P. Foggia
  */
 
 #ifdef __GNUG__
-#pragma implementation
+#   pragma implementation
 #endif
 
 #include "wx/wxprec.h"
 
+#ifdef __BORLANDC__
+#   pragma hdrstop
+#endif
+
 #ifndef  WX_PRECOMP
-  #include "wx/wx.h"
+#   include "wx/wx.h"
 #endif //precompiled headers
 
 #include "bombs.h"
 
-/*--------  BombCanvasClass::DrawField(dc, xc1, yc1, xc2, yc2)  -------*/
-/* Draws the field on the device context dc                            */
-/* xc1,yc1 etc. are the (inclusive) limits of the area to be drawn,    */
-/* expressed in cells.                                                 */
-/*---------------------------------------------------------------------*/
-void BombsCanvasClass::DrawField(wxDC *dc, int xc1, int yc1, int xc2, int yc2)
-{ int x,y,xmax,ymax;
-  wxChar buf[2];
-  long chw, chh;
-
-  wxColour *wxBlack = wxTheColourDatabase->FindColour(_T("BLACK"));
-  wxColour *wxWhite = wxTheColourDatabase->FindColour(_T("WHITE"));
-  wxColour *wxRed = wxTheColourDatabase->FindColour(_T("RED"));
-  wxColour *wxBlue = wxTheColourDatabase->FindColour(_T("BLUE"));
-  wxColour *wxGrey = wxTheColourDatabase->FindColour(_T("LIGHT GREY"));
-  wxColour *wxGreen = wxTheColourDatabase->FindColour(_T("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);
-  wxBrush *redBrush = wxTheBrushList->FindOrCreateBrush(*wxRed, wxSOLID);
-
-  xmax=field_width*x_cell*X_UNIT;
-  ymax=field_height*y_cell*Y_UNIT;
-
-
-  dc->SetPen(* blackPen);
-  for(x=xc1; x<=xc2; x++)
-    dc->DrawLine(x*x_cell*X_UNIT, 0, x*x_cell*X_UNIT, ymax);
-  for(y=xc1; y<=yc2; y++)
-    dc->DrawLine(0, y*y_cell*Y_UNIT, xmax, y*y_cell*Y_UNIT);
-
-
-  wxFont font= BOMBS_FONT;
-  dc->SetFont(font); 
-
-  buf[1]=_T('\0');
-  for(x=xc1; x<=xc2; x++)
-    for(y=yc1; y<=yc2; y++)
-      { if (wxGetApp().Game.IsMarked(x,y))
-          { dc->SetPen(* blackPen);
-            dc->SetBrush(* greyBrush);
-            dc->DrawRectangle( x*x_cell*X_UNIT, y*y_cell*Y_UNIT,
-                               x_cell*X_UNIT+1, y_cell*Y_UNIT+1);
-            *buf=_T('M');
-            if (!wxGetApp().Game.IsHidden(x,y) && wxGetApp().Game.IsBomb(x,y))
-              dc->SetTextForeground(*wxBlue);
-            else
-              dc->SetTextForeground(*wxRed);
-            dc->SetTextBackground(*wxGrey);
-            dc->GetTextExtent(buf, &chw, &chh);
-            dc->DrawText( buf,
-                  x*x_cell*X_UNIT + (x_cell*X_UNIT-chw)/2,
-                  y*y_cell*Y_UNIT + (y_cell*Y_UNIT-chh)/2
-                );
-            if (!wxGetApp().Game.IsHidden(x,y) && wxGetApp().Game.IsBomb(x,y))
-              { dc->SetPen(*redPen);
-                dc->DrawLine(x*x_cell*X_UNIT, y*y_cell*Y_UNIT,
-                             (x+1)*x_cell*X_UNIT, (y+1)*y_cell*Y_UNIT);
-                dc->DrawLine(x*x_cell*X_UNIT, (y+1)*y_cell*Y_UNIT,
-                             (x+1)*x_cell*X_UNIT, y*y_cell*Y_UNIT);
-              }
-          }
-        else if (wxGetApp().Game.IsHidden(x,y))
-          { dc->SetPen(*blackPen);
-            dc->SetBrush(*greyBrush);
-            dc->DrawRectangle( x*x_cell*X_UNIT, y*y_cell*Y_UNIT,
-                               x_cell*X_UNIT+1, y_cell*Y_UNIT+1);
-          }
-        else if (wxGetApp().Game.IsBomb(x,y))
-          { dc->SetPen(* blackPen);
-            dc->SetBrush(* redBrush);
-            dc->DrawRectangle( x*x_cell*X_UNIT, y*y_cell*Y_UNIT,
-                               x_cell*X_UNIT+1, y_cell*Y_UNIT+1);
-            *buf=_T('B');
-            dc->SetTextForeground(* wxBlack);
-            dc->SetTextBackground(* wxRed);
-            dc->GetTextExtent(buf, &chw, &chh);
-            dc->DrawText( buf,
-                  x*x_cell*X_UNIT + (x_cell*X_UNIT-chw)/2,
-                  y*y_cell*Y_UNIT + (y_cell*Y_UNIT-chh)/2
-                );
-            if (wxGetApp().Game.IsExploded(x,y))
-              { dc->SetPen(* bluePen);
-                dc->DrawLine(x*x_cell*X_UNIT, y*y_cell*Y_UNIT,
-                             (x+1)*x_cell*X_UNIT, (y+1)*y_cell*Y_UNIT);
-                dc->DrawLine(x*x_cell*X_UNIT, (y+1)*y_cell*Y_UNIT,
-                             (x+1)*x_cell*X_UNIT, y*y_cell*Y_UNIT);
-              }
-          }
-        else   // Display a digit
-          { dc->SetPen(* blackPen);
-            dc->SetBrush(* whiteBrush);
-            dc->DrawRectangle( x*x_cell*X_UNIT, y*y_cell*Y_UNIT,
-                               x_cell*X_UNIT+1, y_cell*Y_UNIT+1);
-            *buf = (wxGetApp().Game.Get(x,y) & BG_MASK) + _T('0');
+// Draws the field on the device context dc
+// xc1,yc1 etc. are the (inclusive) limits of the area to be drawn,
+// expressed in cells.
+void BombsCanvas::DrawField(wxDC *dc, int xc1, int yc1, int xc2, int yc2)
+{
+    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 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);
+    wxBrush *focusedBrush = wxTheBrushList->FindOrCreateBrush(wxFocused, wxSOLID);
+    wxBrush *redBrush = wxTheBrushList->FindOrCreateBrush(wxRed, wxSOLID);
+
+    dc->SetPen(* blackPen);
+
+    int x, y;
+    int xMax = this->GetGridSizeInPixels().GetWidth();
+    int yMax = this->GetGridSizeInPixels().GetHeight();
+    for(x=xc1; x<=xc2; x++)
+        dc->DrawLine(x*m_cellWidth*X_UNIT, 0, x*m_cellWidth*X_UNIT, yMax);
+    for(y=xc1; y<=yc2; y++)
+        dc->DrawLine(0, y*m_cellHeight*Y_UNIT, xMax, y*m_cellHeight*Y_UNIT);
+
+
+    wxFont font= BOMBS_FONT;
+    dc->SetFont(font); 
+
+    for(x=xc1; x<=xc2; x++)
+        for(y=yc1; y<=yc2; y++)
+        {
+            if (m_game->IsMarked(x,y))
+            {
+                dc->SetPen(* blackPen);
+
+                if (m_game->IsFocussed(x, y))
+                    dc->SetBrush(* focusedBrush);
+                else
+                    dc->SetBrush(* greyBrush);
+
+                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);
+                else
+                    dc->SetTextForeground(wxRed);
+
+                dc->SetTextBackground(wxGrey);
+                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->IsHidden(x,y) && m_game->IsBomb(x,y))
+                {
+                    dc->SetPen(*redPen);
+                    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,
+                        (x+1)*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT);
+                }
+            }
+            else if (m_game->IsHidden(x,y))
+            {
+                dc->SetPen(*blackPen);
+                if (m_game->IsFocussed(x, y))
+                    dc->SetBrush(* focusedBrush);
+                else
+                    dc->SetBrush(*greyBrush);
+
+                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->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->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->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,
+                        (x+1)*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT);
+                }
+            }
+            else   // Display a digit
+            {
+                dc->SetPen(* blackPen);
+                if (m_game->IsFocussed(x, y))
+                    dc->SetBrush(* focusedBrush);
+                else
+                    dc->SetBrush(* whiteBrush);
+                dc->DrawRectangle( x*m_cellWidth*X_UNIT, y*m_cellHeight*Y_UNIT,
+                    m_cellWidth*X_UNIT+1, m_cellHeight*Y_UNIT+1);
+
+                int digit_value = m_game->Get(x,y) & BG_MASK;
+                switch(digit_value)
+                {
+                case 0:
+                    buf = wxT("0");
+                    dc->SetTextForeground(wxGreen);
+                    break;
+                case 1: 
+                    buf = wxT("1");
+                    dc->SetTextForeground(wxBlue);
+                    break;
+                default:
+                    buf.Printf(wxT("%d"),digit_value);
+                    dc->SetTextForeground(wxBlack);
+                    break;
+            }
             dc->GetTextExtent(buf, &chw, &chh);
-            switch(*buf)
-              { case _T('0'): dc->SetTextForeground(* wxGreen); break;
-                case _T('1'): dc->SetTextForeground(* wxBlue); break;
-                default:  dc->SetTextForeground(* wxBlack); break;
-              }
-            dc->SetTextBackground(* wxWhite);
+            dc->SetTextBackground(wxWhite);
             dc->DrawText( buf,
-                  x*x_cell*X_UNIT + (x_cell*X_UNIT-chw)/2,
-                  y*y_cell*Y_UNIT + (y_cell*Y_UNIT-chh)/2
-                );
-          }
-      }
-  dc->SetFont(wxNullFont);
-
-  if (wxGetApp().BombsFrame)
-    { wxString buf;
-      buf.Printf(_T("%d bombs  %d remaining cells"),
-                 wxGetApp().Game.GetBombs(),
-                 wxGetApp().Game.GetRemainingCells());
-      wxGetApp().BombsFrame->SetStatusText(buf, 0);
+                x*m_cellWidth*X_UNIT + (m_cellWidth*X_UNIT-chw)/2,
+                y*m_cellHeight*Y_UNIT + (m_cellHeight*Y_UNIT-chh)/2);
+        }
     }
+    dc->SetFont(wxNullFont);
+
+#if wxUSE_LOG
+    wxLogStatus(wxT("%d bombs  %d remaining cells"),
+        m_game->GetNumBombs(), m_game->GetNumRemainingCells() );
+#endif
 }
 
-/*--------  BombCanvasClass::RefreshField(xc1, yc1, xc2, yc2)  --------*/
-/* Refreshes the field image                                           */
-/* xc1,yc1 etc. are the (inclusive) limits of the area to be drawn,    */
-/* expressed in cells.                                                 */
-/*---------------------------------------------------------------------*/
-void BombsCanvasClass::RefreshField(int xc1, int yc1, int xc2, int yc2)
-  {
+// Refreshes the field image
+// xc1,yc1 etc. are the (inclusive) limits of the area to be drawn,
+// expressed in cells.
+void BombsCanvas::RefreshField(int xc1, int yc1, int xc2, int yc2)
+{
     wxClientDC dc(this);
     DrawField(& dc, xc1, yc1, xc2, yc2);
-    if (bmp)
-      { wxMemoryDC memDC;
-        memDC.SelectObject(* bmp);
+    if (m_bmp)
+    {
+        wxMemoryDC memDC;
+        memDC.SelectObject(*m_bmp);
         DrawField(&memDC, xc1, yc1, xc2, yc2);
         memDC.SelectObject(wxNullBitmap);
-      }
-  }
+    }
+}
 
 // Called when uncovering a cell.
-void BombsCanvasClass::Uncover(int x, int y)
+void BombsCanvas::Uncover(int x, int y)
 {
-  wxGetApp().Game.Unhide(x,y);
-  RefreshField(x, y, x, y);
-  if (wxGetApp().Game.IsBomb(x,y) || wxGetApp().Game.GetRemainingCells()==0)
-    { wxBell();
-      if (!wxGetApp().Game.IsBomb(x,y))
-       { wxMessageBox(_T("Nice! You found all the bombs!"), _T("wxWin Bombs"),
-                      wxOK|wxCENTRE, wxGetApp().BombsFrame);
-       }
-      else // x,y is a bomb
-       { wxGetApp().Game.Explode(x, y);
-       }
-      for(x=0; x<field_width; x++)
-       for(y=0; y<field_height; y++)
-         wxGetApp().Game.Unhide(x,y);
-      RefreshField(0, 0, field_width-1, field_height-1);
+    m_game->Unhide(x,y);
+    RefreshField(x, y, x, y);
+
+    const int gridWidth = m_game->GetWidth();
+    const int gridHeight = m_game->GetHeight();
+
+    const bool hasWon = m_game->GetNumRemainingCells() == 0;
+    if (m_game->IsBomb(x,y) || hasWon)
+    {
+        wxBell();
+        if (hasWon)
+        {
+            wxMessageBox(wxT("Nice! You found all the bombs!"),
+                wxT("wxWin Bombs"), wxOK|wxCENTRE);
+        }
+        else // x,y is a bomb
+        {
+            m_game->Explode(x, 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);
     }
-  else if (!wxGetApp().Game.Get(x, y))
-    { int left = ( x > 0 ) ? x-1 : 0;
-      int right = ( x < wxGetApp().Game.GetWidth() - 1 )?
-       x+1 : wxGetApp().Game.GetWidth() - 1;
-      int top = ( y > 0 ) ? y-1 : 0;
-      int bottom = ( y < wxGetApp().Game.GetHeight() - 1 )?
-       y+1 : wxGetApp().Game.GetHeight() - 1;
-      int i,j;
-      for (j = top; j <= bottom; j++)
-       for (i=left; i <= right; i++)
-         if ((i != x || j != y) && wxGetApp().Game.IsHidden(i,j)
-             && !wxGetApp().Game.IsMarked(i,j))
-           Uncover(i,j);
+    else if (!m_game->Get(x, y))
+    {
+        int left = ( x > 0 ) ? x-1 : 0;
+        int right = ( x < gridWidth - 1 )
+            ? x+1
+            : gridWidth - 1;
+        int top = ( y > 0 ) ? y-1 : 0;
+        int bottom = ( y < gridHeight - 1 )
+            ? y+1
+            : gridHeight - 1;
+
+        int i, j;
+        for (j=top; j<=bottom; j++)
+            for (i=left; i<=right; i++)
+                if ( (i != x || j != y) && m_game->IsHidden(i, j)
+                    && !m_game->IsMarked(i, j) )
+                {
+                    Uncover(i, j);
+                }
     }
 }
 
 // Called when the canvas receives a mouse event.
-void BombsCanvasClass::OnEvent(wxMouseEvent& event)
+void BombsCanvas::OnMouseEvent(wxMouseEvent& event)
 {
-  wxCoord fx, fy;
-  event.GetPosition(&fx, &fy);
-  int x = fx/(x_cell*X_UNIT);
-  int y = fy/(y_cell*Y_UNIT);
-  if (x<field_width && y<field_height)
-    { if ( (event.RightDown() || (event.LeftDown() && event.ShiftDown()))
-           && (wxGetApp().Game.IsHidden(x,y)
-               || wxGetApp().Game.GetRemainingCells()==0))
-        { wxGetApp().Game.Mark(x,y);
-          RefreshField(x, y, x, y);
-          return;
+    const int gridWidth = m_game->GetWidth();
+    const int gridHeight = m_game->GetHeight();
+
+    wxCoord fx, fy;
+    event.GetPosition(&fx, &fy);
+    int x = fx/(m_cellWidth*X_UNIT);
+    int y = fy/(m_cellHeight*Y_UNIT);
+    if (x<gridWidth && y<gridHeight)
+    {
+        if ( (event.RightDown() || (event.LeftDown() && event.ShiftDown()))
+           && (m_game->IsHidden(x,y)
+               || !m_game->GetNumRemainingCells() ) )
+        { 
+            // store previous and current field
+            int prevFocusX = m_game->m_gridFocusX;
+            int prevFocusY = m_game->m_gridFocusY;
+            m_game->m_gridFocusX = x;
+            m_game->m_gridFocusY = y;
+            RefreshField(prevFocusX, prevFocusY, prevFocusX, prevFocusY);
+            m_game->Mark(x, y);
+            RefreshField(x, y, x, y);
+            return;
         }
-      else if (event.LeftDown() && wxGetApp().Game.IsHidden(x,y)
-               && !wxGetApp().Game.IsMarked(x,y))
-        { Uncover(x,y);
-         return;
+        else if (event.LeftDown() && m_game->IsHidden(x,y)
+            && !m_game->IsMarked(x,y))
+        {
+            // store previous and current field
+            int prevGridFocusX = m_game->m_gridFocusX;
+            int prevGridFocusY = m_game->m_gridFocusY;
+            m_game->m_gridFocusX = x;
+            m_game->m_gridFocusY = y;
+            RefreshField(prevGridFocusX, prevGridFocusY,
+                prevGridFocusX, prevGridFocusY);
+            Uncover(x, y);
+            return;
         }
     }
 }
 
+void BombsCanvas::OnChar(wxKeyEvent& event)
+{
+    int keyCode = event.GetKeyCode();
+    int prevGridFocusX = m_game->m_gridFocusX;
+    int prevGridFocusY = m_game->m_gridFocusY;
+
+    const int gridWidth = m_game->GetWidth();
+    const int gridHeight = m_game->GetHeight();
+
+    switch(keyCode)
+    {
+
+    case WXK_RIGHT:
+        m_game->m_gridFocusX++;
+        if (m_game->m_gridFocusX >= gridWidth) m_game->m_gridFocusX = 0;
+        break;
+
+    case WXK_LEFT:
+        m_game->m_gridFocusX--;
+        if (m_game->m_gridFocusX<0) m_game->m_gridFocusX = gridWidth-1;
+        break;
+
+    case WXK_DOWN:
+        m_game->m_gridFocusY++;
+        if (m_game->m_gridFocusY >= gridHeight) m_game->m_gridFocusY = 0;
+        break;
+
+    case WXK_UP:
+        m_game->m_gridFocusY--;
+        if (m_game->m_gridFocusY<0) m_game->m_gridFocusY = gridHeight-1;
+        break;
+
+    case WXK_RETURN:
+        if ( (prevGridFocusX == m_game->m_gridFocusX)
+            && (prevGridFocusY == m_game->m_gridFocusY)
+            && (m_game->IsHidden(m_game->m_gridFocusX, m_game->m_gridFocusY)) )
+        {
+            m_game->Mark(m_game->m_gridFocusX, m_game->m_gridFocusY);
+            if (!m_game->IsMarked(m_game->m_gridFocusX, m_game->m_gridFocusY))
+            {
+                Uncover(m_game->m_gridFocusX, m_game->m_gridFocusY);
+            }
+            RefreshField(m_game->m_gridFocusX, m_game->m_gridFocusY,
+                m_game->m_gridFocusX, m_game->m_gridFocusY);
+        }
+        break;
+
+    default:
+        event.Skip();
+
+    }
+
+    if ((prevGridFocusX != m_game->m_gridFocusX)
+        || (prevGridFocusY != m_game->m_gridFocusY))
+    {
+        // refresh previous field and focused field
+        RefreshField(prevGridFocusX, prevGridFocusY,
+            prevGridFocusX, prevGridFocusY);
+        RefreshField(m_game->m_gridFocusX, m_game->m_gridFocusY,
+            m_game->m_gridFocusX, m_game->m_gridFocusY);
+    }
+}
index d49b6a434d7b4c6b183a4e9567f7e7c52295ab51..3778780869ebafe2d9fca0168d9cb25ac5e8e5d1 100644 (file)
@@ -2,7 +2,7 @@
 // Name:        bombs1.cpp
 // Purpose:     Implementation of the class BombsGame
 // Author:      P. Foggia 1996
-// Modified by:
+// Modified by: Wlodzimierz Skiba (ABX) 2003
 // Created:     1996
 // RCS-ID:      $Id$
 // Copyright:   (c) 1996 P. Foggia
 ///////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation
+#   pragma implementation
 #endif
 
 #include "wx/wxprec.h"
 
+#ifdef __BORLANDC__
+  #pragma hdrstop
+#endif
+
 #ifndef  WX_PRECOMP
-  #include "wx/wx.h"
-#endif //precompiled headers
+#   include "wx/wx.h"
+#endif
 
 #include "game.h"
 #include <stdlib.h>
 #define PROB 0.2
 
 #ifndef RAND_MAX
-#define RAND_MAX INT_MAX
+#   define RAND_MAX INT_MAX
 #endif
 
 
-/*--------------------  BombsGame::~BombsGame()  ---------------------*/
-/*--------------------------------------------------------------------*/
 BombsGame::~BombsGame()
-  { if (field)
-      free(field);
-  }
-
-/*------------------  int BombsGame::Init(width,height)  -------------------*/
-/* Initialize the play field.   Returns 0 on failure                        */
-/*--------------------------------------------------------------------------*/
-int BombsGame::Init(int aWidth, int aHeight)
-  { int x, y;
+{
+    if (m_field)
+    {
+        delete[] m_field;
+    }
+}
+
+// Initialize the play field. Returns false on failure
+bool BombsGame::Init(int aWidth, int aHeight)
+{
+    m_gridFocusX = m_gridFocusY = -1;
+
+    int x, y;
     int xx, yy;
 
-    if (field)
-      free(field);
-    field=(short *)malloc(aWidth*aHeight*sizeof(short));
-    if (!field)
-      { width=height=0;
-        return 0;
-      }
-    width=aWidth;
-    height=aHeight;
-
-    for(x=0; x<width; x++)
-      for(y=0; y<height; y++)
-        { field[x+y*width] = ((float)rand()/RAND_MAX <PROB)?
-                             BG_HIDDEN | BG_BOMB :
-                             BG_HIDDEN;
+    if (m_field)
+    {
+        delete[] m_field;
+    }
+
+    m_field = new short[aWidth*aHeight];
+    if (!m_field)
+    {
+        m_width = m_height = 0;
+        return false;
+    }
+
+    m_width = aWidth;
+    m_height = aHeight;
+
+    for(x=0; x<m_width; x++)
+    {
+        for(y=0; y<m_height; y++)
+        {
+            m_field[x+y*m_width] = ((float)rand()/RAND_MAX <PROB)
+                ? BG_HIDDEN | BG_BOMB
+                : BG_HIDDEN;
         }
+    }
+
+    m_numBombCells = 0;
+    for(x=0; x<m_width; x++)
+        for(y=0; y<m_height; y++)
+            if (m_field[x+y*m_width] & BG_BOMB)
+            {
+                m_numBombCells++;
+
+                for(xx=x-1; xx<=x+1; xx++)
+                    if (xx>=0 && xx<m_width)
+                        for(yy=y-1; yy<=y+1; yy++)
+                            if (yy>=0 && yy<m_height && (yy!=y || xx!=x))
+                                m_field[xx+yy*m_width]++;
+            }
+
+    m_numRemainingCells = m_height*m_width-m_numBombCells;
+
+    return true;
+}
 
-    bombs=0;
-    for(x=0; x<width; x++)
-      for(y=0; y<height; y++)
-        if (field[x+y*width] & BG_BOMB)
-          { bombs++;
-            for(xx=x-1; xx<=x+1; xx++)
-              if (xx>=0 && xx<width)
-                for(yy=y-1; yy<=y+1; yy++)
-                  if (yy>=0 && yy<height && (yy!=y || xx!=x))
-                    field[xx+yy*width]++;
-          }
-    normal_cells=height*width-bombs;
-    return 1;
-  }
-
-/*----------------------  BombsGame::Mark(x,y)  -------------------------*/
-/* Marks/unmarks a cell                                                  */
-/*-----------------------------------------------------------------------*/
 void BombsGame::Mark(int x, int y)
-  {
-      field[x+y*width] ^= BG_MARKED;
-  }
+{
+    m_field[x+y*m_width] ^= BG_MARKED;
+}
 
-/*-------------------  BombsGame::Unhide(x,y)  ------------------------*/
-/* Unhides a cell                                                      */
-/*---------------------------------------------------------------------*/
 void BombsGame::Unhide(int x, int y)
-  { if (!IsHidden(x,y))
-      return;
-    field[x+y*width] &= ~BG_HIDDEN;
+{
+    if (!IsHidden(x,y))
+    {
+        return;
+    }
+
+    m_field[x+y*m_width] &= ~BG_HIDDEN;
+
     if (!IsBomb(x,y))
-      normal_cells--;
-  }
+    {
+        m_numRemainingCells--;
+    }
+}
 
-/*-------------------  BombsGame::Explode(x,y)  ------------------------*/
-/* Makes a cell exploded                                                */
-/*----------------------------------------------------------------------*/
-void BombsGame::Explode(int x, int y)
-  {
-    field[x+y*width] |= BG_EXPLODED;
-  }
 
+void BombsGame::Explode(int x, int y)
+{
+    m_field[x+y*m_width] |= BG_EXPLODED;
+}
index ad16000de6a0e372da5a5776f567743ee75ab1c7..00cc83ea058687d7b484a92a8974a7efe030fd4b 100644 (file)
@@ -1,10 +1,16 @@
-//---------------------------------------------------------------
-// game.h
-// Definition of the class BombsGame, containing the data for a
-// playfield
-//---------------------------------------------------------------
-#ifndef GAME_H
-#define GAME_H
+///////////////////////////////////////////////////////////////////////////////
+// Name:        game.h
+// Purpose:     Bombs game
+// Author:      P. Foggia 1996
+// Modified by: Wlodzimierz Skiba (ABX) 2003
+// Created:     1996
+// RCS-ID:      $Id$
+// Copyright:   (c) 1996 P. Foggia
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_DEMOS_BOMBS_GAME_H_
+#define _WX_DEMOS_BOMBS_GAME_H_
 
 #define BG_HIDDEN   0x100
 #define BG_BOMB     0x200
 #define BG_EXPLODED 0x800
 #define BG_MASK     0x0FF
 
-
 #include <stddef.h>
 
 class BombsGame
-  { protected:
-      int width,height;
-      short *field;
-      int bombs,normal_cells;
-    public:
-      BombsGame() { width=height=0; field=NULL; };
-      ~BombsGame();
-      int Init(int width, int height);
-      int GetWidth() { return width; };
-      int GetHeight() { return height; };
-      int Get(int x, int y) { return field[x+y*width]; };
-      void Mark(int x, int y);
-      void Unhide(int x, int y);
-      void Explode(int x, int y);
-      int IsHidden(int x, int y) { return Get(x,y) & BG_HIDDEN; };
-      int IsMarked(int x, int y) { return Get(x,y) & BG_MARKED; };
-      int IsBomb(int x, int y) { return Get(x,y) & BG_BOMB; };
-      int IsExploded(int x, int y) { return Get(x,y) & BG_EXPLODED; };
-      int GetBombs() { return bombs; };
-      int GetRemainingCells() { return normal_cells; };
-  };
-
-#endif /* def GAME_H */
+{
+public:
+    BombsGame()
+    {
+        m_width = m_height = 0;
+        m_field = NULL;
+    };
+
+    ~BombsGame();
+
+    int GetWidth() const { return m_width; };
+    int GetHeight() const { return m_height; };
+
+    int Get(int x, int y) const
+    {
+        return m_field[x+y*m_width];
+    };
+
+    int IsFocussed(int x, int y) const
+    {
+        return (m_gridFocusX == x) && (m_gridFocusY == y);
+    }
+
+    int IsHidden(int x, int y) const
+    {
+        return Get(x,y) & BG_HIDDEN;
+    };
+
+    int IsMarked(int x, int y) const
+    {
+        return Get(x,y) & BG_MARKED;
+    };
+
+    int IsBomb(int x, int y) const
+    {
+        return Get(x,y) & BG_BOMB;
+    };
+
+    int IsExploded(int x, int y) const
+    {
+        return Get(x,y) & BG_EXPLODED;
+    };
+
+    int GetNumBombs() const
+    {
+        return m_numBombCells;
+    };
+
+    int GetNumRemainingCells() const
+    {
+        return m_numRemainingCells;
+    };
+
+
+
+    bool Init(int width, int height);
+
+
+    // Marks/unmarks a cell
+    void Mark(int x, int y);
+
+    // Unhides a cell
+    void Unhide(int x, int y);
+
+    // Makes a cell exploded
+    void Explode(int x, int y);
+
+    int m_gridFocusX;
+    int m_gridFocusY;
+
+private:
+
+    // Current difficulty level (Determines grid size).
+    //int m_level;
+
+    int m_width, m_height;
+    short *m_field;
+    int m_numBombCells, m_numRemainingCells;
+
+};
 
+#endif // #ifndef _WX_DEMOS_BOMBS_GAME_H_