Subversion Repositories Kolibri OS

Rev

Rev 2796 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. //Leency 10.10.2011, JustClicks v2.0, GPL
  2.  
  3. #include "lib\kolibri.h"
  4. #include "lib\random.h"
  5. #include "lib\boxes.txt"
  6. #include "lang.h"
  7.  
  8. system_colors sc;
  9.  
  10. //óðîâíè ñëîæíîñòè
  11. int DIFFICULTY_LEVEL;
  12. char *BOARD_SIZES[]={ "S", "M", "L", 0 };
  13. int DIFFICULTY_LEV_PARAMS[]={ 9, 12, 16 };
  14.  
  15. int BLOCKS_NUM; //êîëè÷åñòâî êâàäðàòèêîâ ïî Õ è ïî Y
  16. int BLOCKS_LEFT; //áëîêîâ îñòàëîñü
  17. int blocks_matrix[28*28]; //öâåòà äëÿ ïîëÿ ñ êâàäðàòèêàìè
  18.  
  19. #define USER_PANEL_HEIGHT 35
  20. #define BLOCK_SIZE 21 //ðàçìåð êâàäðàòèêà
  21. #define MARKED 7
  22. #define DELETED_BLOCK 6
  23. #define HEADER "Just Clicks v2.0"
  24.  
  25. #ifdef LANG_RUS
  26.         char NEW_GAME_TEXT[]=" ‡ ­®¢® [F2]";
  27.         char REZULT_TEXT[]="¥§ã«ìâ â: ";
  28. #else
  29.         char NEW_GAME_TEXT[]="New Game [F2]";
  30.         char REZULT_TEXT[]="Rezult: ";
  31. #endif
  32.  
  33.  
  34. void main()
  35. {  
  36.         int key, id;
  37.        
  38.         BLOCKS_NUM=DIFFICULTY_LEV_PARAMS[0]; //ïî-óìîë÷àíèþ ñàìîå ìàëåíüêîå ïîëå
  39.        
  40.         new_game();
  41.    
  42.         loop()
  43.                 switch(WaitEvent())
  44.                 {
  45.                         case evButton:
  46.                                 id = GetButtonID();
  47.                                 if (id==1) ExitProcess();
  48.                                 if (id==2) goto _NEW_GAME_MARK;
  49.                                 if (id>=100)
  50.                                 {
  51.                                         if (check_for_end()) break; //åñëè èãðà çàêîí÷åíà
  52.                                        
  53.                                         move_blocks(id-100);
  54.                                         draw_field();
  55.                                        
  56.                                         draw_clicks_num();
  57.                                        
  58.                                         break;
  59.                                 }
  60.                                 if (id==10) //èçìåíÿåì ðàçìåð ïîëÿ
  61.                                 {
  62.                                         if (DIFFICULTY_LEVEL<2) DIFFICULTY_LEVEL++; else DIFFICULTY_LEVEL=0;
  63.                                        
  64.                                         BLOCKS_NUM = DIFFICULTY_LEV_PARAMS[DIFFICULTY_LEVEL]; //êîëè÷åñòâî êâàäðàòèêîâ ïî Õ è ïî Y
  65.                                        
  66.                                         new_game();
  67.                                        
  68.                                         MoveSize(-1, -1, BLOCK_SIZE*BLOCKS_NUM +9, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+4+USER_PANEL_HEIGHT);
  69.                                         break;
  70.                                 }
  71.                                 break;
  72.                         case evKey:
  73.                                 key = GetKey();
  74.                                 if (key==027) //Escape
  75.                                          ExitProcess();
  76.                                 if (key==051) //F2
  77.                                 {
  78.                                         _NEW_GAME_MARK:
  79.                                                 new_game();
  80.                                                 draw_clicks_num();
  81.                                                 draw_field();
  82.                                 }
  83.                                 break;
  84.                         case evReDraw:
  85.                                 draw_window();
  86.                 }
  87. }
  88.  
  89.  
  90. void move_blocks(int button_id) //åñëè ôèøêà îäíà, òî íå óäàëÿåì
  91. {
  92.         int i, j,
  93.         marked_num=1,
  94.         old_marker=blocks_matrix[button_id],
  95.         restart;
  96.  
  97.         blocks_matrix[button_id]=MARKED;
  98.  
  99.         //âûäåëÿåì âñå ôèøêè òîãî æå ÷âåòà
  100.         _RESTART_MARK:
  101.         restart=0;
  102.         for (i=0;i<BLOCKS_NUM;i++)
  103.                 for (j=0;j<BLOCKS_NUM;j++)
  104.                 {
  105.                         if (blocks_matrix[i*BLOCKS_NUM+j]<>old_marker) continue; //åñëè ôèøêà íå íóæíîãî öâåòà èä¸ì äàëüøå
  106.                         if (blocks_matrix[i*BLOCKS_NUM+j]==MARKED) continue; //åñëè ôèøêà óæå îòìå÷åíà, èä¸ì äàëåå
  107.                        
  108.                         if (j>0) && (blocks_matrix[i*BLOCKS_NUM+j-1]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //ñìîòðèì ëåâûé
  109.                         if (i>0) && (blocks_matrix[i-1*BLOCKS_NUM+j]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //ñìîòðèì âåðõíèé
  110.                         if (j<BLOCKS_NUM-1) && (blocks_matrix[i*BLOCKS_NUM+j+1]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //ñìîòðèì ïðàâûé
  111.                         if (i<BLOCKS_NUM-1) && (blocks_matrix[i+1*BLOCKS_NUM+j]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //ñìîòðèì íèæíèé
  112.                        
  113.                         if (blocks_matrix[i*BLOCKS_NUM+j]==MARKED) //åñëè ôèøêó îòìåòèëè, òî ïîòîì öèêë íóæíî áóäåò ïðîêðóòèòü ñíà÷àëà - ìîæ åù¸ ÷¸ îòìåòèì
  114.                         {
  115.                                 restart=1;
  116.                                 marked_num++;
  117.                         }
  118.                 }
  119.         if (restart) goto _RESTART_MARK;
  120.        
  121.         if (marked_num==1) //åñëè áëîê òîëüêî îäèí, óõîäèì
  122.         {
  123.                 blocks_matrix[button_id]=old_marker;
  124.                 return;
  125.         }
  126.  
  127.         //äâèãàåì áëîêè ïî âåðòèêàëè
  128.         _2_RESTART_MARK:
  129.         restart=0;
  130.         for (i=BLOCKS_NUM;i>0;i--)
  131.                 for (j=BLOCKS_NUM;j>=0;j--)
  132.                 {
  133.                         if (blocks_matrix[i*BLOCKS_NUM+j]==MARKED) && (blocks_matrix[i-1*BLOCKS_NUM+j]<>blocks_matrix[i*BLOCKS_NUM+j])
  134.                         {
  135.                                 blocks_matrix[i*BLOCKS_NUM+j]><blocks_matrix[i-1*BLOCKS_NUM+j];
  136.                                 restart=1;
  137.                         }
  138.                 }
  139.         if (restart) goto _2_RESTART_MARK;
  140.        
  141.         //îòìå÷àåì ôèøêè, êàê óäàë¸ííûå
  142.         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++)
  143.                         if (blocks_matrix[i]==MARKED)
  144.                                 blocks_matrix[i]=DELETED_BLOCK;
  145.                                
  146.         //äâèãàåì áëîêè âëåâî, åñëè åñòü ïóñòîé ñòîëáåö
  147.         restart=BLOCKS_NUM; //íå ïðèäóìàë íè÷åãî ëó÷øå :(
  148.        
  149.         _3_RESTART_MARK:
  150.         for (j=0;j<BLOCKS_NUM-1;j++)
  151.                 if (blocks_matrix[BLOCKS_NUM-1*BLOCKS_NUM+j]==DELETED_BLOCK)
  152.                 {
  153.                         for (i=0;i<BLOCKS_NUM;i++)
  154.                                 blocks_matrix[i*BLOCKS_NUM+j]><blocks_matrix[i*BLOCKS_NUM+j+1];
  155.                 }
  156.         restart--;
  157.         if (restart) goto _3_RESTART_MARK;
  158. }
  159.  
  160.  
  161. void draw_window()
  162. {
  163.         int j, PANEL_Y;
  164.         proc_info Form;
  165.        
  166.         sc.get();
  167.         DefineAndDrawWindow(300,176, BLOCK_SIZE*BLOCKS_NUM +9, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+4+USER_PANEL_HEIGHT,
  168.                 0x74,sc.work,0,0,HEADER);
  169.        
  170.         //ïðîâåðÿåì íå ñõëîïíóòî ëè îêíî â çàãîëîâîê
  171.         GetProcessInfo(#Form, SelfInfo);
  172.         if (Form.status_window>2) return;
  173.  
  174.  
  175.         PANEL_Y=BLOCK_SIZE*BLOCKS_NUM;
  176.  
  177.         DrawBar(0,PANEL_Y, PANEL_Y, USER_PANEL_HEIGHT, sc.work); //ïàíåëü ñíèçó
  178.                
  179.         //íîâàÿ èãðà
  180.         DefineButton(10,PANEL_Y+7, 13*6+6, 20, 2,sc.work_button);
  181.         WriteText(10+4,PANEL_Y+14,0x80,sc.work_button_text,#NEW_GAME_TEXT,0);
  182.  
  183.  
  184.         //êíîïî÷êa âûáîðà óðîâíÿ ñëîæíîñòè
  185.         DefineButton(95,PANEL_Y+7, 20,20, 10,sc.work_button);
  186.         WriteText(95+8,PANEL_Y+14,0x80,sc.work_button_text,BOARD_SIZES[DIFFICULTY_LEVEL],0);
  187.        
  188.         draw_field();
  189.        
  190.         draw_clicks_num();
  191. }
  192.  
  193.  
  194. int check_for_end()
  195. {
  196.         int i, j, button_id;
  197.  
  198.         if (!BLOCKS_LEFT) return 1; //epic win
  199.  
  200.         for (i=0;i<BLOCKS_NUM;i++)
  201.                 for (j=0;j<BLOCKS_NUM;j++)
  202.                 {
  203.                         button_id=blocks_matrix[i*BLOCKS_NUM+j];
  204.                        
  205.                         if (button_id==DELETED_BLOCK) continue;
  206.                        
  207.                         if (j>0) && (blocks_matrix[i*BLOCKS_NUM+j-1]==button_id) return 0;
  208.                         if (i>0) && (blocks_matrix[i-1*BLOCKS_NUM+j]==button_id) return 0;
  209.                         if (j<BLOCKS_NUM-1) && (blocks_matrix[i*BLOCKS_NUM+j+1]==button_id) return 0;
  210.                         if (i<BLOCKS_NUM-1) && (blocks_matrix[i+1*BLOCKS_NUM+j]==button_id) return 0;
  211.                 }
  212.         return 2;
  213. }
  214.  
  215.  
  216. void draw_clicks_num()
  217. {
  218.         char rezult[15];
  219.         int i;
  220.         int TEXT_Y=BLOCK_SIZE*BLOCKS_NUM+14;
  221.         int TEXT_X=TEXT_Y/2+48; //130;
  222.  
  223.         BLOCKS_LEFT=0;
  224.        
  225.         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++)
  226.                 if (blocks_matrix[i]<>DELETED_BLOCK) BLOCKS_LEFT++;    
  227.        
  228.         DrawBar(TEXT_X, TEXT_Y, 18,9, sc.work_button);
  229.        
  230.         WriteText(TEXT_X,TEXT_Y,0x80,sc.work_button_text,IntToStr(BLOCKS_LEFT),0);
  231.         if (check_for_end())
  232.         {
  233.                 copystr(#REZULT_TEXT, #rezult);
  234.                 copystr(IntToStr(BLOCKS_LEFT), #rezult+strlen(#rezult));
  235.                 if (check_for_end()==1) copystr("Epic WIN!!1", #rezult);
  236.                 DrawFlatButton(BLOCK_SIZE*BLOCKS_NUM/2-70, BLOCK_SIZE*BLOCKS_NUM/2-20, 140, 40, 2, #rezult);
  237.         }
  238. }
  239.  
  240.  
  241. void new_game()
  242. {
  243.         int i;
  244.  
  245.         //ïÿòü öâåòîâ èñïîëüçóåòñÿ â èãðå äëÿ êâàäðàòèêîâ, MARKED äëÿ òîãî,
  246.         //÷òîáû îòìåòèòü êâàäðàòèêè â ïðîöåññå çàëèâêè è DELETED_BLOCK  äëÿ èõ óäàëåíèÿ
  247.         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++)
  248.                 blocks_matrix[i] = random(5);
  249. }
  250.  
  251.  
  252. void draw_field()
  253. {
  254.         int i, j;
  255.         int current_id;
  256.        
  257.         for (i=0;i<BLOCKS_NUM;i++)
  258.                 for (j=0;j<BLOCKS_NUM;j++)
  259.                 {
  260.                         current_id = i*BLOCKS_NUM+j;
  261.                         DeleteButton(current_id+100);
  262.                         if (blocks_matrix[current_id]==DELETED_BLOCK)
  263.                         {
  264.                                 DrawBar(j*BLOCK_SIZE,i*BLOCK_SIZE, BLOCK_SIZE,BLOCK_SIZE, 0xB2B4BF);
  265.                         }
  266.                         else
  267.                         {
  268.                                 DefineButton(j*BLOCK_SIZE,i*BLOCK_SIZE,BLOCK_SIZE-1,BLOCK_SIZE-1, current_id+100+BT_HIDE,0);
  269.                                 PutImage(blocks_matrix[current_id]*1323+#img,21,21,j*BLOCK_SIZE,i*BLOCK_SIZE);
  270.                         }
  271.                 }
  272. }
  273.  
  274.  
  275. void DrawFlatButton(dword x,y,width,height,id,text)
  276. {
  277.         DrawRegion_3D(x,y,width,height,sc.work_graph,sc.work_graph);
  278.         DrawRegion_3D(x+1,y+1,width-2,height-2,0xFFFFFF,sc.work);
  279.         DrawBar(x+2,y+2,width-3,height-3,sc.work);
  280.         IF (id) DefineButton(x,y,width,height,id+BT_HIDE,sc.work);
  281.         WriteText(-strlen(text)*6+width/2+x+1,height/2-3+y,0x80,sc.work_text,text,0);
  282. }
  283.  
  284. stop: