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 |
Основные порталы (построено редакторами)

