kolFindBombs--; // уменьшаем количество найденных бомб на еденицу
}
// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /
bool MyField:: TestOnWin() // тест на выигрыш
{
for (int i = 0; i < GetCols(); i++)
{
for (int j = 0; j < GetRows(); j++)
{
if (! field [i] [j] ->isBomb() &&
(field [i] [j] ->GetState() == CLOSED ||
field [i] [j] ->GetState() == BLOCK))
return false;
}
}
return true;
}
// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /
SaperDlg. h
// saperDlg. h: header file
//
#pragma once
#include "myfield. h"
// CsaperDlg dialog
class CsaperDlg: public CDialog
{
// Construction
public:
CsaperDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
enum { IDD = IDD_SAPER_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
private: // внутренние переменные и функции класса
MyField field;
bool isInitAll;
bool begin;
bool isFirstClick;
void SetPosition();
void ShowFindBombs();
// Implementation
protected:
HICON m_hIcon;
CFont fontFindBombs;
CString nameOfPowered;
// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // функция для щелчка левой кнопкой мыши
public:
afx_msg void OnRButtonDown(UINT nFlags, CPoint point); // функция для щелчка правой кнопкой мыши
public:
int bombsCount; // счетчик бомб
public:
int height; // высота
public:
int width; // ширина
public:
afx_msg void OnBnClickedButtonExit(); // функция выхода из игры
public:
afx_msg void OnBnClickedButtonStart(); // функция для начала игры
};
SaperDlg. cpp
// saperDlg. cpp: implementation file
//
#include "stdafx. h"
#include "saper. h"
#include "saperDlg. h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include "myfield. h"
#include "mycell. h"
// CsaperDlg dialog
CsaperDlg:: CsaperDlg(CWnd* pParent /*=NULL*/)
: CDialog(CsaperDlg:: IDD, pParent), isInitAll(false), begin (false), isFirstClick(true)
, bombsCount(0)
, height(0)
, width(0)
{
m_hIcon = AfxGetApp() - >LoadIcon(IDR_MAINFRAME);
// шрифт
fontFindBombs. CreateFontA(
50,
0,
0,
0,
400,
FALSE,
FALSE,
0,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_MODERN,
"Courier");
nameOfPowered = "Разработчик: Гаврюшенко Мария Александровна\r\nГруппа: КН-06-4";
}
void CsaperDlg:: DoDataExchange(CDataExchange* pDX)
{
CDialog:: DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_BOMBS_COUNT, bombsCount);
DDV_MinMaxInt(pDX, bombsCount, 1, 4096);
DDX_Text(pDX, IDC_EDIT_HEIGHT, height);
DDV_MinMaxInt(pDX, height, 10, 40);
DDX_Text(pDX, IDC_EDIT_WIDTH, width);
DDV_MinMaxInt(pDX, width, 10, 50);
}
BEGIN_MESSAGE_MAP(CsaperDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
// }}AFX_MSG_MAP
ON_WM_LBUTTONDOWN()
// ON_WM_MOUSEMOVE()
ON_WM_RBUTTONDOWN()
ON_BN_CLICKED(IDC_BUTTON_EXIT, &CsaperDlg:: OnBnClickedButtonExit)
ON_BN_CLICKED(IDC_BUTTON_START, &CsaperDlg:: OnBnClickedButtonStart)
END_MESSAGE_MAP()
// CsaperDlg message handlers
BOOL CsaperDlg:: OnInitDialog()
{
CDialog:: OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// значения, которые находятся в окне
CRect rect; // задаем значения переменным
GetWindowRect(&rect);
field. Init(10, 10, 15); // поле
height = field. GetCols(); // высота
width = field. GetRows(); // ширина
bombsCount = field. GetBombsCount(); // счетчик бомб
SetPosition(); // устанавливаем позицию
isInitAll = true;
begin = true;
isFirstClick = true;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CsaperDlg:: OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc. GetSafeHdc()), 0);
// Center icon in client rectangle
// установка иконки
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect. Width() - cxIcon + 1) / 2;
int y = (rect. Height() - cyIcon + 1) / 2;
// Draw the icon
dc. DrawIcon(x, y, m_hIcon);
}
else
{
CDialog:: OnPaint();
CDC * dc = GetDC();
if (isInitAll)
{
// рисуем бомбу
CBrush brush;
brush. CreateSolidBrush(RGB(255, 255, 255));
CBrush * oldBrush = dc->SelectObject(&brush);
dc->Rectangle(8, 8, field. GetRows() * (SIZE + 2) + 10,
field. GetCols() * (SIZE + 2) + 10);
dc->SelectObject(oldBrush);
field. Draw(dc);
}
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CsaperDlg:: OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CsaperDlg:: OnLButtonDown(UINT nFlags, CPoint point)
{
if (! begin)
return;
if (point. x < 10 || point. x > (field. GetRows() * (SIZE + 2) + 3) ||
point. y < 10 || point. y > (field. GetCols() * (SIZE + 2) + 3))
return;
CDC * dc = GetDC();
int result;
result = field. Click(dc, point);
// если при первом щелчке вы проиграли, то поле перерисовуется
if (isFirstClick)
{
while (result & GAMEOVER)
{
field. ReInit(field. GetCols(), field. GetRows(), field. GetBombsCount());
result = field. Click(dc, point);
}
}
ShowFindBombs(); // показывает найденные бомбы
if (result & REDRAW) // перерисовуем поле
{
field. Draw(dc);
CRect rect;
GetWindowRect(&rect);
InvalidateRect(rect, TRUE);
}
if (result & GAMEOVER) // если вы проиграли
{
begin = false;
MessageBox("Вы проиграли!!!: '(", "Конец игры", MB_OK);
}
if (result & WINNER) // если вы выиграли
{
begin = false;
MessageBox("Вы выграли!!!:)))", "Конец игры", MB_OK);
}
isFirstClick = false;
CDialog:: OnLButtonDown(nFlags, point);
}
void CsaperDlg:: OnRButtonDown(UINT nFlags, CPoint point)
{
if (! begin)
return;
if (point. x < 10 || point. x > (field. GetRows() * (SIZE + 2) + 3) ||
point. y < 10 || point. y > (field. GetCols() * (SIZE + 2) + 3))
return;
CDC * dc = GetDC();
field. Block(dc, point);
field. Draw(dc);
ShowFindBombs();
CRect rect;
GetWindowRect(&rect);
InvalidateRect(rect, TRUE);
CDialog:: OnRButtonDown(nFlags, point);
}
void CsaperDlg:: OnBnClickedButtonExit()
{
// Выход
OnOK();
}
void CsaperDlg:: OnBnClickedButtonStart()
{
// Begin
isInitAll = false;
begin = false;
UpdateData(TRUE);
CDC * dc = GetDC();
field. ReInit(height, width, bombsCount); // перерисовка
height = field. GetCols();
width = field. GetRows();
bombsCount = field. GetBombsCount();
SetPosition();
field. Draw(dc);
CRect rect;
GetWindowRect(&rect);
InvalidateRect(rect, TRUE);
isInitAll = true;
begin = true;
isFirstClick = true;
UpdateData(FALSE);
}
void CsaperDlg:: SetPosition()
{
CRect rect;
GetWindowRect(&rect);
// движение окна
MoveWindow(rect. left, rect. top, field. GetRows() * (SIZE + 2) + 230,
field. GetCols() * (SIZE + 2) + 80, TRUE);
ShowFindBombs();
// создание кнопок в окне
GetDlgItem(IDC_STATIC_BOMBS_COUNT) - >SetWindowTextA("Количество бомб: ");
GetDlgItem(IDC_STATIC_BOMBS_COUNT) - >MoveWindow(field. GetRows() * (SIZE + 2) + 30,
70, 130, 15, TRUE);
GetDlgItem(IDC_EDIT_BOMBS_COUNT) - >MoveWindow(field. GetRows() * (SIZE + 2) + 160,
67, 50, 20, TRUE);
GetDlgItem(IDC_STATIC_HEIGHT) - >SetWindowTextA("Высота: ");
GetDlgItem(IDC_STATIC_HEIGHT) - >MoveWindow(field. GetRows() * (SIZE + 2) + 30,
100, 130, 15, TRUE);
GetDlgItem(IDC_EDIT_HEIGHT) - >MoveWindow(field. GetRows() * (SIZE + 2) + 160,
97, 50, 20, TRUE);
GetDlgItem(IDC_STATIC_WIDTH) - >SetWindowTextA("Ширина: ");
GetDlgItem(IDC_STATIC_WIDTH) - >MoveWindow(field. GetRows() * (SIZE + 2) + 30,
130, 130, 15, TRUE);
GetDlgItem(IDC_EDIT_WIDTH) - >MoveWindow(field. GetRows() * (SIZE + 2) + 160,
127, 50, 20, TRUE);
GetDlgItem(IDC_BUTTON_START) - >SetWindowTextA("Начать");
GetDlgItem(IDC_BUTTON_START) - >MoveWindow(field. GetRows() * (SIZE + 2) + 70,
170, 100, 20, TRUE);
GetDlgItem(IDC_BUTTON_EXIT) - >SetWindowTextA("Выход");
GetDlgItem(IDC_BUTTON_EXIT) - >MoveWindow(field. GetRows() * (SIZE + 2) + 70,
200, 100, 20, TRUE);
GetWindowRect(&rect);
GetDlgItem(IDC_STATIC_POWEREDBY) - >SetWindowTextA(nameOfPowered);
GetDlgItem(IDC_STATIC_POWEREDBY) - >MoveWindow(rect. Width() / 2 - 180,
rect. Height() - 65, 350, 50, FALSE);
}
void CsaperDlg:: ShowFindBombs() // показать найденные бомбы
{
char *pNum = NULL;
char num [5] ;
pNum = itoa(field. GetBombsCount() - field. GetFindBombsCount(), num, 10); // перевод цифрового значения в строчный
GetDlgItem(IDC_STATIC_FIND_BOMBS_COUNT) - >SetFont(&fontFindBombs, TRUE);
GetDlgItem(IDC_STATIC_FIND_BOMBS_COUNT) - >SetWindowTextA(pNum);
GetDlgItem(IDC_STATIC_FIND_BOMBS_COUNT) - >MoveWindow(field. GetRows() * (SIZE + 2) + 70,
10, 100, 50, TRUE);
}
ПРИЛОЖЕНИЕ 3.
ИНТЕРФЕЙС ПРОГРАММЫ
РИС.1
РИС.2
РИС.3
РИС.4 РИС.5