1 ///////////////////////////////////////////////////////////////////////////////
4 // Author: P. Foggia 1996
5 // Modified by: Wlodzimierz Skiba (ABX) 2003
8 // Copyright: (c) 1996 P. Foggia
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
13 # pragma implementation
16 #include "wx/wxprec.h"
24 #endif //precompiled headers
26 #include "wx/stockitem.h"
36 #if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) \
37 || defined(__WXMAC__) || defined(__WXMGL__)
41 IMPLEMENT_APP(BombsApp
)
44 STDAPI_(__int64
) CeGetRandomSeed();
47 // Called to initialize the program
48 bool BombsApp
::OnInit()
51 srand((unsigned) CeGetRandomSeed());
53 srand((unsigned) time(NULL
));
56 m_frame
= new BombsFrame(&m_game
);
58 m_frame
->NewGame(bombsID_EASY
, false);
63 BEGIN_EVENT_TABLE(BombsFrame
, wxFrame
)
64 EVT_MENU(bombsID_EASY
, BombsFrame
::OnNewEasyGame
)
65 EVT_MENU(bombsID_MEDIUM
, BombsFrame
::OnNewMediumGame
)
66 EVT_MENU(bombsID_HARD
, BombsFrame
::OnNewHardGame
)
67 EVT_MENU(bombsID_EASYCORNER
, BombsFrame
::OnEasyCorner
)
68 EVT_MENU(wxID_EXIT
, BombsFrame
::OnExit
)
69 EVT_MENU(wxID_ABOUT
, BombsFrame
::OnAbout
)
72 BombsFrame
::BombsFrame(BombsGame
*game
)
73 : wxFrame(NULL
, wxID_ANY
, wxT("wxBombs"), wxDefaultPosition
,
74 wxSize(300, 300), wxDEFAULT_DIALOG_STYLE
|wxMINIMIZE_BOX
)
78 m_lastLevel
= bombsID_EASY
;
80 SetIcon(wxICON(bombs
));
86 // Create a menu bar for the frame
87 wxMenuBar
*menuBar
= new wxMenuBar
;
88 wxMenu
*menuFile
= new wxMenu
;
89 wxMenu
*menuLevel
= new wxMenu
;
90 menuLevel
->AppendRadioItem(bombsID_EASY
, wxT("&Easy (10x10)\tCtrl-1"));
91 menuLevel
->AppendRadioItem(bombsID_MEDIUM
, wxT("&Medium (15x15)\tCtrl-2"));
92 menuLevel
->AppendRadioItem(bombsID_HARD
, wxT("&Hard (25x20)\tCtrl-3"));
94 menuFile
->Append(bombsID_NEWGAME
, wxT("&New Game"),
95 menuLevel
, wxT("Starts a new game"));
96 menuFile
->AppendCheckItem(bombsID_EASYCORNER
, wxT("&Easy corner"));
98 menuFile
->AppendSeparator();
99 menuFile
->Append(wxID_EXIT
, wxGetStockLabel(wxID_EXIT
), wxT("Quits the application"));
101 menuBar
->Append(menuFile
, wxT("&File"));
104 wxMenu
*menuHelp
= new wxMenu
;
105 menuHelp
->Append(wxID_ABOUT
, wxT("&About"),
106 wxT("Displays the program information") );
108 menuBar
->Append(menuHelp
, wxT("&Help"));
112 // Create child subwindows.
113 m_canvas
= new BombsCanvas(this, m_game
);
115 // Ensure the subwindows get resized o.k.
116 // OnSize(width, height);
118 // Centre frame on the screen.
125 void BombsFrame
::OnExit(wxCommandEvent
& WXUNUSED(event
))
130 void BombsFrame
::NewGame(int level
, bool query
)
134 int ok
= wxMessageBox(
135 wxT("Start new game regardless previous board?"),
137 wxYES_NO
| wxICON_QUESTION
,
143 int numHorzCells
= 20, numVertCells
= 20;
149 numHorzCells
= numVertCells
= 10;
153 numHorzCells
= numVertCells
= 15;
157 numHorzCells
= 25; numVertCells
= 20;
161 wxFAIL_MSG(wxT("Invalid level"));
165 m_game
->Init(numHorzCells
, numVertCells
, m_easyCorner
);
167 GetMenuBar()->Check(level
, true);
169 m_canvas
->UpdateGridSize();
170 SetClientSize(m_canvas
->GetGridSizeInPixels());
173 void BombsFrame
::OnAbout(wxCommandEvent
& WXUNUSED(event
))
176 wxT("wxBombs (c) 1996 by P. Foggia\n<foggia@amalfi.dis.unina.it>"),
177 wxT("About wxBombs") );
180 void BombsFrame
::OnNewEasyGame(wxCommandEvent
& WXUNUSED(event
))
182 NewGame(bombsID_EASY
, true);
185 void BombsFrame
::OnNewMediumGame(wxCommandEvent
& WXUNUSED(event
))
187 NewGame(bombsID_MEDIUM
, true);
190 void BombsFrame
::OnNewHardGame(wxCommandEvent
& WXUNUSED(event
))
192 NewGame(bombsID_HARD
, true);
195 void BombsFrame
::OnEasyCorner(wxCommandEvent
& WXUNUSED(event
))
201 msg
= wxT("disable");
203 msg
= wxT("Do you really want to ") + msg
+ wxT(" having\ntop left corner always empty for easier start?");
205 int ok
= wxMessageBox(
208 wxYES_NO
| wxICON_QUESTION
,
214 m_easyCorner
= !m_easyCorner
;
216 NewGame(m_lastLevel
, true);
219 BEGIN_EVENT_TABLE(BombsCanvas
, wxPanel
)
220 EVT_PAINT(BombsCanvas
::OnPaint
)
221 EVT_MOUSE_EVENTS(BombsCanvas
::OnMouseEvent
)
222 EVT_CHAR(BombsCanvas
::OnChar
)
225 BombsCanvas
::BombsCanvas(wxFrame
*parent
, BombsGame
*game
)
226 : wxPanel(parent
, wxID_ANY
)
231 wxFont font
= BOMBS_FONT
;
235 wxString buf
= wxT("M");
237 dc
.GetTextExtent(buf
, &chw
, &chh
);
238 dc
.SetFont(wxNullFont
);
240 dc
.SetMapMode(wxMM_METRIC
);
242 int xcm
= dc
.LogicalToDeviceX(10);
243 int ycm
= dc
.LogicalToDeviceY(10);
244 // To have a square cell, there must be :
246 if (chw
*ycm
< chh
*xcm
)
257 m_cellWidth
= (sx
+3+X_UNIT
)/X_UNIT
;
258 m_cellHeight
= (sy
+3+Y_UNIT
)/Y_UNIT
;
259 dc
.SetMapMode(wxMM_TEXT
);
263 BombsCanvas
::~BombsCanvas()
272 // Called when canvas needs to be repainted.
273 void BombsCanvas
::OnPaint(wxPaintEvent
& WXUNUSED(event
))
277 const int numHorzCells
= m_game
->GetWidth();
278 const int numVertCells
= m_game
->GetHeight();
279 // Insert your drawing code here.
282 wxSize size
= dc
.GetSize();
283 m_bmp
= new wxBitmap(size
.GetWidth(), size
.GetHeight());
287 memDC
.SelectObject(*m_bmp
);
288 DrawField(&memDC
, 0, 0, numHorzCells
-1, numVertCells
-1);
289 memDC
.SelectObject(wxNullBitmap
);
296 memDC
.SelectObject(*m_bmp
);
297 wxSize size
= dc
.GetSize();
298 dc
.Blit(0, 0, size
.GetWidth(), size
.GetHeight(),
299 &memDC
, 0, 0, wxCOPY
);
300 memDC
.SelectObject(wxNullBitmap
);
304 DrawField(&dc
, 0, 0, numHorzCells
-1, numVertCells
-1);
308 void BombsCanvas
::UpdateGridSize()
316 SetSize(GetGridSizeInPixels());
320 wxSize BombsCanvas
::GetGridSizeInPixels() const
322 return wxSize(m_cellWidth
*X_UNIT
*m_game
->GetWidth(),
323 m_cellHeight
*Y_UNIT
*m_game
->GetHeight());