- •Министерство образования Республики Беларусь уо «Полоцкий государственный университет»
- •Курсовая работа
- •1 Анализ задания и постановка задачи
- •2 Теоретическая часть
- •2.1 Основные сведения о WinApi
- •2.2 Теоретические основы игры
- •3 Проектирование программы
- •4 Реализация программы
- •4.1 Реализация логической структуры, используемой в игре
- •4.2 Реализация графической части приложения
4 Реализация программы
4.1 Реализация логической структуры, используемой в игре
Для объявления глобальных переменных и структуры был создан файл global.h. Содержимое этого файла:
typedef struct{
int all;
int win;
int winCurr;
int lossCurr;
int winMax;
int lossMax;
int BestTime[10];
}stat;
структура, используемая для хранения статистики; поля данной структуры:
all – количество сыгранных игр;
win – количество побед;
winCurr – текущее количество выигранных подряд игр;
lossCurr – текущее количество проигранных подряд игр;
winMax – максимальное количество выигранных подряд игр;
lossMax – максимальное количество проигранных подряд игр;
BestTime – массив с лучшими результатами;
typedef struct{
Element *Head;
} LIST;
LIST *list;
Структура для двухсвязного списка, используемого для хранения состояний игрового поля после каждого, сделанного игроком хода.
typedef struct _Element{
struct _Element *Next,*Prev;
BYTE** Array1;
BYTE **Array2;
HWND **Array3;
BYTE fieldHeight;
BYTE fieldWidth;
BYTE bombCount;
BYTE countNotBomb; BYTE bombCountForFlag;
} Element;
Структура, используемая для хранения состояния игрового поля и количества непомеченных «мин».
Глобальные переменные:
HWND hWnd – дескриптор основного окна;
BYTE field[MAX_HEIGHT][MAX_WIDTH] – матрица, содержащая информацию о клетках-ячейках игрового поля (числа от 0 до 9);
BYTE fieldMark[MAX_HEIGHT][MAX_WIDTH] – матрица, содержащая информацию о состоянии ячеек игрового поля, т.е. числа 0, 1, 2 или 3 (не открыто, открыто, помечено флагом, помечено вопросом);
HWND butt[MAX_HEIGHT][MAX_WIDTH] – матрица дескрипторов кнопок, являющихся ячейками игрового поля;
HWND hGrBox – дескриптор объекта GroupBox;
bool flagEOG – флаг окончания игры;
BYTE fieldHeight, fieldWidth – высота и ширина игрового поля соответственно;
BYTE bombCount – количество «мин»;
BYTE countNotBomb – количество ячеек, свободных от «мин»
BYTE timeCount – количество секунд;
BYTE bombCountForFlag – количество «мин» не помеченных флагом;
stat easy, medium, hard – структуры, хранящие статистическую информацию для каждого из уровней сложности;
static int TimerFlag=0; - флаг таймера;
Прототипы функций:
LRESULT CALLBACK WndProcButt(HWND, UINT, WPARAM, LPARAM) – оконная процедура для кнопки;
LRESULT CALLBACK WndProcGB(HWND, UINT, WPARAM, LPARAM) – оконная процедура для GroupBox;
В файле functions.h находятся основной функционал программы.
Далее будут описаны прототипы функций, реализующие логическую часть игры:
void create_field() – создание игрового поля (предварительное матрицы field и fieldMark обнуляются, и производится расстановка «мин»);
void setField() – расстановка чисел идентификаторов количества «мин»; функция будет использована только после того как будут расстановлены «мины»;
bool fieldIsClose() – проверка на «открытость» поля. Данная функция используется при сохранении игры, т.е. она проверяет, была ли открыта хотя бы одна ячейка;
void SaveGame() – сохранение игры в файл «save.sap». Сохранение всех свойств и состояний игрового поля и запись их в файл;
void LoadGame() – загрузка игры из файла «save.sap»;
void NullStat() – обнуление статистики. Вызывается в том случае, обнуление статистики производится непосредственно самим пользователем или в том случае, когда файл со статистикой повреждён или отсутствует;
void SaveStat() – сохранение статистики в файл «stat.sap»;
void LoadStat() – загрузка статистики из файла «stat.sap»;
void StatWin() – запись в статистику при выигрыше;
void StatLoss() запись в статистику при проигрыше;
LIST * AddList(LIST *list,BYTE **,BYTE **,HWND **,BYTE,BYTE,BYTE,BYTE,BYTE)- функция добавления состояния поля, размеров поля и количества непомеченных «мин» в ячейку двухсвязного списка;
LIST * DelList(LIST *list)- функция удаления ранее записанного состояния игрового поля, в случае если превышен размер списка, счетчик больше 3;
LIST *Repak(LIST *list,BYTE ***Array1,BYTE ***Array2,HWND ***Array3,BYTE *fieldHeight,BYTE *fieldWidth,BYTE *bombCount,BYTE *countNotBomb,BYTE *bombCountForFlag)- функция извлекает последний, записанный в список ход, срабатывает после нажатия клавиши Backspace;