home *** CD-ROM | disk | FTP | other *** search
Wrap
// soukromé konstanty // konstanty pro barvy na τachovnici # define modDamy_BARVA_B╓L╡ 1 # define modDamy_BARVA_¼ERN╡ 2 // soukromé prom╪nné int modDamy_Rozm╪rµachovnice; // rozm╪r τachovnice int modDamy_Rozm╪rPolíƒka; // velikost políƒka τachovnice int *modDamy_µachovnice; // umíst╪ní dam na τachovnici (prvky pole = sloupce) int modDamy_Θroveσ; // úroveσ zano²ení v backtrackingu (práv╪ umís£ovaná dáma) // soukromé funkce void modDamy_Vykresliµachovnici(int KreslitDámy) { int modDamy_KreslenéPolíƒkoX, modDamy_KreslenéPolíƒkoY; int modDamy_KreslenéPolíƒkoBarva; int modDamy_KreslenéPolíƒkoDáma; for(modDamy_KreslenéPolíƒkoX = 0; modDamy_KreslenéPolíƒkoX < modDamy_Rozm╪rµachovnice; modDamy_KreslenéPolíƒkoX++) { for(modDamy_KreslenéPolíƒkoY = 0; modDamy_KreslenéPolíƒkoY < modDamy_Rozm╪rµachovnice; modDamy_KreslenéPolíƒkoY++) { // vykreslení políƒka τachovnice pat²iƒné velikosti, barvy a figury modDamy_KreslenéPolíƒkoBarva = ((int)abs((double)(modDamy_KreslenéPolíƒkoX-modDamy_KreslenéPolíƒkoY))%2)?modDamy_BARVA_¼ERN╡:modDamy_BARVA_B╓L╡; 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; 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, 1, modDamy_KreslenéPolíƒkoX*modDamy_Rozm╪rPolíƒka, modDamy_KreslenéPolíƒkoY*modDamy_Rozm╪rPolíƒka, integer((modDamy_Rozm╪rPolíƒka-1)/39)+1, integer((modDamy_Rozm╪rPolíƒka-1)/29)+1); } } } string modDamy_PoleDamNaⁿet╪zec(int *modDamy_P²evád╪néPole) { string modDamy_Vrátit = ""; int modDamy_P²evád╪náDáma; 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++) { if(modDamy_Rozm╪rµachovnice <= 8) modDamy_Vrátit += (string)(char)('a'+modDamy_P²evád╪náDáma); modDamy_Vrátit += StrL¼íslo(modDamy_P²evád╪néPole[modDamy_P²evád╪náDáma]+1,-1)+" "; } modDamy_Vrátit = StrKopie(modDamy_Vrátit, 0, StrDélka(modDamy_Vrátit)-1); return modDamy_Vrátit; } // ve²ejné funkce void modDamy_Start(void) { // v p²ípad╪ grafického reºimu: if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { // smazání obrazovky GrSmaºOkno(); // vykreslení τachovnice modDamy_Vykresliµachovnici(1); } 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); VyprázdniFrontuKláves(); MyτZapni(); ¼ekej(NaKlávesu|NaMyτ); VyprázdniFrontuKláves(); MyτVypni(); // smazání obrazovky v p²ípad╪ textového reºimu if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { TxtSmaºObrazovku(); } mod_VypiτHláτku("Probíhá v∞poƒet...", mod_VYPIµHL╡µKU_NE¼EKEJ); // inicializace prom╪nn∞ch pouºívan∞ch v∞poƒtem modDamy_Θroveσ = 0; mod_Poƒetⁿeτení = 0; mod_HledatDál = 1; // zaznamenání ƒasu startu v∞poƒtu Systémov∞¼as(mod_¼asStart); // zapsání parametrà v∞poƒtu do souboru, pokud si to uºivatel p²ál if(mod_ZapisovatProtokol) { mod_ProtokolZapiτStart1(); SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Reºim obrazovky: "+(mod_ReºimObrazovky==mod_TEXTOVφ_REªIM?"textov∞":"grafick∞")+"\n"); 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"); SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Hledaná ²eτení: "+(mod_Hledanáⁿeτení==mod_VµECHNA_ⁿEµEN╓?"vτechna":"jakékoliv")+"\n"); 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"); SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Vyƒkat po nalezení ²eτení na stisk klávesy: "+(mod_¼ekatNaKlávesu?"ano":"ne")+"\n"); SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Zapisovat protokol o v∞poƒtu: "+(mod_ZapisovatProtokol?"ano":"ne")+"\n"); SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Soubor protokolu: "+mod_ZapisovatProtokol_Název+"\n"); mod_ProtokolZapiτStart2(); } } void modDamy_Hotovo(void) { // uloºení ƒasu dokonƒení v∞poƒtu Systémov∞¼as(mod_¼asHotovo); // pokud si uºivatel nep²ál najít pouze jedno ²eτení (a tedy toto nechat zobrazené) if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM && mod_Hledanáⁿeτení != mod_JAKÉKOLIV_ⁿEµEN╓) { // p²ekreslení τachovnice (te╘ jiº prázdné) modDamy_Vykresliµachovnici(1); } // v p²ípad╪ grafického reºimu pípnutí - oznámení dokonƒení v∞poƒtu if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { Tón(1000); ¼ekej(1500); VypniTón(); } // v∞poƒet doby trvání v∞poƒtu mod_V∞poƒetDobyTrváníV∞poƒtu(); // zapsání informací t∞kajících se dokonƒení v∞poƒtu do souboru, pokud si to uºivatel p²ál if(mod_ZapisovatProtokol) { 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"); 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"); 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"); mod_ProtokolZapiτHotovo(); } // zobrazení doby trvání v∞poƒtu 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); } void modDamy_Θklid(void) { // uvoln╪ní pam╪ti pouºité pro pole dam HromadaUvolniPam╪£(modDamy_µachovnice); } void modDamy_ZadáníVstupu(void) { // INICIALIZACE REªIMU OBRAZOVKY if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { // p²epnutí do textového reºimu P²epniNaText(); } else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { GrSmaºOkno(); } // INFORMACE O REªIMU OBRAZOVKY if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { mod_VypiτHláτku("Pouºívám textov∞ reºim...", mod_VYPIµHL╡µKU_VY¼KEJ); } else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { mod_VypiτHláτku("Pouºívám grafick∞ reºim...", mod_VYPIµHL╡µKU_VY¼KEJ); } // ZJIµT╖N╓ ROZM╖RU µACHOVNICE if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { mod_VypiτHláτku("Zadejte rozm╪r τachovnice v políƒkách [4-20]: ", mod_VYPIµHL╡µKU_NE¼EKEJ); while((VyprázdniFrontuKláves(),Txt¼tiI¼íslo(modDamy_Rozm╪rµachovnice)) || modDamy_Rozm╪rµachovnice < 4 || modDamy_Rozm╪rµachovnice > 20); } else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { mod_VypiτHláτku("Pomocí myτi zvolte rozm╪r τachovnice.", mod_VYPIµHL╡µKU_NE¼EKEJ); modDamy_Rozm╪rµachovnice = 4; modDamy_Rozm╪rPolíƒka = 88; int modDamy_V╪tτíZeVzdáleností; int modDamy_Nov∞Rozm╪rµachovnice; int modDamy_Nov∞Rozm╪rPolíƒka = modDamy_Rozm╪rPolíƒka; MyτZapni(); 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); NastavJménoBankyP²edm╪tà("*\\backtraq"); MyτNastavGrKurzor(26); NastavJménoBankyP²edm╪tà("*\\backtraq.mod\\"+AktivníModul->KrátkéJméno); MyτVyprázdniFrontuUdálostí(); VyprázdniFrontuKláves(); MyτZobrazKurzor(); // vytvo²ení faleτné události myτi a nastavení faleτného rozm╪ru τachovnice // za úƒelem vykreslení τachovnice p²i prvním vstupu do obsluºného cyklu // while Myτ¼tiUdálost(gMyτUdálost); gMyτUdálost.Typ = MyτUdálostPohyb; modDamy_Rozm╪rµachovnice = 0; // opakování reakcí na události myτi dokud nebylo stisknuto levé tlaƒítko // nebo nebyl stisknut Enter while(gMyτUdálost.Typ != MyτUdálostLevéTlNahoru && !(BylaStisknutaKlávesa() && ¼tiKlávesuZFronty() == KlEnter)) { switch ((int)gMyτUdálost.Typ) { case MyτUdálostPohyb: // nalezení v╪tτí ze vzdáleností od levého horního rohu modDamy_V╪tτíZeVzdáleností = gMyτUdálost.Y-mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1+1; 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; // pokud se zm╪nil poºadovan∞ rozm╪r τachovnice if((modDamy_Nov∞Rozm╪rµachovnice = integer((modDamy_V╪tτíZeVzdáleností-1)/(double)modDamy_Rozm╪rPolíƒka)+1) != modDamy_Rozm╪rµachovnice) { // redukce rozm╪ru τachovnice, pokud má b∞t menτí neº povolen∞ if(modDamy_Nov∞Rozm╪rµachovnice < 4) { if(modDamy_Nov∞Rozm╪rµachovnice == 4) break; else modDamy_Nov∞Rozm╪rµachovnice = 4; } // redukce rozm╪ru τachovnice, pokud má b∞t v╪tτí neº povolen∞ else if(modDamy_Nov∞Rozm╪rµachovnice > 20) { if(modDamy_Nov∞Rozm╪rµachovnice == 20) break; else modDamy_Nov∞Rozm╪rµachovnice = 20; } // pokud se rozm╪r τachovnice nezm╪nil, nemá smysl dále pokraƒovat if(modDamy_Nov∞Rozm╪rµachovnice == modDamy_Rozm╪rµachovnice) break; // zm╪na rozm╪ru políƒka o polovinu v p²ípad╪ pot²eby if(modDamy_Nov∞Rozm╪rµachovnice > modDamy_Rozm╪rµachovnice) { if(modDamy_Rozm╪rµachovnice < 6 && modDamy_Nov∞Rozm╪rµachovnice >= 6) modDamy_Nov∞Rozm╪rPolíƒka /= 2; if(modDamy_Rozm╪rµachovnice < 11 && modDamy_Nov∞Rozm╪rµachovnice >= 11) modDamy_Nov∞Rozm╪rPolíƒka /= 2; } else if(modDamy_Nov∞Rozm╪rµachovnice < modDamy_Rozm╪rµachovnice) { if(modDamy_Rozm╪rµachovnice >= 6 && modDamy_Nov∞Rozm╪rµachovnice < 6) modDamy_Nov∞Rozm╪rPolíƒka *= 2; if(modDamy_Rozm╪rµachovnice >= 11 && modDamy_Nov∞Rozm╪rµachovnice < 11) modDamy_Nov∞Rozm╪rPolíƒka *= 2; } // p²emíst╪ní kurzoru myτi v p²ípad╪ zm╪ny rozm╪ru políƒka if(modDamy_Nov∞Rozm╪rPolíƒka != modDamy_Rozm╪rPolíƒka) { 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); modDamy_Rozm╪rPolíƒka = modDamy_Nov∞Rozm╪rPolíƒka; } // nastavení nového rozm╪ru τachovnice jako aktuálního modDamy_Rozm╪rµachovnice = modDamy_Nov∞Rozm╪rµachovnice; // vykreslení nové τachovnice a vypsání nového rozm╪ru MyτSchovejKurzor(); GrSmaºOkno(); GrNastavPozici(450,0); GrNastavBarvuPop²edí(Pal¼erná); GrPiτⁿet╪zec("Aktuální rozm╪r: "); GrPiτL¼íslo(modDamy_Rozm╪rµachovnice,-1); GrPiτZnak('x'); GrPiτL¼íslo(modDamy_Rozm╪rµachovnice,-1); modDamy_Vykresliµachovnici(0); MyτZobrazKurzor(); } break; } Myτ¼tiUdálost(gMyτUdálost); } MyτSchovejKurzor(); MyτVypni(); GrSmaºOkno(); } // INFORMACE O ROZM╖RU µACHOVNICE if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { 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); } // ZJIµT╖N╓, KTER╡ ⁿEµEN╓ HLEDAT mod_NechZvolit_Volby[0] = "jakékoliv ²eτení"; mod_NechZvolit_AccessKeys[0] = 'j'; mod_NechZvolit_Volby[1] = "vτechna ²eτení"; mod_NechZvolit_AccessKeys[1] = 'v'; switch(mod_NechZvolit("Co chcete nalézt?")) { case 0: mod_Hledanáⁿeτení = mod_JAKÉKOLIV_ⁿEµEN╓; break; case 1: mod_Hledanáⁿeτení = mod_VµECHNA_ⁿEµEN╓; break; } // INFORMACE O TOM, KTER╡ ⁿEµEN╓ HLEDAT if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { 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); } // ZJIµT╖N╓, KTERÉ POZICE ZOBRAZOVAT mod_NechZvolit_Volby[0] = "jen ²eτení"; mod_NechZvolit_AccessKeys[0] = '²'; mod_NechZvolit_Volby[1] = "i pràb╪h hledání"; mod_NechZvolit_AccessKeys[1] = 'p'; switch(mod_NechZvolit("Zobrazovat jen nalezená ²eτení nebo i pràb╪h hledání (upozorn╪ní: pomalé)?")) { case 0: mod_ZobrazovanéPozice = mod_POUZE_ⁿEµEN╓; break; case 1: mod_ZobrazovanéPozice = mod_VµECHNY_POZICE; break; } // INFORMACE O TOM, KTERÉ POZICE ZOBRAZOVAT if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { 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); } // ZJIµT╖N╓, ZDA ¼EKAT PO NALEZEN╓ ⁿEµEN╓ NA STISK KL╡VESY if(mod_Hledanáⁿeτení == mod_JAKÉKOLIV_ⁿEµEN╓) { // pokud se hledá pouze jedno ²eτení, ƒeká se po jeho nalezení na stisk klávesy vºdycky mod_¼ekatNaKlávesu = 1; } else { mod_NechZvolit_Volby[0] = "ano, vyƒkat"; mod_NechZvolit_AccessKeys[0] = 'a'; mod_NechZvolit_Volby[1] = "ne, neƒekat"; mod_NechZvolit_AccessKeys[1] = 'n'; switch(mod_NechZvolit("Vyƒkat po nalezení ²eτení na stisknutí klávesy?")) { case 0: mod_¼ekatNaKlávesu = 1; break; case 1: mod_¼ekatNaKlávesu = 0; break; } // INFORMACE O TOM, ZDA PO NALEZEN╓ ⁿEµEN╓ ¼EKAT NA STISK KL╡VESY if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { mod_VypiτHláτku("Po nalezení ²eτení "+(mod_¼ekatNaKlávesu?"budu":"nebudu")+" ƒekat na stisk klávesy...", mod_VYPIµHL╡µKU_VY¼KEJ); } } // ZJIµT╖N╓, ZDA ZAPISOVAT PROTOKOL O VφPO¼TU DO SOUBORU mod_NechZvolit_Volby[0] = "ano, zapisovat"; mod_NechZvolit_AccessKeys[0] = 'a'; mod_NechZvolit_Volby[1] = "ne, nezapisovat"; mod_NechZvolit_AccessKeys[1] = 'n'; switch(mod_NechZvolit("Zapisovat protokol o v∞poƒtu do souboru?")) { case 0: mod_ZapisovatProtokol = 1; break; case 1: mod_ZapisovatProtokol = 0; break; } // INFORMACE O TOM, ZDA ZAPISOVAT PROTOKOL O VφPO¼TU DO SOUBORU if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { mod_VypiτHláτku("Protokol o v∞poƒtu "+(mod_ZapisovatProtokol?"budu":"nebudu")+" zapisovat do souboru...", mod_VYPIµHL╡µKU_VY¼KEJ); } if(mod_ZapisovatProtokol) { // ZJIµT╖N╓ N╡ZVU SOUBORU, KAM ZAPISOVAT PROTOKOL O VφPO¼TU mod_VypiτHláτku("Zadejte název souboru: ", mod_VYPIµHL╡µKU_NE¼EKEJ); mod_ZapisovatProtokol_Název = ""; if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { Txtⁿádkov∞Editor(mod_ZapisovatProtokol_Název,50,50,-1,0); TxtPiτNov∞ⁿádek(); } else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN); VyprázdniFrontuKláves(); Grⁿádkov∞Editor(mod_ZapisovatProtokol_Název,50,-1,0,-1,PalTmav╪Modrá<<4|Palªlutá); GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA); } if(StrKopie(mod_ZapisovatProtokol_Název, 1, 1) != ":") mod_ZapisovatProtokol_Název = "*\\" + mod_ZapisovatProtokol_Název; // INFORMACE O N╡ZVU SOUBORU, KAM ZAPISOVAT PROTOKOL O VφPO¼TU if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { mod_VypiτHláτku("Zvolen soubor "+mod_ZapisovatProtokol_Název+"...", mod_VYPIµHL╡µKU_VY¼KEJ); } } // Pⁿ╓PRAVA POLE DAM (µACHOVNICE) // alokace pam╪ti pro pole modDamy_µachovnice = (int*)HromadaAlokujPam╪£(modDamy_Rozm╪rµachovnice*sizeof(modDamy_µachovnice[0])); // nastavení vτech prvkà pole tak, aby dámy na zaƒátku byly mimo τachovnici memset(modDamy_µachovnice, modDamy_Rozm╪rµachovnice, modDamy_Rozm╪rµachovnice*sizeof(modDamy_µachovnice[0])); } void modDamy_OptimalizaceVstupu(void) { } void modDamy_OpakováníInicializace(void) { modDamy_µachovnice[modDamy_Θroveσ] = 0; } int modDamy_OpakováníTest(void) { return modDamy_µachovnice[modDamy_Θroveσ] < modDamy_Rozm╪rµachovnice; } void modDamy_OpakováníIterace(void) { modDamy_µachovnice[modDamy_Θroveσ]++; } void modDamy_Dalτí¼lánek_P²ed(void) { // zv∞τení úrovn╪ backtrackingu (práv╪ umís£ované dámy) modDamy_Θroveσ++; } void modDamy_Dalτí¼lánek_Po(void) { // zmenτení úrovn╪ backtrackingu (práv╪ umís£ované dámy) modDamy_Θroveσ--; } int modDamy_TestVyhovuje(void) { // zobrazení práv╪ testované pozice, pokud si uºivatel toto nastavil if(mod_ZobrazovanéPozice == mod_VµECHNY_POZICE) { if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { TxtPiτⁿet╪zec(modDamy_PoleDamNaⁿet╪zec(modDamy_µachovnice)); TxtPiτNov∞ⁿádek(); } else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { modDamy_Vykresliµachovnici(1); } if(mod_ZapisovatProtokol) { SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, modDamy_PoleDamNaⁿet╪zec(modDamy_µachovnice)); SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor); } } // zjiτt╪ní, zda nalezená pozice vyhovuje podmínkám úlohy int modDamy_TestovanáDáma; for(modDamy_TestovanáDáma=0; modDamy_TestovanáDáma<modDamy_Θroveσ; modDamy_TestovanáDáma++) { 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σ)) { return 0; break; } } return 1; } int modDamy_TestNalezeno(void) { return !(modDamy_Θroveσ < modDamy_Rozm╪rµachovnice-1); } void modDamy_Nalezeno(void) { // zv∞τení poƒtu nalezen∞ch ²eτení mod_Poƒetⁿeτení++; // zabrán╪ní pokraƒování v backtrackingu, pokud uºivateli staƒí jakékoliv ²eτení if(mod_Hledanáⁿeτení == mod_JAKÉKOLIV_ⁿEµEN╓) mod_HledatDál = 0; // zobrazení práv╪ nalezeného ²eτení if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) { TxtPiτⁿet╪zec("NALEZENO ⁿEµEN╓: "); TxtPiτⁿet╪zec(modDamy_PoleDamNaⁿet╪zec(modDamy_µachovnice)); TxtPiτNov∞ⁿádek(); } else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { 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); if(mod_ZobrazovanéPozice == mod_POUZE_ⁿEµEN╓) modDamy_Vykresliµachovnici(1); } // zápis práv╪ nalezeného ²eτení do souboru, pokud si to uºivatel p²ál if(mod_ZapisovatProtokol) { SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "NALEZENO ⁿEµEN╓: "); SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, modDamy_PoleDamNaⁿet╪zec(modDamy_µachovnice)); SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor); } // 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í 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(); } // vyƒkání na stisk klávesy, pokud si to uºivatel p²ál if(mod_¼ekatNaKlávesu) ¼ekejNaKlávesu(); } void modDamy_InfoOModulu(struct _ModulInfo* ModulInfo) { ModulInfo->KrátkéJméno = "DAMY"; ModulInfo->DlouhéJméno = "Problém osmi dam"; 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à)."; ModulInfo->Verze = 1.1; // version 1.0 from 2002-08-22 ModulInfo->Datum.Den = 7; ModulInfo->Datum.M╪síc = 9; ModulInfo->Datum.Rok = 2002; ModulInfo->Autor = "Marek Blahuτ"; ModulInfo->Kontakt = "blahus@seznam.cz"; ModulInfo->Start = &modDamy_Start; ModulInfo->Hotovo = &modDamy_Hotovo; ModulInfo->Θklid = &modDamy_Θklid; ModulInfo->ZadáníVstupu = &modDamy_ZadáníVstupu; ModulInfo->OptimalizaceVstupu = &modDamy_OptimalizaceVstupu; ModulInfo->OpakováníInicializace = &modDamy_OpakováníInicializace; ModulInfo->OpakováníTest = &modDamy_OpakováníTest; ModulInfo->OpakováníIterace = &modDamy_OpakováníIterace; ModulInfo->Dalτí¼lánek_P²ed = &modDamy_Dalτí¼lánek_P²ed; ModulInfo->Dalτí¼lánek_Po = &modDamy_Dalτí¼lánek_Po; ModulInfo->TestVyhovuje = &modDamy_TestVyhovuje; ModulInfo->TestNalezeno = &modDamy_TestNalezeno; ModulInfo->Nalezeno = &modDamy_Nalezeno; }