Det finns en inbyggd begränsning på hur länge ett skript får köra i webbläsaren. Begränsningen verkar träda i kraft efter 5 miljoner körda satser (enl. microsofts hemsida). När detta inträffar får man upp en jobbig splash, typ:
"Du kör ett skript som tar lång tid - vill du avbryta detta skript?"
Finns det något sätt att komma runt detta? Jag vill inte få upp denna ruta. Jag vill att skriptet ska fortsätta köra färdigt.
Jag vet att det går att justera värdet för när denna splash dyker upp i windows registry men det är ju inte något man man kan kräva av användarna så den lösningen är utesluten.
När inträffar timeouten? Är det så att du kör scriptet kontinuerligt eller triggar du scriptet på en flyttning av en pjäs?
Jag tror problemet ligger i att AI-koden tar mer CPU-kraft än vad som är kutym att använda i javascript.
Mitt tips är som stattin säger är att köra algoritmen några rundor, för att sedan köra setTimeout. Om du t ex har en for-loop så låter du den gå ett tag, sedan anropar funktionen sig själv mha setTimeout, i stil med setTimeout(loopfunktionen, 50);
Då måste du så klart anpassa variablerna så att de kan kommas åt från den funktionen och inte skrivs över. (Dela upp funktionen i initiering, loop och terminering)
Algoritmen som räknar ut datorns motdrag startar först när en pjäs flyttas. På denna nivå är alltså programmet händelsestyrt.
I 95% av kalkylerna så beräknas draget relativt omgående (några sekunder). Men för vissa drag behöver den ytterligare lite tid och då dyker denna trista ruta upp.
Det går ganska snabbt att komma upp i 5 miljoner satser. Det tar bara några sekunder.
Sökfunktionen som beräknar draget är ju en ganska komplicerad rekursiv djupet-först-algoritm så ... jag har inte riktigt kommit på hur jag skulle exprimentera med att göra en timeout mitt i alla beräkningar ...
Ligger det en beta-version av det faktiska spelet uppe någonstans? Jag skulle ju kunna kolla på algoritmen och se om jag kan hjälpa till. Skicka ett PM till mig med någon form av IM-adress om du har lust (MSN, ICQ, AIM, Gtalk eller YIM)
Jag tror nog det går slänga in en timeout någonstans så scriptet hinner andas lite och det borde inte vara allt för svårt heller men jag har lite svårt att sätta mig in i en sånt stort script, jag brukar knappt förstå mina egna ibland. Men jag är imponerad (y)
Det går att göra illegala drag och spela bortanför schackmatt. Det är medvetet för att kunna testa och hitta fel. Har båda kungar utplånats från bordet, vilket är fullt möjligt tack vare detta, så fungerar i sin tur inte vissa kontrollvariabler så då lär inte texten ovanför spelet längre visa något meningsfullt heller.
Att fixa detta är ju ganska oviktigt eftersom programmet senare bara kommer tillåta legala drag. Funktionen isChecked t.ex. behöver inte kunna hantera situationen när det inte finns någon kung eftersom det alltid finns en kung. Annars är spelet slut.
Hmm, buggigt värre. Ett par drag in i matchen så kyckas motorn på något sätt få för sig att min bonde är en svart dam på något sätt. (Hände när jag markerade hästen på g1) Sedan gjorde denna nya dam ett drag till, att ta tornet.
Kan tillägga att jag använder Opera, men jag ser inte hur det skulle kunna påverka.
Jag postar på allmän begäran en länk till ett ofärdigt skript. Jag får flera inlägg med bildbevis på att programmet är ofärdigt ...
? He, He.
Jag ska iofs medge att jag inte riktigt begrep på vilket sätt det skulle underlätta förståelsen för problemet att posta en länk till ett ofärdigt program men jag ville vara tillmötesgående.
Jag har designat programmet top-down och då blir det alltid så här. Det är oftast ganska enkla buggar som sen får katastrofala konsekvenser. Det är helt normalt i avlusningsprocessen i sådana här projekt.
Om dessa problem återstår om ett halvår kan man ju ta det då. Just nu är jag mest nyfiken på den fråga jag ställde.
Förlåt, jag ville bara hjälpa till genom att rapportera en bugg.
Fast i detta fall var det ju inte ens en bugg. Bara gnäll. ;)
Du flyttar e4 - datorn svarar e5 (helt okej)
Du flyttar d3 - datorn svarar d5 (också helt okej)
Sen flyttar du din bonde från d3 till g1 !?
Vem har lärt dig att man får göra så?
Det går att göra helknäppa drag (som jag skrev tidigare) men då är det inte säkert programmet kan hantera det eftersom vissa delar är en s.k. tillståndsmaskin som i vissa avseenden förutsätter en ordnad följd av legala drag.
Det var ett misstag... Jag upplevde att jag markerade hästen. Men då faller alla pusselbitar på plats ang. vad som hände.
Nör jag kollar på koden får jag två intryck:
Koden är en konvertering av C-kod, alt. skrivet av en person med C som första språk. (Pga av kodens utseende, ofta ett ganska kompakt skrivsätt och korta variabelnamn)
All kod är inte skriven av samma person. (Pga olika indentering på olika ställen)
Jag tycker att koden är relativt svår att följa, så jag kommer nog inte att kunna ge dig en praktiskt lösning, åtminstone inte ikväll/natt. En principiell lösning har du redan fått i mitt första inlägg i den här tråden.
Koden är en konvertering av C-kod, alt. skrivet av en person med C som första språk.
Det är väl traditionell C som präglat mig mest, svar ja. När jag skriver C -program så känns det som att skriva en bok.
nitro2k01 skrev:
All kod är inte skriven av samma person. (Pga olika indentering på olika ställen)
Här spekulerar vi. Vilka delar menar du inte är skrivna av mig?
Koden är skriven i anteckningar och wordpad. Det är fullt möjligt att den ena inte indenterar på samma sätt som den andra. Det har jag inte riktigt tänkt på.
Fast jag tror inte du eller någon annan hittar lösningen i min kod. Problemet är inte av algoritmisk natur. Det är inte minskad beräkningskomplexitet jag är ute efter. I det avseendet ligger nog mitt program ganska bra till.