home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 December / PCWorld_2002-12_cd.bin / Software / Komercni / Baltik / katB.exe / katB / BACKTRAQ / BACKTRAQ.MOD / DAMY.INC < prev    next >
Text File  |  2002-09-20  |  21KB  |  421 lines

  1. // soukromé konstanty
  2.  
  3. // konstanty pro barvy na τachovnici
  4. # define modDamy_BARVA_B╓L╡ 1
  5. # define modDamy_BARVA_¼ERN╡ 2
  6.  
  7. // soukromé prom╪nné
  8.  
  9. int modDamy_Rozm╪rµachovnice; // rozm╪r τachovnice
  10. int modDamy_Rozm╪rPolíƒka; // velikost políƒka τachovnice
  11.  
  12. int *modDamy_µachovnice; // umíst╪ní dam na τachovnici (prvky pole = sloupce)
  13. int modDamy_Θroveσ; // úroveσ zano²ení v backtrackingu (práv╪ umís£ovaná dáma)
  14.  
  15. // soukromé funkce
  16.  
  17. void modDamy_Vykresliµachovnici(int KreslitDámy) {
  18.   int modDamy_KreslenéPolíƒkoX, modDamy_KreslenéPolíƒkoY;
  19.   int modDamy_KreslenéPolíƒkoBarva;
  20.   int modDamy_KreslenéPolíƒkoDáma;
  21.   for(modDamy_KreslenéPolíƒkoX = 0; modDamy_KreslenéPolíƒkoX < modDamy_Rozm╪rµachovnice; modDamy_KreslenéPolíƒkoX++) {
  22.     for(modDamy_KreslenéPolíƒkoY = 0; modDamy_KreslenéPolíƒkoY < modDamy_Rozm╪rµachovnice; modDamy_KreslenéPolíƒkoY++) {
  23.       // vykreslení políƒka τachovnice pat²iƒné velikosti, barvy a figury
  24.       modDamy_KreslenéPolíƒkoBarva = ((int)abs((double)(modDamy_KreslenéPolíƒkoX-modDamy_KreslenéPolíƒkoY))%2)?modDamy_BARVA_¼ERN╡:modDamy_BARVA_B╓L╡;
  25.       modDamy_KreslenéPolíƒkoDáma = KreslitDámy?(modDamy_Rozm╪rµachovnice-1-modDamy_µachovnice[modDamy_KreslenéPolíƒkoX]==modDamy_KreslenéPolíƒkoY?1:0):0;
  26.       GrKresliP²edm╪ty(46 + ((modDamy_KreslenéPolíƒkoDáma)*2+(modDamy_KreslenéPolíƒkoBarva==modDamy_BARVA_B╓L╡))*(integer((modDamy_Rozm╪rPolíƒka-1)/39)+1) + (modDamy_Rozm╪rPolíƒka<88)*15*4 + (modDamy_Rozm╪rPolíƒka<44)*8,
  27.                        1,
  28.                        modDamy_KreslenéPolíƒkoX*modDamy_Rozm╪rPolíƒka,
  29.                        modDamy_KreslenéPolíƒkoY*modDamy_Rozm╪rPolíƒka,
  30.                        integer((modDamy_Rozm╪rPolíƒka-1)/39)+1,
  31.                        integer((modDamy_Rozm╪rPolíƒka-1)/29)+1);
  32.       }
  33.     }
  34.   }
  35.  
  36. string modDamy_PoleDamNaⁿet╪zec(int *modDamy_P²evád╪néPole) {
  37.   string modDamy_Vrátit = "";
  38.   int modDamy_P²evád╪náDáma;
  39.   for(modDamy_P²evád╪náDáma=0; modDamy_P²evád╪náDáma<modDamy_Rozm╪rµachovnice && modDamy_P²evád╪néPole[modDamy_P²evád╪náDáma]<modDamy_Rozm╪rµachovnice; modDamy_P²evád╪náDáma++) {
  40.     if(modDamy_Rozm╪rµachovnice <= 8) modDamy_Vrátit += (string)(char)('a'+modDamy_P²evád╪náDáma);
  41.     modDamy_Vrátit += StrL¼íslo(modDamy_P²evád╪néPole[modDamy_P²evád╪náDáma]+1,-1)+" ";
  42.     }
  43.   modDamy_Vrátit = StrKopie(modDamy_Vrátit, 0, StrDélka(modDamy_Vrátit)-1);
  44.   return modDamy_Vrátit;
  45.   }
  46.  
  47. // ve²ejné funkce
  48.  
  49. void modDamy_Start(void) {
  50.   // v p²ípad╪ grafického reºimu:
  51.   if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  52.     // smazání obrazovky
  53.     GrSmaºOkno();
  54.     // vykreslení τachovnice
  55.     modDamy_Vykresliµachovnici(1);
  56.     }
  57.  
  58.   mod_VypiτHláτku("Po stisknutí klávesy nebo tlaƒítka myτi se rozb╪hne v∞poƒet...", mod_VYPIµHL╡µKU_NE¼EKEJ);
  59.   VyprázdniFrontuKláves(); MyτZapni();
  60.   ¼ekej(NaKlávesu|NaMyτ);
  61.   VyprázdniFrontuKláves(); MyτVypni();
  62.  
  63.   // smazání obrazovky v p²ípad╪ textového reºimu
  64.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  65.     TxtSmaºObrazovku();
  66.     }
  67.  
  68.   mod_VypiτHláτku("Probíhá v∞poƒet...", mod_VYPIµHL╡µKU_NE¼EKEJ);
  69.  
  70.   // inicializace prom╪nn∞ch pouºívan∞ch v∞poƒtem
  71.   modDamy_Θroveσ = 0;
  72.   mod_Poƒetⁿeτení = 0;
  73.   mod_HledatDál = 1;
  74.  
  75.   // zaznamenání ƒasu startu v∞poƒtu
  76.   Systémov∞¼as(mod_¼asStart);
  77.  
  78.   // zapsání parametrà v∞poƒtu do souboru, pokud si to uºivatel p²ál
  79.   if(mod_ZapisovatProtokol) {
  80.     mod_ProtokolZapiτStart1();
  81.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Reºim obrazovky: "+(mod_ReºimObrazovky==mod_TEXTOVφ_REªIM?"textov∞":"grafick∞")+"\n");
  82.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Rozm╪r τachovnice: "+StrL¼íslo(modDamy_Rozm╪rµachovnice,-1)+"x"+StrL¼íslo(modDamy_Rozm╪rµachovnice,-1)+"\n");
  83.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Hledaná ²eτení: "+(mod_Hledanáⁿeτení==mod_VµECHNA_ⁿEµEN╓?"vτechna":"jakékoliv")+"\n");
  84.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Zobrazované pozice: "+(mod_ZobrazovanéPozice==mod_POUZE_ⁿEµEN╓?"jen nalezená ²eτení":"i pràb╪h hledání")+"\n");
  85.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Vyƒkat po nalezení ²eτení na stisk klávesy: "+(mod_¼ekatNaKlávesu?"ano":"ne")+"\n");
  86.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Zapisovat protokol o v∞poƒtu: "+(mod_ZapisovatProtokol?"ano":"ne")+"\n");
  87.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Soubor protokolu: "+mod_ZapisovatProtokol_Název+"\n");
  88.     mod_ProtokolZapiτStart2();
  89.     }
  90.   }
  91.  
  92. void modDamy_Hotovo(void) {
  93.   // uloºení ƒasu dokonƒení v∞poƒtu
  94.   Systémov∞¼as(mod_¼asHotovo);
  95.   // pokud si uºivatel nep²ál najít pouze jedno ²eτení (a tedy toto nechat zobrazené)
  96.   if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM && mod_Hledanáⁿeτení != mod_JAKÉKOLIV_ⁿEµEN╓) {
  97.     // p²ekreslení τachovnice (te╘ jiº prázdné)
  98.     modDamy_Vykresliµachovnici(1);
  99.     }
  100.   // v p²ípad╪ grafického reºimu pípnutí - oznámení dokonƒení v∞poƒtu
  101.   if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { Tón(1000); ¼ekej(1500); VypniTón(); }
  102.   // v∞poƒet doby trvání v∞poƒtu
  103.   mod_V∞poƒetDobyTrváníV∞poƒtu();
  104.   // zapsání informací t∞kajících se dokonƒení v∞poƒtu do souboru, pokud si to uºivatel p²ál
  105.   if(mod_ZapisovatProtokol) {
  106.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Hotovo: "+StrL¼ísloZeroPad(mod_¼asHotovo.Hodiny,2)+":"+StrL¼ísloZeroPad(mod_¼asHotovo.Minuty,2)+":"+StrL¼ísloZeroPad(mod_¼asHotovo.Sekundy,2)+"."+StrL¼ísloZeroPad(mod_¼asHotovo.Setiny,2)+"\n");
  107.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Délka v∞poƒtu: "+StrL¼ísloZeroPad(mod_¼asRozdíl.Hodiny,2)+":"+StrL¼ísloZeroPad(mod_¼asRozdíl.Minuty,2)+":"+StrL¼ísloZeroPad(mod_¼asRozdíl.Sekundy,2)+"."+StrL¼ísloZeroPad(mod_¼asRozdíl.Setiny,2)+"\n");
  108.     if(mod_Hledanáⁿeτení == mod_VµECHNA_ⁿEµEN╓) SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Poƒet ²eτení: "+StrD¼íslo(mod_Poƒetⁿeτení,-1,0)+" z "+StrD¼íslo(pow(modDamy_Rozm╪rµachovnice,modDamy_Rozm╪rµachovnice),-1,0)+"\n");
  109.     mod_ProtokolZapiτHotovo();
  110.     }
  111.   // zobrazení doby trvání v∞poƒtu
  112.   mod_VypiτHláτku("Hotovo. Délka: "+StrL¼ísloZeroPad(mod_¼asRozdíl.Hodiny,2)+":"+StrL¼ísloZeroPad(mod_¼asRozdíl.Minuty,2)+":"+StrL¼ísloZeroPad(mod_¼asRozdíl.Sekundy,2)+"."+StrL¼ísloZeroPad(mod_¼asRozdíl.Setiny,2)+"."+(mod_Hledanáⁿeτení==mod_VµECHNA_ⁿEµEN╓?" Poƒet ²eτení: "+StrD¼íslo(mod_Poƒetⁿeτení,-1,0)+" z "+StrD¼íslo(pow(modDamy_Rozm╪rµachovnice,modDamy_Rozm╪rµachovnice),-1,0)+".":""), mod_VYPIµHL╡µKU_¼EKEJNAKL╡VESU);
  113.   }
  114.  
  115. void modDamy_Θklid(void) {
  116.   // uvoln╪ní pam╪ti pouºité pro pole dam
  117.   HromadaUvolniPam╪£(modDamy_µachovnice);
  118.   }
  119.  
  120. void modDamy_ZadáníVstupu(void) {
  121.   // INICIALIZACE REªIMU OBRAZOVKY
  122.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  123.     // p²epnutí do textového reºimu
  124.     P²epniNaText();
  125.     }
  126.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  127.     GrSmaºOkno();
  128.     }
  129.  
  130.   // INFORMACE O REªIMU OBRAZOVKY
  131.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  132.     mod_VypiτHláτku("Pouºívám textov∞ reºim...", mod_VYPIµHL╡µKU_VY¼KEJ);
  133.     }
  134.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  135.     mod_VypiτHláτku("Pouºívám grafick∞ reºim...", mod_VYPIµHL╡µKU_VY¼KEJ);
  136.     }
  137.  
  138.   // ZJIµT╖N╓ ROZM╖RU µACHOVNICE
  139.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  140.     mod_VypiτHláτku("Zadejte rozm╪r τachovnice v políƒkách [4-20]: ", mod_VYPIµHL╡µKU_NE¼EKEJ);
  141.     while((VyprázdniFrontuKláves(),Txt¼tiI¼íslo(modDamy_Rozm╪rµachovnice)) || modDamy_Rozm╪rµachovnice < 4 || modDamy_Rozm╪rµachovnice > 20);
  142.     }
  143.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  144.     mod_VypiτHláτku("Pomocí myτi zvolte rozm╪r τachovnice.", mod_VYPIµHL╡µKU_NE¼EKEJ);
  145.     modDamy_Rozm╪rµachovnice = 4;
  146.     modDamy_Rozm╪rPolíƒka = 88;
  147.     int modDamy_V╪tτíZeVzdáleností;
  148.     int modDamy_Nov∞Rozm╪rµachovnice;
  149.     int modDamy_Nov∞Rozm╪rPolíƒka = modDamy_Rozm╪rPolíƒka;
  150.     MyτZapni();
  151.     MyτNastavPozici(mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1+(modDamy_Rozm╪rµachovnice-0.5)*modDamy_Rozm╪rPolíƒka-1, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1+(modDamy_Rozm╪rµachovnice-0.5)*modDamy_Rozm╪rPolíƒka-1);
  152.     NastavJménoBankyP²edm╪tà("*\\backtraq");
  153.     MyτNastavGrKurzor(26);
  154.     NastavJménoBankyP²edm╪tà("*\\backtraq.mod\\"+AktivníModul->KrátkéJméno);
  155.     MyτVyprázdniFrontuUdálostí();
  156.     VyprázdniFrontuKláves();
  157.     MyτZobrazKurzor();
  158.     // vytvo²ení faleτné události myτi a nastavení faleτného rozm╪ru τachovnice
  159.     // za úƒelem vykreslení τachovnice p²i prvním vstupu do obsluºného cyklu
  160.     // while
  161.     Myτ¼tiUdálost(gMyτUdálost);
  162.     gMyτUdálost.Typ = MyτUdálostPohyb;
  163.     modDamy_Rozm╪rµachovnice = 0;
  164.     // opakování reakcí na události myτi dokud nebylo stisknuto levé tlaƒítko
  165.     // nebo nebyl stisknut Enter
  166.     while(gMyτUdálost.Typ != MyτUdálostLevéTlNahoru && !(BylaStisknutaKlávesa() && ¼tiKlávesuZFronty() == KlEnter)) {
  167.       switch ((int)gMyτUdálost.Typ) {
  168.         case MyτUdálostPohyb:
  169.           // nalezení v╪tτí ze vzdáleností od levého horního rohu
  170.           modDamy_V╪tτíZeVzdáleností = gMyτUdálost.Y-mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1+1;
  171.           if(gMyτUdálost.X-mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1+1 > modDamy_V╪tτíZeVzdáleností) modDamy_V╪tτíZeVzdáleností = gMyτUdálost.X-mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1+1;
  172.           // pokud se zm╪nil poºadovan∞ rozm╪r τachovnice
  173.           if((modDamy_Nov∞Rozm╪rµachovnice = integer((modDamy_V╪tτíZeVzdáleností-1)/(double)modDamy_Rozm╪rPolíƒka)+1) != modDamy_Rozm╪rµachovnice) {
  174.             // redukce rozm╪ru τachovnice, pokud má b∞t menτí neº povolen∞
  175.             if(modDamy_Nov∞Rozm╪rµachovnice < 4) {
  176.               if(modDamy_Nov∞Rozm╪rµachovnice == 4) break;
  177.               else modDamy_Nov∞Rozm╪rµachovnice = 4;
  178.               }
  179.             // redukce rozm╪ru τachovnice, pokud má b∞t v╪tτí neº povolen∞
  180.             else if(modDamy_Nov∞Rozm╪rµachovnice > 20) {
  181.               if(modDamy_Nov∞Rozm╪rµachovnice == 20) break;
  182.               else modDamy_Nov∞Rozm╪rµachovnice = 20;
  183.               }
  184.             // pokud se rozm╪r τachovnice nezm╪nil, nemá smysl dále pokraƒovat
  185.             if(modDamy_Nov∞Rozm╪rµachovnice == modDamy_Rozm╪rµachovnice) break;
  186.             // zm╪na rozm╪ru políƒka o polovinu v p²ípad╪ pot²eby
  187.             if(modDamy_Nov∞Rozm╪rµachovnice > modDamy_Rozm╪rµachovnice) {
  188.               if(modDamy_Rozm╪rµachovnice < 6 && modDamy_Nov∞Rozm╪rµachovnice >= 6) modDamy_Nov∞Rozm╪rPolíƒka /= 2;
  189.               if(modDamy_Rozm╪rµachovnice < 11 && modDamy_Nov∞Rozm╪rµachovnice >= 11) modDamy_Nov∞Rozm╪rPolíƒka /= 2;
  190.               }
  191.             else if(modDamy_Nov∞Rozm╪rµachovnice < modDamy_Rozm╪rµachovnice) {
  192.               if(modDamy_Rozm╪rµachovnice >= 6 && modDamy_Nov∞Rozm╪rµachovnice < 6) modDamy_Nov∞Rozm╪rPolíƒka *= 2;
  193.               if(modDamy_Rozm╪rµachovnice >= 11 && modDamy_Nov∞Rozm╪rµachovnice < 11) modDamy_Nov∞Rozm╪rPolíƒka *= 2;
  194.               }
  195.             // p²emíst╪ní kurzoru myτi v p²ípad╪ zm╪ny rozm╪ru políƒka
  196.             if(modDamy_Nov∞Rozm╪rPolíƒka != modDamy_Rozm╪rPolíƒka) {
  197.               MyτNastavPozici(mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1+(modDamy_Nov∞Rozm╪rµachovnice-0.5)*modDamy_Nov∞Rozm╪rPolíƒka, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1+(modDamy_Nov∞Rozm╪rµachovnice-0.5)*modDamy_Nov∞Rozm╪rPolíƒka);
  198.               modDamy_Rozm╪rPolíƒka = modDamy_Nov∞Rozm╪rPolíƒka;
  199.               }
  200.             // nastavení nového rozm╪ru τachovnice jako aktuálního
  201.             modDamy_Rozm╪rµachovnice = modDamy_Nov∞Rozm╪rµachovnice;
  202.             // vykreslení nové τachovnice a vypsání nového rozm╪ru
  203.             MyτSchovejKurzor();
  204.             GrSmaºOkno();
  205.             GrNastavPozici(450,0);
  206.             GrNastavBarvuPop²edí(Pal¼erná);
  207.             GrPiτⁿet╪zec("Aktuální rozm╪r: ");
  208.             GrPiτL¼íslo(modDamy_Rozm╪rµachovnice,-1);
  209.             GrPiτZnak('x');
  210.             GrPiτL¼íslo(modDamy_Rozm╪rµachovnice,-1);
  211.             modDamy_Vykresliµachovnici(0);
  212.             MyτZobrazKurzor();
  213.             }
  214.           break;
  215.         }
  216.       Myτ¼tiUdálost(gMyτUdálost);
  217.       }
  218.     MyτSchovejKurzor();
  219.     MyτVypni();
  220.     GrSmaºOkno();
  221.     }
  222.  
  223.   // INFORMACE O ROZM╖RU µACHOVNICE
  224.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  225.     mod_VypiτHláτku("Pouºívám τachovnici o rozm╪ru "+StrL¼íslo(modDamy_Rozm╪rµachovnice,-1)+"x"+StrL¼íslo(modDamy_Rozm╪rµachovnice,-1)+"...", mod_VYPIµHL╡µKU_VY¼KEJ);
  226.     }
  227.  
  228.   // ZJIµT╖N╓, KTER╡ ⁿEµEN╓ HLEDAT
  229.   mod_NechZvolit_Volby[0] = "jakékoliv ²eτení"; mod_NechZvolit_AccessKeys[0] = 'j';
  230.   mod_NechZvolit_Volby[1] = "vτechna ²eτení"; mod_NechZvolit_AccessKeys[1] = 'v';
  231.   switch(mod_NechZvolit("Co chcete nalézt?")) {
  232.     case 0: mod_Hledanáⁿeτení = mod_JAKÉKOLIV_ⁿEµEN╓; break;
  233.     case 1: mod_Hledanáⁿeτení = mod_VµECHNA_ⁿEµEN╓; break;
  234.     }
  235.  
  236.   // INFORMACE O TOM, KTER╡ ⁿEµEN╓ HLEDAT
  237.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  238.     mod_VypiτHláτku("Budu hledat "+(mod_Hledanáⁿeτení==mod_VµECHNA_ⁿEµEN╓?"vτechna":"jakékoliv")+" ²eτení...", mod_VYPIµHL╡µKU_VY¼KEJ);
  239.     }
  240.  
  241.   // ZJIµT╖N╓, KTERÉ POZICE ZOBRAZOVAT
  242.   mod_NechZvolit_Volby[0] = "jen ²eτení"; mod_NechZvolit_AccessKeys[0] = '²';
  243.   mod_NechZvolit_Volby[1] = "i pràb╪h hledání"; mod_NechZvolit_AccessKeys[1] = 'p';
  244.   switch(mod_NechZvolit("Zobrazovat jen nalezená ²eτení nebo i pràb╪h hledání (upozorn╪ní: pomalé)?")) {
  245.     case 0: mod_ZobrazovanéPozice = mod_POUZE_ⁿEµEN╓; break;
  246.     case 1: mod_ZobrazovanéPozice = mod_VµECHNY_POZICE; break;
  247.     }
  248.  
  249.   // INFORMACE O TOM, KTERÉ POZICE ZOBRAZOVAT
  250.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  251.     mod_VypiτHláτku("Budu zobrazovat "+(mod_ZobrazovanéPozice==mod_POUZE_ⁿEµEN╓?"jen nalezená ²eτení":"i pràb╪h hledání")+"...", mod_VYPIµHL╡µKU_VY¼KEJ);
  252.     }
  253.  
  254.   // ZJIµT╖N╓, ZDA ¼EKAT PO NALEZEN╓ ⁿEµEN╓ NA STISK KL╡VESY
  255.   if(mod_Hledanáⁿeτení == mod_JAKÉKOLIV_ⁿEµEN╓) {
  256.     // pokud se hledá pouze jedno ²eτení, ƒeká se po jeho nalezení na stisk klávesy vºdycky
  257.     mod_¼ekatNaKlávesu = 1;
  258.     }
  259.   else {
  260.     mod_NechZvolit_Volby[0] = "ano, vyƒkat"; mod_NechZvolit_AccessKeys[0] = 'a';
  261.     mod_NechZvolit_Volby[1] = "ne, neƒekat"; mod_NechZvolit_AccessKeys[1] = 'n';
  262.     switch(mod_NechZvolit("Vyƒkat po nalezení ²eτení na stisknutí klávesy?")) {
  263.       case 0: mod_¼ekatNaKlávesu = 1; break;
  264.       case 1: mod_¼ekatNaKlávesu = 0; break;
  265.       }
  266.  
  267.     // INFORMACE O TOM, ZDA PO NALEZEN╓ ⁿEµEN╓ ¼EKAT NA STISK KL╡VESY
  268.     if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  269.       mod_VypiτHláτku("Po nalezení ²eτení "+(mod_¼ekatNaKlávesu?"budu":"nebudu")+" ƒekat na stisk klávesy...", mod_VYPIµHL╡µKU_VY¼KEJ);
  270.       }
  271.     }
  272.  
  273.   // ZJIµT╖N╓, ZDA ZAPISOVAT PROTOKOL O VφPO¼TU DO SOUBORU
  274.   mod_NechZvolit_Volby[0] = "ano, zapisovat"; mod_NechZvolit_AccessKeys[0] = 'a';
  275.   mod_NechZvolit_Volby[1] = "ne, nezapisovat"; mod_NechZvolit_AccessKeys[1] = 'n';
  276.   switch(mod_NechZvolit("Zapisovat protokol o v∞poƒtu do souboru?")) {
  277.     case 0: mod_ZapisovatProtokol = 1; break;
  278.     case 1: mod_ZapisovatProtokol = 0; break;
  279.     }
  280.  
  281.   // INFORMACE O TOM, ZDA ZAPISOVAT PROTOKOL O VφPO¼TU DO SOUBORU
  282.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  283.     mod_VypiτHláτku("Protokol o v∞poƒtu "+(mod_ZapisovatProtokol?"budu":"nebudu")+" zapisovat do souboru...", mod_VYPIµHL╡µKU_VY¼KEJ);
  284.     }
  285.  
  286.   if(mod_ZapisovatProtokol) {
  287.     // ZJIµT╖N╓ N╡ZVU SOUBORU, KAM ZAPISOVAT PROTOKOL O VφPO¼TU
  288.     mod_VypiτHláτku("Zadejte název souboru: ", mod_VYPIµHL╡µKU_NE¼EKEJ);
  289.     mod_ZapisovatProtokol_Název = "";
  290.     if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  291.       Txtⁿádkov∞Editor(mod_ZapisovatProtokol_Název,50,50,-1,0);
  292.       TxtPiτNov∞ⁿádek();
  293.       }
  294.     else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  295.       GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN);
  296.       VyprázdniFrontuKláves();
  297.       Grⁿádkov∞Editor(mod_ZapisovatProtokol_Název,50,-1,0,-1,PalTmav╪Modrá<<4|Palªlutá);
  298.       GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA);
  299.       }
  300.     if(StrKopie(mod_ZapisovatProtokol_Název, 1, 1) != ":") mod_ZapisovatProtokol_Název = "*\\" + mod_ZapisovatProtokol_Název;
  301.  
  302.     // INFORMACE O N╡ZVU SOUBORU, KAM ZAPISOVAT PROTOKOL O VφPO¼TU
  303.     if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  304.       mod_VypiτHláτku("Zvolen soubor "+mod_ZapisovatProtokol_Název+"...", mod_VYPIµHL╡µKU_VY¼KEJ);
  305.       }
  306.     }
  307.  
  308.   // Pⁿ╓PRAVA POLE DAM (µACHOVNICE)
  309.   // alokace pam╪ti pro pole
  310.   modDamy_µachovnice = (int*)HromadaAlokujPam╪£(modDamy_Rozm╪rµachovnice*sizeof(modDamy_µachovnice[0]));
  311.   // nastavení vτech prvkà pole tak, aby dámy na zaƒátku byly mimo τachovnici
  312.   memset(modDamy_µachovnice, modDamy_Rozm╪rµachovnice, modDamy_Rozm╪rµachovnice*sizeof(modDamy_µachovnice[0]));
  313.   }
  314.  
  315. void modDamy_OptimalizaceVstupu(void) {
  316.   }
  317.  
  318. void modDamy_OpakováníInicializace(void) {
  319.   modDamy_µachovnice[modDamy_Θroveσ] = 0;
  320.   }
  321.  
  322. int modDamy_OpakováníTest(void) {
  323.   return modDamy_µachovnice[modDamy_Θroveσ] < modDamy_Rozm╪rµachovnice;
  324.   }
  325.  
  326. void modDamy_OpakováníIterace(void) {
  327.   modDamy_µachovnice[modDamy_Θroveσ]++;
  328.   }
  329.  
  330. void modDamy_Dalτí¼lánek_P²ed(void) {
  331.   // zv∞τení úrovn╪ backtrackingu (práv╪ umís£ované dámy)
  332.   modDamy_Θroveσ++;
  333.   }
  334.  
  335. void modDamy_Dalτí¼lánek_Po(void) {
  336.   // zmenτení úrovn╪ backtrackingu (práv╪ umís£ované dámy)
  337.   modDamy_Θroveσ--;
  338.   }
  339.  
  340. int modDamy_TestVyhovuje(void) {
  341.   // zobrazení práv╪ testované pozice, pokud si uºivatel toto nastavil
  342.   if(mod_ZobrazovanéPozice == mod_VµECHNY_POZICE) {
  343.     if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  344.       TxtPiτⁿet╪zec(modDamy_PoleDamNaⁿet╪zec(modDamy_µachovnice));
  345.       TxtPiτNov∞ⁿádek();
  346.       }
  347.     else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  348.       modDamy_Vykresliµachovnici(1);
  349.       }
  350.     if(mod_ZapisovatProtokol) {
  351.       SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, modDamy_PoleDamNaⁿet╪zec(modDamy_µachovnice));
  352.       SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor);
  353.       }
  354.     }
  355.   // zjiτt╪ní, zda nalezená pozice vyhovuje podmínkám úlohy
  356.   int modDamy_TestovanáDáma;
  357.   for(modDamy_TestovanáDáma=0; modDamy_TestovanáDáma<modDamy_Θroveσ; modDamy_TestovanáDáma++) {
  358.     if(modDamy_µachovnice[modDamy_TestovanáDáma] == modDamy_µachovnice[modDamy_Θroveσ] || abs(modDamy_µachovnice[modDamy_TestovanáDáma]-modDamy_µachovnice[modDamy_Θroveσ]) == abs(modDamy_TestovanáDáma-modDamy_Θroveσ)) {
  359.       return 0;
  360.       break;
  361.       }
  362.     }
  363.   return 1;
  364.   }
  365.  
  366. int modDamy_TestNalezeno(void) {
  367.   return !(modDamy_Θroveσ < modDamy_Rozm╪rµachovnice-1);
  368.   }
  369.  
  370. void modDamy_Nalezeno(void) {
  371.   // zv∞τení poƒtu nalezen∞ch ²eτení
  372.   mod_Poƒetⁿeτení++;
  373.   // zabrán╪ní pokraƒování v backtrackingu, pokud uºivateli staƒí jakékoliv ²eτení
  374.   if(mod_Hledanáⁿeτení == mod_JAKÉKOLIV_ⁿEµEN╓) mod_HledatDál = 0;
  375.   // zobrazení práv╪ nalezeného ²eτení
  376.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  377.     TxtPiτⁿet╪zec("NALEZENO ⁿEµEN╓: ");
  378.     TxtPiτⁿet╪zec(modDamy_PoleDamNaⁿet╪zec(modDamy_µachovnice));
  379.     TxtPiτNov∞ⁿádek();
  380.     }
  381.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  382.     mod_VypiτHláτku("Nalezeno "+StrL¼íslo(mod_Poƒetⁿeτení,-1)+". ²eτení: " + modDamy_PoleDamNaⁿet╪zec(modDamy_µachovnice), mod_VYPIµHL╡µKU_NE¼EKEJ);
  383.     if(mod_ZobrazovanéPozice == mod_POUZE_ⁿEµEN╓) modDamy_Vykresliµachovnici(1);
  384.     }
  385.   // zápis práv╪ nalezeného ²eτení do souboru, pokud si to uºivatel p²ál
  386.   if(mod_ZapisovatProtokol) {
  387.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "NALEZENO ⁿEµEN╓: ");
  388.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, modDamy_PoleDamNaⁿet╪zec(modDamy_µachovnice));
  389.     SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor);
  390.     }
  391.   // v p²ípad╪ grafického reºimu, pokud se ale nehledají vτechna ²eτení a zároveσ nezobrazují pouze nalezená ²eτení, pípnutí - oznámení nalezení ²eτení
  392.   if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM && !(mod_Hledanáⁿeτení == mod_VµECHNA_ⁿEµEN╓ && mod_ZobrazovanéPozice == mod_POUZE_ⁿEµEN╓)) { Tón(1000); ¼ekej(100); VypniTón(); }
  393.   // vyƒkání na stisk klávesy, pokud si to uºivatel p²ál
  394.   if(mod_¼ekatNaKlávesu) ¼ekejNaKlávesu();
  395.   }
  396.  
  397. void modDamy_InfoOModulu(struct _ModulInfo* ModulInfo) {
  398.   ModulInfo->KrátkéJméno = "DAMY";
  399.   ModulInfo->DlouhéJméno = "Problém osmi dam";
  400.   ModulInfo->Popis = "Problém osmi dam je klasick∞ problém spoƒívající v hledání odpov╪di na otázku, jak rozestavit na τachovnici osm dam tak, aby se vzájemn╪ neohroºovaly (vodorovn╪, svisle ani diagonáln╪). Tento modul navíc ²eτí cel∞ problém obecn╪ji, dle volby uºivatele pro ƒty²i aº dvacet dam (a τachovnice pat²iƒn∞ch rozm╪rà).";
  401.   ModulInfo->Verze = 1.1; // version 1.0 from 2002-08-22
  402.   ModulInfo->Datum.Den = 7;
  403.   ModulInfo->Datum.M╪síc = 9;
  404.   ModulInfo->Datum.Rok = 2002;
  405.   ModulInfo->Autor = "Marek Blahuτ";
  406.   ModulInfo->Kontakt = "blahus@seznam.cz";
  407.   ModulInfo->Start = &modDamy_Start;
  408.   ModulInfo->Hotovo = &modDamy_Hotovo;
  409.   ModulInfo->Θklid = &modDamy_Θklid;
  410.   ModulInfo->ZadáníVstupu = &modDamy_ZadáníVstupu;
  411.   ModulInfo->OptimalizaceVstupu = &modDamy_OptimalizaceVstupu;
  412.   ModulInfo->OpakováníInicializace = &modDamy_OpakováníInicializace;
  413.   ModulInfo->OpakováníTest = &modDamy_OpakováníTest;
  414.   ModulInfo->OpakováníIterace = &modDamy_OpakováníIterace;
  415.   ModulInfo->Dalτí¼lánek_P²ed = &modDamy_Dalτí¼lánek_P²ed;
  416.   ModulInfo->Dalτí¼lánek_Po = &modDamy_Dalτí¼lánek_Po;
  417.   ModulInfo->TestVyhovuje = &modDamy_TestVyhovuje;
  418.   ModulInfo->TestNalezeno = &modDamy_TestNalezeno;
  419.   ModulInfo->Nalezeno = &modDamy_Nalezeno;
  420.   }
  421.