Смекни!
smekni.com

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 = "Разработчик: Гаврюшенко Мария Александровна&bsol;r&bsol;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