Subversion Repositories Kolibri OS

Rev

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