Subversion Repositories Kolibri OS

Rev

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

  1. //Leency 06.10.2011, Flood-it! v2.4, GPL
  2.  
  3. #include "lib\kolibri.h"
  4. #include "lib\random.h"
  5.  
  6. #ifndef AUTOBUILD
  7. #include "lang.h--"
  8. #endif
  9.  
  10. system_colors sc;
  11. proc_info Form;
  12. dword stak[100]; //юъэю яюью∙ш
  13.  
  14. //єЁютэш ёыюцэюёЄш
  15. int DIFFICULTY_LEV_PARAMS[]={ 28, 14, 25,  //ыхуъю
  16.                               17, 28, 50}; //Є цхыю
  17.                                                          
  18. //яю-єьюыўрэш■ "ыхуъю"
  19. int BLOCK_SIZE = 28; //ЁрчьхЁ ътрфЁрЄшър
  20. int BLOCKS_NUM = 14; //ъюышўхёЄтю ътрфЁрЄшъют яю ╒ ш яю Y
  21. int MAX_CLICKS = 25; //ьръёшьры№эюх ъюышўхёЄтю ъышъют фю т√шуЁ√°р
  22.  
  23. int CLICKS = 0;      //ёъюы№ъю їюфют єцх ёфхыры шуЁюъ
  24.  
  25. #define USER_PANEL_WIDTH 119
  26.  
  27. //°хёЄ№ ЎтхЄют шёяюы№чєхЄё  т шуЁх фы  ътрфЁрЄшъют, ёхф№ьющ цх (яюёыхфэшщ) фы  Єюую,
  28. //ўЄюс√ юЄьхЄшЄ№ ътрфЁрЄшъш т яЁюЎхёёх чрыштъш
  29. dword FIELD_COLORS[]= {0xf18db6, 0x605ca8, 0xfddc80, 0xdc4a20, 0x46b1e2, 0x7e9d1e,   0x232323, 0};
  30. char *BOARD_SIZES[]={ "S", "L", 0 };
  31.  
  32.  
  33. #ifdef LANG_RUS
  34.         char *BUTTON_CAPTIONS[]={ " Заново [F2]", " Помощь [F1]", " Выход [Esc]", 0};
  35.         char CLICKS_TEXT[]=" Клики:   /";
  36.         char LEVELS_TEXT[]="Поле:";
  37.        
  38.         char HELP_WINDOW_CAPTION[]="Помощь";
  39.         char *HELP_TEXT[]={     "Как играть во Flood-it?",
  40.         "",
  41.         "Заполните поле одним цветом за ограниченное число ходов.",
  42.         "Игра начинается с верхней левой клетки. Выберите цвет, нажав на один из",
  43.         "квадратиков слева, и клетки окрасятся этим цветом - так вы присоедините",
  44.         "соседние клетки той же окраски. Захватить поле нужно за минимальное",
  45.         "число ходов. Пошаговая стратегия с интересным принципом - изменись,",
  46.         "чтобы победить!",
  47.         "",
  48.         "Играть также можно клавишами:",
  49.         "[Q] [W] [E]",
  50.         "[A] [S] [D]",
  51.         0};
  52. #else
  53.         char *BUTTON_CAPTIONS[]={ "New Game [F2]", "Help     [F1]", "Exit    [Esc]", 0};
  54.         char CLICKS_TEXT[]="Clicks:   /";
  55.         char LEVELS_TEXT[]="Board:";
  56.        
  57.         char HELP_WINDOW_CAPTION[]="Help";
  58.         char *HELP_TEXT[]={     "How to play Flood-it?",
  59.         "",
  60.         "Flood the whole board with one color within the allowed steps.",
  61.         "You start from the top left corner and progress by selecting one",
  62.         "of the colored buttons on the left. When you change your current area",
  63.         "color, every adjacent square with the same color also changes, that",
  64.         "way you can flood other areas of the board. Select from 3 sizes of",
  65.         "the board and try to flood-it in the least amount of steps!",
  66.         "Addictive and Fun!",
  67.         "",
  68.         "You can also play with keyboard:",
  69.         "[Q] [W] [E]",
  70.         "[A] [S] [D]",
  71.         0};
  72. #endif
  73.  
  74.  
  75. unsigned char color_matrix[28*28]; //ЎтхЄр фы  яюы  ё ътрфЁрЄшърьш
  76.  
  77. unsigned char loss_matrix[14*14]={
  78. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  79. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  80. 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 2,
  81. 2, 3, 2, 2, 2, 3, 2, 3, 2, 2, 2, 3, 2, 2,
  82. 2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
  83. 2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
  84. 2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
  85. 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 2,
  86. 2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
  87. 2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
  88. 2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2,
  89. 2, 3, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 2,
  90. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  91. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
  92. };
  93.  
  94. unsigned char win_matrix[14*14]={
  95. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  96. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  97. 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
  98. 4, 1, 4, 1, 4, 1, 4, 4, 4, 1, 4, 4, 1, 4,
  99. 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 4, 1, 4,
  100. 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 4,
  101. 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
  102. 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
  103. 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
  104. 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
  105. 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 4,
  106. 4, 4, 1, 4, 1, 4, 4, 1, 4, 1, 4, 4, 1, 4,
  107. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  108. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  109. };
  110.  
  111. void main()
  112. {  
  113.         int key, id;
  114.        
  115.         new_game();
  116.    
  117.         loop()
  118.         {
  119.                 switch(WaitEvent())
  120.                 {
  121.                         case evButton:
  122.                                 id = GetButtonID();
  123.                                 IF (id==1) || (id==4) ExitProcess();
  124.                                 IF (id==2) goto _NEW_GAME_MARK;
  125.                                 IF (id==3) goto _HELP_MARK;
  126.                                 IF (id>=100)
  127.                                 {
  128.                                         make_turn(id-100);
  129.                                         break;
  130.                                 }
  131.                                 if (id>=10)
  132.                                 {
  133.                                         id=id-10*3;
  134.                                        
  135.                                         IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[id]) break; //т√сЁрэ ЄюЄ цх ЁрчьхЁ
  136.                                        
  137.                                         BLOCK_SIZE = DIFFICULTY_LEV_PARAMS[id]; //ЁрчьхЁ ътрфЁрЄшър
  138.                                         BLOCKS_NUM = DIFFICULTY_LEV_PARAMS[id+1]; //ъюышўхёЄтю ътрфЁрЄшъют яю ╒ ш яю Y
  139.                                         MAX_CLICKS = DIFFICULTY_LEV_PARAMS[id+2]; //ьръёшьры№эюх ъюышўхёЄтю ъышъют фю т√шуЁ√°р
  140.                                        
  141.                                         new_game();
  142.                                        
  143.                                         MoveSize(-1, -1, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+14);
  144.                                 }
  145.                                 break;
  146.                         case evKey:
  147.                                 key = GetKey();
  148.                                 IF (key==027) //Escape
  149.                                          ExitProcess();
  150.                                 IF (key==050) //F1
  151.                                 {
  152.                                         _HELP_MARK:
  153.                                                 CreateThread(#help,#stak);
  154.                                 }
  155.                                 IF (key==051) //F2
  156.                                 {
  157.                                         _NEW_GAME_MARK:
  158.                                                 new_game();
  159.                                                 draw_clicks_num();
  160.                                                 draw_field();
  161.                                 }
  162.                                 IF (key==113) make_turn(0); //Q
  163.                                 IF (key==119) make_turn(1); //W
  164.                                 IF (key==101) make_turn(2); //E
  165.                                 IF (key==097) make_turn(3); //A
  166.                                 IF (key==115) make_turn(4); //S
  167.                                 IF (key==100) make_turn(5); //D
  168.                                 break;
  169.                         case evReDraw:
  170.                                 draw_window();
  171.                 }
  172.         }
  173. }
  174.  
  175.  
  176. void make_turn(int turn_id)
  177. {
  178.         IF (color_matrix[0]==turn_id) return; //хёыш ЎтхЄ яхЁтющ Їш°ъш Єръющ цх, шуэюЁшЁєхь схёёь√ёыхээ√щ їюф
  179.         IF (CLICKS>=MAX_CLICKS) return; //хёыш шуЁр чръюэўхэр
  180.        
  181.         CLICKS++;
  182.         draw_clicks_num();
  183.        
  184.         fill_field(turn_id);
  185.         draw_field();
  186.         check_for_end(); //хёыш шуЁр чръюэўхэр 
  187. }
  188.  
  189.  
  190. void draw_window()
  191. {
  192.         int i, j;
  193.         #define BUTTON_SIZE 28
  194.        
  195.         sc.get();
  196.                
  197.         DefineAndDrawWindow(300,176, BLOCK_SIZE*BLOCKS_NUM +14+USER_PANEL_WIDTH, BLOCK_SIZE*BLOCKS_NUM +GetSkinWidth()+14, 0x74,sc.work,0,0,"Flood-it!");
  198.        
  199.         //яЁютхЁ хь эх ёїыюяэєЄю ыш юъэю т чруюыютюъ
  200.         GetProcessInfo(#Form, SelfInfo);
  201.         IF (Form.status_window==4) return;
  202.        
  203.         //чръЁр°штрхь Їюэ -> єьхэ№°рхЄ яхЁхЁшёютъє
  204.         for (i=0;i<=4;i++)
  205.         {
  206.                 IF (i<>4)
  207.                         DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work);
  208.                 else
  209.                         DrawRegion(USER_PANEL_WIDTH+i-5,i, BLOCK_SIZE*BLOCKS_NUM +9-i-i, BLOCK_SIZE*BLOCKS_NUM+9-i-i, sc.work_graph); //юсюфюъ
  210.         }
  211.         DrawBar(0,0, USER_PANEL_WIDTH-5, BLOCK_SIZE*BLOCKS_NUM+10, sc.work);
  212.        
  213.         //ъэюяюўъш чрыштъш
  214.         for (i=0;i<2;i++)
  215.                 for (j=0;j<3;j++)
  216.                         DefineButton(j*BUTTON_SIZE+17,i*BUTTON_SIZE+15,BUTTON_SIZE,BUTTON_SIZE, i*3+j+100,FIELD_COLORS[i*3+j]);
  217.  
  218.         //ъэюяюўъш фхщёЄтшщ
  219.         for (j=0;j<3;j++)
  220.         {
  221.                 DefineButton(17,j*25+120, 13*6+6, 20, j+2,sc.work_button);
  222.                 WriteText(17+4,j*25+127,0x80,sc.work_button_text,BUTTON_CAPTIONS[j],0);
  223.         }
  224.  
  225.         //ъэюяюўъш т√сюЁр єЁютэ  ёыюцэюёЄш
  226.         WriteText(17,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,sc.work_text,#LEVELS_TEXT,0);
  227.         for (j=0;j<2;j++)
  228.         {
  229.                 DefineButton(j*25+56,BLOCKS_NUM*BLOCK_SIZE-20, 20,20, j+10,sc.work_button);
  230.                
  231.                 IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[j*3]) EDI=0x800080;
  232.                         else EDI=sc.work_button_text;
  233.                
  234.                 WriteText(j*25+56+8,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0);
  235.                 WriteText(j*25+56+9,BLOCKS_NUM*BLOCK_SIZE-20+7,0x80,EDI,BOARD_SIZES[j],0);
  236.         }
  237.        
  238.         draw_clicks_num();
  239.        
  240.         draw_field();
  241.  
  242. }
  243.  
  244.  
  245. void new_game()
  246. {
  247.         int i;
  248.        
  249.         CLICKS = 0;
  250.        
  251.         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++)
  252.                         color_matrix[i] = random(6);
  253. }
  254.  
  255.  
  256. void fill_field(int new_color_id)
  257. {
  258.         int i, j,
  259.         old_color_id=color_matrix[0],
  260.         restart;
  261.         #define MARKED 6
  262.        
  263.         color_matrix[0]=MARKED;
  264.        
  265.         _RESTART_MARK:
  266.        
  267.         restart=0;
  268.        
  269.         for (i=0;i<BLOCKS_NUM;i++)
  270.                 for (j=0;j<BLOCKS_NUM;j++)
  271.                 {
  272.                         IF (color_matrix[i*BLOCKS_NUM+j]<>old_color_id) continue; //хёыш Їш°ър эх эєцэюую ЎтхЄр шф╕ь фры№°х
  273.                         IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) continue; //хёыш Їш°ър єцх юЄьхўхэр, шф╕ь фрыхх
  274.                        
  275.                         IF (j>0) && (color_matrix[i*BLOCKS_NUM+j-1]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //ёьюЄЁшь ыхт√щ
  276.                         IF (i>0) && (color_matrix[i-1*BLOCKS_NUM+j]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //ёьюЄЁшь тхЁїэшщ
  277.                         IF (j<BLOCKS_NUM-1) && (color_matrix[i*BLOCKS_NUM+j+1]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //ёьюЄЁшь яЁрт√щ
  278.                         IF (i<BLOCKS_NUM-1) && (color_matrix[i+1*BLOCKS_NUM+j]==MARKED) color_matrix[i*BLOCKS_NUM+j]=MARKED; //ёьюЄЁшь эшцэшщ
  279.                        
  280.                         IF (color_matrix[i*BLOCKS_NUM+j]==MARKED) restart=1; //хёыш Їш°ъє юЄьхЄшыш, Єю яюЄюь Ўшъы эєцэю сєфхЄ яЁюъЁєЄшЄ№ ёэрўрыр - ьюц х∙╕ ў╕ юЄьхЄшь
  281.                 }
  282.         IF (restart) goto _RESTART_MARK;
  283.  
  284.         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++)
  285.                         IF (color_matrix[i]==MARKED) color_matrix[i]=new_color_id;
  286. }
  287.  
  288.  
  289. int check_for_end()
  290. {
  291.         int i, j, ii, jj;
  292.  
  293.         if (CLICKS>=MAX_CLICKS) //хёыш яЁюшуЁ√°
  294.         {
  295.                 IF (CLICKS==MAX_CLICKS) //т√шуЁ√°№ эр яюёыхфэхь їюфх
  296.                 {
  297.                         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++) //яЁютхЁ хь тё╕ ыш яюых юфэюую ЎтхЄр, хёыш эхЄ єїюфшь
  298.                                         IF (color_matrix[i]<>color_matrix[0]) goto _loss_MARK;
  299.                         goto _WIN_MARK;
  300.                 }
  301.                
  302.                 _loss_MARK:
  303.                
  304.                 for (i=0;i<14;i++)
  305.                         for (j=0;j<14;j++)
  306.                         {
  307.                                 IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0])
  308.                                 {
  309.                                         ii=i;
  310.                                         jj=j;
  311.                                 }
  312.                                 else
  313.                                 {
  314.                                         ii=i*2;
  315.                                         jj=j*2;
  316.                                 }
  317.                                 color_matrix[ii*BLOCKS_NUM+jj]=loss_matrix[i*14+j];
  318.                                 color_matrix[ii+1*BLOCKS_NUM+jj]=loss_matrix[i*14+j];
  319.                                 color_matrix[ii*BLOCKS_NUM+jj+1]=loss_matrix[i*14+j];
  320.                                 color_matrix[ii+1*BLOCKS_NUM+jj+1]=loss_matrix[i*14+j];
  321.                                 draw_field();
  322.                                 //Pause(5);                            
  323.                         }      
  324.                        
  325.                 return 1;
  326.         }
  327.        
  328.         for (i=0;i<BLOCKS_NUM*BLOCKS_NUM;i++) //яЁютхЁ хь тё╕ ыш яюых юфэюую ЎтхЄр, хёыш эхЄ єїюфшь
  329.                         IF (color_matrix[i]<>color_matrix[0]) return 0;
  330.  
  331.         //тё╕ яюых юфэюую ЎтхЄр ш Їш°хъ ьхэ№°х MAX_CLICKS -> яюсхфр
  332.        
  333.         _WIN_MARK:
  334.        
  335.         for (i=0;i<25;i++)
  336.         {
  337.                 new_game();
  338.                 draw_field();
  339.                 Pause(7);
  340.         }
  341.  
  342.         CLICKS=MAX_CLICKS;
  343.        
  344.         for (i=0;i<14;i++)
  345.                 for (j=0;j<14;j++)
  346.                 {
  347.                         IF (BLOCK_SIZE == DIFFICULTY_LEV_PARAMS[0]) //чрыштър фы  яюыхщ Ёрчэюую ЁрчьхЁр Ёрчэр 
  348.                         {
  349.                                 ii=i;
  350.                                 jj=j;
  351.                         }
  352.                         else
  353.                         {
  354.                                 ii=i*2;
  355.                                 jj=j*2;
  356.                         }
  357.                         color_matrix[ii*BLOCKS_NUM+jj]=win_matrix[i*14+j];
  358.                         color_matrix[ii+1*BLOCKS_NUM+jj]=win_matrix[i*14+j];
  359.                         color_matrix[ii*BLOCKS_NUM+jj+1]=win_matrix[i*14+j];
  360.                         color_matrix[ii+1*BLOCKS_NUM+jj+1]=win_matrix[i*14+j];
  361.                         draw_field();
  362.                         //Pause(5);                            
  363.                 }      
  364.         return 1;
  365. }
  366.  
  367.  
  368. void draw_clicks_num()
  369. {
  370.         #define TEXT_X 21
  371.         #define TEXT_Y 92
  372.        
  373.         DrawBar(8*6+TEXT_X, TEXT_Y, 6*2,9, sc.work);
  374.        
  375.         WriteText(TEXT_X,TEXT_Y,0x80,sc.work_text,#CLICKS_TEXT,0);
  376.  
  377.         IF (CLICKS<10) EBX=9*6+TEXT_X;
  378.                 else EBX=8*6+TEXT_X;
  379.        
  380.         WriteText(EBX,TEXT_Y,0x80,sc.work_text,IntToStr(CLICKS),0);
  381.        
  382.         WriteText(11*6+TEXT_X,TEXT_Y,0x80,sc.work_text,IntToStr(MAX_CLICKS),0);
  383. }
  384.  
  385.  
  386. void draw_field()
  387. {
  388.         int i, j;
  389.         int color_id;
  390.        
  391.         for (i=0;i<BLOCKS_NUM;i++)
  392.                 for (j=0;j<BLOCKS_NUM;j++)
  393.                 {
  394.                         color_id = color_matrix[i*BLOCKS_NUM+j];
  395.                         DrawBar(j*BLOCK_SIZE+USER_PANEL_WIDTH, i*BLOCK_SIZE+5, BLOCK_SIZE,BLOCK_SIZE, FIELD_COLORS[color_id]);
  396.                 }
  397. }
  398.  
  399.  
  400. void help()
  401. {  
  402.         int i;
  403.        
  404.         loop()
  405.         switch (WaitEvent())
  406.         {
  407.                 CASE evButton:
  408.                                 IF (GetButtonID()==1) ExitProcess();
  409.                                 break;
  410.                 CASE evKey:
  411.                                 IF (GetKey()==27) ExitProcess(); //Esc
  412.                                 break;
  413.                 CASE evReDraw:
  414.                                 for (i=0; HELP_TEXT[i]<>0; i++;) {};
  415.                                
  416.                                 DefineAndDrawWindow(500,200,450,i*13+44,0x34,sc.work,0,0,#HELP_WINDOW_CAPTION);
  417.                                
  418.                                 WriteText(6,12,0x80,sc.work_text,HELP_TEXT[0],0); //¤Єю фы  цшЁэюую °ЁшЇЄр
  419.                                 for (i=0; HELP_TEXT[i]<>0; i++;) WriteText(5,i*13+12,0x80,sc.work_text,HELP_TEXT[i],0);
  420.         }
  421. }
  422.  
  423.  
  424. stop: