Subversion Repositories Kolibri OS

Rev

Rev 3933 | Rev 6167 | 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. #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, 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 = GetKey();
  79.                                 if (key==027) //Escape
  80.                                          ExitProcess();
  81.                                 if (key==051) //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.         //íîâàÿ èãðà
  185.         DefineButton(10,PANEL_Y+7, 13*6+6, 20, 2,sc.work_button);
  186.         WriteText(10+4,PANEL_Y+14,0x80,sc.work_button_text,#NEW_GAME_TEXT,0);
  187.  
  188.  
  189.         //êíîïî÷êa âûáîðà óðîâíÿ ñëîæíîñòè
  190.         DefineButton(95,PANEL_Y+7, 20,20, 10,sc.work_button);
  191.         WriteText(95+8,PANEL_Y+14,0x80,sc.work_button_text,BOARD_SIZES[DIFFICULTY_LEVEL],0);
  192.  
  193.         draw_field();
  194.  
  195.         draw_clicks_num();
  196. }
  197.  
  198.  
  199. int check_for_end()
  200. {
  201.         int i, j, button_id;
  202.  
  203.         if (!BLOCKS_LEFT) return 1; //epic win
  204.  
  205.         for (i=0;i<BLOCKS_NUM;i++)
  206.                 for (j=0;j<BLOCKS_NUM;j++)
  207.                 {
  208.                         button_id=blocks_matrix[i*BLOCKS_NUM+j];
  209.  
  210.                         if (button_id==DELETED_BLOCK) continue;
  211.  
  212.                         if (j>0) && (blocks_matrix[i*BLOCKS_NUM+j-1]==button_id) return 0;
  213.                         if (i>0) && (blocks_matrix[i-1*BLOCKS_NUM+j]==button_id) return 0;
  214.                         if (j<BLOCKS_NUM-1) && (blocks_matrix[i*BLOCKS_NUM+j+1]==button_id) return 0;
  215.                         if (i<BLOCKS_NUM-1) && (blocks_matrix[i+1*BLOCKS_NUM+j]==button_id) return 0;
  216.                 }
  217.         return 2;
  218. }
  219.  
  220.  
  221. void draw_clicks_num()
  222. {
  223.         char rezult[15];
  224.         int i;
  225.         int TEXT_Y=BLOCK_SIZE*BLOCKS_NUM+14;
  226.         int TEXT_X=TEXT_Y/2+48; //130;
  227.  
  228.         BLOCKS_LEFT=0;
  229.  
  230.         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++)
  231.                 if (blocks_matrix[i]<>DELETED_BLOCK) BLOCKS_LEFT++;
  232.  
  233.         DrawBar(TEXT_X, TEXT_Y, 18,9, sc.work);
  234.         WriteText(TEXT_X,TEXT_Y,0x80,sc.work_text,IntToStr(BLOCKS_LEFT),0);
  235.  
  236.         if (check_for_end())
  237.         {
  238.                 copystr(#REZULT_TEXT, #rezult);
  239.                 copystr(IntToStr(BLOCKS_LEFT), #rezult+strlen(#rezult));
  240.                 if (check_for_end()==1) copystr("Epic WIN!!1", #rezult);
  241.                 DrawFlatButton(BLOCK_SIZE*BLOCKS_NUM/2-70, BLOCK_SIZE*BLOCKS_NUM/2-20, 140, 40, 3, #rezult);
  242.         }
  243. }
  244.  
  245.  
  246. void new_game()
  247. {
  248.         int i;
  249.  
  250.         //ïÿòü öâåòîâ èñïîëüçóåòñÿ â èãðå äëÿ êâàäðàòèêîâ, MARKED äëÿ òîãî,
  251.         //÷òîáû îòìåòèòü êâàäðàòèêè â ïðîöåññå çàëèâêè è DELETED_BLOCK  äëÿ èõ óäàëåíèÿ
  252.         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++)
  253.                 blocks_matrix[i] = random(5);
  254.         DeleteButton(3);
  255. }
  256.  
  257.  
  258. void draw_field()
  259. {
  260.         int i, j;
  261.         int current_id;
  262.  
  263.         for (i=0;i<BLOCKS_NUM;i++)
  264.                 for (j=0;j<BLOCKS_NUM;j++)
  265.                 {
  266.                         current_id = i*BLOCKS_NUM+j;
  267.                         DeleteButton(current_id+100);
  268.                         if (blocks_matrix[current_id]==DELETED_BLOCK)
  269.                         {
  270.                                 DrawBar(j*BLOCK_SIZE,i*BLOCK_SIZE, BLOCK_SIZE,BLOCK_SIZE, 0xB2B4BF);
  271.                         }
  272.                         else
  273.                         {
  274.                                 DefineButton(j*BLOCK_SIZE,i*BLOCK_SIZE,BLOCK_SIZE-1,BLOCK_SIZE-1, current_id+100+BT_HIDE,0);
  275.                                 PutImage(blocks_matrix[current_id]*1323+#img,21,21,j*BLOCK_SIZE,i*BLOCK_SIZE);
  276.                         }
  277.                 }
  278. }
  279.  
  280.  
  281. void DrawFlatButton(dword x,y,width,height,id,text)
  282. {
  283.         DrawRegion_3D(x,y,width,height,sc.work_graph,sc.work_graph);
  284.         DrawRegion_3D(x+1,y+1,width-2,height-2,0xFFFFFF,sc.work);
  285.         DrawBar(x+2,y+2,width-3,height-3,sc.work);
  286.         IF (id) DefineButton(x,y,width,height,id+BT_HIDE,sc.work);
  287.         WriteText(-strlen(text)*6+width/2+x+1,height/2-3+y,0x80,sc.work_text,text,0);
  288. }
  289.  
  290. stop:
  291.