for(size_t j = 0; j < domains. at(domainID).points. size(); j++)
{
// Открываем текущую ячейку
GetCell(domains. at(domainID).points. at(j).second, domains. at(domainID).points. at(j).first).state = CellState::OPEN;
// Открываем справа
if(domains. at(domainID).points. at(j).second + 1 < Width)
{
// Справа прямо
GetCell(domains. at(domainID).points. at(j).second + 1, domains. at(domainID).points. at(j).first).state = CellState::OPEN;
// Справа вверху
if(domains. at(domainID).points. at(j).first + 1 < Height)
GetCell(domains. at(domainID).points. at(j).second + 1, domains. at(domainID).points. at(j).first + 1).state = CellState::OPEN;
// Справа внизу
if(domains. at(domainID).points. at(j).first - 1 >= 0)
GetCell(domains. at(domainID).points. at(j).second + 1, domains. at(domainID).points. at(j).first - 1).state = CellState::OPEN;
}
// Открываем слева
if(domains. at(domainID).points. at(j).second - 1 >= 0)
{
// Справа прямо
GetCell(domains. at(domainID).points. at(j).second - 1, domains. at(domainID).points. at(j).first).state = CellState::OPEN;
// Справа вверху
if(domains. at(domainID).points. at(j).first + 1 < Height)
GetCell(domains. at(domainID).points. at(j).second - 1, domains. at(domainID).points. at(j).first + 1).state = CellState::OPEN;
// Справа внизу
if(domains. at(domainID).points. at(j).first - 1 >= 0)
GetCell(domains. at(domainID).points. at(j).second - 1, domains. at(domainID).points. at(j).first - 1).state = CellState::OPEN;
}
// Сверху
if(domains. at(domainID).points. at(j).first - 1 >= 0)
{
GetCell(domains. at(domainID).points. at(j).second, domains. at(domainID).points. at(j).first - 1).state = CellState::OPEN;
}
// Снизу
if(domains. at(domainID).points. at(j).first + 1 < Height)
GetCell(domains. at(domainID).points. at(j).second, domains. at(domainID).points. at(j).first + 1).state = CellState::OPEN;
}
}
// Открываем текущую
GetCell(x, y).state = CellState::OPEN;
}
// Пометить ячейку
void Model::Mark(int x, int y)
{
switch (GetCell(x, y).state)
{
case CellState::OPEN:
break;
case CellState::CLOSED:
FlagCount++;
GetCell(x, y).state = CellState::FLAG;
break;
case CellState::FLAG:
if(FlagCount > 0)
FlagCount--;
GetCell(x, y).state = CellState::CLOSED;
break;
}
}
// Все ли флаги раставленны корректно
bool Model::FlagsCorrect()
{
// Счетчик верно расставленных флагов
int correctFlags = 0;
// Цикл подсчета количества верно расставленных флагов
for(int y = 0; y < Height; y++)
for(int x = 0; x < Width; x++)
// Если в клетке есть мина и на ней поставлен флажек
if(GetCell(x, y).hasMine && GetCell(x, y).state == CellState::FLAG)
// Увеличиваем счетчик правильных флагов
correctFlags++;
// Количество правильных флагов равно количеству бомб
return correctFlags == BombCount;
}
=============================Отображение====================
#pragma once
#include "View. h"
#include "Model. h"
View::View()
{
/*model = new Model(FIELD_TYPE0, FIELD_TYPE0);
// Строим текущую модель на основе переданной в параметрах
ReSetModel(*model); */
model = NULL;
// Параметры ячейки
CellWidth = 30;
CellHeight = 30;
// Ширина отступа
BorderSize = 50;
// Ширина полосы
lineWidth = 4;
// Задаем параметры экрана:
SceneWidth = FIELD_TYPE0 * CellWidth /* ширина занимаемая клеткам */
//+ (FIELD_TYPE0 + 1) * lineWidth /* ширина отступов между клетками */
+ BorderSize * 2; /* ширина "бордюра" вокруг поля */
SceneHeight = FIELD_TYPE0 * CellHeight /* высота занимаемая клеткам */
//+ (FIELD_TYPE0 + 1) * lineWidth /* ширина отступов между клетками */
+ BorderSize * 2; /* ширина "бордюра" вокруг поля */
// Обнуляем переменные
hRC = NULL;
hDC = NULL;
hWnd = NULL;
// Окно активно по умолчанию
active = true;
}
// Деструктор
View::~View()
{
KillGLWindow();
}
// Задать параметры
void View::ReSetModel(Model *mod)
{
// Создаем новую на основе заданной
model = mod;//new Model(mod);
// Параметры ячейки
CellWidth = 30;
CellHeight = 30;
// Ширина отступа
BorderSize = 50;
// Ширина полосы
lineWidth = 4;
// Задаем параметры экрана:
SceneWidth = model->Width * CellWidth /* ширина занимаемая клеткам */
//+ (model->Width + 1) * lineWidth /* ширина отступов между клетками */
+ BorderSize * 2; /* ширина "бордюра" вокруг поля */
SceneHeight = model->Height * CellHeight /* высота занимаемая клеткам */
//+ (model->Height + 1) * lineWidth /* ширина отступов между клетками */
+ BorderSize * 2; /* ширина "бордюра" вокруг поля */
// Окно активно по умолчанию
active = true;
RECT rect;
GetWindowRect(hWnd, &rect);
int w = rect. right - rect. left;
int h = rect. bottom - rect. top;
if(w != SceneWidth || h!= SceneHeight)
{
MoveWindow(hWnd, rect. left, rect. top, SceneWidth, SceneHeight, true);
}
}
// Отсоединяем модель от класса отображения
void View::ReleaseModel()
{
if(model == NULL) return;
delete model;
model = NULL;
}
// Инициализация библиотеки
int View::InitGL( GLvoid )
{
// Построение шрифта
BuildFont();
// Разрешить плавное цветовое сглаживание
glShadeModel(GL_SMOOTH);
// Очистка экрана в черный цвет
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Разрешить очистку буфера глубины
glClearDepth( 1.0f );
// Разрешить тест глубины
glEnable( GL_DEPTH_TEST );
// Тип теста глубины
glDepthFunc( GL_LEQUAL );
// Улучшение в вычислении перспективы
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
// Инициализация прошла успешно
return true;
}
// Отрисовка сцены
int View::DrawGLScene(GLvoid)
{
glClearColor(0.0, 0.4, 0.5, 1.0);
// Очистить экран и буфер глубины
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
// Сбросить текущую матрицу
glLoadIdentity();
// Задаем параметры координат сцены
gluOrtho2D(0.0f, SceneWidth, 0.0f, SceneHeight);
// Если модель не задана - ничего не рисуем
if(model == NULL) return true;
// Цвет линии окружающей поле
glColor3f(0.0f, 0.0f, 0.0f);
//glTranslatef(0.0f, 0.0f, 1.0f);
// Начало рисования линий
glBegin(GL_LINES);
glVertex2f(BorderSize, SceneHeight - BorderSize);
glVertex2f(SceneWidth - BorderSize, SceneHeight - BorderSize);
glVertex2f(BorderSize, BorderSize);
glVertex2f(SceneWidth - BorderSize, BorderSize);
glVertex2f(BorderSize, BorderSize);
glVertex2f(BorderSize, SceneHeight - BorderSize);
glVertex2f(SceneWidth - BorderSize, BorderSize);
glVertex2f(SceneWidth - BorderSize, SceneHeight - BorderSize);
// Окончание рисования линий
glEnd();
// Рисование поля
for (int y = 0; y < model->Height; y++)
for (int x = 0; x < model->Width; x++)
{
switch (model->GetCell(x, y).state)
{
case CellState::CLOSED:
drawClosedField(x, y);
break;
// Если ячейка открыта
case CellState::OPEN:
// И ячейка не имеет мины
if (!model->GetCell(x, y).hasMine)
{
// Подсчитываем количество мин сеседствующих с текущей клеткой
int minesAround = 0;
for (int yy = y - 1; yy <= y + 1; ++yy)
for (int xx = x - 1; xx <= x + 1; ++xx)
{
if ((xx == x && yy == y) ||
xx < 0 || xx >= model->Width ||
yy < 0 || yy >= model->Height)
continue;
if (model->GetCell(xx, yy).hasMine)
++minesAround;
}
// Рисуем открытую яч и подпись количества соседних мин
drawOpenedField(x, y, minesAround);
}
// Рисуем мину
else
drawMine(x, y);
break;
case CellState::FLAG:
// Рисуем флаг
drawFlag(x, y);
break;
}
}
// Выводим информацию о игре
glColor3f(1.0f, 1.0f, 1.0f);
glRasterPos2f(BorderSize, BorderSize / 2.0f);
// Время
glPrint("Time:%d", model->timer);
// Количество не помеченных бомб
glRasterPos2f(SceneWidth - BorderSize * 2.0f, BorderSize / 2.0f);
glPrint("Bomb left:%d", model->BombCount - model->FlagCount);
// Прорисовка прошла успешно
return true;
}
// Перерисовка при изменении размеров окна
GLvoid View::ReSizeGLScene( GLsizei width, GLsizei height )
{
// Предотвращение деления на ноль
if(height == 0)
height = 1;
// Сброс текущей области вывода
glViewport(0, 0, width, height);
// Выбор матрицы вида модели
glMatrixMode( GL_MODELVIEW );
// Сброс матрицы вида модели
glLoadIdentity();
}
// Рисуем закрытое поле
void View::drawClosedField(int x, int y)
{
// Установить текущий цвет (R, G,B)
glColor3f(0.8f, 0.8f, 0.8f);
glBegin(GL_QUADS);
glVertex2f(BorderSize + x * CellWidth, SceneHeight - (BorderSize + y * CellHeight));
glVertex2f(BorderSize + (x + 1) * CellWidth, SceneHeight - (BorderSize + y * CellHeight));
glVertex2f(BorderSize + (x + 1) * CellWidth, SceneHeight - (BorderSize + (y + 1) * CellHeight));
glVertex2f(BorderSize + x * CellWidth, SceneHeight - (BorderSize + (y + 1) * CellHeight));
glEnd();
// Установить текущий цвет (R, G,B)
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_LINES);
glVertex2f(BorderSize + x * CellWidth, SceneHeight - (BorderSize + y * CellHeight));
glVertex2f(BorderSize + (x + 1) * CellWidth - 1, SceneHeight - (BorderSize + y * CellHeight));
glVertex2f(BorderSize + x * CellWidth, SceneHeight - (BorderSize + y * CellHeight));
glVertex2f(BorderSize + x * CellWidth, SceneHeight - (BorderSize + (y + 1) * CellHeight - 1));
glEnd();
// Установить текущий цвет (R, G,B)
glColor3f(0.2f, 0.2f, 0.2f);
glBegin(GL_LINES);
glVertex2f(BorderSize + (x + 1) * CellWidth - 1, SceneHeight - (BorderSize + y * CellHeight));
glVertex2f(BorderSize + (x + 1) * CellWidth - 1, SceneHeight - (BorderSize + (y + 1) * CellHeight - 1));
glVertex2f(BorderSize + x * CellWidth, SceneHeight - (BorderSize + (y + 1) * CellHeight - 1));
glVertex2f(BorderSize + (x + 1) * CellWidth - 1, SceneHeight - (BorderSize + (y + 1) * CellHeight - 1));
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |
Основные порталы (построено редакторами)

