Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Исправить!
- // 1) Если последняя свободная ячейка с предупреждением, то не проигрывается мелодия победы
- // 2)
- // 3) Нужен алгоритм предсказания неопределённой ситуации. Это когда нельзя просчитать по открытым уже клеткам,
- // где может быть бомба.
- // 4)
- // 5) Смазывает клик ЛКМ в режиме игры.
- // УЖЕ ИСПРАВЛЕНО!
- //
- // 1) +++++++++Показывать кол-во оставшихся свободных клеток сразу после клика, а не после движения.
- // 2) Нужен модуль подсчёта времени и определения-сохранения рекордов.
- // 3) Предусмотреть запись 100-го рекорда на место записи с максимальным временем.
- // 4) Зависает после выигрыша.
- #include "C:\\dllBridge\\WinLego\\Lego\\Lego.h"
- using namespace Lego;
- #include <stdio.h>
- #include "resource\\MineS.h"
- int mode = 0,
- bomb = 0, // Arranged bombs
- WinW = 0, //
- x, y,
- On_the_field, // Не используется !!!
- xF = 0,
- yF = 0;
- char sz[122];
- Button btn[7]; //int (*xTrans)[100];
- void ShowAfterLoad();
- int Game_Process();
- int ShowPic(); // Показать мины (отладка)
- int ShowDig();
- int posF(int);
- int ShowPic_2();
- int Show_Danger();
- ///////////////////////////////////////////// Эта функция инициализации. Создана специально для Вас ! Она вызывается
- void INIT() // (с помощью таймера №1) 1 единственный раз, когда Timer_CLK == 1.
- {
- if(WIN == 2) { WIN = 0;
- btn[1].Create("Show numbers", 500, 20, 90, 22);
- btn[2].Create("Show pictures", 500, 60, 90, 22); }
- btn[3].Create("Restart" , 500, 100, 90, 22);
- btn[5].Create("Load" , 500, 140, 90, 22);
- btn[3].SetFont(3);
- btn[5].SetFont(3);
- btn[5].Hide(); // Порт берём
- sap_Load_HST();
- }
- // void out_of_mode_11();
- // void switching_to_mode_11();
- // int mode_11();
- ///////////////////////////////////////////// Эта функция вызывается (с помощью таймера №2) 5 раз в секунду, когда
- void START() // Timer_CLK >= 2.
- {
- On_the_field = posF(0);
- if(btn[1].Press()) ShowDig();
- if(btn[2].Press()) ShowPic();
- if(btn[3].Press())
- {
- soundPlay("resource\\Sound\\reset.mp3");
- Timer_CLK = 1;
- mode = 0;
- WIN = 0;
- WinW = 0;
- Print_2(460, 244, " ");
- Print_2(460, 264, " ");
- Print_2(460, 284, " ");
- Print_2(460, 304, " ");
- Print_2(460, 324, " ");
- Print_2(460, 344, " ");
- Print_2(460, 364, " ");
- Print_2(460, 384, " ");
- Print_2(460, 404, " ");
- Print_2(460, 424, " ");
- Print_2(200, 453, " "); //This result has already been // "Repeating the result!"
- sap_CounterReset();
- }
- if(btn[5].Press()) // "Load"
- { btn[5].Hide ();
- InvalidateRect(hWnd, 0, 1);
- //sap_Load(); // + + + + + + +
- sap_Load_lite();
- Timer_CLK = 661;
- mode = 1;
- WIN = 0;
- WinW = 0;
- /* Print_2(460, 244, " ");
- Print_2(460, 264, " ");
- Print_2(460, 284, " ");
- Print_2(460, 304, " ");
- Print_2(460, 324, " ");
- Print_2(460, 344, " ");
- Print_2(460, 364, " ");
- Print_2(460, 384, " ");
- Print_2(460, 404, " ");
- Print_2(460, 424, " "); */
- ShowAfterLoad();
- }
- Game_Process();
- }
- //++++++++++++++++++++++++++++++++++++++
- int mode_0();
- int mode_1();
- int mode_2();
- int mode_3();
- //void switching_to_mode_4(); // Инициализация перед mode_4
- //int mode_4();
- //void out_of_mode_4(); // Деинициализация после mode_4
- // Обработка игровых событий.
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- int Game_Process() //++
- {
- switch(mode) // Разделение на режимы работы (mode).
- {
- // mode = 0 Это режим ожидания перед началом игры
- // Ждём нажатия левой кнопки или появления "Пчёлки", чтобы запустить игровой процесс.
- case 0: mode_0();
- break;
- // mode = 1 Это режим открытия очередной клетки на игровом поле.
- case 1: mode_1();
- break;
- // Победа!
- // mode = 2 Это режим постепенного показа содержимого игрового поля после победы
- case 2: mode_2();
- break;
- // Проигрыш
- case 3: mode_3();
- break;
- }
- return 0;
- }
- // mode = 0 Это режим ожидания перед началом игры
- // Ждём нажатия левой кнопки или появления "Пчёлки", чтобы запустить игровой процесс.
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- int mode_0() //++
- {
- if(Timer_CLK == 2)
- {
- PictureShow_2(11, 11, "resource\\Pictures\\1_02.png"); // Клетчатый-начальный фон игрового поля
- bomb = sap_SetSize(11, 11);
- sprintf(sz, "Arranged bombs: %d ", bomb);
- Print_2(17, 453, sz);
- }
- if(Timer_CLK == 27)
- { x = rand()%nSizeX + 1; // Выбираем место (случайно), для установки "Пчёлки"
- y = rand()%nSizeY + 1;
- if(anField[x][y] == 110) // Если рядом нет бомб, то подходит для "Пчёлки"
- {
- x = 39 * x - 27;
- y = 39 * y - 27;
- PictureShow_2(x, y, "resource\\Pictures\\5_00.png"); // Пчёлка = свободная клетка
- mode = 1; sap_CounterInit(Timer_CLK); return 0;
- }
- else Timer_CLK = 26;
- }
- if(LMouseBtn) { mode = 1; sap_CounterInit(Timer_CLK); }
- return 0;
- }
- // mode = 1 Это режим открытия очередной клетки на игровом поле.
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- int mode_1() //++
- {
- sap_CurTime(Timer_CLK);
- if(RMouseBtn) { RMouseBtn = 0; posF(1); sap_RightClick(xF, yF); Show_Danger(); }
- if(LMouseBtn) { LMouseBtn = 0; posF(1); sap_LeftClick (xF, yF);
- sprintf(sz, "freeCell = %d ", freeCell); Print_1(200, 453, sz); }
- if(WIN == 1)
- {
- if(Timer_CLK % 2) soundPlay("resource\\Sound\\Won.mp3"); // Звуки победы :)
- else soundPlay("resource\\Sound\\IRONMAN_01.mp3");
- mode = 2;
- sap_CounterWIN();
- }
- if(WIN == 4) // Проигрыш !
- {
- x = 39 * xF - 27;
- y = 39 * yF - 27;
- if(anField[xF][yF] == 10) PictureShow_2(x, y, "resource\\Pictures\\5_04.png"); // Пламя взрыва
- soundPlay("resource\\Sound\\podriv.mp3");
- mode = 3;
- Lego::PrintSet_2.nTextClr = 2;
- Print_2(460, 424, " Out of the rating. "); nThe_rating_is_relevant = 0;
- Lego::PrintSet_2.nTextClr = 14;
- btn[5].Show();
- }
- else ShowPic_2();
- }
- // Победа!
- // mode = 2 Это режим постепенного показа содержимого игрового поля после победы
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- int mode_2() //++
- {
- if(++WinW > 3)
- for(int z = 1; z <= nSizeY; z++)
- for(int i = 1; i <= nSizeX; i++)
- {
- if(anField[i][z] == 109) { // Под флажком мина?
- anField[i][z] = 31;
- x = 39 * i - 27;
- y = 39 * z - 27;
- PictureShow_2(x, y, "resource\\Pictures\\5_10.png"); // Рисунок обезвреженой-перечёркнутой мины
- WinW = 0;
- return 0;
- }
- if(anField[i][z] == 119) { // Мина не помеченная восклицательным знаком?
- anField[i][z] = 29;
- x = 39 * i - 27;
- y = 39 * z - 27;
- PictureShow_2(x, y, "resource\\Pictures\\5_08.png"); // Рисунок мины
- WinW = 0;
- return 0;
- }
- }
- if(WinW > 3) // После открытия всех клеток показать рисунок победы
- {
- mode = 7; // ?
- PictureShow_1(48, 86, "resource\\Pictures\\1_10.png"); // Микки Маус победил
- }
- }
- // Проигрыш
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- int mode_3() //++
- {
- if(++WinW > 21)
- {
- mode = 7; // ?
- PictureShow_1(49, 86, "resource\\Pictures\\1_09.png"); // Котик проиграл ;)
- }
- }
- // Показать предупреждение !
- // Отображение восклицательного знака (флажка на месте предполагаемой бомбы)
- // Или стереть "флажок". Место без флажка не должно быть чёрным...
- ////////////////////////////////////////////////
- int Show_Danger() //
- {
- int x = 39 * xF - 27;
- int y = 39 * yF - 27;
- if(anField[xF][yF] < 110)
- if(anField[xF][yF] > 99)
- {
- PictureShow_2(x, y, "resource\\Pictures\\5_02.png"); // Восклицательный знак
- soundPlay("resource\\Sound\\obezvred.mp3");
- }
- if(anField[xF][yF] < 120)
- if(anField[xF][yF] > 109)
- {
- PictureShow_2(x, y, "resource\\Pictures\\5_03.png"); // Стереть воскл. знак чёрным квадратиком
- }
- }
- // Сканирует все клетки и показывает те, что должны быть отображены на игровом поле 1-й раз
- ///////////////////////////////////////////////
- int ShowPic_2() //
- {
- int x, y;
- for(int z = 1; z <= nSizeY; z++)
- for(int i = 1; i <= nSizeX; i++)
- {
- if(anField[i][z] < 20) {
- x = 39 * i - 27;
- y = 39 * z - 27;
- if(anField[i][z] < 9)
- { PictureShow_2(x, y, "resource\\Pictures\\5_01.png");// Чёрн. квадр.
- if(anField[i][z]) Print_2(x+14, y+11, anField[i][z]);
- if(anField[i][z]> 3) soundPlay("resource\\Sound\\alert.mp3");
- }
- if(anField[i][z] == 9) PictureShow_2(x, y, "resource\\Pictures\\5_08.png"); //Рисунок мины
- if(anField[i][z] == 10) PictureShow_2(x, y, "resource\\Pictures\\5_04.png");// Пламя взрыва
- anField[i][z] += 20;
- }
- }
- }
- // Показывает ранее открытые клетки после загрузки сохранения игры
- ///////////////////////////////////////////////
- void ShowAfterLoad() //
- {
- freeCell = nSizeX * nSizeY;
- int M;
- for(int z = 1; z <= nSizeY; z++)
- for(int i = 1; i <= nSizeX; i++)
- {
- x = 39 * i - 27;
- y = 39 * z - 27;
- M = 1;
- if(anField[i][z] == 119) freeCell --;
- if(anField[i][z] == 109) { M = 0; PictureShow_2(x, y, "resource\\Pictures\\5_02.png"); }//Восклицательный знак
- if(anField[i][z] > 19 && anField[i][z] < 29 )
- {
- PictureShow_2(x, y, "resource\\Pictures\\5_01.png"); // Чёрный квадрат
- if(anField[i][z] - 20) Print_2(x+14, y+11, anField[i][z]-20);
- M = 0;
- }
- if(M) PictureShow_2(x, y, "resource\\Pictures\\5_03.png"); // Закрашивает нераскрытое поле (синий)
- else freeCell --;
- }
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- // (Oтладка) Показывает рисунки мины на всём поле.
- ///////////////////////////////////////////////
- int ShowPic() //
- {
- static int Flag = 0;
- if(Flag)
- {
- Flag = 0;
- InvalidateRect(hWnd, 0, 1);
- return 0;
- }
- for(int z = 1; z <= nSizeY; z++)
- for(int i = 1; i <= nSizeX; i++)
- {
- x = 39 * i - 27;
- y = 39 * z - 27;
- if(anField[i][z] == 119) { PictureShow_1( x, y, "resource\\Pictures\\5_08.png"); } // Рисунок мины
- }
- Flag = 1;
- }
- // (Отладка) Показывает цифры под каждой клеткой поля.
- ///////////////////////////////////////////////
- int ShowDig() //
- {
- static int Flag = 0;
- if(Flag)
- {
- Flag = 0;
- InvalidateRect(hWnd, 0, 1);
- return 0;
- }
- for(int z = 1; z <= nSizeY; z++)
- for(int i = 1; i <= nSizeX; i++)
- {
- x = 39 * i - 20;
- y = 39 * z - 20;
- Print_1(x, y, anField[i][z]);
- }
- Flag = 1;
- }
- // Определяет на какой клетке (игрового поля) находится курсор
- // Возвращает 0, если за пределами поля.
- // Возвращает 1, если над полем игровым.
- ///////////////////////////////////////////////// nP = 0 независимо от нажатия кнопок мыши
- int posF(int nP) // nP = 1 После нажатия на ЛКМ
- {
- int i, x, y;
- if(nP) x = (xMFix - 10)/39;
- else x = (xMove - 10)/39;
- x++;
- if(x <= 11)
- if(x != xF) { xF = x; return 1;}
- if(nP) y = (yMove - 10)/39;
- else y = (yMFix - 10)/39;
- y++;
- if(y <= 11)
- if(y != yF) { yF = y; return 1; }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement