else if(model->FlagCount == model->BombCount && model->FlagsCorrect())

{

stat. AddRecord(StatRec(model->Width, model->Height, model->BombCount, model->timer, true));

return GameState::PlayerWin;

}

// Иначе игра продолжается

return GameState::Continue;

}

// Старт таймера

void Game::TimerStart()

{

// Создаем таймер

nTimerID = SetTimer(view->hWnd, GAME_TIMER, 1000, NULL);

}

// Остановка таймера

void Game::TimerStop()

{

// Остановливаем таймер

KillTimer(view->hWnd, GAME_TIMER);

}

// Обновить таймер

void Game::UpdateTimer()

{

model->timer++;

}

// Доступ к модели

Model * Game::GetModel()

{

return model;

}

// Доступ к объкту отображения

View * Game::GetView()

{

return view;

}

// Задать объект отображения

void Game::SetView(View *v)

{

view = v;

}

// Доступ к объекту статистики

Statistic & Game::GetStat()

{

return stat;

}

===================Исходный код главной процедуры==============

#pragma once

#include "Headers. h"

// Параметры поля

int FieldWidth = 10;

int FieldHeight = 10;

// Максимальные размеры поля

int fieldMaxWidth = 64, fieldMinWidth = 5;

int fieldMaxHeight = 64, fieldMinHeight = 5;

// Создаем глобальный объект игры

Game game;

// Объект отображения

View view;

// Прототип функции WndProc главного окна

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

// Прототип калбек функции дочернего окна

BOOL CALLBACK ChildDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

BOOL CALLBACK statDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, // Дескриптор приложения

HINSTANCE hPrevInstance, // Дескриптор родительского приложения

LPSTR lpCmdLine, // Параметры командной строки

int nCmdShow) // Состояние отображения окна

{

MSG msg; // Структура для хранения сообщения Windows

BOOL done = false; // Логическая переменная для выхода из цикла

// Задаем объект отображения

game. SetView(&view);

// Создаем OpenGL окно

if(!view. CreateGLWindow(WndProc, L"Saper", 32))

return 0;

// Пока не конец

while(!done)

{

// Если есть в очереди сообщение

if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

// Сообщение о выходе

if(msg. message == WM_QUIT)

done = true;

else

{

// Переводим сообщение

TranslateMessage(&msg);

// Отсылаем сообщение

DispatchMessage(&msg);

}

}

// Если нет сообщений

else

{

// Если программа активна

if(view. active)

{

// Нажата клавиша ESC

if(view. keys[VK_ESCAPE])

{

// Завершение работы

done = true;

}

// Иначе обновляем экран

else

{

SetWindowText(view. hWnd, L"Saper. Группа 23ф Данил<Sansual>");

// Рисуем сцену

view. DrawGLScene();

// Меняем буфер (двойная буферизация)

SwapBuffers(view. hDC);

}

}

}

}

game. GetStat().SaveStat();

// Завершение работы

return msg. wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd, // Дескриптор окна

UINT uMsg, // Сообщение для этого окна

WPARAM wParam, // Дополнительная информация

LPARAM lParam) // Дополнительная информация

{

// Проверка сообщения для окна

switch (uMsg)

{

case WM_INITDIALOG:

game. GetStat().LoadStat();

return TRUE;

//

break;

// Проверка сообщения активности окна

case WM_ACTIVATE:

{

// Проверить состояние минимизации

if(!HIWORD(wParam))

{

// Программа активна

view. active = true;

}

else

{

// Программа теперь не активна

view. active = false;

}

// Возвращаемся в цикл обработки сообщений

return 0;

}

// Перехватываем системную команду

case WM_SYSCOMMAND:

{

// Останавливаем системный вызов

switch(wParam)

{

// Пытается ли запустится скринсейвер?

case SC_SCREENSAVE:

// Пытается ли монитор перейти в режим сбережения энергии?

case SC_MONITORPOWER:

// Предотвращаем это

return 0;

}

// Выход

break;

}

// Мы получили сообщение о закрытие?

case WM_CLOSE:

{

// Отправить сообщение о выходе

PostQuitMessage(0);

// Вернуться назад

return 0;

}

// Была ли нажата кнопка?

case WM_KEYDOWN:

{

// Если нажата кнопка, мы присваиваем этой ячейке в массиве true

view. keys[wParam] = true;

// Возвращаемся

return 0;

}

// Была ли отпущена клавиша?

case WM_KEYUP:

{

// Если отпущенна кнопка, мы присваиваем этой ячейке в массиве false

view. keys[wParam] = false;

// Возвращаемся

return 0;

}

// Изменены размеры OpenGL окна

case WM_SIZE:

{

// Младшее слово=Width, старшее слово=Height

view. ReSizeGLScene( LOWORD(lParam), HIWORD(lParam) );

// Возвращаемся

return 0;

}

case WM_TIMER:

{

game. UpdateTimer();

return 0;

}

case WM_LBUTTONDOWN:

{

// Если модель не создана - не обрабатываем кнопку мыши

if(!game. GetModel())

return 0;

// Координата клика

POINT p;

// Получаем "x" компоненту

p. x = MAKEPOINTS(lParam).x;

// Получаем "y" компоненту

p. y = MAKEPOINTS(lParam).y;

// Расчитываем координаты в системе OpenGL

POINT pgl = view. GetOGLPos(p. x, p. y);

// Если клик попал в игровое поле

if(pgl. x < view. SceneWidth - view. BorderSize &&

pgl. x > view. BorderSize &&

pgl. y < view. SceneHeight - view. BorderSize &&

pgl. y > view. BorderSize)

{

// Получаем индексы клетки по которой произошел клик

POINT id = view. GetCellIndex(pgl);

if(id. x == -1 || id. y == -1)

return 0;

/// Игра не запущенна

if (!game. IsStart())

{

// Запускаем

game. GameStart();

}

// Открываем клетку

game. GetModel()->Open(id. x, id. y);

// Проверяем статус игры

if(game. GameProcess(id. x, id. y) == GameState::CompWin)

{

MessageBox(NULL, L"Allahu Akbar", L"Obama Win", MB_OK | MB_ICONERROR);

game. EndGame();

return 0;

}

else if(game. GameProcess(id. x, id. y) == GameState::PlayerWin)

{

wchar_t buff[32];

_itow(game. GetModel()->timer, buff, 10);

MessageBox(NULL, L"Counter-Terrorist Win", L"LEFT BUTTON", MB_OK | MB_ICONEXCLAMATION);

MessageBox(NULL, buff, L"Затраченное время", MB_OK | MB_ICONINFORMATION);

game. EndGame();

return 0;

}

}

return 0;

}

case WM_RBUTTONDOWN:

{

// Если модель не создана - не обрабатываем кнопку мыши

if(!game. GetModel())

return 0;

// Координата клика

POINT p;

// Получаем "x" компоненту

p. x = MAKEPOINTS(lParam).x;

// Получаем "y" компоненту

p. y = MAKEPOINTS(lParam).y;

// Расчитываем координаты в системе OpenGL

POINT pgl = view. GetOGLPos(p. x, p. y);

// Если клик попал в игровое поле

if(pgl. x < view. SceneWidth - view. BorderSize &&

pgl. x > view. BorderSize &&

pgl. y < view. SceneHeight - view. BorderSize &&

pgl. y > view. BorderSize)

{

// Получаем индексы клетки по которой произошел клик

POINT id = view. GetCellIndex(pgl);

// Игра не запущенна

if (!game. IsStart())

{

// Запускаем

game. GameStart();

}

// Помечаем клетку

game. GetModel()->Mark(id. x, id. y);

// Проверяем статус игры

if(game. GameProcess(id. x, id. y) == GameState::PlayerWin)

{

wchar_t buff[32];

_itow(game. GetModel()->timer, buff, 10);

MessageBox(NULL, L"Counter-Terrorist Win", L"RIGHT BUTTON :D", MB_OK | MB_ICONEXCLAMATION);

MessageBox(NULL, buff, L"Затраченное время", MB_OK | MB_ICONINFORMATION);

game. EndGame();

return 0;

}

}

return 0;

}

case WM_COMMAND:

{

switch(wParam)

{

case IDC_MENU_1:

// Показываем диалог из ресурсов

DialogBox(NULL, MAKEINTRESOURCE(IDD_CHILDLG), view. hWnd, ChildDlgProc);

// Сбрасываем значения параметров поля

FieldWidth = FIELD_TYPE0;

FieldHeight = FIELD_TYPE0;

break;

case IDC_MENU_2:

// Показываем диалог из ресурсов

DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOGBAR), view. hWnd, statDlgProc);

break;

case IDC_MENU_3:

view. keys[VK_ESCAPE] = true;

break;

default:

break;

}

return 0;

}

}

// пересылаем все необработанные сообщения DefWindowProc

return DefWindowProc(hWnd, uMsg, wParam, lParam);

}

// Калбек процедура диалогового окна с настройками параметров игры

BOOL CALLBACK ChildDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg)

{

case WM_COMMAND:

switch(LOWORD(wParam))

{

case IDOK:

// Если была запущенна игра

if(game. IsStart())

// Останавливаем

game. EndGame();

// Запуск игры с размером поля 10х10

game. InitGame(FieldWidth, FieldHeight);

EndDialog(hWnd, 0);

break;

case IDCANCEL:

EndDialog(hWnd, 0);

break;

}

break;

case WM_INITDIALOG:

{

// Задаем параметры для первого спина

SendMessage(GetDlgItem(hWnd, IDC_SPIN1), UDM_SETBUDDY, (WPARAM)GetDlgItem(hWnd, IDC_STATIC_1), 0);

SendMessage(GetDlgItem(hWnd, IDC_SPIN1), UDM_SETRANGE, 0, MAKELPARAM(fieldMaxWidth, fieldMinWidth));

SendMessage(GetDlgItem(hWnd, IDC_SPIN1), UDM_SETPOS, 0, FieldWidth);

// Задаем параметры для второго спина

SendMessage(GetDlgItem(hWnd, IDC_SPIN2), UDM_SETBUDDY, (WPARAM)GetDlgItem(hWnd, IDC_STATIC_2), 0);

SendMessage(GetDlgItem(hWnd, IDC_SPIN2), UDM_SETRANGE, 0, MAKELPARAM(fieldMaxWidth, fieldMinWidth));

SendMessage(GetDlgItem(hWnd, IDC_SPIN2), UDM_SETPOS, 0, FieldHeight);

}

break;

case WM_VSCROLL:

{

// Получаем текущие данные спинов

FieldWidth = LOWORD(SendMessage(GetDlgItem(hWnd, IDC_SPIN1), UDM_GETPOS, 0, 0));

FieldHeight = LOWORD(SendMessage(GetDlgItem(hWnd, IDC_SPIN2), UDM_GETPOS, 0, 0));

// Обновляем данные информационных полей

SetDlgItemInt(hWnd, IDC_STATIC_1, FieldWidth, 0);

SetDlgItemInt(hWnd, IDC_STATIC_2, FieldHeight, 0);

}

break;

case WM_CLOSE:

// Завершаяем диалог

EndDialog(hWnd, 0);

break;

default:

return FALSE;

}

return TRUE;

}

// Обработчик диалога статистики

BOOL CALLBACK statDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg)

{

case WM_COMMAND:

switch(LOWORD(wParam))

{

case IDOK:

EndDialog(hWnd, 0);

break;

case IDCANCEL:

EndDialog(hWnd, 0);

break;

}

break;

case WM_INITDIALOG:

{

// Получаем идентификатор Edit элемента

HWND edit = GetDlgItem(hWnd, IDC_EDIT1);

// Временная строка

string str = "";

// Собираем данные о игровых записях

for(size_t i = 0; i < game. GetStat().GetRecords().size(); i++)

{

str += game. GetStat().GetRecords().at(i)->ToString().c_str();

str += "\r\n";

}

// Добавляем статистику о играх

str += game. GetStat().ToString();

// Добавляем текст

SetWindowTextA(edit, (LPCSTR)str. c_str());

}

break;

case WM_ACTIVATE:

{

// Получаем идентификатор Edit элемента

HWND edit = GetDlgItem(hWnd, IDC_EDIT1);

// Временная строка

string str = "";

// Собираем данные о игровых записях

for(size_t i = 0; i < game. GetStat().GetRecords().size(); i++)

{

str += game. GetStat().GetRecords().at(i)->ToString().c_str();

str += "\r\n";

}

// Добавляем статистику о играх

str += game. GetStat().ToString();

// Добавляем текст

SetWindowTextA(edit, (LPCSTR)str. c_str());

}

break;

case WM_CLOSE:

// Завершаяем диалог

EndDialog(hWnd, 0);

break;

default:

return FALSE;

}

return TRUE

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6

Основные порталы (построено редакторами)

Домашний очаг

ДомДачаСадоводствоДетиАктивность ребенкаИгрыКрасотаЖенщины(Беременность)СемьяХобби
Здоровье: • АнатомияБолезниВредные привычкиДиагностикаНародная медицинаПервая помощьПитаниеФармацевтика
История: СССРИстория РоссииРоссийская Империя
Окружающий мир: Животный мирДомашние животныеНасекомыеРастенияПриродаКатаклизмыКосмосКлиматСтихийные бедствия

Справочная информация

ДокументыЗаконыИзвещенияУтверждения документовДоговораЗапросы предложенийТехнические заданияПланы развитияДокументоведениеАналитикаМероприятияКонкурсыИтогиАдминистрации городовПриказыКонтрактыВыполнение работПротоколы рассмотрения заявокАукционыПроектыПротоколыБюджетные организации
МуниципалитетыРайоныОбразованияПрограммы
Отчеты: • по упоминаниямДокументная базаЦенные бумаги
Положения: • Финансовые документы
Постановления: • Рубрикатор по темамФинансыгорода Российской Федерациирегионыпо точным датам
Регламенты
Термины: • Научная терминологияФинансоваяЭкономическая
Время: • Даты2015 год2016 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

АвиацияАвтоВычислительная техникаОборудование(Электрооборудование)РадиоТехнологии(Аудио-видео)(Компьютеры)

Общество

БезопасностьГражданские права и свободыИскусство(Музыка)Культура(Этика)Мировые именаПолитика(Геополитика)(Идеологические конфликты)ВластьЗаговоры и переворотыГражданская позицияМиграцияРелигии и верования(Конфессии)ХристианствоМифологияРазвлеченияМасс МедиаСпорт (Боевые искусства)ТранспортТуризм
Войны и конфликты: АрмияВоенная техникаЗвания и награды

Образование и наука

Наука: Контрольные работыНаучно-технический прогрессПедагогикаРабочие программыФакультетыМетодические рекомендацииШколаПрофессиональное образованиеМотивация учащихся
Предметы: БиологияГеографияГеологияИсторияЛитератураЛитературные жанрыЛитературные героиМатематикаМедицинаМузыкаПравоЖилищное правоЗемельное правоУголовное правоКодексыПсихология (Логика) • Русский языкСоциологияФизикаФилологияФилософияХимияЮриспруденция

Мир

Регионы: АзияАмерикаАфрикаЕвропаПрибалтикаЕвропейская политикаОкеанияГорода мира
Россия: • МоскваКавказ
Регионы РоссииПрограммы регионовЭкономика

Бизнес и финансы

Бизнес: • БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумаги: • УправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги - контрольЦенные бумаги - оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудит
Промышленность: • МеталлургияНефтьСельское хозяйствоЭнергетика
СтроительствоАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством