Subversion Repositories Kolibri OS

Rev

Rev 6167 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. #include "lib\kolibri.h"
  3. #include "lib\random.h"
  4.  
  5. unsigned char block[] = FROM "lib\\boxes.raw";
  6.  
  7. system_colors sc;
  8.  
  9. //óðîâíè ñëîæíîñòè
  10. int DIFFICULTY_LEVEL=1; //ïî-óìîë÷àíèþ ñðåäíåå ïîëå
  11. char *BOARD_SIZES[]={ "S", "M", "L", 0 };
  12. int DIFFICULTY_LEV_PARAMS[]={ 9, 12, 16 };
  13.  
  14. int BLOCKS_NUM; //êîëè÷åñòâî êâàäðàòèêîâ ïî Õ è ïî Y
  15. int BLOCKS_LEFT; //áëîêîâ îñòàëîñü
  16. int blocks_matrix[28*28]; //öâåòà äëÿ ïîëÿ ñ êâàäðàòèêàìè
  17.  
  18. #define USER_PANEL_HEIGHT 35
  19. #define BLOCK_SIZE 21 //ðàçìåð êâàäðàòèêà
  20. #define MARKED 7
  21. #define DELETED_BLOCK 6
  22. #define HEADER "Just Clicks v2.2"
  23.  
  24. #ifndef AUTOBUILD
  25. #include "lang.h--"
  26. #endif
  27.  
  28. #ifdef LANG_RUS
  29.         #define NEW_GAME_TEXT "‡ ­®¢® [F2]"
  30.         #define RESULT_TEXT   "¥§ã«ìâ â: "
  31. #elif LANG_EST
  32.         #define NEW_GAME_TEXT "Uus mäng [F2]"
  33.         #define RESULT_TEXT   "Tulemus: "
  34. #else
  35.         #define NEW_GAME_TEXT "New Game [F2]"
  36.         #define RESULT_TEXT   "Result: "
  37. #endif
  38.  
  39.  
  40. void main()
  41. {
  42.         int id;
  43.  
  44.         BLOCKS_NUM=DIFFICULTY_LEV_PARAMS[DIFFICULTY_LEVEL];
  45.  
  46.         new_game();
  47.  
  48.         loop()
  49.                 switch(WaitEvent())
  50.                 {
  51.                         case evButton:
  52.                                 id = @GetButtonID();
  53.                                 if (id==1) ExitProcess();
  54.                                 if (id==2) || (id==3) goto _NEW_GAME_MARK;
  55.                                 if (id>=100)
  56.                                 {
  57.                                         if (check_for_end()) break; //åñëè èãðà çàêîí÷åíà
  58.  
  59.                                         move_blocks(id-100);
  60.                                         draw_field();
  61.  
  62.                                         draw_clicks_num();
  63.  
  64.                                         break;
  65.                                 }
  66.                                 if (id==10) //èçìåíÿåì ðàçìåð ïîëÿ
  67.                                 {
  68.                                         if (DIFFICULTY_LEVEL<2) DIFFICULTY_LEVEL++; else DIFFICULTY_LEVEL=0;
  69.  
  70.                                         BLOCKS_NUM = DIFFICULTY_LEV_PARAMS[DIFFICULTY_LEVEL]; //êîëè÷åñòâî êâàäðàòèêîâ ïî Õ è ïî Y
  71.  
  72.                                         new_game();
  73.  
  74.                                         MoveSize(-1, -1, BLOCK_SIZE*BLOCKS_NUM +9, BLOCK_SIZE*BLOCKS_NUM +GetSkinHeight()+4+USER_PANEL_HEIGHT);
  75.                                         break;
  76.                                 }
  77.                                 break;
  78.                         case evKey:
  79.                                 @GetKeyScancode();
  80.                                 if (AL==001) //Escape
  81.                                          ExitProcess();
  82.                                 if (AL==060) //F2
  83.                                 {
  84.                                         _NEW_GAME_MARK:
  85.                                                 new_game();
  86.                                                 draw_clicks_num();
  87.                                                 draw_field();
  88.                                 }
  89.                                 break;
  90.                         case evReDraw:
  91.                                 draw_window();
  92.                 }
  93. }
  94.  
  95.  
  96. void move_blocks(int button_id) //åñëè ôèøêà îäíà, òî íå óäàëÿåì
  97. {
  98.         int i, j,
  99.         marked_num=1,
  100.         old_marker=blocks_matrix[button_id],
  101.         restart;
  102.  
  103.         blocks_matrix[button_id]=MARKED;
  104.  
  105.         //âûäåëÿåì âñå ôèøêè òîãî æå ÷âåòà
  106.         _RESTART_MARK:
  107.         restart=0;
  108.         for (i=0;i<BLOCKS_NUM;i++)
  109.                 for (j=0;j<BLOCKS_NUM;j++)
  110.                 {
  111.                         if (blocks_matrix[i*BLOCKS_NUM+j]<>old_marker) continue; //åñëè ôèøêà íå íóæíîãî öâåòà èä¸ì äàëüøå
  112.                         if (blocks_matrix[i*BLOCKS_NUM+j]==MARKED) continue; //åñëè ôèøêà óæå îòìå÷åíà, èä¸ì äàëåå
  113.  
  114.                         if (j>0) && (blocks_matrix[i*BLOCKS_NUM+j-1]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //ñìîòðèì ëåâûé
  115.                         if (i>0) && (blocks_matrix[i-1*BLOCKS_NUM+j]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //ñìîòðèì âåðõíèé
  116.                         if (j<BLOCKS_NUM-1) && (blocks_matrix[i*BLOCKS_NUM+j+1]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //ñìîòðèì ïðàâûé
  117.                         if (i<BLOCKS_NUM-1) && (blocks_matrix[i+1*BLOCKS_NUM+j]==MARKED) blocks_matrix[i*BLOCKS_NUM+j]=MARKED; //ñìîòðèì íèæíèé
  118.  
  119.                         if (blocks_matrix[i*BLOCKS_NUM+j]==MARKED) //åñëè ôèøêó îòìåòèëè, òî ïîòîì öèêë íóæíî áóäåò ïðîêðóòèòü ñíà÷àëà - ìîæ åù¸ ÷¸ îòìåòèì
  120.                         {
  121.                                 restart=1;
  122.                                 marked_num++;
  123.                         }
  124.                 }
  125.         if (restart) goto _RESTART_MARK;
  126.  
  127.         if (marked_num==1) //åñëè áëîê òîëüêî îäèí, óõîäèì
  128.         {
  129.                 blocks_matrix[button_id]=old_marker;
  130.                 return;
  131.         }
  132.  
  133.         //äâèãàåì áëîêè ïî âåðòèêàëè
  134.         _2_RESTART_MARK:
  135.         restart=0;
  136.         for (i=BLOCKS_NUM;i>0;i--)
  137.                 for (j=BLOCKS_NUM;j>=0;j--)
  138.                 {
  139.                         if (blocks_matrix[i*BLOCKS_NUM+j]==MARKED) && (blocks_matrix[i-1*BLOCKS_NUM+j]<>blocks_matrix[i*BLOCKS_NUM+j])
  140.                         {
  141.                                 blocks_matrix[i*BLOCKS_NUM+j]><blocks_matrix[i-1*BLOCKS_NUM+j];
  142.                                 restart=1;
  143.                         }
  144.                 }
  145.         if (restart) goto _2_RESTART_MARK;
  146.  
  147.         //îòìå÷àåì ôèøêè, êàê óäàë¸ííûå
  148.         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++)
  149.                         if (blocks_matrix[i]==MARKED)
  150.                                 blocks_matrix[i]=DELETED_BLOCK;
  151.  
  152.         //äâèãàåì áëîêè âëåâî, åñëè åñòü ïóñòîé ñòîëáåö
  153.         restart=BLOCKS_NUM; //íå ïðèäóìàë íè÷åãî ëó÷øå :(
  154.  
  155.         _3_RESTART_MARK:
  156.         for (j=0;j<BLOCKS_NUM-1;j++)
  157.                 if (blocks_matrix[BLOCKS_NUM-1*BLOCKS_NUM+j]==DELETED_BLOCK)
  158.                 {
  159.                         for (i=0;i<BLOCKS_NUM;i++)
  160.                                 blocks_matrix[i*BLOCKS_NUM+j]><blocks_matrix[i*BLOCKS_NUM+j+1];
  161.                 }
  162.         restart--;
  163.         if (restart) goto _3_RESTART_MARK;
  164. }
  165.  
  166.  
  167. void draw_window()
  168. {
  169.         int PANEL_Y;
  170.         proc_info Form;
  171.  
  172.         sc.get();
  173.         DefineAndDrawWindow(300,176, BLOCK_SIZE*BLOCKS_NUM +9, BLOCK_SIZE*BLOCKS_NUM +GetSkinHeight()+4+USER_PANEL_HEIGHT,
  174.                 0x74,sc.work,0,0,HEADER);
  175.  
  176.         //ïðîâåðÿåì íå ñõëîïíóòî ëè îêíî â çàãîëîâîê
  177.         GetProcessInfo(#Form, SelfInfo);
  178.         if (Form.status_window>2) return;
  179.  
  180.  
  181.         PANEL_Y=BLOCK_SIZE*BLOCKS_NUM;
  182.  
  183.         DrawBar(0,PANEL_Y, PANEL_Y, USER_PANEL_HEIGHT, sc.work); //ïàíåëü ñíèçó
  184.  
  185.         DrawCaptButton(10, PANEL_Y+7, 90, 20, 2, sc.work_button, sc.work_button_text,NEW_GAME_TEXT);
  186.         DrawCaptButton(105,PANEL_Y+7, 20, 20, 10,sc.work_button, sc.work_button_text,BOARD_SIZES[DIFFICULTY_LEVEL]);
  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);
  229.         WriteText(TEXT_X,TEXT_Y,0x80,sc.work_text,IntToStr(BLOCKS_LEFT),0);
  230.  
  231.         if (check_for_end())
  232.         {
  233.                 copystr(RESULT_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, 3, #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.         DeleteButton(3);
  251. }
  252.  
  253.  
  254. void draw_field()
  255. {
  256.         int i, j;
  257.         int current_id;
  258.  
  259.         for (i=0;i<BLOCKS_NUM;i++)
  260.                 for (j=0;j<BLOCKS_NUM;j++)
  261.                 {
  262.                         current_id = i*BLOCKS_NUM+j;
  263.                         DeleteButton(current_id+100);
  264.                         if (blocks_matrix[current_id]==DELETED_BLOCK)
  265.                         {
  266.                                 DrawBar(j*BLOCK_SIZE,i*BLOCK_SIZE, BLOCK_SIZE,BLOCK_SIZE, 0xB2B4BF);
  267.                         }
  268.                         else
  269.                         {
  270.                                 DefineButton(j*BLOCK_SIZE,i*BLOCK_SIZE,BLOCK_SIZE-1,BLOCK_SIZE-1, current_id+100+BT_HIDE,0);
  271.                                 PutImage(blocks_matrix[current_id]*1323+#block,21,21,j*BLOCK_SIZE,i*BLOCK_SIZE);
  272.                         }
  273.                 }
  274. }
  275.  
  276.  
  277. void DrawFlatButton(dword x,y,width,height,id,text)
  278. {
  279.         DrawRegion_3D(x,y,width,height,sc.work_graph,sc.work_graph);
  280.         DrawRegion_3D(x+1,y+1,width-2,height-2,0xFFFFFF,sc.work);
  281.         DrawBar(x+2,y+2,width-3,height-3,sc.work);
  282.         IF (id) DefineButton(x,y,width,height,id+BT_HIDE,sc.work);
  283.         WriteText(-strlen(text)*6+width/2+x+1,height/2-3+y,0x80,sc.work_text,text,0);
  284. }
  285.  
  286. stop:
  287.