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
|