на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Сапер
p align="left">{

DeInit(); // очистка поля

Init(cs, rs, kb); // задаем поле

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

void MyField:: DeInit() // очистка поля

{

if (field == NULL)

return;

for (int i = 0; i < GetCols(); i++)

for (int j = 0; j < GetRows(); j++)

if (field [i] [j]. GetPointer() ! = NULL)

field [i] [j]. Destroy();

for (int i = 0; i < GetCols(); i++) // удаление массива

if (field [i] ! = NULL)

delete [] field [i] ;

if (field! = NULL)

delete [] field;

field = NULL;

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

void MyField:: Draw(CDC * dc) // рисуем поле

{

if (field == NULL)

return; // error

for (int i = 0; i < GetCols(); i++)

for (int j = 0; j < GetRows(); j++)

if (field [i] [j] ! = NULL)

field [i] [j] ->Draw(dc);

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

int MyField:: Click(CDC * dc, const CPoint & point) // проверка, попала ли мышь по ячейке

{

if (field == NULL)

return 0; // error

for (int i = 0; i < GetCols(); i++)

{

for (int j = 0; j < GetRows(); j++)

{

if (field [i] [j] ->HitToPoint(point))

{

int res = field [i] [j] ->Click(dc); // если попала по ячейке, то открываем ее

if (res & OPEN_NULL_VALUES)

{

this->countItter = 0;

OpenNullValues(i, j);

}

if (TestOnWin()) // тест на выигрыш

OpenAll();

res

if (res & GAMEOVER)

OpenAll();

return res;

}

}

}

return 0;

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

void MyField:: Block(CDC * dc, const CPoint & point) // возможность ставить флажки по всему полю

{

if (field == NULL)

return; // error

for (int i = 0; i < GetCols(); i++)

{

for (int j = 0; j < GetRows(); j++)

{

if (field [i] [j] ->HitToPoint(point))

{

if (field [i] [j] ->GetState() == OPENED)

return;

if (field [i] [j] ->GetState() == CLOSED)

{

IncFindBombs();

field [i] [j] ->SetState(BLOCK); // проверка на флажок

return;

}

if (field [i] [j] ->GetState() == BLOCK) // правая кнопка убирает флажок

{

DecFindBombs();

field [i] [j] ->SetState(CLOSED);

return;

}

}

}

}

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

int MyField:: CalcValueForCell(int i, int j)

{

int value = 0;

// Обходим все соседние ячейки в поисках бомб

if (CheckCell(i, j - 1))

if (GetCellByIndex(i, j - 1) ! = NULL && GetCellByIndex(i, j - 1) - >isBomb())

value++;

if (CheckCell(i - 1, j - 1))

if (GetCellByIndex(i - 1, j - 1) ! = NULL && GetCellByIndex(i - 1, j - 1) - >isBomb())

value++;

if (CheckCell(i - 1, j))

if (GetCellByIndex(i - 1, j) ! = NULL && GetCellByIndex(i - 1, j) - >isBomb())

value++;

if (CheckCell(i - 1, j + 1))

if (GetCellByIndex(i - 1, j + 1) ! = NULL && GetCellByIndex(i - 1, j + 1) - >isBomb())

value++;

if (CheckCell(i, j + 1))

if (GetCellByIndex(i, j + 1) ! = NULL && GetCellByIndex(i, j + 1) - >isBomb())

value++;

if (CheckCell(i + 1, j + 1))

if (GetCellByIndex(i + 1, j + 1) ! = NULL && GetCellByIndex(i + 1, j + 1) - >isBomb())

value++;

if (CheckCell(i + 1, j))

if (GetCellByIndex(i + 1, j) ! = NULL && GetCellByIndex(i + 1, j) - >isBomb())

value++;

if (CheckCell(i + 1, j - 1))

if (GetCellByIndex(i + 1, j - 1) ! = NULL && GetCellByIndex(i + 1, j - 1) - >isBomb())

value++;

return value;

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

bool MyField:: CheckCell(int i, int j)

{

if (i >= 0 && j >= 0 && i < GetCols() && j < GetRows())

return true;

return false;

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

void MyField:: OpenAll() // открытие ячеек

{

if (field == NULL)

return; // error

// передаем значение номера строки и столбца

for (int i = 0; i < GetCols(); i++)

for (int j = 0; j < GetRows(); j++)

field [i] [j] ->SetState(OPENED);

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

void MyField:: OpenNullValues(int i, int j) // пустые ячейки, а вокруг цифры

{

if (! CheckCell(i, j))

return;

if (GetCellByIndex(i, j) == NULL)

return;

if (GetCellByIndex(i, j) - >isBomb())

return;

else

if (countItter! = 0 && (GetCellByIndex(i, j) - >GetState() == OPENED ||

GetCellByIndex(i, j) - >GetState() == BLOCK)) // не может открыть ячейку, если она уже открыта либо стоит с флажком

return;

GetCellByIndex(i, j) - >SetState(OPENED);

countItter++;

// Обходим все соседние ячейки чтобы их открыть

if (((CMyCellWob *) GetCellByIndex(i, j)) - >GetValue() == 0)

{

OpenNullValues(i, j - 1);

OpenNullValues(i - 1, j - 1);

OpenNullValues(i - 1, j);

OpenNullValues(i - 1, j + 1);

OpenNullValues(i, j + 1);

OpenNullValues(i + 1, j + 1);

OpenNullValues(i + 1, j);

OpenNullValues(i + 1, j - 1);

}

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

void MyField:: IncFindBombs()

{

kolFindBombs++; // увеличиваем количество найденных бомб на еденицу

}

// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /

void MyField:: DecFindBombs()

{

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

}

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)

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)

point. x > (field. GetRows() * (SIZE + 2) + 3)

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

Страницы: 1, 2, 3, 4



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.