0, // Сдвиговый бит игнорируется
0, // Нет буфера накопления
0, 0, 0, 0, // Биты накопления игнорируются
32, // 32 битный Z-буфер (буфер глубины)
0, // Нет буфера трафарета
0, // Нет вспомогательных буферов
PFD_MAIN_PLANE, // Главный слой рисования
0, // Зарезервировано
0, 0, 0 // Маски слоя игнорируются
};
// Попытка получить контекст устройства
if(!(hDC = GetDC(hWnd)))
{
// Восстановить экран
KillGLWindow();
MessageBox(NULL, L"Can't Create A GL Device Context.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
// Ошибка получения контекста устройства
return false;
}
// Найден ли подходящий формат пикселя?
if(!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))
{
// Восстановить экран
KillGLWindow();
MessageBox(NULL, L"Can't Find A Suitable PixelFormat.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
// Ошибка, формат для пикселя не найден
return false;
}
// Возможно ли установить Формат Пикселя?
if(!SetPixelFormat(hDC, PixelFormat, &pfd))
{
// Восстановить экран
KillGLWindow();
MessageBox(NULL, L"Can't Set The PixelFormat.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
// Ошибка задания формата пиксел
return false;
}
// Возможно ли установить Контекст Рендеринга?
if(!(hRC = wglCreateContext(hDC)))
{
// Восстановить экран
KillGLWindow();
MessageBox(NULL, L"Can't Create A GL Rendering Context.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
// Ошибка установки контекста рендеринга
return false;
}
// Попробовать активировать Контекст Рендеринга
if(!wglMakeCurrent(hDC, hRC))
{
// Восстановить экран
KillGLWindow();
MessageBox(NULL, L"Can't Activate The GL Rendering Context.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
// Ошибка активации конекства
return false;
}
// Показать окно
ShowWindow(hWnd, SW_SHOW);
// Слегка повысим приоритет
SetForegroundWindow(hWnd);
// Установить фокус клавиатуры на наше окно
SetFocus(hWnd);
// Инициализация библиотеки OpenGL для текущего окна
if(!InitGL())
{
// Восстановить экран
KillGLWindow();
MessageBox(NULL, L"Initialization Failed.", L"ERROR", MB_OK | MB_ICONEXCLAMATION );
return false;
}
// Завершение инициализации окна успешно
return true;
}
// Корректное разрушение окна
GLvoid View::KillGLWindow(GLvoid)
{
// Проверка существования контекста устройства
if(hRC)
{
// Попытка освободить RC и DC
if(!wglMakeCurrent(NULL, NULL))
MessageBox(NULL, L"Release Of DC And RC Failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
// Попытка удалить RC
if(!wglDeleteContext(hRC))
MessageBox(NULL, L"Release Rendering Context Failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
// Установить RC в NULL
hRC = NULL;
}
// Попытка уничтожить DC
if(hDC && !ReleaseDC(hWnd, hDC))
{
MessageBox(NULL, L"Release Device Context Failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
// Установить DC в NULL
hDC = NULL;
}
// Попытка уничтожить окно
if(hWnd && !DestroyWindow(hWnd))
{
MessageBox(NULL, L"Could Not Release hWnd.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
// Установить hWnd в NULL
hWnd = NULL;
}
// Возможно ли разрегистрировать класс
if(!UnregisterClass(L"Saper OpenGL Window Class", hInstance))
{
MessageBox(NULL, L"Could Not Unregister Class.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
// Установить hInstance в NULL
hInstance = NULL;
}
}
=============================Статистика=====================
#pragma once
#include "Statistic. h"
#include <windows. h>
// Конструктор
Statistic::Statistic()
{
// Общее количество выигранных игр
wins = 0;
// Общее количество проигрышей
looses = 0;
// Общее время затраченное на игры
TotalTime = 0;
// Время самой долгой победы
slowGame = 0;
// Время самой быстрой победы
quickGame = MAXLONG;
// Путь к файлу статистики
savePath = "Stat. dat";
}
// Деструктор
Statistic::~Statistic()
{
Clear();
}
// Добавить запись
void Statistic::AddRecord(StatRec &rec)
{
// Добавляем запись в список
records. push_back(new StatRec(rec));
// Обновляем данные статистики
Refresh();
}
// Очистить все записи
void Statistic::Clear()
{
for(size_t i = 0; i < records. size(); i++)
delete records. at(i);
}
// Сброс данных в файл
void Statistic::SaveStat()
{
// Открываем файл
ofstream outf(savePath, ios::trunc);
// Сохраняем все записи что есть на данный момент
for(size_t i = 0; i < records. size(); i++)
outf << records. at(i)->recDate << '#'
<< records. at(i)->Width << '#' << records. at(i)->Height << '#' << records. at(i)->BombCount << '#'
<< records. at(i)->gameTime << '#' << ((records. at(i)->WinGame) ? "win" : "loose") << '#' << endl;
// Закрываем файл
outf. close();
}
// Загрузка данных из файла
void Statistic::LoadStat()
{
// Открываем файл
ifstream inf(savePath);
if(!inf)
return;
// Временная строка - буфер
string buff = "";
char k;
StatRec temp;
// Читаем файл
while(!inf. eof())
{
k = inf. get();
// Если запись окончена
if(k == '\n')
{
// Разбираем данные в строке
Parse(&temp, buff);
// Очищаем буфер
buff. clear();
// Добавляем в вектор
records. push_back(new StatRec(temp));
}
buff += k;
}
// Обновляем данные статистики
Refresh();
// Закрываем файл
inf. close();
}
// Разбор строки параметров
void Statistic::Parse(StatRec *p, string buff)
{
string temp = "";
int count = 0;
for(size_t i = 0; i < buff. size(); i++)
{
// Обнаружен коней строки текущего параметра
if(buff. at(i) == '#')
{
switch(count)
{
// Добавляем первый параметр - дата игры
case 0:
strcpy(p->recDate, temp. c_str());
break;
// Ширина поля
case 1:
p->Width = atoi(temp. c_str());
break;
// Высота поля
case 2:
p->Height = atoi(temp. c_str());
break;
// Количество бомб
case 3:
p->BombCount = atoi(temp. c_str());
break;
// Время затраченное на игру
case 4:
p->gameTime = atoi(temp. c_str());
break;
// Исход игры: выиграл/проиграл
case 5:
p->WinGame = (strcmp(temp. c_str(), "win") == 0) ? true : false;
break;
default:
break;
}
// Очистка буферной строки
temp. clear();
// Переходим к следующему параметру
count++;
}
// Добавляем в буферную строку
else if(buff. at(i) != '\n')
temp += buff. at(i);
}
}
// Обновление глобальных данных о игре
void Statistic::Refresh()
{
for(size_t i = 0; i < records. size(); i++)
{
// Общее количество выигранных игр
if(records. at(i)->WinGame)
wins++;
// Общее количество проигрышей
else
looses++;
// Общее время затраченное на игры
TotalTime += records. at(i)->gameTime;
// Время самой долгой победы
if(records. at(i)->gameTime > slowGame && records. at(i)->WinGame)
slowGame = records. at(i)->gameTime;
// Время самой быстрой победы
if(records. at(i)->gameTime < quickGame && records. at(i)->WinGame)
quickGame = records. at(i)->gameTime;
}
}
// Собрать статистику в одну строку
string Statistic::ToString()
{
char buff[32];
string str = "\r\n\r\n";
itoa(wins, buff, 10);
str += "Количество выиграных игр:\t ";
str += buff; str += "\r\n";
itoa(looses, buff, 10);
str += "Количество проигранных игр:\t ";
str += buff; str += "\r\n";
itoa(TotalTime, buff, 10);
str += "Время затраченное на игры:\t ";
str += buff; str += "\r\n";
itoa(slowGame, buff, 10);
str += "Время самой длинной победы:\t ";
str += buff; str += "\r\n";
if(quickGame == MAXLONG)
itoa(0, buff, 10);
else
itoa(quickGame, buff, 10);
str += "Время самой быстрой победы:\t ";
str += buff; str += "\r\n";
return str;
}
// Получить список игровых записей
vector<StatRec*> Statistic::GetRecords()
{
return records;
}
===============================Игра========================
#pragma once
#include "Game. h"
// Идентификатор таймера
#define GAME_TIMER 1
// Конструктор
Game::Game()
{
// Загружаем данные статистики
stat. LoadStat();
model = NULL;
nTimerID = -1;
gameStart = false;
}
// Деструктор
Game::~Game()
{
delete model;
}
// Инициализация игры
void Game::InitGame(int FieldWidth, int FieldHeight)
{
// Создаем представление
model = new Model(FieldWidth, FieldHeight);
// Задаем параметры
view->ReSetModel(model);
}
// Старт игры
void Game::GameStart()
{
if(model == NULL) return;
gameStart = true;
TimerStart();
}
void Game::EndGame()
{
gameStart = false;
TimerStop();
view->ReleaseModel();
model = NULL;
}
// Запущенна ли игра
bool Game::IsStart()
{
return gameStart;
}
// Проверка состояния игры
GameState Game::GameProcess(int x, int y)
{
// Если нарвались на мину - игра окончена победил компьютер
if (model->GetCell(x, y).state == CellState::OPEN && model->GetCell(x, y).hasMine)
{
stat. AddRecord(StatRec(model->Width, model->Height, model->BombCount, model->timer, false));
// Возвращаем статус игры
return GameState::CompWin;
}
// Если количество флагов достигло количества бомб и все флаги раставлены только на бомбах а не на пустых клетках - игра окончена победил игрок
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |
Основные порталы (построено редакторами)

