Advertisement
dllbridge

Untitled

Dec 30th, 2021
872
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.44 KB | None | 0 0
  1.  
  2.  
  3. //     Исправить!
  4. //  1) Если последняя свободная ячейка с предупреждением, то не проигрывается мелодия победы
  5. //  2)
  6. //  3) Нужен алгоритм предсказания неопределённой ситуации. Это когда нельзя просчитать по открытым уже клеткам,
  7. //     где может быть бомба.
  8. //  4)
  9. //  5) Смазывает клик ЛКМ в режиме игры.
  10.  
  11.  
  12.  
  13. //     УЖЕ ИСПРАВЛЕНО!
  14. //
  15. //  1) +++++++++Показывать кол-во оставшихся свободных клеток сразу после клика, а не после движения.
  16. //  2) Нужен модуль подсчёта времени и определения-сохранения рекордов.
  17. //  3) Предусмотреть запись 100-го рекорда на место записи с максимальным временем.
  18. //  4) Зависает после выигрыша.
  19.  
  20.  
  21. #include    "C:\\dllBridge\\WinLego\\Lego\\Lego.h"
  22. using namespace Lego;
  23.  
  24. #include    <stdio.h>
  25.  
  26.  
  27. #include  "resource\\MineS.h"
  28.  
  29.  
  30.  
  31. int         mode = 0,
  32.             bomb = 0,  //  Arranged bombs
  33.             WinW = 0,  //  
  34.                 x, y,
  35.         On_the_field,  //  Не используется !!!
  36.             xF   = 0,
  37.             yF   = 0;
  38.          
  39. char         sz[122];    
  40.  
  41. Button        btn[7];         //int   (*xTrans)[100];
  42.  
  43. void ShowAfterLoad();  
  44. int   Game_Process();
  45. int        ShowPic();   //  Показать мины  (отладка)
  46. int        ShowDig();
  47. int        posF(int);
  48. int      ShowPic_2();
  49. int    Show_Danger();
  50.  
  51.  
  52. /////////////////////////////////////////////   Эта функция инициализации. Создана специально для Вас ! Она вызывается
  53. void INIT()                                //          (с помощью таймера №1) 1 единственный раз, когда Timer_CLK == 1.
  54. {
  55.      if(WIN == 2) { WIN = 0;
  56.      btn[1].Create("Show  numbers", 500,  20, 90, 22);
  57.      btn[2].Create("Show pictures", 500,  60, 90, 22);  }
  58.      btn[3].Create("Restart"      , 500, 100, 90, 22);       
  59.      btn[5].Create("Load"         , 500, 140, 90, 22);    
  60.      btn[3].SetFont(3);
  61.      btn[5].SetFont(3);  
  62.      btn[5].Hide();                                           //  Порт берём
  63.      
  64.      sap_Load_HST();
  65. }
  66.  
  67.  
  68. //   void       out_of_mode_11();
  69. //   void switching_to_mode_11();
  70. //   int               mode_11();  
  71.  
  72. /////////////////////////////////////////////     Эта функция вызывается (с помощью таймера №2) 5 раз в секунду, когда
  73. void START()                               //                                                           Timer_CLK >= 2.
  74. {    
  75.    
  76.      On_the_field = posF(0);
  77.      
  78.      if(btn[1].Press())  ShowDig();
  79.      if(btn[2].Press())  ShowPic();    
  80.      if(btn[3].Press())
  81.      {
  82.         soundPlay("resource\\Sound\\reset.mp3");   
  83.         Timer_CLK = 1;     
  84.         mode      = 0;
  85.         WIN       = 0; 
  86.         WinW      = 0;  
  87.         Print_2(460, 244, "                        ");         
  88.         Print_2(460, 264, "                        ");  
  89.         Print_2(460, 284, "                        ");
  90.         Print_2(460, 304, "                        ");  
  91.         Print_2(460, 324, "                        ");
  92.         Print_2(460, 344, "                        ");  
  93.         Print_2(460, 364, "                        ");  
  94.         Print_2(460, 384, "                        ");  
  95.         Print_2(460, 404, "                        ");  
  96.         Print_2(460, 424, "                        ");
  97.         Print_2(200, 453, "                                              ");     //This result has already been                                 //  "Repeating the result!"
  98.         sap_CounterReset();                    
  99.      }
  100.      
  101.                                                                      
  102.      if(btn[5].Press())                                //   "Load"
  103.      {  btn[5].Hide ();
  104.         InvalidateRect(hWnd, 0, 1);    
  105.         //sap_Load();                                                                                 //  + + + + + + +
  106.         sap_Load_lite();
  107.        
  108.         Timer_CLK = 661;       
  109.         mode      = 1;
  110.         WIN       = 0; 
  111.         WinW      = 0;
  112.        
  113.     /*  Print_2(460, 244, "                        ");         
  114.         Print_2(460, 264, "                        ");  
  115.         Print_2(460, 284, "                        ");
  116.         Print_2(460, 304, "                        ");  
  117.         Print_2(460, 324, "                        ");
  118.         Print_2(460, 344, "                        ");  
  119.         Print_2(460, 364, "                        ");  
  120.         Print_2(460, 384, "                        ");  
  121.         Print_2(460, 404, "                        ");  
  122.         Print_2(460, 424, "                        ");      */
  123.         ShowAfterLoad();   
  124.      }
  125.  
  126.      Game_Process();
  127. }
  128.  
  129. //++++++++++++++++++++++++++++++++++++++
  130. int                mode_0();
  131. int                mode_1();
  132. int                mode_2();
  133. int                mode_3();
  134. //void  switching_to_mode_4();    //   Инициализация перед mode_4
  135. //int                mode_4();
  136. //void        out_of_mode_4();    // Деинициализация после mode_4
  137.  
  138.  
  139.  
  140. //  Обработка игровых событий.
  141. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  142. int Game_Process()                                              //++    
  143. {
  144.    
  145.     switch(mode)                                             // Разделение на режимы работы (mode).
  146.     {      
  147.               // mode = 0  Это режим ожидания перед началом игры
  148.               // Ждём нажатия левой кнопки или появления "Пчёлки", чтобы запустить игровой процесс.  
  149.         case  0: mode_0();  
  150.                  break;
  151.  
  152.               // mode = 1  Это режим открытия очередной клетки на игровом поле.  
  153.         case  1: mode_1();
  154.                  break;        
  155.  
  156.               // Победа!
  157.               // mode = 2  Это режим постепенного показа содержимого игрового поля после победы
  158.         case  2: mode_2();  
  159.                  break;    
  160.        
  161.               // Проигрыш
  162.         case  3: mode_3();     
  163.                  break;    
  164.     }
  165.    
  166. return 0;  
  167. }
  168.  
  169.  
  170. // mode = 0  Это режим ожидания перед началом игры
  171. // Ждём нажатия левой кнопки или появления "Пчёлки", чтобы запустить игровой процесс.
  172. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  173. int mode_0()                                                    //++
  174. {
  175.    
  176.     if(Timer_CLK ==  2)
  177.     {
  178.                        
  179.        PictureShow_2(11, 11, "resource\\Pictures\\1_02.png");                // Клетчатый-начальный фон игрового поля
  180.        bomb = sap_SetSize(11, 11);
  181.        sprintf(sz, "Arranged bombs: %d ", bomb);
  182.        Print_2(17, 453, sz);           
  183.     }
  184.     if(Timer_CLK == 27)        
  185.     {  x = rand()%nSizeX + 1;                                    //  Выбираем место (случайно), для установки "Пчёлки"
  186.        y = rand()%nSizeY + 1;
  187.                    
  188.        if(anField[x][y] == 110)                                      //  Если рядом нет бомб, то подходит для "Пчёлки"
  189.        {  
  190.           x = 39 * x - 27;
  191.           y = 39 * y - 27;
  192.                            
  193.           PictureShow_2(x, y, "resource\\Pictures\\5_00.png");                          //  Пчёлка = свободная клетка
  194.           mode = 1; sap_CounterInit(Timer_CLK);                return 0;
  195.        }  
  196.        else  Timer_CLK = 26;
  197.     }
  198.     if(LMouseBtn) { mode = 1; sap_CounterInit(Timer_CLK); }
  199.                
  200. return 0;  
  201. }
  202.  
  203.  
  204. // mode = 1  Это режим открытия очередной клетки на игровом поле.
  205. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  206. int mode_1()                                                    //++
  207. {
  208.    
  209.     sap_CurTime(Timer_CLK);
  210.                  
  211.     if(RMouseBtn) { RMouseBtn = 0; posF(1); sap_RightClick(xF, yF);  Show_Danger(); }
  212.     if(LMouseBtn) { LMouseBtn = 0; posF(1); sap_LeftClick (xF, yF);
  213.                     sprintf(sz, "freeCell = %d ", freeCell); Print_1(200, 453, sz); }      
  214.     if(WIN == 1)
  215.     {
  216.        if(Timer_CLK % 2) soundPlay("resource\\Sound\\Won.mp3");                                   //  Звуки победы :)
  217.        else              soundPlay("resource\\Sound\\IRONMAN_01.mp3"); 
  218.        mode = 2;
  219.        sap_CounterWIN();
  220.     }  
  221.  
  222.     if(WIN == 4)                                                                                        //  Проигрыш !
  223.     {
  224.    
  225.        x = 39 * xF - 27;
  226.        y = 39 * yF - 27;
  227.                                          
  228.        if(anField[xF][yF] == 10) PictureShow_2(x, y, "resource\\Pictures\\5_04.png");                 // Пламя взрыва   
  229.                        
  230.        soundPlay("resource\\Sound\\podriv.mp3");   
  231.        mode = 3;
  232.        Lego::PrintSet_2.nTextClr =  2;
  233.        Print_2(460, 424, " Out of the rating.   ");      nThe_rating_is_relevant = 0;
  234.        Lego::PrintSet_2.nTextClr = 14;                                     
  235.        btn[5].Show();                      
  236.      }               
  237.      else ShowPic_2();     
  238.    
  239. }
  240.  
  241.  
  242.  
  243. // Победа!
  244. // mode = 2  Это режим постепенного показа содержимого игрового поля после победы
  245. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  246. int mode_2()                                                    //++
  247. {
  248.    
  249.     if(++WinW > 3)
  250.                  for(int z = 1; z <= nSizeY; z++)                          
  251.                  for(int i = 1; i <= nSizeX; i++)
  252.                  {
  253.                     if(anField[i][z]  == 109) {   // Под флажком мина?
  254.                        anField[i][z]   =  31;    
  255.                
  256.                        x = 39 * i - 27;
  257.                        y = 39 * z - 27;
  258.                
  259.                        PictureShow_2(x, y, "resource\\Pictures\\5_10.png");  // Рисунок обезвреженой-перечёркнутой мины
  260.                        
  261.                        WinW = 0;
  262.                        return 0;
  263.                     }
  264.                    
  265.                     if(anField[i][z]  == 119) {  //  Мина не помеченная восклицательным знаком?
  266.                        anField[i][z]   =  29;    
  267.                
  268.                        x = 39 * i - 27;
  269.                        y = 39 * z - 27;
  270.                
  271.                        PictureShow_2(x, y, "resource\\Pictures\\5_08.png");                            // Рисунок мины  
  272.                        
  273.                        WinW = 0;
  274.                        return 0;
  275.                     }  
  276.                  } 
  277.                  
  278.                  if(WinW > 3) // После открытия всех клеток показать рисунок победы
  279.                  {
  280.                     mode = 7;   // ?
  281.                     PictureShow_1(48, 86, "resource\\Pictures\\1_10.png");                      //  Микки Маус победил
  282.                  }     
  283. }
  284.  
  285.  
  286. //  Проигрыш
  287. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  288. int mode_3()                                                    //++
  289. {
  290.    
  291.     if(++WinW > 21)
  292.     {
  293.          mode = 7;   // ?
  294.                    
  295.          PictureShow_1(49, 86, "resource\\Pictures\\1_09.png");                       //  Котик проиграл ;)
  296.     }      
  297. }
  298.  
  299.  
  300.  
  301. //  Показать предупреждение !
  302. //  Отображение восклицательного знака (флажка на месте предполагаемой бомбы)
  303. //  Или стереть "флажок". Место без флажка не должно быть чёрным...
  304. ////////////////////////////////////////////////
  305. int Show_Danger()                             //
  306. {              
  307.    
  308.     int x = 39 * xF - 27;
  309.     int y = 39 * yF - 27;
  310.  
  311.    
  312.     if(anField[xF][yF] < 110)
  313.     if(anField[xF][yF] >  99)  
  314.     {
  315.        
  316.        PictureShow_2(x, y, "resource\\Pictures\\5_02.png");               //            Восклицательный знак
  317.        soundPlay("resource\\Sound\\obezvred.mp3");
  318.     }
  319.    
  320.     if(anField[xF][yF] < 120)
  321.     if(anField[xF][yF] > 109)  
  322.     {  
  323.        PictureShow_2(x, y, "resource\\Pictures\\5_03.png");               //  Стереть воскл. знак чёрным квадратиком
  324.     }
  325. }
  326.  
  327.  
  328.  
  329.  
  330.  
  331. //  Сканирует все клетки и показывает те, что должны быть отображены на игровом поле 1-й раз
  332. ///////////////////////////////////////////////
  333. int ShowPic_2()                              //
  334. {  
  335.    
  336.     int x, y;
  337.  
  338.     for(int z = 1; z <= nSizeY; z++)                           
  339.     for(int i = 1; i <= nSizeX; i++)
  340.     {
  341.         if(anField[i][z]  < 20) {                                                                    
  342.                              
  343.             x = 39 * i - 27;
  344.             y = 39 * z - 27;
  345.                              
  346.             if(anField[i][z] <   9)
  347.             {                       PictureShow_2(x, y, "resource\\Pictures\\5_01.png");//  Чёрн. квадр.
  348.                 if(anField[i][z])    Print_2(x+14, y+11, anField[i][z]);
  349.                 if(anField[i][z]> 3) soundPlay("resource\\Sound\\alert.mp3");
  350.             }
  351.             if(anField[i][z] ==  9) PictureShow_2(x, y, "resource\\Pictures\\5_08.png"); //Рисунок мины  
  352.             if(anField[i][z] == 10) PictureShow_2(x, y, "resource\\Pictures\\5_04.png");// Пламя взрыва                         
  353.             anField[i][z] += 20;
  354.         }
  355.     }                                      
  356. }
  357.  
  358. // Показывает ранее открытые клетки после загрузки сохранения игры
  359. ///////////////////////////////////////////////
  360. void ShowAfterLoad()                         //  
  361. {
  362.      
  363.      freeCell = nSizeX * nSizeY;
  364.      
  365.      int M;
  366.      
  367.      for(int z = 1; z <= nSizeY; z++)                          
  368.      for(int i = 1; i <= nSizeX; i++)
  369.      {
  370.          x = 39 * i - 27;
  371.          y = 39 * z - 27;
  372.          M =  1;
  373.                                
  374.          if(anField[i][z] == 119)   freeCell --;                       
  375.          if(anField[i][z] == 109) { M = 0; PictureShow_2(x, y, "resource\\Pictures\\5_02.png"); }//Восклицательный знак
  376.          if(anField[i][z]  >  19 && anField[i][z]  < 29 )
  377.          {                                                                   
  378.             PictureShow_2(x, y, "resource\\Pictures\\5_01.png");                                     //  Чёрный квадрат
  379.             if(anField[i][z] -   20) Print_2(x+14, y+11, anField[i][z]-20);
  380.             M = 0;
  381.          }
  382.                        
  383.          if(M) PictureShow_2(x, y, "resource\\Pictures\\5_03.png");           //  Закрашивает нераскрытое поле (синий)
  384.          else  freeCell --;
  385.       }
  386. }
  387.  
  388. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  389.  
  390. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  391.  
  392. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  393.  
  394.  
  395. //  (Oтладка) Показывает рисунки мины на всём поле.  
  396. ///////////////////////////////////////////////    
  397. int ShowPic()                                //
  398. {  
  399.    
  400.     static int Flag = 0;
  401.  
  402.     if(Flag)
  403.     {
  404.        Flag = 0;
  405.        
  406.        InvalidateRect(hWnd, 0, 1);
  407.        
  408.        return 0;   
  409.     }
  410.  
  411.    
  412.     for(int z = 1; z <= nSizeY; z++)   
  413.     for(int i = 1; i <= nSizeX; i++)
  414.     {      
  415.        
  416.         x = 39 * i - 27;
  417.         y = 39 * z - 27;
  418.          
  419.         if(anField[i][z] == 119) {  PictureShow_1( x,  y, "resource\\Pictures\\5_08.png"); }           // Рисунок мины      
  420.     }  
  421.    
  422.     Flag = 1;
  423. }
  424.  
  425.  
  426.  
  427. //  (Отладка) Показывает цифры под каждой клеткой поля.
  428. ///////////////////////////////////////////////
  429. int ShowDig()                                //
  430. {
  431.    
  432.     static int Flag = 0;
  433.    
  434.    
  435.     if(Flag)
  436.     {
  437.        Flag = 0;
  438.        
  439.        InvalidateRect(hWnd, 0, 1);
  440.        
  441.        return 0;   
  442.     }
  443.    
  444.    
  445.     for(int z = 1; z <= nSizeY; z++)
  446.     for(int i = 1; i <= nSizeX; i++)
  447.     {
  448.         x = 39 * i - 20;
  449.         y = 39 * z - 20;       
  450.         Print_1(x, y, anField[i][z]);  
  451.     }
  452.    
  453.      Flag = 1;
  454. }
  455.  
  456.  
  457.  
  458.  
  459. //  Определяет на какой клетке (игрового поля) находится курсор
  460. //  Возвращает 0, если за пределами поля.
  461. //  Возвращает 1, если над полем игровым.
  462. /////////////////////////////////////////////////  nP = 0 независимо от нажатия кнопок мыши
  463. int posF(int nP)                               //  nP = 1 После нажатия на ЛКМ
  464. {
  465.    
  466.     int i, x, y;
  467.    
  468.     if(nP)  x = (xMFix - 10)/39;   
  469.     else    x = (xMove - 10)/39;  
  470.    
  471.     x++;         
  472.      
  473.      
  474.      
  475.     if(x <= 11)
  476.     if(x != xF) { xF = x; return 1;}     
  477.      
  478.     if(nP)  y = (yMove - 10)/39;       
  479.     else    y = (yMFix - 10)/39;  
  480.      
  481.     y++;
  482.      
  483.     if(y <= 11)
  484.     if(y != yF) { yF = y; return 1; }  
  485.  
  486. return 0;  
  487. }
  488.  
  489.  
  490.  
  491.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement