Subversion Repositories Kolibri OS

Rev

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