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

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

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

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

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

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

Техника

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

Общество

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

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

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

Мир

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

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

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