//////////////////////////// D A B B A B A //////////////////////////// // timemovestart s‘ttes op i start af computer-and-display // startmovetime er tid fra cont. thinking eller lig med timemovestart #define MET1 #define noMET2 #define noCOMPACT #define noCHECKHASH #define noHASHDOUBLECHECK #define noTVHASH #define noMENUPOSITIONS #define MINIMAINMENU not-used-yet #define EVERPLAY not-used-yet #define SPECOPTIONS not-used-yet #define VARIANTS #define noQUIETEXPERIMENT // bem‘rk ant.sel.ply i mellemtiden er ‘ndret fra 8 til 6..... #define noONLYFORJENS #define noCHECKJENSPCTIME #define noCHECKALL #define noCHECKSQAVOID #define noBREAKPOINT #define noFILTRACE #define noFILTRACEMOVES #define noRANDOMOFF #define noSAMERANDOM #define noPREVAL #define PREVALPLYTRACE 1 // 1,(2,3).... se b-prevalue-moves() #define noCHECKYSTILLING // black queens at f4 and f6 #define noDAB4KORR #define BLANKHAPPENS #define noSCHOOP #define noPBSILLY #define noUSEBESTMOVE1 #define noCHECKBESTMOVE1 // evt. altid netop 4 sel. ply plus op til 4 mere indtil quiet-pos... // // // modst. b›nder p† 7.r‘kke => quiet=false!? // always_cut=1; // 2 is best... NYT: hvis secprmove>=120 // // but moves in 10 sec. may take 60 sec. (on 486 50Mhz) // if (always equal 2) // {if (last_iteration>=4) always=0; else always=1;} // test p† secprmove // if (quiet equal false) sel_side[ply]*=-1; // denne linie i quiet-pos virker vistnok alligevel........!! /* kig p† stillingerne i BADMOVES. De skal klares ved 1 sec/move. Dem der ikke klares ligger forrest i filen. Beskriv brugen af TIMETEST-filen med 22 stillinger... (3,3,0-10) ok selektive tr‘k: b›nder, der truer officerer.... selektiv search limit: 50 (sk‘rm) eller 20 (filtrace) nogle varianter giver fejl p† ch2....... incremental update af antal pawn on each line (faster) ..... and remove rook-evaluation from pawn-evaluation nu hvor simple killers er blevet ‘ndret, er der m†ske nogle scorer der un›digt bliver gemt og flyttet rundt p†.... fjern 4 x hmmmmmm ifm promotion/pili reducer brug af sq120_to_koordinat minimax ( ) - intern==white score f›rer rigtigt op - add-error..... nulstil/flyt killers i self-/gameplay.... rediger larsen-filer.... 31000---> checkall Word, courier new 5, 2 spalter: 19 sider (i.s.f. 76 sider) startstilling: flere nodes med tpo ved (6,2,0) og random=0 310314 0(1) <> 408373 1115(467) 53763 0(1) <> 75948 672(771) ved (5,2,0) ok ved (4,4,0) ok.. evt. CUTOFF ved tr‘kgentagelse efter 4 tr‘k..... kun filtrace i sidste iteration vha trace >100 ide: godt tr‘k i matesearch skal have h›j prevalue....!? check om mobilitet er nul n†r den bruges.... rokade ikke selektivt tr‘k hvis t†rntr‘kket ikke er selektivt flyt killers under gameplay !=newgame isf nulstilling... make_real et pladsproblem n‘rmer sig.......... ok udelad move hvis det leder tilbage til samme stilling - tag hensyn til slag - kan i enkelte situationer ---> pat - i gameplay kan man evt. vurdere dette move lavere... (repetition) // mangler: and tr‘k 1 og 3 ikke †bner for e.p. (hensyn til tr‘k 2) lastply skal altid udf›res af den forsvarende..... (skift - (3,4,2)) dybde (x,y,z): z skal v‘re lige; x+y skal v‘re lige. runtest: hop ud af matesearch hvis det rigtige tr‘k er fundet Hvar fra minimax - Hauptvariant P prioriter skakker over slag, der ikke genopretter balancen P ply=lastply-1: kun pr›ve skakker og slag.... (ingen traek; ikke=pat...) prevalue ligeglad med frafelt.... P prevalue c3-c4 i Nf7-stilling ikke ok (bonde d‘kket af D) P brik til d‘kket felt med i b†de prevalue og vurdering - samme med flyt truet brik P prevalue (efter promotion) :w:(+centrum[to]-centrum[fr])/4 b:(-centrum[to]+centrum[fr])/4 + bondetabeller.... nogen effekt? P matesearch prevalue: hvis ikke slag s† 1000 i bonus hvis tilfelt ikke er truet (er attack ok?) checket sep. '96: check at simple killers virker ok check Rxd3 moveorder.... opret killer3 x matesearch forbedres med yderligere brug af mslim udskriv msmoves, computer-x(), msmax forts‘t brug af struct.... ogs† med med bin‘re v‘rdier swap funktion nulstil prt_fr.......... lav filtrace fejlfri og easy-to-read vu bruges ikke.... brug nielsen-ratingtest stillinger... opret materiel-ply-zero overblik over first dynamic, start-best-score, intern, sel-side, realmoves, vurdering traektabel og movevalue endimensionel avoid *-1.... x=0-x isf x=x*-1 (vist ingen effekt - pr›vet i prevalue) l›s ide:cutoff selv om der mangler 0,10 - is‘er h›jt oppe i tr‘et... dog ikke sidste iteration easy og hard.... hvor skal de ligge aht baup mm s‘t realmoves = 123 i make-move-array hvis selektiv-now==true... definer traektvang.... sl† minimax og alfabeta sammen..... (topkill...) y=z[b]; u=y+3; x=y-6 - hurtigere? Franz, L.Rasmussen, Suurballe, Osted, Wood, Boedlander, PST MHA AFC JQP Danne, 1930-Tom, Hundeb›ll, Mally, Mader, Lars Kamstrup internetadr. til skakbladet (plus Dabba, progr. skak....) Nh6 position: depth ikke 0,2,4 efter tur i gameplay (Ra3xa5) dette check skal nu v‘re inaktiveret.... automatisk justering af variabler for optimering Rooksquare..... (checksearch virker ikke fuldt ud...) x-ref p† c-source (funktioner og variable) read.me: compiler til 386/486/pentium(?) C-fif: grafikboard og no scroll, brug mus hvor bruges tiden i programmet.... vis iterationsnr og b-m-s-f som streger p† grafisk skakbr‘t. ide: nulstil simple-kill i make_move () 2 ply l‘ngere nede.... dum udskrift mellem it=0 og it=1 3 x solution-----> 1 ok 4 stillinger til tidstest: opening, rolig, vild, slutspil. no solution. ikke aktuel mere....?: undg† materieljustering af simple killers ved pat mm ( print-best-move ply-zero ikke helt ok............. ) ( dette med - og x g†r vist kun til sidst..... ) ( styr p† hvordan scorer f›res op i traet... ok nu???? ) ( brug af vu...., mate_score...... ) inaktiveret. ( vistnok allerede ok: reducer kald til (count-)black-7-8 ) ( er SxL ok gain... nu er S=L! ) minimax.c: v‘rdi for hvide b›nder p† 2. r‘kke bruges ikke..... */ /* ctrl+break stopper altid........ hvordan inspecter man structure-variable? long int er lig med 4 bytes men_value - simpel model er indlagt... hvad med 90, 300, 325, 475, 950!? colditz 106 klares ikke ved 8,2,0 -,Qc7 efter 44 mill. pos. 7985 sec. -------- 31 : lang s›getid; dumme varianter (Dxh7# pr›ves ikke) 1.b7# klares ved 6,4,0 - men ikke ved 6,2,2 - hmmmmmm ----- 4,6,0 og qlimit=12 giver l›sning p† 8 sekunder. */ /* ***************************************** * * * * * * d a b b a b a * * * * * * ***************************************** udgangspunkt i no-chess 0.5 */ #include "time.h" #include "math.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" #include #include #include #include #include #include /* Programmets udvikling: indl‘s stillinger i epd-format tr‘kgenerator make-move & undo-move udskrift af tr‘k/varianter attack-tabel og prevalue_moves b›nderne er ogs† med (incl. forvandling & e.p.) simpelt br‘t p† sk‘rmen menu-system med diverse funktioner... pre_value nu ogs† for hvid mini-max & simpel vurdering: mat, pat, materiel undg† pseudo-moves n†r man er i skak simpel iterativ gennemgang simpel killermove - 2 stk. pr. ply extended selektiv search generer kun slag, skakker og fribondetr‘k dynamisk search: stille tr‘k efter nogle forcerede tr‘k er med! afvikling af tests i filer er nu ok - flere gode faciliteter alle vigtige parametre kan ‘ndres via menu uden ny compilering nu kan stillinger med sort i tr‘kket ogs† klares udvidet trace - hver variant kommer som en linie p† sk‘rmen - al trace kan dirigeres ud i en fil (ved at rette een linie - kan evt. g›res med 160 tr‘k; showboard() ved de f›rste 56 halvtr‘k slutter med at vise slutstillingen l›sning rettet i position H... finder (igen) det korteste mattr‘k.... fejl fundet ved partiafslutning matesearch nu ogs† i gameplay (smallere og dybere(16 i.s.f. 12)) bedre samarbejde med simple-killers og prevalue!? simple killers gemmes nu 2 steder - ikke kun ved cut-off. help kan kaldes under gameplay f† f‘rdiggjort check-search.... varier †bningsspillet de f›rste tr‘k vha et R A N D() till‘g bedre placering af b›nder simpel king-safety opening-tips forbedret forbedret matesearch - er nu iterativ forvandling til t†rn og l›ber suspenderet ikke s›ge efter flere mattr‘k i samme stilling hop over tr‘k der f›rer til tr‘kgentagelser (fx 1.Nf3,Nf6 2.Ng1,Ng8) samtidig s‘ttes score til nul transpositions efter 3 tr‘k klares nu..... version 1 9 9 6 july 23. til Alastair Scott + venner magic=1 giver nyeste version at TPO..... king safety virkede ikke.... loop-star bruges 2 steder mere.... your*move / e2-e4* magic=2 giver promotion til B,R ghost-rooks fjernes.... Archbishop & Chancellor: springer fik den nye dronnings v‘rdi z i main-menu = genneml‘s eco.pgn tryk en tast = move now (evt. exit selfplay og testfil) magic>99 = move_now tv-allnodes i diverse-menu testfil: -40: skip 40 stillinger og k›r l›s stop altid efter 50 stillinger bondevurdering - kun n†r b›nder har v‘ret flyttet eller sl†et - max udslag m†les og vises i diverse-menu - beregnes kun hvis det kan give et new-best-move p i gameplay der er fejl i tpo - brug 99.... 4 nye Betza-varianter er nu med version 1 9 9 6 aug. 20. sendt til Wood, Bodlaender brug piece-lists movegen. & pawn-evaluation must be faster: 20%! ny def af black_8 l›berparret kendes nu byt af n†r man er foran og omvendt placer dronning i n‘rheden af modstanders konge bedre placering af t†rne (angrib svage b›nder, frem p† br‘ttet; is‘r 7. og 8. r‘kke, hav forbindelse; is‘r p† linie, samme r‘kke som m.konge version 1 9 9 6 sep. 07. sendt til Alastair 'avanceret' simple killer funktion fjernet (20% hurtigere) slag af lige flyttet brik gemmes IKKE som simple-killer (3% hurtigere) prevalue optimeret (10% hurtigere) stille tr‘k meget reduceret og m†lrettet (350% hurtigere!!) bondetr‘k der truer officerer er nu selektive tr‘k filtest k›rer altid med random=0 bondevurdering forbedret lidt rooks on open files, block c-pawns less, play more 1.e4, keep g-pawn on 2/3 row, kingsafety: pawn in front of king most important to be there st›rre br‘t under gameplay secprmove kan nu klares disc-trace er ogs† lavet version 1 9 9 6 okt. 14. Frigivet p† internet. Artikel udgivet (AISE). fjern *-loop-fejl i Morphy-stilling (gjort med hop-ud i make-move) y-stilling med to sorte dronninger ok ved 5,5,2? ja..... (intet rettet) tidsstyring er ikke god nok (T765SEC, Qc2-d3....... ved 30sec./move) fejl: gameplay_info kan ikke s‘ttes on det store br‘t ›delagde help-billedet endgame-limit var forkert forkert retning ved forvandling bondev‘gt halveret for at undg† dumme tr‘k... magic 5 indf›rt... limit-pawnscore startv‘rdi flyttet fra m-a-p-z til c-a-d. stop p† tid kun efter iteration 2 dronningens tilbageholdenhed i †bningen er gradueret alle kommandoer i gameplay kan nu skrives med eet bogstav fjern pseudomoves i ply 0 (kode er mere klar) (pseudomoves fjernes i gameplay vha minisearch aht varianter af skak!) briktabeller sorteres f›r hvert tr‘k s† testpos. og spil k›rer ens quiet-position indf›rt (senere justeret med dybde=3 og skift af sel.side) fejl fundet vedr. bundne brikker i ply 0 samt mobilitet[0]=-1 fejl vedr. afbytning ja/nej pga king 0-->6666 nu fundet trace nu rigtig mht score p† selektiv variant always-cutoff er ‘ndret (nu normalt altid cut-off; dog aldrig iterat. 1) 7-fejl fundet: ghost-moves, pili-loop, sq-avoid ikke resat. tr‘ktid: max. og gns. er nu med i menu 6. bishop-pair og exchf nu med p† menu fjern best-move-so-far under gameplay/info on... divide zero; +1 manglede: ((msmax/(tv-nodes +1 ))>3 or secprmove>0) tag tid p† PC: indf›rt p† matesearch og p† show board slowly game in xx minutes, tid p† sort og hvid everplay - 2 forskellige strategier spiller mod hinanden 'S / Tpo' f›res nu op i ply zero - ca. 4% hurtigere Avancerede simple killers (3) er nu 'det bedste' version 1 9 9 7 sep. 26. Torsten Schoop. make_delay() bruger nu rigtig tidtagning matesearch rettet, s† mate9css (Lc4xf7+) nu klares spil hurtigere i †bningen: play_early_game_fast() er nu indf›rt&justeret spil lidt langsommere (assume 10-30 moves instead of 20-40 moves) fejl vedr. Lf8 og b›nder p† g7 og e7 (der blev testet p† d7 isf e7) bishop-pair ‘ndret fra 22 til 32 king-safety: hold konge p† e1/e8 indtil der er rokeret... fejl vedr. silly games fundet (gem-full-evalu). random halveret og begr‘nset (black-8 < 6 ---> 0). version 1 9 9 7 oct. 04 til Internet, Torsten Schoop, Peter Wood etc. sound on/off indlagt Q-development in the opening adjusted h‘ngende b›nder justeret; is‘r p† †ben linie evt. med modst. t†rne... Version til Schoop tidtagning fors›ges ikke afbrudt f›r iteration 3 - kunne give d†rlige tr‘k som -,Bd6xb4 (og koster lidt tid) interval for tidtagning justeret mht speedfactor (sparer lidt tid) !!! tidtagningsrettelser har vist gjort gentagne selfplay ens!!! tr‘k hurtigt hvis der kun er eet tr‘k at g›re (hm: skak/matesearch...) iteration 1 k›rte kun p† materiel n†r der ingen matesearch var... quiet depth 3--->1 hanging pawns opjusteret igen... gameinfo.trc er lavet... det er er i nulstil () kaldes nu ogsaa fra computer-and-display. der er haab om at gamespil og testpositioner nu beregnes ens taarntraek/slag skal ogsaa udloese bauer-evaluation... Version til Schoop n†r du er >=t†rn foran, s† tag din konge hen til modstanderens konge og pres modstanderens konge mod rand/hj›rne fejl vedr. hvide frib›nder rettet; frib›nder opjusteret centre, kingsafety og mobilitet fades ud mod slutspillet KBK og KNK kendes nu i dead-draw som utilstr‘kkeligt materiale. KBB.....K - med i dead-draw n†r l›bere er p† samme farve dead-draw=true skal stoppe spillet exchange blev sprunget over n†r der ingen bondevurdering skete... sure? exchangefactor max +-70 exchangefactor rettet mht overflow? for mange * f›r /.... har muligvis gjort spillet meget mere ligefrem.... time will show... keep kings away from the centre until the early endgame l›berpar (opjusteret); bedst i †bne stillinger (sum af b›nder = 10) Version til Schoop materiel-10-0 kan blive > 10; s‘ttes s† til 10 sm† forbedringer i vurderingsfunktion (0,5% hurtigere) king-safety: ikke kun b›nder kan beskytte kongen tag ogs† hensyn til beskyttelse vandret tag is‘r hensyn til beskyttelse ind mod midten (vand./diag.) gammel feltvurdering halveret..... probably-draw er nu ok. klarer KNNK og randbonde + forkert l›ber. frib›nder sat endnu 50% op..... centralisering ‘ndret: bondetabeller bruges ikke mere bonus for b›nder for at sl† ind mod centrum rooks more on open/halfopen files v‘rdi +/- 4 i opening () for at t†rne er flyttet er sat i bero rokade medf›rer nu ogs† pawnchange s‘ttes til true Version til Schoop 3 dec king-safety falder nu ikke n†r kongen er p† linie 1 / 8. nu kun halvt s† slemt (11) at blokere c-b›nderne. Q: 900->1000(avoid 2R against Q); B: 300->315(better than a knight) v‘r varsom med at bytte let officer for 3 b›nder; de bliver jagtet... IKKE TESTET Rook on open file - how open is now detected! Harding; Kh1-position: 2/3 af tiden bruges i matesearch l›st ved at tid i matesearch IKKE indg†r ved test af gr‘nse p† 30% 900sec/move: full matesearch (176s) / 1800s/m: 1/3 msch (0.49 sec)??? pga overflow 1639*20 i (double)sec.prmove* MS.PCT (double indlagt) nr. 20: pga fejl i matesearch, der ikke er opm‘rksom p† pat. matesearch opdager ikke forsvarerens patmulighed (e8Q?; e8N!) alle positioner i INSUFMAT klares nu Ikke pr›ve forvandling til l›ber/t†rn n†r score(0) bedre end remis og der ikke har v‘ret en pat-stilling i s›gningen nye kommandoer i gameplay: new/AN/DR/SP/MZ ny level 'mate in x moves' er lavet auto232 er nu lavet.... Version til Schoop 23 jan + 28 jan 'korteste' mat findes sandsynligvis - vha mate-ply... (g›r iteration f‘rdig og tag en ekstra iteration...) spil meget mindre e4,Nf6 - og endnu mere 1.e4 helst fulgt af e5 auto232 rettet til som 't4'... Version til Schoop 29 jan Version til Schoop 31 jan (sidste(?) auto232-rettelser...) Udskriv partier i simpelt format i GAMES.TXT (kan let konverteres til rigtigt pgn-format med ChessBd) Bishoppair 50->60; 1.e4 25->18 Version til Schoop 4 feb epd: sidste '/' kan nu v‘re en blank som i korrekt epd everplay skriver nu ikke i gameinfo.trc spil b›nderne mere frem i †bningen (random-move); is‘r dobbeltskridt kingsaf rettet; mobil og centr 8-->10, how-open rettet alle epd-filer har nu typen .epd. Version til internet 25 feb. v‘rdi for dronning og springer kan nu rettes mobil og centr 10-->16 king-safety: fjernet till‘g for konge p† hj›rnefelter; reduceret c1/c8; till‘g for 'sideluft' til kongen; ogs† till‘g hvis brik foran konge er fjendtlig bonde; Ke1/e8: till‘g gives ved rokaderet isf t†rne i hj›rnerne opening: s›g †bent spil; straf hvis antal b›nder>12... random-move: bonus for at rokere med det samme spil straks fianchettol›beren p† plads opening: hold springere tilbage p† f›rste 3 r‘kker i †bningen; springerne ud f›r l›berne i †bningen; till‘g n†r centrumsb›nder ikke er p† 2/3 r‘kke; flyt ikke hvide b›nder p† d4&e4 og c4&d4 ved ret til o-o b›r bonde f2 v‘re p† plads ved ret til o-o b›r g-bonde v‘re p† g2 eller g3 Sd2/Se2 b›r ikke blokere for Lc1/Lf1 som ikke har b2/g2 fri L›berplaceringer p† e2,c4,b3,a2,b5,d2,g5,h4,f4,g3 vurderet springere f†r lille straf p† e2,d2 ligesom l›berne spil mindre fianchetto, mindre 1.e4 og mere 1.e4,e5 hemmelig kommando 'e16' indlagt straf for (hvide) b›nder p† b4 og g4 fjernet blokering af bonde c2 gjort afh‘ngig af b›nder p† d4 og d5 sl† ind mod centrum nedsat: 35--->20 Version til Schoop 18 mar games.txt nu med linieskift for hvert 5 tr‘k (Chessbd kan l‘se den!) tr‘knumre er nu med 50-tr‘ksregel kan nu klares I ply 1 till‘gges 1/5 af vurdering renset for materiel testes senere i everplay... hemmelig kommando 'e60' indlagt repeat4 er tilrettet 50-tr‘ksregel, kommende hash etc. meld fejl hvis pc-speed er nul..... hashtables.....! med i everplay rook ‘ndret: 450-->475 g›r brug af define variants rooksquare chess indlagt (ikke helt korrekt jvf. rooksq.epd) inaktiveret igen: quiet-depth=3 og sel. dybde dynamisk... 3xrepeat virker nu via hashkoder. (x ply tilbage i spillet) grid chess indlagt test p† dead draw flyttet insuf skal med i make-move som 50-tr‘ksregel... mainline er nu med (findes via hashtables) top-kill, do-gem-top, find-move-index er fjernet draw-score er nu med i menu 6 kun test p† dead draw n†r der er sl†et en brik (eller ply eq 1) forberedelse til perm.brain: der skal tastes 's' nu for at stoppe Dabbaba i sine beregninger insuf g‘lder nu kun i alm. skak Permanent Brain programmeret........ midnatsfejl afhjulpet... Version til Schoop 6 maj gl. fejl rettet: bondes dobbeltr‘k med skak kan afv‘rges med e.p. rook 475-->490 ant.sel.ply 8--->6... ny level: y moves in x minutes define SCHOOP: score, line og thinking on vises ikke 3 x repeat checkes nu helt ud (50 tr‘k tilbage) hash: initieres n†r der er regnet p† et forkert tr‘k ved plydyb==ply_1 pr›ves forsigtig brug af hash (ikke overskriv noget) Version til Schoop 13 maj midnatsfejl: tr‘ktid estimeres ud fra tv-nodes eller s‘ttes til 30 sec... vis br‘t ved 'cont. think.'.... 2 x kode samlet i make_evt_drucker_delay savegames {no perm.brain} {midnight?} {div. pb_silly vedr. '*' og ':'} permanent brain: tr‘k kan nu rettes hash-items p† 2 ›verste ply m† ikke overskrives nedefra aht pb (hash_ply) bishop 315-->305; bishoppair 60-->30 frib›nder sat 50% op s›g kun †bent spil n†r der ikke k›res auto232 (= spil mod mennesker) udvid error1 og error2 til 20 styk... fx signed char happens[20] . = spil pb-tr‘k #define PBSILLY, USEBESTMOVE1 og CHECKBESTMOVE1 er indf›rt games.txt: note vedr. 'something good...' quiet-depth - 1 i menu! Version til Schoop 28 juni selfplay skal ikke vise tr‘knumre/mainline #define blankhappens indf›rt // // ///////////////////// her er vi nu! //////////////// // // * noget galt med tiden i everplay.... * scroll--->blink... * gameinfo 1/2/3 ok? help skal justeres... ok? s-kommando stop/selfplay.... (*)ikke ok: randi_id [x][y]=random(42949)*100000+random(65535); (*)#define: sl† trace i games.txt on/off; evt ved at blanke den... brug den udskrevne forbrugte tid i add-movetime store-pb-pos mangler ved pb-silly... hvorfor sl›ses der lidt med b›nder i †bningen? parametre til add-movetime er forkerte nyt navn til uli-sletigen evt. slet mulighed for ikke at k›re iterativt... t†rne p† lange †bne linier der IKKE ender med 2 b›nder [ how_open() ] t†rn bag bonde(c2), der er god at st›de frem (b›nder p† d4,d5) st›rre hashtabeller bedre l‘s/skriv af hashtabeller score = mate in x; her bliver x ikke beregnet korrekt... ret midnatsfejl permanent... - datatype clock_t... pr›v med gettime() ok! nodes i tredie iteration 0 (dab4korr...) if (pb_sw_move_guessed!=true) init_hash(); // hmmmmmmm for dyrt(?) ved store hashtabeller... permbrain: tr‘k i ** og :: kan ikke klare pb alene (n†r swhash = 0). hmm? f† iteration 0 til ogs† at virke gameinfo.trc er blevet ret ul‘selig moves erstattes af mpc?! singular extension: l‘g info i hash til brug i n‘ste iteration... find fejl vedr. p[0].pawnchange... (happens[1]). Fejl ifm hash? test p† 30% i forbrugt tid flere steder - lav define brug rooksquare_mate i make-move.... (›hhhhh) quiet-depth - kun virke p† hvert andet ply....? fixed depth: passer selektiv indtastet dybde??? en parameter mere p† change_castle_pili fjern key i write-hash (iteration>40............. FEJL, eller indtastet>40?) check plads mellem heap og stack...... check gameinfo.trc og info ON er ok......... random_move opsplittes i vurd_ply1 og random_move... Morphy-position viser g7f6N som best move under s›gningen... --------------- tager 165 sec. ved 10sec/move tv-non-sel-move virker ikke... 1b6/3r4/1p1Pbp2/k1p3p1/pNP2pPp/P1P1pP1P/4P1KR/5BNQ/w Nb4-c6+? heller ikke p† position i rookbish (1.a8Q? = pat) t†rne vurderes dobbelt pga dobbeltb›nder... dddddddoooooooobbbbbbb t†rne p† halv†bne linier - hvor gode er de? lav indtastning af 4 0/1 i menu'en filforkortelser pr‘senteres p‘nere.... k›re korrekt med EPD (rokade- og ep-markeringer samt bm i kort notation) (fixed depth--->secprmove efter tur i 7.chesspos. in files....) centralisering - g‘lder ikke D i minimax.... altid auto232 on som Genius 5!? easy moves fast... brug af mus speciel kode for KPK, KBNK og KQKP(7.row) Gem filer med nye navne, s† intet overskrives (evt som option...) vurdering af t†rnplacering: dddddddddddoooooooooooobbbbbbbbb flere b›nder p† samme linie-> t†rnvurdering gentages..... gem tr‘kkene i partiet ›vre gr‘nse = xxx? (250 ply) 'Windows' (se How Computers Play Chess for alm. og avanceret version) †bningsbibliotek (let at kopiere fra GnuChess...? eller?) transpositioner og variation.... undg† at danne tr‘ktabel - pr›v f›rst det gemte hashmove konkrete fejl / ideer en score paa 30002 dukker op... pseudomoves (Bc6-a4) fjernes evt. f›rst i it. 3 pga cut-off vurdering kaldes flere gange i samme node.... g›r mere brug af simple-kill-tv.... forskellige tr‘k: magic 0=e6xd5 magic 3=Nf8-g6 (3,4,0) i Larsen04. dabbj0j3.c dabbarch.c: forskellig tid for samme stilling ved (2,8,0): alm.: 198 sec. filtrace: 908 sec. ‘ndret selektiv search / quiet position.... Re8-e1 spilles ikke f›r efter 26 sec..... (3,6,0) lav sel dybde = 8; but make it fast! (Archchess langsom!) Bb5xc6: efter it. 1 har Re1xe6 en score p† -1050??? prevalue: forkert med fuld value af captured piece! tag tid p† pc: beregn msmax (- and 4 x mslim!? nej......) -30000 (int) kan ikke blive st›rre (aht printline) minus turbo giver faktor 2 - 3 (3,3 er korrekt...) magic 13 overfl›dig..... msmax beregnes forkert (n†r secprmove>0) best-move-so-far: sort forvandling c2-c3Q...... stadig dumme fejl (BAD9703; f4-f5?; 30/m), men kun i game-/selfplay... f4-f5?: kan fremprovokeres i teststilling! fejl i BAD9703 g›res ikke ved bondev‘gt 4 isf 8! OK?? Unsolved mystery: sidste: sagen har noget med tidtagningen at g›re!! selfplaygames er ikke ens (selv med random=0) og alle rand () ---> 6543 21 og med noRAN DOM og SAMERAN DOM. OK? desuden: 2) compute a move (forskellige tr‘k/antal s›gte nodes...) Men TIMETEST giver samme tid og antal nodes hver gang...! P-funktion til at vise bondevurdering k›rer ikke helt korrekt... I sj‘ldne tilf‘lde vises et tr‘k som fx c2e4 isf Qc2-e4 (fx under selfplay (vises dobbelt) eller n†r et tr‘k bliver manuelt afbrudt med en taste) er struct hurtigere end alm. array....!? solution ligger nu 3 steder..... optimering af kode (tr‘ktabel en-dimensionel mm) brug kbhit() isf bioskey.... read EOF ok? og start fra bestemt pos-nr (f›rste & sidste) lav define p† sel_delay parametre.... 1-5 for tr‘kantal 4 for promotion - skal gradueres 4,3,2,2,1 for slag 2 for skak nyt: x for at flytte truet brik... forfin info_out.... print-a1-h8() n‘sten lig med sprint-a1-h8() ply 1: lav evt. dyb skaks›gning..... (defensiv matesearch...) kommandoer til at ‘ndre stilling, take-back o.s.v. bedre grafik EDIT DABBABA.TXT..... alm. tuning: move_generator m.m.: undg† at multiplicere med 1 / -1 move_array ‘ndres fra 2 dimensioner til 1 dimension mere udnyttelse af STRUCT n†r der konstateres et ulovligt tr‘k (bundet brik flyttes), s† fjern resterende ulovlige tr‘k i tr‘ktabellen der skal arbejdes lidt mere med search: er der fundet en mat skal man g† 1 ply op.... tr‘k i ply 0 der f›rer til mat skal ikke unders›ges i flg. iterationer udvid s›gning n†r truede brikker flyttes... f‘rdigg›r (evt. ikke!?) rutine der opdager discovered check: a) s† disse skakker kommer med i selektiv search (Colditz nr. 13) b) s† illegale tr‘k afvises p† aller nederste ply (spild af tid!?) */ #define a1 21 #define b1 22 #define c1 23 #define d1 24 #define e1 25 #define f1 26 #define g1 27 #define h1 28 #define a2 31 #define b2 32 #define c2 33 #define d2 34 #define e2 35 #define f2 36 #define g2 37 #define h2 38 #define a3 41 #define b3 42 #define c3 43 #define d3 44 #define e3 45 #define f3 46 #define g3 47 #define h3 48 #define a4 51 #define b4 52 #define c4 53 #define d4 54 #define e4 55 #define f4 56 #define g4 57 #define h4 58 #define a5 61 #define b5 62 #define c5 63 #define d5 64 #define e5 65 #define f5 66 #define g5 67 #define h5 68 #define a6 71 #define b6 72 #define c6 73 #define d6 74 #define e6 75 #define f6 76 #define g6 77 #define h6 78 #define a7 81 #define b7 82 #define c7 83 #define d7 84 #define e7 85 #define f7 86 #define g7 87 #define h7 88 #define a8 91 #define b8 92 #define c8 93 #define d8 94 #define e8 95 #define f8 96 #define g8 97 #define h8 98 #define equal == #define or || #define exor ^ #define and && #define false 0 #define true 1 #define no_good_found 22222 #define int_min -30000 #define int_max +30000 int mate_ply; // used for taking an extra iteration when a mate is found // hoping to see a shorter mate and get the game finished... int port=0; // bruges af auto232 int save_games=false; // skal filen games.txt dannes char p99[99]; // tekster editeres over i dette felt og udskrives int sqwidth=35; int hvid=1, boardcolor; int board_x, board_y=10; // br‘ttets ›verste venstre hj›rne ('nordvest') int square_x, square_y; char ch, nr[2]; int gdriver=VGA, gmode=VGAHI, errorcode; int x1, y1, r; // bruges i computer-and-display og computer-x()..... int gem_full_evalu; int q_test, keyboard_stop, time_stop; int it_out, move_out; /* udskriv hvor dyb en s›gning der blev lavet */ int noprint=false; int sound_on=false; int evermoves_160=160; int mpc=0; //move-ply-count //int draw50move=0; // draw by 50 move rule //int hnode; // skal slettes igen..... double mslim[5]; /* mate-search limits (mslim[0] is last ply)*/ signed char wbauern[10]; /* Anzahl der weisse Bauern auf einer Linie */ signed char wtuerme[10]; /* Anzahl der weisse Tuerme auf einer Linie */ signed char sbauern[10]; /* Anzahl der schwarze Bauern auf einer Linie */ signed char stuerme[10]; /* Anzahl der schwarze Tuerme auf einer Linie */ int limitpawnscore, pawninfo=false; int wpawn=4; int quiet_depth=1; double pawnexceed=0, totalexcd=0; int speedfactor; // is 10 on a 50 mhz 486 double pctid; double startmovetime; int tpct_it_zero; // how many pct of the time was spent in the matesearch signed char chess_variant; #define normal 0 #define stationary 1 #define knightmate 2 #define q_is_rn 3 #define q_is_bn 4 #define nightrider 5 #define knightwazir 6 #define knightferz 7 #define knightdabbaba 8 #define knightalfil 9 #define rooksquare 10 #define gridchess 11 #define stop 111 /* denne bruges ogs† som stopklods i move_fr-array */ #define one_step 1 #define more_steps 7 char men_letter[9] ={'P', ' ', ' ', 'N', 'B', 'R', 'Q', 'K', '\0'}; //int nc_men_value[8] ={0, 0, 90, 300, 300, 475, 950, 6666}; int nc_men_value[8] ={0, 0, 100, 300, 305, 490, 1000, 6666}; signed char nc_king[20] ={one_step, -1, 9, 10, 11, 1, -9, -10, -11, stop }; signed char nc_queen[20] ={more_steps, -1, 9, 10, 11, 1, -9, -10, -11, stop}; signed char nc_rook[20] ={more_steps, -1, 10, 1, -10, stop}; signed char nc_bishop[20] ={more_steps, 9, 11, -9, -11, stop}; signed char nc_knight[20]={one_step, 8, 19, 21, 12, -8, -19, -21, -12, stop}; signed char wazir[5] ={ -1, +10, +1, -10, stop}; signed char ferz[5] ={ -9, +11, +9, -11, stop}; signed char dabbaba[5] ={ -2, +20, +2, -20, stop}; signed char alfil[5] ={ -18, +22, +18, -22, stop}; int men_value[8]; signed char king[20]; signed char queen[20]; signed char rook[20]; signed char bishop[20]; signed char knight[20]; signed char *gangart; /* bruges som pointer i ovenstående 5 arrays */ //char fatal_tekst[60]; /* hop ud af programmet med denne meddelelse.. */ signed char gen_moves_mode; #define move_and_attack 2 #define only_attack 1 signed char status, normal_game=0, monitor=1, autoplay=2, self_play=3, everplay=4; signed char gameplay_info=false; char *arr1; // f›rste pr›ve p† hashtables... signed char w_antselply=0; signed char ant_sel_ply; /* antal selektive ply i en iteration. */ signed char last_sel_ply=4; /* antal selektive ply i sidste iteration*/ signed char first_sel_ply; /* tidligst mulige selektive ply */ signed char sel_ply_now; /* true/false: er dette ply selektivt */ signed char iteration; /* dybde igangv‘rende iteration */ signed char sgn_wh_bl; /* 1/-1. 1 if white when ply==iteration */ signed char last_iteration=4; /* dybde sidste iteration */ signed char only_recapture; /* skal kun generobringer pr›ves */ int iterativ=1; /* +1 = der k›res iterativ s›gning */ int s_kill=3; /* 0=bruges ikke; */ int always_cut=1; /* +1 = ja, 0 = nej, 2 = auto */ int always; /* +1 = ja, 0 = nej */ int check_search=0; /* depth in ply */ int gem_check_search; /* depth in ply */ //long mate_ search; /* number of positions */ int mate_search=10; /* number of positions in 1000's */ //int swrepeat4; /* */ int wrand; /* */ int magic=0; /* funny and test purposes.... */ int qdynamic; /* gr‘nse for udl›sning af quiet move... */ int it4_qdyn=50; /* qdynamic i 4. iteration. */ int skift=1; /* +1 = initiativ kan skifte i sel search*/ int full_evalu=1; /* +1 = yes. 0=no=only materiel */ int wmobil=16; /* v‘gt for mobilitet */ int wcentr=4; /* v‘gt for centralisering */ int wopen=8; /* v‘gt for †bningstips */ int wkingsaf=8; /* v‘gt for king safety */ int bishoppair=30; int king_centre=1; // king in centre in early endgame int king_corner=1; // get opponents king into the corner int Q_near_enemy_K=1; // int rook_placement=1; // int exchf=50; // exchange factor int filtrace; /* true/false */ int gameplay=false; /* true/false */ int dummy_search=false; // to avoid best-move-so-far in dummy-search int info_out=1; /* +1 = vis informationer p† sk‘rmen */ //int top_kill; /* +1 = brug top_kill */ int black_8; /* antal originale sorte brikker p† 8. r‘kke */ int matesearch_score; int maxpawn=0; int vu; int whole_menu=false; signed char intern_a=32; signed char intern_b=64; signed char intern; signed char intern_c=7; signed char intern_d=15; const signed char grid[h8+1] = { /** A B C D E F G H **/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, /* A1 ... H1 */ 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, /* A2 ... H2 */ 0, 5, 5, 6, 6, 7, 7, 8, 8, 0, /* A3 ... H3 */ 0, 5, 5, 6, 6, 7, 7, 8, 8, 0, /* A4 ... H4 */ 0, 9, 9, 10, 10, 11, 11, 12, 12, 0, /* A5 ... H5 */ 0, 9, 9, 10, 10, 11, 11, 12, 12, 0, /* A6 ... H6 */ 0, 13, 13, 14, 14, 15, 15, 16, 16, 0, /* A7 ... H7 */ 0, 13, 13, 14, 14, 15, 15, 16, 16}; /* A8 ... H8 */ const int centrum[h8+1] = { /** A B C D E F G H **/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 8, 12, 12, 8, 0, 4, 0, /* A1 ... H1 */ 0, 4, 8, 12, 16, 16, 12, 8, 4, 0, /* A2 ... H2 */ 0, 8, 12, 16, 20, 20, 16, 12, 8, 0, /* A3 ... H3 */ 0, 12, 16, 20, 24, 24, 20, 16, 12, 0, /* A4 ... H4 */ 0, 12, 16, 20, 24, 24, 20, 16, 12, 0, /* A5 ... H5 */ 0, 8, 12, 16, 20, 20, 16, 12, 8, 0, /* A6 ... H6 */ 0, 4, 8, 12, 16, 16, 12, 8, 4, 0, /* A7 ... H7 */ 0, 4, 0, 8, 12, 12, 8, 0, 4}; /* A8 ... H8 */ /** *** Bewertung der Felder fuer Bauern. *** Wird in Stellungsbewertung verwendet. **/ //const int wBFeldWert[h8]= { /* weisse Bauern */ ///** A B C D E F G H **/ // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A1..H1 (nicht moeglich) */ // /* Zentrumsbauern sind auf 2-ter Reihe schlecht (gehoeren nach vorne) */ // /* f-h Bauern sollen wegen Koenigsschutz hinten bleiben */ // 0, 4, 4, 0, 0, 0, 6, 6, 6, 0, // 0, 6, 6, 8, 8, 8, 4, 6, 6, 0, /* A3 ... H3 */ // 0, 8, 8, 16, 22, 22, 4, 4, 4, 0, /* A4 ... H4 */ // 0, 10, 10, 20, 26, 26, 10, 10, 10, 0, /* A5 ... H5 */ // 0, 12, 12, 22, 28, 28, 14, 14, 14, 0, /* A6 ... H6 */ // 0, 18, 18, 28, 32, 32, 20, 20, 20}; /* A7 ... H7 */ // /* Auf 8-ter Reihe kann kein Bauer stehen */ //const int sBFeldWert[h8]= { /* schwarze Bauern */ ///** A B C D E F G H **/ // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A1..H1 (nicht moeglich) */ // 0, 18, 18, 28, 32, 32, 20, 20, 20, 0, /* A2 ... H2 */ // 0, 12, 12, 22, 28, 28, 14, 14, 14, 0, /* A3 ... H3 */ // 0, 10, 10, 20, 26, 26, 10, 10, 10, 0, /* A4 ... H4 */ // 0, 8, 8, 16, 22, 22, 4, 4, 4, 0, /* A5 ... H5 */ // 0, 6, 6, 8, 8, 8, 4, 6, 6, 0, /* A6 ... H6 */ // 0, 4, 4, 0, 0, 0, 6, 6, 6}; /* A7 ... H7 */ // /* Auf 8-ter Reihe kann kein Bauer stehen */ signed char attack_w_min[h8+2]; /* mindste hvide brik der truer et felt */ signed char attack_b_min[h8+2]; /* mindste sorte brik der truer et felt */ signed char attack_w_nul[h8+2]; /* nulstiller attack_w_min */ signed char attack_b_nul[h8+2]; /* nulstiller attack_b_min */ signed char tablin[h8+1]; /* table of lines e7=5; b4=2 etc. */ signed char tabrow[h8+1]; /* table of rows e7=7; b4=4 etc. */ char xxx[162]; /* her l‘ses den stilling, der startes med */ char gem_xxx[162]; signed char ply, ply_1; /* ply, ply minus en, ply minus to */ signed char wh_bl; #define white 1 #define black -1 signed char sq[120+78]; // her er skakbr‘ttet som 10x12 + pb_pos signed char *sq_idx, *sq_idx2; /* disse pointere bruges på skakbrættet */ /* brættes felter (sq) kan indeholde disse værdier: */ #define w_p 2 /* white pawn o.s.v. */ #define w_n 3 #define w_b 4 #define w_r 5 #define w_q 6 #define w_k 7 #define b_p -2 #define b_n -3 #define b_b -4 #define b_r -5 #define b_q -6 #define b_k -7 #define sq_empty -1 #define sq_illegal 1 /* udenfor 8x8 brættet */ /* >=w_p er en hvid brik; <=b_p er en sort brik */ #define prom_q_9 111 /* ved bondeforvandling indeholder til-feltet en */ #define prom_r_9 112 /* af disse v‘rdier. */ #define prom_b_9 113 /* Forvandling er til q,r,b,n, og det sker p† */ #define prom_n_9 114 /* feltet = fra-felt + 9/10/11. */ #define prom_q_10 116 /* (For sort tr‘kker man 9/10/11 fra) */ #define prom_r_10 117 #define prom_b_10 118 #define prom_n_10 119 #define prom_q_11 121 #define prom_r_11 122 #define prom_b_11 123 #define prom_n_11 124 #define ANTSELPLY 2 #define DRAWPLY 3 #define max_ply 32 #define m_ply max_ply+4 // normalt kun +1....... #define opening_limit 2 #define endgame_limit 7966 #define allowed 1 #define not_allowed 0 typedef struct {signed char fr; signed char to; } move; move wmove; typedef char *string_t; signed char quiet; // is a position quiet? true or false. #define GAME_MAXINDEX 102 unsigned long int game_id [GAME_MAXINDEX+1]; unsigned long int game_idx[GAME_MAXINDEX+1]; int game_pointer=-1; typedef struct {unsigned long int hash_id; unsigned long int hash_idx; signed char hash_fr; signed char hash_to; signed int hash_score; // 30222==none signed char hash_score_final; // true or false signed char hash_depth; signed char hash_ply; unsigned char hash_mpc; } hash_struct; //unsigned long int asdfadsf[4096]; //unsigned long int bsdfadsf[4096]; //unsigned long int csdfadsf[4096]; //unsigned long int dsdfadsf[4096]; #ifdef COMPACT hash_struct compa[256]; #endif hash_struct hash; int hashint[8]; int far *farp; int far *wfarp; int swhash=1; unsigned long int uli_id, uli_idx, uli_id_index, hz, uli_sletigen; unsigned long int hash_maxindex=8192, hash_totbytes, uli_sletigenx; unsigned long int randi_id [h8+1][12]; unsigned long int randi_idx[h8+1][12]; //unsigned long int randy_id[21]; // b/w, 4xcastle, 2x8 e_p //unsigned long int randy_idx[21]; signed char plydyb, gemplydyb; signed char happens[20]={' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '\0'}; // check if some events happens... typedef struct {signed char w_o_o; signed char b_o_o; signed char w_o_o_o; signed char b_o_o_o; signed char e_p; /* indeholder not-allowed eller a6 hvis der fx lige er spillet a7a5 */ signed char pawnchange; // pawns/rooks moved/captured--> true signed char draw50; // antal spillede tr‘k uden slag eller bondetr‘k unsigned long int hash_idx; unsigned long int hash_id; } pp; pp p[m_ply]; signed char ms_fr; signed char ms_to; #define max_moves_in_table 90 //int tpo2idx [max_moves_in_table]; /* pegepinde */ signed char sel_delay [m_ply]; /*"t‘ller forcerede ting i x-dele"*/ signed char first_dynamic_sel_ply [m_ply]; /* i hvilket ply starter sel. search */ signed char sel_side [m_ply]; /* white/black. hvem k›rer sel. search?*/ signed char last_ply; /* hvor dybt i ply g†r vi maksimalt ned?*/ signed char king_in_check [m_ply]; /* er kongen i skak? true/false */ signed char best_move_fr [m_ply]; signed char best_move_to [m_ply]; //int gem_best_score_0; /* bruges ved afbrydelse af et tr‘k*/ int most_recent_best_score; // -------------------------------- int gem_sel_vurd [m_ply]; // gem selektiv vurdering int best_score [m_ply]; // bruges i mini-max int mms [m_ply]; // rigtig mini-max score.... int start_best_score [m_ply]; /* nulstiller best_score */ int mate_score [m_ply]; int w_materiel [m_ply]; /* hvids materiel udover kongen */ int b_materiel [m_ply]; /* sorts materiel udover kongen */ int centre [m_ply]; /* acc. centralisering */ signed char mobilitet [m_ply]; /* udfyldes n†r tr‘kkene er dannet */ char realmoves [m_ply]; /* mobilitet minus pseudomoves */ double mate_sch_pos [m_ply]; /* mate search positions left */ int random_move; /* random moves in the opening */ //int mate_sch_pos [m_ply]; /* mate search positions left */ signed char move_fr_before [m_ply]; /* indholdet af from- og to-feltet */ signed char move_to_before [m_ply]; /* inden tr‘kket blev udf›rt */ signed char prt_fr [m_ply]; /* traekket i forrige udsk. variant*/ signed char prt_to [m_ply]; /* traekket i forrige udsk. variant*/ signed char full_line; /* styrer fuld/blank linie */ signed char move_pointer [m_ply]; /* peger p† n‘ste tr‘k */ signed char move_point; /* arbejdsindeks når der arbejdes i træktabellen */ signed char move_fr [m_ply][max_moves_in_table]; signed char move_to [m_ply][max_moves_in_table]; int move_value [m_ply][max_moves_in_table]; int oldpre_value [m_ply][max_moves_in_table]; /************** counters ******************/ double tv_nodes, tv_pseudo_moves, tv_cutoff, tv_printline, tv_last_ply; double tv_error, filtrc_error, tv_pat, tv_repeat, tv_allnodes=0; double tv_sessionmoves=0, tv_sessionmovetime=0; double tv_hash_read, tv_hash_read_ok, tv_hash_read_ok_final, tv_hash_nofinal; double tv_hash_hit; double tv_hash_skriv, tv_hash_opdat, tv_hash_ejskriv, tv_hash_error; int tv_non_sel_move; double w_ever, b_ever; double vurd_node; int gem_vurd; double maxmovetime=0; // max time for a move in the session double wtid, btid; // time in 1/100 sec used by w and b double msmax; // max number of nodes in matesearch #ifdef SCHOOP int gameinxmin=0; // zero or = minutes for the game int moves_inxmin=60; // used for x moves int min_forxmoves=60; // in y minutes #else int gameinxmin=5; // zero or = minutes for the game int moves_inxmin=0; // used for x moves int min_forxmoves=0; // in y minutes #endif int secprmove=0; int mateinx=0; // used for the mate-level int drucker=false; // AUTO232 on/off int startmateriel; // sum of materiel - 2*K in startposition int draw_score=0; //****************** permanent brain *********************** signed char pb_move_ready=false; signed char pb_move_fr; signed char pb_move_to; #ifdef PBSILLY signed char pb_silly1_fr, pb_silly2_fr, pb_silly2w_fr; signed char pb_silly1_to, pb_silly2_to, pb_silly2w_to; #endif signed char pb_on=false; signed char pb_time_used=false; signed char pb_sw_move_received=false; signed char pb_sw_move_guessed=false; double pb_opponents_time, pb_oppo_nodes; unsigned long int pb_count_bioskey; unsigned long int pb_count_limit; signed char pb_tv_1_4=0; signed char pb_move_received[20]; #define MSPCT 20 // max 20% of the time should be used in the matesearch double check_time_at_nodes; // when to do extra timecontrol char mark_nodesstop; // # indicates a brutal stop // disse felter bruges til at danne legale tr‘k n†r man er i skak signed char sq_avoid_check[h8+1]; /* true/false - hvilke felter skal man flytte til for at parere skakken */ signed char sq_checking_man; // hvor st†r den skakgivende brik // signed char checking_direction1; /* skakgivende retning mod kongen / nul */ signed char checking_direction2; /* ved dobbeltskakker den anden retning */ signed char sq_checked_king; /* hvor er den truede konge */ int w_insufmat, b_insufmat; int trace=-30000; FILE *fp; FILE *gi; // used for gameinfo.trc FILE *pgn; // used for games.txt #define normal_move 0 signed char make2_move_status=normal_move; #define pseudo_move 1 signed char make_move_status=normal_move; #define make_cut_off 2 #define score_is_found 3 signed char simple_kill1_fr [m_ply]; /* pr. ply gemmes tr‘k, der */ signed char simple_kill1_to [m_ply]; /* bevirker cut-off. */ int tv_s_kill1 [m_ply]; int simple_kill1_vu [m_ply]; /* hvor gode var killerne? */ int s_kill1_oldpre [m_ply]; /* killerens oprindelige preval*/ signed char simple_kill2_fr [m_ply]; /* i prevalue s‘ttes de */ signed char simple_kill2_to [m_ply]; /* foran andre tr‘k. */ int tv_s_kill2 [m_ply]; int simple_kill2_vu [m_ply]; /* hvor gode var killerne? */ int s_kill2_oldpre [m_ply]; /* killerens oprindelige preval*/ // ‘ndret fra 2000,5..... //#define kill_items 90 //#define kill_depth 2 //signed char kill_fr [kill_items][ kill_depth]; //signed char kill_to [kill_items][ kill_depth]; /* Best-Move-And-Score-So-Far */ /* i den første iteration eller to puttes kun data i indeks [0], da det er uinteressant at det bedste træk skifter mange gange her... Vha disse data kan man kalde frem, hvad programmet kom frem til under sine beregninger... De kan også bruges til Kaufman's 1-time test, hvor han giver point hvis programmet har fundet det rigtige efter 30, 60, 90 og 120 sekunder. (0 til 4 point pr. testposition) */ #define bmassf_max 10 /* signed char bmassf_idx; int bmassf_seconds [bmassf_max]; int bmassf_score [bmassf_max]; signed char bmassf_move_fr [bmassf_max]; signed char bmassf_move_to [bmassf_max]; */ /* ved test af stillinger skal man finde (evt. undg†) dette tr‘k */ signed char solution_fr; signed char solution_to; /* forvandling kan ikke umiddelbart klares endnu */ signed char solution_mark; /* indeholder ! eller ? - find/undg† dette træk */ signed char run_test=false; /* indeholder true eller false. K›rer vi test? */ signed char solution_xxx[51]; signed char filnavn[20]; double tid, timemovestart; int disctrace=false; int exitsolfound=false; signed char piliwq[13], piliwr[13], piliwb[13], piliwn[13], piliwp[13], sqwk; signed char pilibq[13], pilibr[13], pilibb[13], pilibn[13], pilibp[13], sqbk; // int tvpili; int two_kings; // value of two kings // Es wird der Text in 'text' ausgedruckt (til seriel port). void drucke_text(string_t text) { int i; for(i=0;text[i]!=0;i=i+1) biosprint(0,text[i],port); return; } // Druckt die Carriage-Return Linefeed Sequenz am Ende einer Zeile. void drucke_crlf(void) { char text[3]; // text[0]='\f'; // formfeed // text[0]='\n'; // linieskift // text[0]='\r'; // return tast // text[0]='\t'; // horisontal tabulering text[0]=13; // CR; text[1]=10; // LINEFEED; text[2]=0; drucke_text(text); } void break_point() { #ifdef BREAKPOINT int dum; if (iteration equal 4 and ply equal 4 and move_fr[0][move_pointer[0]]==f6 and move_to[0][move_pointer[0]]==e4 and move_fr[1][move_pointer[1]]==d2 and move_to[1][move_pointer[1]]==d3 and move_fr[2][move_pointer[2]]==d8 and move_to[2][move_pointer[2]]==a5 and move_fr[3][move_pointer[3]]==c1 and move_to[3][move_pointer[3]]==d2 // and move_fr[4][move_pointer[4]]==e8 // and move_to[4][move_pointer[4]]==f8 ) ++dum; //printf("s‘t breakpoint i denne linie..."); #endif } void press_a_k_t_c() { int dum; if (filtrace equal false) { dum = getch(); ++dum;} } void press_any_key_to_continue() { int dum; printf("\n Press any key to continue..."); dum = getch(); ++dum; } int bw_index(signed char sqman) { if (sqman>w_k or sqman b_p and sqman =a6) return randi_id[1][ 5+e_p-a6]; // else return randi_id[2][13+e_p-a3]; //} void read_hash(unsigned long int key) { //if (swhash equal 1) #ifdef COMPACT hash=compa[key]; #endif #ifdef MET1 {for (hz=0; hz<=7; ++hz) *(hashint+hz)=*(farp+key*8+hz); memcpy(&hash, hashint, 16); } #endif #ifdef MET2 {//wfarp=farp+key*sizeof(hash); movedata(FP_SEG((farp+key)), FP_OFF((farp+key)), FP_SEG(&hash), FP_OFF(&hash), sizeof(hash)); // wfarp=farp+key*sizeof(hash); // movedata(FP_SEG(hashint), FP_OFF(hashint), // FP_SEG(wfarp), FP_OFF(wfarp), // sizeof(hash)); // memcpy(&hash.hash_id, hashint, sizeof(hash)); } #endif } void write_hash(unsigned long int key) { //if (swhash equal 1) #ifdef COMPACT compa[key]=hash; #endif #ifdef MET1 {memcpy(hashint, &hash, 16); for (hz=0; hz<=7; ++hz) *(farp+key*8+hz)=*(hashint+hz); // memcpy(hashint, &hash.hash_id, sizeof(hash)); // wfarp=farp+key*sizeof(hash); // movedata(FP_SEG(wfarp), FP_OFF(wfarp), // FP_SEG(hashint), FP_OFF(hashint), // sizeof(hash)); } #endif #ifdef MET2 {//wfarp=farp+key*sizeof(hash); movedata(FP_SEG(&hash), FP_OFF(&hash), FP_SEG((farp+key)), FP_OFF((farp+key)), sizeof(hash)); // wfarp=farp+key*sizeof(hash); // movedata(FP_SEG(hashint), FP_OFF(hashint), // FP_SEG(wfarp), FP_OFF(wfarp), // sizeof(hash)); // memcpy(&hash.hash_id, hashint, sizeof(hash)); } #endif } void calculate_hashkey() { int x; uli_id=uli_idx=0; for (x=a1; x<=h8; ++x) {if (sq[x]>=w_p or sq[x]<=b_p) {uli_idx=uli_idx exor randi_idx[x][bw_index(sq[x])]; uli_id =uli_id exor randi_id [x][bw_index(sq[x])];} } if (wh_bl equal black) {uli_idx=uli_idx exor randi_idx[0][0]; uli_id =uli_id exor randi_id [0][0];} //if (p[ply].w_o_o !=allowed and p[ply].w_o_o ==allowed) uli_id=uli_id exor randy_id[1]; //if (p[ply].w_o_o_o!=allowed and p[ply].w_o_o_o==allowed) uli_id=uli_id exor randy_id[2]; //if (p[ply].b_o_o !=allowed and p[ply].b_o_o ==allowed) uli_id=uli_id exor randy_id[3]; //if (p[ply].b_o_o_o!=allowed and p[ply].b_o_o_o==allowed) uli_id=uli_id exor randy_id[4]; //uli_id=uli_id exor make_e_p_hash(p[ply_1].e_p); //uli_id=uli_id exor make_e_p_hash(p[ply].e_p); if (p[ply].e_p!=not_allowed) {uli_idx=uli_idx exor randi_idx[0][1]; uli_id =uli_id exor randi_id [0][1];} } void sort_pili(signed char *pili) // makes search in testpositions and gameplay identical... {signed char x, y, z, *p, *q; for (x=0; x<=8; ++x) {for (y=0, p=pili; y<=8; ++y) {q=p+1; if (*p<*q) {z=*q; *q=*p; *p=z;}; ++p; } } } void zero_to_pili(signed char *pili, signed char man) {signed char x, *p; p=pili; for (x=0; x<=11; ++x) {*p=0; ++p;} *p=man; } void add_to_pili(signed char *pili, signed char *sq) {*(pili+*(pili+11))=*sq; ++*(pili+11);} // in one statement....!? void change_to_pili(signed char *pili, signed char *sqfr, signed char *sqto) {signed char *p; p=pili; loop: if (*p!=*sqfr) {++p; goto loop;} // ++p in the if-statement....!? *p=*sqto; } void delete_from_pili(signed char *pili, signed char *sq) {signed char *p; p=pili; loop: if (*p!=*sq) {++p; goto loop;} // ++p in the if-statement....!? if (*(p+1) equal 0) {*p=0; --*(pili+11);} else {--*(pili+11); *p=*(pili+*(pili+11)); *(pili+*(pili+11))=0;} } void add_error() { ++tv_error; ++filtrc_error; printf(" ******* error ******* "); } int everplay_and_black() { if (status != everplay or intern equal white) return false; else return true;} void add_pili(signed char *sq, signed char *man) { if (*man>=w_p) { if (*man equal w_p) add_to_pili(piliwp, sq); else if (*man equal w_n) add_to_pili(piliwn, sq); else if (*man equal w_b) add_to_pili(piliwb, sq); else if (*man equal w_r) add_to_pili(piliwr, sq); else add_to_pili(piliwq, sq); } else { if (*man equal b_p) add_to_pili(pilibp, sq); else if (*man equal b_n) add_to_pili(pilibn, sq); else if (*man equal b_b) add_to_pili(pilibb, sq); else if (*man equal b_r) add_to_pili(pilibr, sq); else add_to_pili(pilibq, sq); } } void change_pili(signed char *sqfr, signed char *sqto, signed char *man) { #ifdef CHECKALL if (*man>w_k or *manb_p) ) {//print_line(); show_board(); //press_a_k_t_c(); add_error(); /*printf(" wh_bl in is-move-a-check... ");*/} #endif if (*man>=w_p) { if (*man equal w_p) change_to_pili(piliwp, sqfr, sqto); else if (*man equal w_k) sqwk=*sqto; else if (*man equal w_n) change_to_pili(piliwn, sqfr, sqto); else if (*man equal w_b) change_to_pili(piliwb, sqfr, sqto); else if (*man equal w_r) change_to_pili(piliwr, sqfr, sqto); else change_to_pili(piliwq, sqfr, sqto); } else { if (*man equal b_p) change_to_pili(pilibp, sqfr, sqto); else if (*man equal b_k) sqbk=*sqto; else if (*man equal b_n) change_to_pili(pilibn, sqfr, sqto); else if (*man equal b_b) change_to_pili(pilibb, sqfr, sqto); else if (*man equal b_r) change_to_pili(pilibr, sqfr, sqto); else change_to_pili(pilibq, sqfr, sqto); } } void change_castle_pili(signed char sq1, signed char sq2, signed char man) {if (sq1==h1 or sq1==h8 or sq1==a1 or sq1==a8) // make-move; not undo-move {uli_sletigenx=uli_sletigenx exor randi_idx[sq1][bw_index(man)]; uli_sletigen =uli_sletigen exor randi_id [sq1][bw_index(man)]; uli_sletigenx=uli_sletigenx exor randi_idx[sq2][bw_index(man)]; uli_sletigen =uli_sletigen exor randi_id [sq2][bw_index(man)]; } change_pili(&sq1, &sq2, &man); } void delete_pili(signed char *sq, signed char *man) { if (*man>=w_p) { if (*man equal w_p) delete_from_pili(piliwp, sq); else if (*man equal w_n) delete_from_pili(piliwn, sq); else if (*man equal w_b) delete_from_pili(piliwb, sq); else if (*man equal w_r) delete_from_pili(piliwr, sq); else delete_from_pili(piliwq, sq); } else { if (*man equal b_p) delete_from_pili(pilibp, sq); else if (*man equal b_n) delete_from_pili(pilibn, sq); else if (*man equal b_b) delete_from_pili(pilibb, sq); else if (*man equal b_r) delete_from_pili(pilibr, sq); else delete_from_pili(pilibq, sq); } } void print_line(); void undo_move(); void make_move(signed char *fr, signed char *to, int hop_ud); void skipgarbage() { while ( getchar() !='\n' ) {} } void scanf_char(signed char *ch) {scanf("%c",ch); skipgarbage();} void scanf_int(int *integer) {scanf("%d",integer); skipgarbage();} void scanf_string() {scanf("%s",xxx); skipgarbage();} double henttid() // returnerer antal hundreddele sekunder siden programstart... {return (double)(100*(clock())/CLK_TCK);} int timepctmovesofar() //{return ((tv_nodes / 30) / ((double)secprmove+1));} // => samme spil hver gang {return ((henttid()-timemovestart+pb_opponents_time) / ((double)secprmove+1));} void p99_secsofar() {sprintf(p99,"\n %8.2f sec. ", (henttid()-timemovestart)/100);} //void writessf(pointer peger) hvordan overf›res file-pointer.....???? //{p99_secsofar(); fprintf(peger, p99);} void writesecsofar_gi() {p99_secsofar(); fprintf(gi,p99);} void writesecsofar() {p99_secsofar(); fprintf(fp,p99);} void make_delay(float delay) { float y; y=henttid(); for (; y+delay>henttid(); ) {} } int count_black_8_row() { int x=0; if (sq[a8] equal b_r) ++x; if (sq[h8] equal b_r) ++x; if (sq[b8] equal b_n) ++x; if (sq[g8] equal b_n) ++x; if (sq[c8] equal b_b) ++x; if (sq[f8] equal b_b) ++x; if (sq[d8] equal b_q) ++x; if (sq[e8] equal b_k) ++x; return x; } void is_castle_allowed() { #ifdef VARIANTS if (chess_variant==knightmate or chess_variant==stationary) {p[0].w_o_o=not_allowed; p[0].w_o_o_o=not_allowed; p[0].b_o_o=not_allowed; p[0].b_o_o_o=not_allowed; } #endif } void normal_chess() { chess_variant=normal; memcpy(men_value, nc_men_value, 16); memcpy(king, nc_king, 20); memcpy(queen, nc_queen, 20); memcpy(rook, nc_rook, 20); memcpy(bishop, nc_bishop, 20); memcpy(knight, nc_knight, 20); } int find_move_index(signed char *fr, signed char *to) {int x=0; loop: //#ifdef CHECKALL if (x>200) { #ifdef ONLYFORJENS printf("\nLooooooooooop! find-move-index\n\n"); press_any_key_to_continue(); #endif happens[10]='0'; return -1;} //#endif if (*fr equal move_fr [0][x] and *to equal move_to [0][x]) return x; ++x; goto loop; } void beep() {printf("\a");} void sq120_to_koordinat(signed char *ch1, signed char *ch2, signed char *ch3) /* 31 (a2) => 2(r‘kke) 1(linie) */ {*ch3=(*ch1 - 10) / 10; *ch2=*ch1 - 10 - (10 * *ch3);} void p99_a1_h8(signed char *ch1) // danner fx 'c8' hvis funktionen bliver kaldt med signed char = 93 {signed char ch2, ch3; sq120_to_koordinat(ch1, &ch2, &ch3); sprintf(p99,"%c%c",'a' - 1 + ch2, '0' + ch3); p99[2]=0; } void print_a1_h8(signed char *ch1) {p99_a1_h8(ch1); printf(p99);} void sprint_a1_h8(signed char *ch1) {p99_a1_h8(ch1); drucke_text(p99);} void pgn_a1_h8(signed char *ch1) {p99_a1_h8(ch1); fprintf(pgn,p99);} void skiftfarve() { if (hvid==1) {hvid=0; setfillstyle(SOLID_FILL,BLACK);} else {hvid=1; setfillstyle(SOLID_FILL,WHITE);} } void rammefirkant(int x, int y, int x2, int y2) // firkant med sort ramme { if (hvid==1) {bar(x+1, y+1, x2-1, y2-1); setcolor(BLACK); rectangle(x, y, x2, y2); } else bar(x, y, x2, y2); if (magic equal 8) make_delay(10); } void draw_box(int x, int y, int lx, int ly) // tegn firkant i feltet { rammefirkant(square_x+((x) *sqwidth/25), square_y-((y+ly)*sqwidth/25), square_x+((x+lx)*sqwidth/25), square_y-((y) *sqwidth/25)); if (magic equal 8) make_delay(10); } void draw_p() // brikkernes udseende { draw_box(7,7, 10,2); draw_box(9,9, 6,7); } void draw_b() { draw_box(5,3, 14,3); draw_box(10,6, 4,14); } void draw_n() { draw_box(5,3, 14,3); draw_box(11,6, 5,9); draw_box(7,15, 9,3); } void draw_r() { draw_box(6,5, 12,5); draw_box(9,10, 6,5); draw_box(7,15, 10,4); } void draw_q() { draw_box(6,3, 12,5); draw_box(4,10, 3,11); draw_box(10,10, 4,7); draw_box(17,10, 3,11); } void draw_k() { draw_box(6,3, 12,5); draw_box(4,10, 7,8); draw_box(13,10, 7,8); draw_box(11,20, 2,2); } int square_colour(signed char *sq) { if ((tablin[*sq] % 2) equal (tabrow[*sq] % 2)) return black; else return white; } void show_board() { signed char w1_char, w2_char, w3_char, man, pb_offset; //int wint; if (pb_on equal true) pb_offset=99; else pb_offset=0; setcolor(boardcolor); for (y1=1; y1<50; ++y1) // en ramme om br‘ttet tegnes {if (y1 equal 5) setcolor(BLACK); rectangle(board_x-y1, board_y-y1, board_x+y1+8*sqwidth-1, board_y+y1+8*sqwidth-1); } for (w1_char=a1; w1_char<=h8; w1_char++) // br‘ttets felter l›bes igennem {if (sq[w1_char]!=sq_illegal) {//wint=w1_char+pb_offset; man=sq[wint]; man=sq[w1_char+pb_offset]; sq120_to_koordinat(&w1_char, &w2_char, &w3_char); x1=w2_char-1; y1=7-(w3_char-1); if (square_colour(&w1_char) equal white) setfillstyle(SOLID_FILL,LIGHTGRAY); else setfillstyle(SOLID_FILL,DARKGRAY); square_x=board_x+(x1*sqwidth); // feltet 'nordvest' square_y=board_y+(y1*sqwidth); bar(square_x, // feltet tegnes square_y, square_x+sqwidth-1, square_y+sqwidth-1); if (magic equal 8) make_delay(10); square_y+=sqwidth; // feltet 'sydvest' skiftfarve(); // tilbage til sort/hvid if (man!=sq_empty) {if ((man>=w_p and hvid==0) or (man<=b_p and hvid==1)) skiftfarve(); if (man equal w_q or man equal b_q) draw_q(); if (man equal w_k or man equal b_k) { #ifdef VARIANTS if (chess_variant==knightmate) draw_n(); else #endif draw_k();} if (man equal w_r or man equal b_r) draw_r(); if (man equal w_b or man equal b_b) draw_b(); if (man equal w_n or man equal b_n) { #ifdef VARIANTS if (chess_variant==knightmate) draw_k(); else #endif draw_n();} if (man equal w_p or man equal b_p) draw_p(); } } } setcolor(RED); // br‘ttets koordinater s‘ttes p† for (x1=0, nr[1]='\0', *nr='a'; x1<8; ++x1,++nr[0]) outtextxy(board_x+x1*sqwidth+(10*sqwidth/25), board_y+(208*sqwidth/25), nr); for (y1=0, nr[1]='\0', *nr='8'; y1<8; ++y1,--nr[0]) outtextxy(board_x-(15*sqwidth/25), board_y+y1*sqwidth+(10*sqwidth/25), nr); } void print_kqrbnp(signed char ch1) /* printer 'K' hvis input = 7(w_k), 'D' ved 6 o.s.v. */ {signed char poschar; poschar=ch1; if (poschar < 0) poschar= -1 * poschar; printf("%1c",men_letter[poschar]); } void change_black_white() {if (wh_bl equal white) wh_bl = black; else wh_bl = white; } void unpack_promotion(signed char *to, signed char *to_9_10_11, signed char *promote_piece) {switch (*to) {case prom_q_10 : *to_9_10_11=10; *promote_piece=w_q; break; case prom_q_9 : *to_9_10_11=9 ; *promote_piece=w_q; break; case prom_q_11 : *to_9_10_11=11; *promote_piece=w_q; break; case prom_n_10 : *to_9_10_11=10; *promote_piece=w_n; break; case prom_n_9 : *to_9_10_11=9 ; *promote_piece=w_n; break; case prom_n_11 : *to_9_10_11=11; *promote_piece=w_n; break; case prom_r_10 : *to_9_10_11=10; *promote_piece=w_r; break; case prom_r_9 : *to_9_10_11=9 ; *promote_piece=w_r; break; case prom_r_11 : *to_9_10_11=11; *promote_piece=w_r; break; case prom_b_10 : *to_9_10_11=10; *promote_piece=w_b; break; case prom_b_9 : *to_9_10_11=9 ; *promote_piece=w_b; break; case prom_b_11 : *to_9_10_11=11; *promote_piece=w_b; break; } } int pre_val(int x) { if (s_kill equal 2) {if (x equal +150 and simple_kill1_vu[ply]>(int_max-100)) return simple_kill1_vu[ply]; if (x equal -150 and simple_kill1_vu[ply]<(int_min+100)) return simple_kill1_vu[ply]; if (x equal +120 and simple_kill2_vu[ply]>(int_max-100)) return simple_kill2_vu[ply]; if (x equal -120 and simple_kill2_vu[ply]<(int_min+100)) return simple_kill2_vu[ply]; } if (ply<2) return (x/3); else return x; } void w_prevalue_moves() {int man, w_min, b_min, pre_value; signed char fr, to, to_9_10_11, promote_piece; signed char s_kill1_fr, s_kill1_to, s_kill2_fr, s_kill2_to; /* signed char top_kill_fr, top_kill_to; int x; if (ply equal 1 and iteration>0) {x=find_move_index(&move_fr[0] [move_pointer[0]], &move_to[0] [move_pointer[0]]); #ifdef CHECKALL if (x>4000) {//printf("\nLooooooooooop!-w-prevalue-moves!!\n\n"); //press_any_key_to_continue(); top_kill_fr=0;} else #endif {top_kill_fr=kill_fr[x][0]; top_kill_to=kill_to[x][0];} } else top_kill_fr=0; if (top_kill != 1) top_kill_fr=0; */ s_kill1_fr=simple_kill1_fr[ply]; s_kill1_to=simple_kill1_to[ply]; s_kill2_fr=simple_kill2_fr[ply]; s_kill2_to=simple_kill2_to[ply]; if (s_kill==0) {s_kill1_fr=0; s_kill2_fr=0;} for (move_point=0; move_fr[ply][move_point] != stop; ++move_point) {fr=move_fr[ply][move_point]; to=move_to[ply][move_point]; if (fr equal hash.hash_fr and to equal hash.hash_to) {pre_value=int_max+2; ++tv_hash_hit; if (info_out==1 and ply==1) printf("hash-kill="); goto w_pre_slut;} // if (fr equal top_kill_fr and to equal top_kill_to) // {pre_value=int_max+1; if (info_out==1) printf("top-kill="); // top_kill_fr=1; goto w_pre_slut;} /* skal fjernes igen */ // check denne goto......... if (attack_w_min[to]>=w_p) pre_value=+5; else pre_value=0; if (to>h8) {unpack_promotion(&to, &to_9_10_11, &promote_piece); to=fr + to_9_10_11; man=300; if (promote_piece equal w_q) pre_value += 100; if (promote_piece equal w_n) pre_value += 100; else pre_value += 50; } else man=men_value[sq[fr]]; /* værdi af brik, der flyttes */ if (iteration>0) { if (man != men_value[w_k] and attack_b_min[fr]>=b_k) {b_min= men_value[0-(attack_b_min[fr]) ]; if (attack_w_min[fr]>w_k) w_min=0; else w_min=men_value[attack_w_min[fr]]; if (w_min equal 0) pre_value += man; else if ((man + w_min) > b_min) {pre_value += ((man - 10)/4 ); if (w_min < b_min) pre_value += ((b_min - w_min) /4 ); } }; } if (attack_b_min[to]>=b_k) {b_min= men_value[0-(attack_b_min[to]) ]; if (attack_w_min[to]>w_k) w_min=0; else w_min=men_value[attack_w_min[to]]; if (w_min equal 0 or w_min equal man) pre_value -= man; else if ((man /*+ w_min*/) > b_min) pre_value += (b_min - man /*- w_min - 10*/); }; if (sq[to] != sq_empty) pre_value += men_value[0-(sq[to])]; w_pre_slut: oldpre_value[ply][move_point]=pre_value; if (fr equal s_kill1_fr and to equal s_kill1_to) // and (simple_kill1_vu[ply]>int_max-100 { if (pre_value+50>s_kill1_oldpre[ply] and s_kill>=3) // ) {if (simple_kill1_vu[ply]>(int_max-100)) pre_value=simple_kill1_vu[ply]; else pre_value=simple_kill1_vu[ply] /* hvad med pat m.m....?) */ -w_materiel[ply]+b_materiel[ply] +50+(s_kill1_oldpre[ply]/3) ; // goto w_pre_slut; } else pre_value+=pre_val(+150); } // {pre_value+=s_kill /*simple_kill1_vu[ply]*/;/* goto w_pre_slut;*/} if (fr equal s_kill2_fr and to equal s_kill2_to) // and (simple_kill2_vu[ply]>int_max-100 { if (pre_value+50>s_kill2_oldpre[ply] and s_kill>=3) // ) {if (simple_kill2_vu[ply]>(int_max-100)) pre_value=simple_kill2_vu[ply]; else pre_value=simple_kill2_vu[ply] /* hvad med pat m.m....?) */ -w_materiel[ply]+b_materiel[ply] +30+(s_kill2_oldpre[ply]/3) ; // goto w_pre_slut; } else pre_value+=pre_val(+120); } // {pre_value+=s_kill-1 /*simple_kill2_vu[ply]*/;/*goto w_pre_slut;*/} move_value[ply][move_point]=pre_value; } // if (ply==1 and top_kill_fr !=1 and // iteration>2) // {if (info_out==1) printf(" no-topkill ");} } void b_prevalue_moves() {int man, w_min, b_min, pre_value; signed char fr, to, to_9_10_11, promote_piece; signed char s_kill1_fr, s_kill1_to, s_kill2_fr, s_kill2_to; /* signed char top_kill_fr, top_kill_to; int x; if (ply equal 1 and iteration>0) {x=find_move_index(&move_fr[0] [move_pointer[0]], &move_to[0] [move_pointer[0]]); #ifdef CHECKALL if (x>4000) {//printf("\nLooooooooooop!-b-prevalue-moves!!\n\n"); for (x=0; x<20; ++x) {printf("\n"); print_a1_h8(&move_fr[0] [x]); print_a1_h8(&move_to[0] [x]); printf("\n"); press_any_key_to_continue(); } x=4001; // press_any_key_to_continue(); top_kill_fr=0;} else #endif {top_kill_fr=kill_fr[x][0]; top_kill_to=kill_to[x][0];} } else top_kill_fr=0; if (top_kill != 1) top_kill_fr=0; */ s_kill1_fr=simple_kill1_fr[ply]; s_kill1_to=simple_kill1_to[ply]; s_kill2_fr=simple_kill2_fr[ply]; s_kill2_to=simple_kill2_to[ply]; if (s_kill==0) {s_kill1_fr=0; s_kill2_fr=0;} #ifdef PREVAL if (ply equal PREVALPLYTRACE) { printf("\n kill-1="); print_a1_h8(&s_kill1_fr); print_a1_h8(&s_kill1_to); printf(" oldpre=%d",s_kill1_oldpre[ply]); printf(" vu=%d",simple_kill1_vu[ply]); printf(" tv=%d",tv_s_kill1[ply]); printf("\n kill-2="); print_a1_h8(&s_kill2_fr); print_a1_h8(&s_kill2_to); printf(" oldpre=%d",s_kill2_oldpre[ply]); printf(" vu=%d",simple_kill2_vu[ply]); printf(" tv=%d",tv_s_kill2[ply]); } #endif for (move_point=0; move_fr[ply][move_point] != stop; ++move_point) {fr=move_fr[ply][move_point]; to=move_to[ply][move_point]; if (fr equal hash.hash_fr and to equal hash.hash_to) {pre_value=int_min-2; ++tv_hash_hit; if (info_out==1 and ply==1) printf("hash-kill="); goto b_pre_slut;} // if (fr equal top_kill_fr and to equal top_kill_to) // {pre_value=int_min-1; if (info_out==1) printf("top-kill="); // top_kill_fr=1; goto b_pre_slut;} /* skal fjernes igen */ if (attack_b_min[to]<=b_p) pre_value=-5; else pre_value=0; if (to>h8) {unpack_promotion(&to, &to_9_10_11, &promote_piece); to=fr - to_9_10_11; man=300; if (promote_piece equal w_q) pre_value -= 100; if (promote_piece equal w_n) pre_value -= 100; else pre_value -= 50; } else man=men_value[0-(sq[fr])]; /* v‘rdi af brik, der flyttes */ if (iteration>0) { if (man != men_value[w_k] and attack_w_min[fr]<=w_k) {w_min= men_value[attack_w_min[fr] ]; if (attack_b_min[fr] w_min) {pre_value -= ((man - 10)/4 ); if (b_min < w_min) pre_value += ((w_min - b_min) /4 ); } }; } if (attack_w_min[to]<=w_k) {w_min= men_value[attack_w_min[to] ]; if (attack_b_min[to] w_min) pre_value -= (w_min - man /*- b_min - 10*/); }; if (sq[to] != sq_empty) pre_value -= men_value[sq[to]]; b_pre_slut: oldpre_value[ply][move_point]=pre_value; if (fr equal s_kill1_fr and to equal s_kill1_to) { if (pre_value-50=3) // and simple_kill1_vu[ply]=3) // or simple_kill2_vu[ply]2) // {if (info_out==1) printf(" no-topkill ");} } void get_next_good_move() /* Dette ser noget rodet ud, men der sker simpelthen det, at man sikrer sig, at det bedste af de resterende træk kommer op som det forreste af de resterende træk og altså bliver prøvet først. */ {signed char gem_i, best_i, anne, *lars, *torben; register signed char i, *x; int best_z, *jens, dina; register int *hanne; signed char *skaerm; /*skaerm=99999; */ if (wh_bl equal white) best_z=int_min; else best_z=int_max; i=move_pointer[ply]; gem_i=i; best_i=i; hanne=&move_value[ply][i]; x=&move_fr[ply][i]; for (lars=x; *x!=stop; ++x) {if ((wh_bl equal white and *hanne>best_z) or (wh_bl equal black and *hanne= konge (truet af konge eller ud‘kket) kan feltet ikke v‘re truet af D, T eller L og der laves straks en return false. */ /* her skal s† unders›ges, om det er true eller false............ */ return false; } int is_move_a_check(signed char *fr, signed char *to) /* denne funktion unders›ger, om et tr‘k giver skak */ /* input er et tr‘k (fra og til), skakbr‘ttet(sq), wh_bl, sq_b/w_k[ply] */ /* bem‘rk at ved ply==last_ply er tr‘kket udf›rt p† br‘ttet.... */ /* denne funktion returnerer false/true */ /* form†let er at udv‘lge de skakgivende tr‘k til den selektive search. */ /* rokade og forvandling tages der ikke hensyn til her, da disse tr‘k altid er med i den selektive search alligevel */ { signed char man, *gangart, *idx2, enemy_king, sq_enemy_king, sw=0; if (sq[*fr] equal sq_empty) man=sq[*to]; else man=sq[*fr]; if (man >= w_p) {sq_enemy_king=sqbk; enemy_king=b_k;} else {sq_enemy_king=sqwk; enemy_king=w_k;} #ifdef CHECKALL if (man>=w_p and wh_bl==black) {add_error(); printf(" wh_bl in is-move-a-check... ");} #endif if (man equal w_p * wh_bl) {if ((*to + wh_bl * 9 equal sq_enemy_king) or (*to + wh_bl * 11 equal sq_enemy_king) ) return true; else goto i_m_a_c_90; } else if (man equal w_r * wh_bl) gangart=rook; else if (man equal w_b * wh_bl) gangart=bishop; else if (man equal w_k * wh_bl) goto i_m_a_c_90; else if (man equal w_n * wh_bl) {gangart=knight; goto i_m_a_c_knight;} else { gangart=queen; sw=1; } i_m_a_c_10: /* ny retning */ if (*++gangart equal stop) goto i_m_a_c_90; /* ikke flere retninger */ if (*to > sq_enemy_king and *gangart > 0) goto i_m_a_c_10; /* forkert */ if (*to < sq_enemy_king and *gangart < 0) goto i_m_a_c_10; /* retning */ idx2=&sq[*to]; i_m_a_c_20: /* et skridt mere i den givne retning */ idx2 += *gangart; if (*idx2 equal sq_empty) goto i_m_a_c_20; if (*idx2 equal enemy_king) return true; goto i_m_a_c_10; i_m_a_c_knight: if (knight[0] equal more_steps) goto i_m_a_c_10; // nightrider i_m_a_c_knight_55: if (*++gangart equal stop) goto i_m_a_c_90; /* ikke flere retninger */ if (*to + *gangart equal sq_enemy_king) return true; goto i_m_a_c_knight_55; i_m_a_c_90: #ifdef VARIANTS if (chess_variant!=normal and sw==1) { if (chess_variant==q_is_rn or chess_variant==q_is_bn) {gangart=knight; sw=2; goto i_m_a_c_knight_55;} } #endif // if ((wh_bl==black and discovered_check(fr, to, &sqwk)==true) // or (wh_bl==white and discovered_check(fr, to, &sqbk)==true)) // return true; return false; } int is_move_a_sel_move(signed char *fr, signed char *to) { int man, enemy_man, gain; signed char depth; /* finder selektive tr‘k - denne funktion kaldes ikke med rokade eller forvandling. */ if (ply equal 0 and iteration equal 0) // kun skakker return is_move_a_check(fr, to); // i matesearch ply zero depth=ply - first_dynamic_sel_ply[ply]; /* depth er nu 0, 2, 4 osv..nej..*/ //#ifdef CHECKALL // if (depth % 2 != 0) {printf("depth not 0,2,4.... %d %d\n", // ply,first_dynamic_sel_ply[ply]); add_error();} //#endif #ifdef CHECKALL if (iteration equal 0 and ant_sel_ply>0) { printf("(iteration equal 0 and sel_ply>0).... "); add_error();} #endif // if (depth>=ant_sel_ply) return is_move_a_check(fr, to); /* check-search */ /* if (iteration equal 0) add_error(); */ /*press_any_key_to_continue()*/ if (wh_bl equal white) goto w_moves; else goto b_moves; w_moves: /* NB: w_attack_min er ufuldst‘ndig p† dette tidspunkt! */ if (only_recapture equal true) {if (sq[*to] != sq_empty and (men_value[sq[*to] * -1] + w_materiel[ply]-b_materiel[ply]) >= (w_materiel[0]-b_materiel[0]) ) return true; else return is_move_a_check(fr, to); // 1. jan 98 } if (depth>ant_sel_ply) goto w_m_1; if (depth equal 0 and sq[*to] != sq_empty) return true; /* alle slag i f›rste ply i den selektive search tages med */ // if (depth <= 2 and *to>=a6 and sq[*fr] equal w_p // and attack_b_min[*to] != b_p) return true; if (depth <= 4 and *to>=a7 and sq[*fr] equal w_p) return true; if (sq[*fr] equal w_p and (sq[*to+9] < b_p or sq[*to+11] < b_p) ) return true; w_m_1: // if ((w_materiel[ply]-b_materiel[ply]) <= // (w_materiel[0]-b_materiel[0])) { if (iteration>0 or ply>(4+last_sel_ply+gem_check_search-2)) // 4=last_iteration 11 okt. {if (sq[*to] != sq_empty) {man=men_value[sq[*fr]]; /* v‘rdi af brik */ enemy_man=men_value[sq[*to] * -1]; if (attack_b_min[*to]==b_k - 1) // mangler: udaekket hvis daekket af K og truet af en anden brik...... gain=enemy_man; /* en ud‘kket brik sl†s */ else gain=enemy_man - man; /* modstanderen kan sl† igen */ if ((w_materiel[ply]-b_materiel[ply]+gain) > (w_materiel[0]-b_materiel[0])) /* slag unders›ges herefter kun, hvis de kan give materielt overskud */ return true; } } } if (iteration>0 and depth>3) return false; else return is_move_a_check(fr, to); b_moves: /* NB: b_attack_min er ufuldst‘ndig p† dette tidspunkt! */ if (only_recapture equal true) {if (sq[*to] != sq_empty and (-men_value[sq[*to] ] + w_materiel[ply]-b_materiel[ply]) <= (w_materiel[0]-b_materiel[0]) ) return true; else return is_move_a_check(fr, to); // 1. jan 98 } if (depth>ant_sel_ply) goto b_m_1; if (depth equal 0 and sq[*to] != sq_empty) return true; /* alle slag i f›rste ply i den selektive search tages med */ // if (depth <= 2 and *to<=h3 and sq[*fr] equal b_p // and attack_w_min[*to] != w_p) return true; if (depth <= 4 and *to<=h2 and sq[*fr] equal b_p) return true; if (sq[*fr] equal b_p and (sq[*to-9] > w_p or sq[*to-11] > w_p) ) return true; b_m_1: // if ((w_materiel[ply]-b_materiel[ply]) >= // (w_materiel[0]-b_materiel[0])) { if (iteration>0 or ply>(4+last_sel_ply+gem_check_search-2)) // 4=last_iteration 11 okt. {if (sq[*to] != sq_empty) {man=men_value[sq[*fr] * -1]; /* v‘rdi af brik */ enemy_man=men_value[sq[*to]]; if (attack_w_min[*to]==w_k + 1) gain=enemy_man; /* en ud‘kket brik sl†s */ else gain=enemy_man - man; /* modstanderen kan sl† igen */ if ((w_materiel[ply]-b_materiel[ply]-gain) < (w_materiel[0]-b_materiel[0])) /* slag unders›ges herefter kun, hvis de kan give materielt overskud */ return true; } } } if (iteration>0 and depth>3) return false; else return is_move_a_check(fr, to); } int sel_move(signed char *ch1, signed char *ch2) { int dum; dum=is_move_a_sel_move(ch1, ch2); if (dum equal false) ++tv_non_sel_move; return dum; } void generate_moves_2(signed char *gangart, signed char ch1) { signed char sc1; signed char ch2; sc1 = *gangart; /* husk at D,L & T går lange ture */ g_m2_10: /* ny retning */ if (*++gangart equal stop) goto g_m2_90; /* ikke flere retninger */ ch2=ch1; sq_idx2=sq_idx; g_m2_20: /* et skridt mere i den givne retning */ sq_idx2 += *gangart; ch2 += *gangart; if (*sq_idx2 equal sq_illegal) goto g_m2_10; /* udenfor brættet */ // asdf // if (sq[f2] equal sq_empty and // sq[a7] equal b_k and // sq[h8] equal w_r and // ply equal 1 and // ch1 equal c5 // ) // {//press_any_key_to_continue(); // // printf("asdf....\n"); // print_a1_h8(&ch2); // } if (wh_bl equal white) {if (*sq_idx < attack_w_min[ch2]) {attack_w_min[ch2]=*sq_idx; if (gen_moves_mode equal only_attack) {if (ch2 equal sqbk) {if (checking_direction1 equal 0) {sq_checking_man=ch1; checking_direction1=*gangart; sq_checked_king=ch2; } else checking_direction2=*gangart; /* dobbeltskak! */ } } else if (ch2 equal sqbk) {make2_move_status=pseudo_move; // if (ply equal 1) printf(" m-m-s=pseudo "); } } } else {if (*sq_idx > attack_b_min[ch2]) {attack_b_min[ch2]=*sq_idx; if (gen_moves_mode equal only_attack) {if (ch2 equal sqwk) {if (checking_direction1 equal 0) {sq_checking_man=ch1; checking_direction1=*gangart; sq_checked_king=ch2; } else checking_direction2=*gangart; /* dobbeltskak! */ } } else if (ch2 equal sqwk) {make2_move_status=pseudo_move; // if (ply equal 1) printf(" m-m-s=pseudo "); } } } if (wh_bl equal white and *sq_idx2 >= w_p) goto g_m2_10; if (wh_bl equal black and *sq_idx2 <= b_p) goto g_m2_10; /* en brik af samme farve */ if (gen_moves_mode equal only_attack) goto g_m2_80; if (*sq_idx equal w_k) {if (attack_b_min[ch2]>=b_k) goto g_m2_10; else {if ( ((ch2 - ch1) equal checking_direction1 and sq[sq_checking_man] != b_p ) or ((ch2 - ch1) equal checking_direction2 and sq[ch1 - checking_direction2] != b_p ) ) goto g_m2_10; else goto g_m2_70; } } if (*sq_idx equal b_k) {if (attack_w_min[ch2]<=w_k) goto g_m2_10; else {if ( ((ch2 - ch1) equal checking_direction1 and sq[sq_checking_man] != w_p ) or ((ch2 - ch1) equal checking_direction2 and sq[ch1 - checking_direction2] != w_p ) ) goto g_m2_10; else goto g_m2_70; } } if (checking_direction1 != 0 and sq_avoid_check[ch2] equal false) goto g_m2_80; g_m2_70: /* if (ply>2 and king_in_check[ply] equal false hmmmmmmmmmmmmmmmmmmmmmmm and ch1 equal move_to[ply-2][move_pointer[ply-2]] and ch2 equal move_fr[ply-2][move_pointer[ply-2]] and move_to[ply-1][move_pointer[ply-1]]==move_fr[ply-3][move_pointer[ply-3]] and move_to[ply-3][move_pointer[ply-3]]==move_fr[ply-1][move_pointer[ply-1]] and move_to_before[ply-2] equal sq_empty and move_to_before[ply-3] equal sq_empty and swrepeat4 equal 1 ) {if ((wh_bl equal white and best_score[ply]draw_score) ) {best_score[ply]=draw_score; ++tv_repeat;} } else */ if (sel_ply_now equal false or sel_move(&ch1, &ch2) equal true) #ifdef VARIANTS if (chess_variant!=gridchess or grid[ch1]!=grid[ch2]) #endif { {move_fr[ply][move_point]=ch1; move_to[ply][move_point++]=ch2; #ifdef CHECKALL if (ch2h8 or sq[ch2]==sq_illegal) {add_error(); printf("error ch2.. "); press_a_k_t_c();} // if (sq[f6]==b_q and // sq[e5]==sq_empty and // sq[d4]==sq_empty and // sq[c3]==w_k and // ch1==d5 and // ch2==c4 // ) // {add_error(); printf("error sq_avoid_ch.. "); press_a_k_t_c();} #endif // print_kqrbnp(*sq_idx); // print_a1_h8(&ch2); // printf(" "); } } g_m2_80: if (*sq_idx2 != sq_empty) goto g_m2_10; if (sc1 equal more_steps) goto g_m2_20; goto g_m2_10; g_m2_90: // if (make2_move_status equal pseudo_move) // sq_idx=&sq[h8]+1; // ny her 31/8 } void pawnmove_into_array(signed char *ch1, signed char *ch2, signed char prom) {int selmove; if (checking_direction1 equal 0 or sq_avoid_check[*ch2] equal true or *ch2 equal p[ply].e_p) #ifdef VARIANTS if (chess_variant!=gridchess or grid[*ch1]!=grid[*ch2]) #endif { if ((wh_bl equal white and *ch1h2)) {if (sel_ply_now equal false or sel_move(ch1, ch2) equal true) {move_fr[ply][move_point]=*ch1; move_to[ply][move_point++]=*ch2; } } else {move_fr[ply][move_point]=*ch1; move_to[ply][move_point++]=prom; /* promotion to Q, R, B, N */ //if (magic equal 2) if (tv_pat>0 or ( (intern equal white and best_score[0]draw_score) ) ) {move_fr[ply][move_point]=*ch1; move_to[ply][move_point++]=prom+1; move_fr[ply][move_point]=*ch1; move_to[ply][move_point++]=prom+2; } move_fr[ply][move_point]=*ch1; move_to[ply][move_point++]=prom+3; } } } void generate_pawn_moves(signed char ch1) { signed char ch2; if (gen_moves_mode equal move_and_attack) {ch2 = ch1 + wh_bl * 10; if (sq[ch2] equal sq_empty) {pawnmove_into_array(&ch1, &ch2, prom_q_10); if ((wh_bl equal white and ch1<=h2) or (wh_bl equal black and ch1>=a7)) {ch2 = ch1 + wh_bl * 20; if (sq[ch2] equal sq_empty) pawnmove_into_array(&ch1, &ch2, 0); } } } if (wh_bl equal white) {ch2 = ch1 + 9; attack_w_min[ch2]=w_p; if (gen_moves_mode equal only_attack and ch2 equal sqbk) {sq_checking_man=ch1; checking_direction1=9; sq_checked_king=ch2; } } else {ch2 = ch1 - 9; attack_b_min[ch2]=b_p; if (gen_moves_mode equal only_attack and ch2 equal sqwk) {sq_checking_man=ch1; checking_direction1=-9; sq_checked_king=ch2; } } if (gen_moves_mode equal move_and_attack) {if ((wh_bl equal white and sq[ch2]<=b_p) or (wh_bl equal black and sq[ch2]>=w_p) or (ch2 equal p[ply].e_p )) pawnmove_into_array(&ch1, &ch2, prom_q_9); } if (wh_bl equal white) {ch2 = ch1 + 11; attack_w_min[ch2]=w_p; if (gen_moves_mode equal only_attack and ch2 equal sqbk) {sq_checking_man=ch1; checking_direction1=11; sq_checked_king=ch2; } } else {ch2 = ch1 - 11; attack_b_min[ch2]=b_p; if (gen_moves_mode equal only_attack and ch2 equal sqwk) {sq_checking_man=ch1; checking_direction1=-11; sq_checked_king=ch2; } } if (gen_moves_mode equal move_and_attack) {if ((wh_bl equal white and sq[ch2]<=b_p) or (wh_bl equal black and sq[ch2]>=w_p) or (ch2 equal p[ply].e_p )) pawnmove_into_array(&ch1, &ch2, prom_q_11); } } void generate_moves() {signed char sovs, x; if (wh_bl equal white) memcpy(attack_w_min+a1, attack_w_nul+a1, h8-a1+2); else memcpy(attack_b_min+a1, attack_b_nul+a1, h8-a1+2); move_point=0; if (checking_direction2 != 0 and gen_moves_mode equal move_and_attack #ifdef VARIANTS and chess_variant != stationary #endif ) {if (wh_bl equal white) {sq_idx=&sq[sqwk]; generate_moves_2(king, sqwk);} // only kingmoves when in doublecheck else {sq_idx=&sq[sqbk]; generate_moves_2(king, sqbk);} goto g_m_exit; } if (wh_bl equal white) {for (x=0; piliwp[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[piliwp[x]]; generate_pawn_moves(piliwp[x]);} for (x=0; piliwr[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[piliwr[x]]; generate_moves_2(rook , piliwr[x]);} for (x=0; piliwb[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[piliwb[x]]; generate_moves_2(bishop, piliwb[x]);} for (x=0; piliwn[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[piliwn[x]]; generate_moves_2(knight, piliwn[x]);} if ( #ifdef VARIANTS chess_variant!=stationary and #endif make2_move_status!=pseudo_move) {sq_idx=&sq[sqwk]; generate_moves_2(king , sqwk);} // for (x=0; piliwk[x]!=0; ++x) // {sq_idx=&sq[piliwk[x]]; generate_moves_2(king , piliwk[x]);} for (x=0; piliwq[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[piliwq[x]]; generate_moves_2(queen, piliwq[x]); #ifdef VARIANTS if (chess_variant==q_is_rn or chess_variant==q_is_bn) {sq_idx=&sq[piliwq[x]]; generate_moves_2(knight, piliwq[x]);} #endif } } else {for (x=0; pilibp[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[pilibp[x]]; generate_pawn_moves(pilibp[x]);} for (x=0; pilibr[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[pilibr[x]]; generate_moves_2(rook , pilibr[x]);} for (x=0; pilibb[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[pilibb[x]]; generate_moves_2(bishop, pilibb[x]);} for (x=0; pilibn[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[pilibn[x]]; generate_moves_2(knight, pilibn[x]);} if ( #ifdef VARIANTS chess_variant!=stationary and #endif make2_move_status!=pseudo_move) {sq_idx=&sq[sqbk]; generate_moves_2(king , sqbk);} // for (x=0; piliwk[x]!=0; ++x) // {sq_idx=&sq[piliwk[x]]; generate_moves_2(king , piliwk[x]);} for (x=0; pilibq[x]!=0 and make2_move_status!=pseudo_move; ++x) {sq_idx=&sq[pilibq[x]]; generate_moves_2(queen, pilibq[x]); #ifdef VARIANTS if (chess_variant==q_is_rn or chess_variant==q_is_bn) {sq_idx=&sq[pilibq[x]]; generate_moves_2(knight, pilibq[x]);} #endif } } if (wh_bl equal white) {if ( p[ply].w_o_o equal allowed and sq[f1] equal sq_empty and sq[g1] equal sq_empty and attack_b_min[e1] equal b_k - 1 and attack_b_min[f1] equal b_k - 1 and attack_b_min[g1] equal b_k - 1) {move_fr[ply][move_point] =e1; move_to[ply][move_point++]=g1; } if ( p[ply].w_o_o_o equal allowed and sq[d1] equal sq_empty and sq[c1] equal sq_empty and sq[b1] equal sq_empty and attack_b_min[e1] equal b_k - 1 and attack_b_min[d1] equal b_k - 1 and attack_b_min[c1] equal b_k - 1) {move_fr[ply][move_point] =e1; move_to[ply][move_point++]=c1; } } else {if ( p[ply].b_o_o equal allowed and sq[f8] equal sq_empty and sq[g8] equal sq_empty and attack_w_min[e8] equal w_k + 1 and attack_w_min[f8] equal w_k + 1 and attack_w_min[g8] equal w_k + 1) {move_fr[ply][move_point] =e8; move_to[ply][move_point++]=g8; } if ( p[ply].b_o_o_o equal allowed and sq[d8] equal sq_empty and sq[c8] equal sq_empty and sq[b8] equal sq_empty and attack_w_min[e8] equal w_k + 1 and attack_w_min[d8] equal w_k + 1 and attack_w_min[c8] equal w_k + 1) {move_fr[ply][move_point] =e8; move_to[ply][move_point++]=c8; } } g_m_exit: } void clear_board() {signed char w1_char, w2_char, w3_char; for (w1_char=0; w1_char<120; w1_char++) { sq[w1_char]=sq_illegal; sq120_to_koordinat(&w1_char, &w2_char, &w3_char); if (w2_char>=1 and w2_char<=8 and w3_char>=1 and w3_char<=8) sq[w1_char]=sq_empty; } } void turn_sqavoid_false() {int x; if (checking_direction1 != 0) {for (x=sq_checking_man; x != sq_checked_king; x+=checking_direction1) sq_avoid_check[x]=false; } #ifdef CHECKSQAVOID for (x=a1; x<=h8; x++) {if (sq_avoid_check[x]!=false) {add_error(); printf(" ups... ");} } #endif // for (x=a1; x<=h8; sq_avoid_check[x++]=false); // ret fejl og fjern } void make_move_array() { int x; gen_moves_mode=move_and_attack; generate_moves(); #ifdef CHECKALL if (checking_direction1 == 0 and king_in_check[ply]==true) {add_error(); printf(" king in check... "); print_line(); show_board(); press_a_k_t_c();} #endif turn_sqavoid_false(); /* fatal error hvis der er overflow i move array..... */ mobilitet[ply]=move_point; realmoves[ply]=move_point; { if (move_point>32); else if (move_point>16) sel_delay[ply] += 1; else if (move_point> 8) sel_delay[ply] += 2; else if (move_point> 4) sel_delay[ply] += 6; else if (move_point> 2) sel_delay[ply] += 12; else sel_delay[ply] += 18; } move_fr[ply][ move_point]=stop; move_pointer[ply]=0; if (move_point>0) {if ( wh_bl equal black) b_prevalue_moves(); else w_prevalue_moves();} } void make_only_attack() {/* tr‘kgeneratoren k›res igennem, men kun attack-arrayet dannes */ signed char x; checking_direction1=0; checking_direction2=0; gen_moves_mode=only_attack; generate_moves(); if (checking_direction1 != 0) {for (x=sq_checking_man; x != sq_checked_king; x+=checking_direction1) sq_avoid_check[x]=true; } } void get_solution(signed char w3_char) /* er det en teststilling læses løsningen (som f.eks. er Qe8xNh5+!). Felterne fra og til (e8 og h5) findes ved at finde cifrene (8 og 5). Trækket omformes til internt format (solution_fr=95 og to=68). Forvandling kan ikke håndteres endnu og er sikkert ikke nødvendig. */ {signed char file_x, row_x; solution_fr=false; solution_to=false; for (solution_mark='!'; w3_char<81; ++w3_char) {if (xxx[w3_char] equal '?') solution_mark='?'; else {if (xxx[w3_char] != ' ') {if (xxx[w3_char] >='1' and xxx[w3_char] <='8') {file_x = file_x - 'a' + 1; row_x = xxx[w3_char] - '1' + 1; if (solution_fr equal false) solution_fr = (10 + (10 * row_x)) + file_x; else solution_to = (10 + (10 * row_x)) + file_x; } else file_x = xxx[w3_char]; } } if ((xxx[w3_char] equal '\n') or (xxx[w3_char] equal '\0') or (xxx[w3_char] equal ' ' and solution_to != false)) w3_char=99; } } void remove_move(int x) { //printf("\n remove:"); //print_a1_h8(&move_fr[0] [x]); //print_a1_h8(&move_to[0] [x]); //printf("\n"); //press_any_key_to_continue(); r: #ifdef CHECKALL if (x equal 120 or x<0) {add_error(); printf(" x equal 120 or < 0... ");} #endif move_to [0][x]=move_to [0][x+1]; move_fr [0][x]=move_fr [0][x+1]; move_value[0][x]=move_value[0][x+1]; if (move_fr[0][x] != stop) {++x; goto r;} } //void remove_pseudomoves_ply_zero() //{ int x=0, p=0, gem_iteration=iteration, gg=last_ply, asp=ant_sel_ply; // iteration=0; last_ply=2 /*1*/; ant_sel_ply=0; //loop_x: // if (move_fr[0][x] equal stop) // {/*if (p>0) printf("\nPseudomoves removed: %d iteration=%d\n",p,gem_iteration); // press_any_key_to_continue(); */ // iteration=gem_iteration; last_ply=gg; ant_sel_ply=asp;} // else // {/*last_ply=77; */ // make_move(&move_fr[0][x], &move_to[0][x], false); // if (make2_move_status equal pseudo_move) // {++p; // printf("\npseudo:"); // print_a1_h8(&move_fr[0][x]); // print_a1_h8(&move_to[0][x]); // printf("\n"); // move_pointer[0]=x; undo_move(); // remove_move(x); // --realmoves[0]; // --mobilitet[0]; // --x; // } // else {move_pointer[0]=x; undo_move();} // ++x; goto loop_x; // } //} void set_pb_guessmove_last() { int x, y; signed char wchar; x=find_move_index(&pb_move_fr, &pb_move_to); y=mobilitet[0]-1; wchar=move_fr[0][y]; move_fr[0][y]=move_fr[0][x]; move_fr[0][x]=wchar; wchar=move_to[0][y]; move_to[0][y]=move_to[0][x]; move_to[0][x]=wchar; } void gen_moves_ply_zero() { signed char gemply=ply; // slettes? ingen effekt - stadig slag ply=0; #ifdef CHECKALL if (ply_1 != -1) add_error(); #endif move_pointer[0]=0; change_black_white(); make_only_attack(); change_black_white(); make_move_array(); if ( (wh_bl equal black and attack_b_min[sqwk]>=b_k) or (wh_bl equal white and attack_w_min[sqbk]<=w_k) ) king_in_check[0]=true; else king_in_check[0]=false; // remove_pseudomoves_ply_zero(); sel_delay[0]=0; ply=gemply; // slettes? ved ply 0 i mate-search..... if (pb_on equal true/* and iteration>0*/) set_pb_guessmove_last(); } void initialize_best_score() {int x; // gem_best_score_0=best_score[0]; most_recent_best_score=best_score[0]; for (x=0;x<=max_ply; x++) // {if (x>0 or start_best_score[0] != w_materiel[0]-b_materiel[0]+wh_bl*30) // nb - +wh_bl*30 ikke vandt‘t!!! //{if (x>0 or matesearch_score equal no_good_found) {if ((wh_bl equal white and x % 2 equal 0) or (wh_bl equal black and x % 2 equal 1)) {start_best_score[x]=(int_min + x); mate_score[x]=(int_min + x);} else {start_best_score[x]=(int_max - x); mate_score[x]=(int_max - x);} if (iteration equal 0 and x % 2 equal 0) start_best_score[x] = w_materiel[0]-b_materiel[0]+wh_bl*30; if (matesearch_score equal no_good_found) best_score[0]=start_best_score[0]; else {best_score[0]=matesearch_score;} } mms[0]=start_best_score[0]; } void nulstil() { signed char x; p[0].pawnchange=false; for (x=a1; x<=h8; sq_avoid_check[x++]=false); for (x=a1; x<=h8; ++x) {attack_w_nul[x]=w_k+1; attack_b_nul[x]=b_k-1;} ply=0; ply_1=-1; mate_ply=-1; calculate_hashkey(); p[0].hash_idx=uli_idx; p[0].hash_id=uli_id; } void roll_entries() { int x=0; for (; x=a1; w1_char=w1_char - 10) {w2_char=w1_char; if (xxx[w3_char] equal '/') w3_char++; do { if (xxx[w3_char] equal 'k') {sq[w2_char]=b_k; ++w3_char; sqbk=w2_char; ++w2_char;} else if (xxx[w3_char] equal 'K') {sq[w2_char]=w_k; ++w3_char; sqwk=w2_char; ++w2_char;} else if (xxx[w3_char] equal 'q') {sq[w2_char]=b_q; ++w3_char; ++w2_char;} else if (xxx[w3_char] equal 'Q') {sq[w2_char]=w_q; ++w3_char; ++w2_char;} else if (xxx[w3_char] equal 'r') {sq[w2_char]=b_r; ++w3_char; ++w2_char;} else if (xxx[w3_char] equal 'R') {sq[w2_char]=w_r; ++w3_char; ++w2_char;} else if (xxx[w3_char] equal 's') {sq[w2_char]=b_r; ++w3_char; beep(); if (w2_char equal a8) p[0].b_o_o_o=not_allowed; else if (w2_char equal h8) p[0].b_o_o=not_allowed; /* else {strcpy(fatal_tekst,"s-rook not on a8/h8"); goto fatal_error;} */ ++w2_char; } else if (xxx[w3_char] equal 'S') {sq[w2_char]=w_r; ++w3_char; beep(); if (w2_char equal a1) p[0].w_o_o_o=not_allowed; else if (w2_char equal h1) p[0].w_o_o =not_allowed; /* else {strcpy(fatal_tekst,"S-rook not on a1/h1"); goto fatal_error;} */ ++w2_char; } else if (xxx[w3_char] equal 'n') {sq[w2_char]=b_n; ++w3_char; ++w2_char;} else if (xxx[w3_char] equal 'N') {sq[w2_char]=w_n; ++w3_char; ++w2_char;} else if (xxx[w3_char] equal 'b') {sq[w2_char]=b_b; ++w3_char; ++w2_char;} else if (xxx[w3_char] equal 'B') {sq[w2_char]=w_b; ++w3_char; ++w2_char;} else if (xxx[w3_char] equal 'p') {sq[w2_char]=b_p; ++w3_char; ++w2_char;} else if (xxx[w3_char] equal 'P') {sq[w2_char]=w_p; ++w3_char; ++w2_char;} else if (xxx[w3_char]>='1' and xxx[w3_char]<='8') { --xxx[w3_char]; ++w2_char;} else if (xxx[w3_char] equal '0' or xxx[w3_char] equal '/' or xxx[w3_char] equal ' ') { ++w3_char;} /* else {strcpy(fatal_tekst,"ukendt tegn i input xxx[]"); goto fatal_error;}; */ } while (xxx[w3_char] != '/' and xxx[w3_char] != ' ' and w3_char<81); } /* mangler: check at der er en hvid og sort konge */ if (xxx[++w3_char] equal 'b') wh_bl = black; else wh_bl = white; intern=wh_bl; if (sq[a8] != b_r or sq[e8] != b_k) p[0].b_o_o_o = not_allowed; if (sq[h8] != b_r or sq[e8] != b_k) p[0].b_o_o = not_allowed; if (sq[a1] != w_r or sq[e1] != w_k) p[0].w_o_o_o = not_allowed; if (sq[h1] != w_r or sq[e1] != w_k) p[0].w_o_o = not_allowed; w_materiel[0]=0; b_materiel[0]=0; for (w1_char=a1; w1_char<=h8; ++w1_char) {sq120_to_koordinat(&w1_char, &tablin[w1_char], &tabrow[w1_char]); if (sq[w1_char]<=b_p) b_materiel[0] += men_value[sq[w1_char] * -1]; if (sq[w1_char]>=w_p) w_materiel[0] += men_value[sq[w1_char] ]; { if (sq[w1_char] equal w_k) sqwk=w1_char; else if (sq[w1_char] equal b_k) sqbk=w1_char; else if (sq[w1_char]>=w_p or sq[w1_char]<=b_p) add_pili(&w1_char, &sq[w1_char]); } } get_solution(w3_char); nulstil(); game_pointer=-1; store_hash_for_3xrepeat(); pb_move_ready=false; startmovetime=henttid(); } void print_pc_speed() { printf("\n PC-timetest (50.00 = 50 mhz 486): %5.2f ", pctid); printf("\n PC-speedfactor (10 = 50 mhz 486): %d ", speedfactor); if (pctid <= 0) // happens sometimes, but no pc is that fast... {printf("\n\n\n\nPC-timetest failed - leave Dabbaba and restart.\n"); press_any_key_to_continue();} } void pc_speed() { long int x; if (speedfactor>0) return; printf("running PC-speedtest..."); pctid=henttid(); for(x=0;x<545;++x) {make_array_ply_zero();}; pctid=henttid()-pctid; if (pctid equal 0) pctid=1; #ifdef CHECKJENSPCTIME if (pctid<5 or pctid>6) {printf(" CHECKJENSPCTIME er forkert..."); beep(); press_a_k_t_c();} #endif speedfactor=((5000/pctid)+5)/10; // 50 is time used on a 50mhz 486 print_pc_speed(); } void p99_seconds_used() { #ifdef BLANKHAPPENS strcpy(happens,""); #endif sprintf(p99,"\nTime: white=%6.2f seconds black=%6.2f seconds %s", wtid, btid, happens); } void show_seconds_used() { p99_seconds_used(); printf(p99);} void init_hash() { long unsigned int qqq; hash.hash_id=0; hash.hash_idx=0; hash.hash_fr=0; hash.hash_to=0; hash.hash_depth=-99; hash.hash_score_final=false; hash.hash_mpc=0; hash.hash_ply=99; // hash.hash_score=30222; ///* for (qqq=0; qqq<=hash_maxindex; ++qqq) { //hash.hash_fr=(char)qqq; write_hash(qqq); } } void store_pb_pos() { memcpy(sq+h8+22, sq+a1, 78); } void new_game() { printf("\n\nReady for a new game now...\n\n"); init_hash(); strcpy(xxx,"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR/w"); make_array_ply_zero(); pc_speed(); startmateriel=w_materiel[0]+b_materiel[0]-two_kings; if (save_games equal true) {fprintf(pgn,"\n"); if (evermoves_160 equal 160) {p99_seconds_used(); fprintf(pgn,p99);} // fprintf(pgn,"\n\n\n[Event \"x\"]\n"); fprintf(pgn,"\n\n[Event \"x\"]\n"); } wtid=0; btid=0; pb_move_fr=d2; pb_move_to=d4; pb_move_ready=true; store_pb_pos(); sq[d2+99]=sq_empty; sq[d4+99]=w_p; } void print_vurdering(int vu_rd) { if (vu_rd<(int_min+100)) vu_rd=vu_rd * -1; if (vu_rd < (int_max - 100)) printf(" score: %d",vu_rd); // nix else printf("mate in %d",(1 + (ply / 2))); else printf(" mate in %d",(1 + ((int_max - vu_rd) / 2))); // else printf("mate in %d %d %d %d",(1 + ((int_max - vu_rd) / 2)), // vu, best_score[ply], best_score[ply+2]); } void line_with_numbers() { printf("\n12345678901234567890123456789012345678901234567890");} void print_line() /* udskriver en variant */ {signed char fedtmule, fr, to, *nora, to_9_10_11, promote_piece, prom; printf("\n"); if (filtrace equal false and info_out equal 1) printf("\n"); if (filtrace equal true) printf("%6.0f ",tv_nodes); // if (mms[2]>=30000 or mms[2]<=-30000) printf("3 "); // else printf(" "); for (fedtmule=0; fedtmuleh8) {unpack_promotion(&to, &to_9_10_11, &promote_piece); if (*nora>=w_p) to=fr + to_9_10_11; if (*nora<=b_p) to=fr - to_9_10_11; prom=men_letter[promote_piece]; } else {//if (first_dynamic_sel_ply[fedtmule] equal 99 and // first_dynamic_sel_ply[fedtmule+1] != 99) // prom='*'; if (king_in_check[fedtmule+1] equal true) {if (prom equal ' ') prom='+'; else prom='$'; } } print_a1_h8(&to); printf("%c ",prom); prt_fr[fedtmule]=fr; prt_to[fedtmule]=to; } else printf(" "); } if (filtrace equal true) ++full_line; if (full_line equal 10) full_line=1; print_vurdering(best_score[ply]); if (run_test==true and magic!=13) {line_with_numbers();printf("\n%s",solution_xxx);} } int sbauerbewertung(int feld,int reihe, int linie) { /*--------------------------------------------------------------------*/ /*- Bewertung eines schwarzen Bauern. Neben den Parameter muessen -*/ /*- auch die Bauernkontrollen, Bauernlinien und Turmlinien richtig -*/ /*- belegt sein. -*/ /*- Gibt die Bewertung aus der Sicht von Schwarz zurueck. -*/ /*--------------------------------------------------------------------*/ int wert=0,j; reihe = 9-reihe; /* Reihe umdrehen. Hoehere Reihe ist */ /* damit wie bei WEISS besser. */ // if(MatSumme[Tiefe]>ENDSPIELMATERIAL) { /* Eroeffnung oder Mittelspiel */ // wert=sBFeldWert[feld]; // /* Entwicklung nicht abgeschlossen. Stosse Randbauern nicht vor */ // if((entwickelt<4) and ((linie>=F_LINIE)||(linie<=B_LINIE)) and // (reihe>REIHE_3)) { /* reihe wurde umgedreht. */ // wert = wert - 15; // } // } // else { /* Im Endspiel sind alle Linien gleich gut. Bringe Bauern nach */ // /* vorne. */ // wert = reihe*4; // } /** *** Ist Bauer ein Isolani ? *** Randbauern brauchen nicht extra behandelt werden. Bauern[A_LINIE-1] ist *** linker Rand, Bauern[H_LINE+1] rechter Rand. Auf beiden Raendern steht *** kein Bauer. **/ //if (linie>4) wert -= (+37 - ((linie - 4) * 15)); //else wert -= (-37 + ((linie) * 15)); if((sbauern[linie-1]==0) and (sbauern[linie+1]==0)) { wert += 12; /* Isolani */ if(sbauern[linie]>1) { /* Isolierter Doppelbauer. */ wert += 4; // before 12 } } if(sbauern[linie]>1) { /* Doppelbauer */ wert += 5; // 15---->5 29 sep. } /* Duo oder unterstuetzter Bauer bekommt Bonus */ /* Z.B. e5,d5 ist Duo, d6 unterstuetzt e5 */ // attack_w_min[to]>=w_p if((attack_b_min[feld]==b_p) or (attack_b_min[feld-10]==b_p)) { wert -= reihe ; } /* Rueckstaendiger Bauer wird nicht von eigenen gestuetzt und */ /* kann nicht nach vorne, weil gegnerische Bauern Feld vor ihm */ /* kontrollieren. */ if (attack_b_min[feld] != b_p and attack_b_min[feld-10] != b_p and attack_b_min[feld+10] != b_p) { wert += 15; if ((attack_w_min[feld-10] equal w_p) or (attack_w_min[feld-20] equal w_p and attack_b_min[feld-20] != b_p) ) {wert += 25; if (wbauern[linie]==0) {wert += 15; // *** rook part 1.sa *** if (piliwr[1]>0 and tablin[piliwr[1]] equal linie) wert+=15; if (piliwr[0]>0 and tablin[piliwr[0]] equal linie) wert+=15; } } //else {if (attack_b_min[feld-20] != b_p and // attack_w_min[feld-20] equal w_p) wert += 10; // } //gl. if (sq[a1 - 1 + linie] equal w_r) wert += 10; if(wbauern[linie]==0) { /* Halboffene Linie */ if (piliwr[1]>0 and tablin[piliwr[1]] equal linie) wert+=12; // *** rook part 1.sb *** if (piliwr[0]>0 and tablin[piliwr[0]] equal linie) wert+=12; // if((Tuerme[linie].weiss>0)) { // wert=wert -8; /* Turm kniet sich auf rueckstaendigen Bauer */ } } else {if(wbauern[linie]==0) { /* Halboffene Linie */ /* ** Bauer ist Freibauer, wenn auf halboffenen Linie und die ** weiteren Felder auf seiner Linie nicht von gegnerischen ** Bauern kontrolliert werden. */ for(j=feld;j>h2;j-=10) { if(attack_w_min[j] equal w_p) { goto fertig; } } /* Freibauer gefunden. Im Endspiel ist Freibauer wichtiger als */ /* im Mittelspiel. */ if (b_materiel[ply]0) { /* Turm unterstuetzt Freibauer */ // wert = wert + reihe*2; /* auf selben Linie */ // } // if(Tuerme[linie].weiss>0) { /* gegnerischer Turm auf selben */ // wert = wert - reihe*2; /* Linie. */ // } // if(MatSumme[Tiefe]==0) { /* Reines Bauernendspiel. Freibauer */ // wert = wert + reihe*8; /* Besonders wertvoll. */ // } if((attack_b_min[feld]==b_p) or (attack_b_min[feld-10]==b_p)) { /* Unterstuetzter Freibauer */ wert -= reihe*14; } /* Freibauer von weisser Figur blockiert. Figur wird auch */ /* nicht von eigenen Bauern bedroht. */ if((sq[feld-10]>=w_p) and (attack_b_min[feld-10]!=b_p)) { wert+= reihe*14; } } else { /* Freibauer im Mittelspiel */ wert -= reihe * 27; if((attack_b_min[feld]==b_p) or (attack_b_min[feld-10]==b_p)) { /* Unterstuetzter Freibauer */ wert -= reihe*8; } } } } fertig: return wert; } int wbauerbewertung(int feld,int reihe, int linie) { int wert=0,j; //reihe = 9-reihe; /* Reihe umdrehen. Hoehere Reihe ist */ /* damit wie bei WEISS besser. */ // if(MatSumme[Tiefe]>ENDSPIELMATERIAL) { /* Eroeffnung oder Mittelspiel */ // wert=sBFeldWert[feld]; // /* Entwicklung nicht abgeschlossen. Stosse Randbauern nicht vor */ // if((entwickelt<4) and ((linie>=F_LINIE)||(linie<=B_LINIE)) and // (reihe>REIHE_3)) { /* reihe wurde umgedreht. */ // wert = wert - 15; // } // } // else { /* Im Endspiel sind alle Linien gleich gut. Bringe Bauern nach */ // /* vorne. */ // wert = reihe*4; // } /** *** Ist Bauer ein Isolani ? *** Randbauern brauchen nicht extra behandelt werden. Bauern[A_LINIE-1] ist *** linker Rand, Bauern[H_LINE+1] rechter Rand. Auf beiden Raendern steht *** kein Bauer. **/ //if (linie>4) wert += (+37 - ((linie - 4) * 15)); //else wert += (-37 + ((linie) * 15)); if((wbauern[linie-1]==0) and (wbauern[linie+1]==0)) { wert -= 12; /* Isolani */ if(wbauern[linie]>1) { /* Isolierter Doppelbauer. */ wert -= 4; // before 12 } } if(wbauern[linie]>1) { /* Doppelbauer */ wert -= 5; // 15---->5 29 sep. } /* Duo oder unterstuetzter Bauer bekommt Bonus */ /* Z.B. e5,d5 ist Duo, d6 unterstuetzt e5 */ // attack_w_min[to]>=w_p if((attack_w_min[feld]==w_p) or (attack_w_min[feld+10]==w_p)) { wert += reihe ; } /* Rueckstaendier Bauer */ /* Rueckstaendiger Bauer wird nicht von eigenen gestuetzt und */ /* kann nicht nach vorne, weil gegnerische Bauern Feld vor ihm */ /* kontrollieren. */ if (attack_w_min[feld] != w_p and attack_w_min[feld+10] != w_p and attack_w_min[feld-10] != w_p) { wert -= 15; if ((attack_b_min[feld+10] equal b_p) or (attack_b_min[feld+20] equal b_p and attack_w_min[feld+20] != w_p) ) {wert -= 25; if (sbauern[linie]==0) {wert -= 15; // *** rook part 1.wa *** if (pilibr[0]>0 and tablin[pilibr[0]] equal linie) wert-=15; if (pilibr[1]>0 and tablin[pilibr[1]] equal linie) wert-=15; } } //else {if (attack_w_min[feld+20] != w_p and // attack_b_min[feld+20] equal b_p) wert -= 10; // } // gl.if (sq[a8 - 1 + linie] equal b_r) wert -= 10; if (sbauern[linie]==0) { /* Halboffene Linie */ if (pilibr[0]>0 and tablin[pilibr[0]] equal linie) wert-=12; // *** rook part 1.wb *** if (pilibr[1]>0 and tablin[pilibr[1]] equal linie) wert-=12; // if((Tuerme[linie].weiss>0)) { // wert=wert -8; /* Turm kniet sich auf rueckstaendigen Bauer */ } } else {if(sbauern[linie]==0) { /* Halboffene Linie */ /* ** Bauer ist Freibauer, wenn auf halboffenen Linie und die ** weiteren Felder auf seiner Linie nicht von gegnerischen ** Bauern kontrolliert werden. */ for(j=feld;j0) { /* Turm unterstuetzt Freibauer */ // wert = wert + reihe*2; /* auf selben Linie */ // } // if(Tuerme[linie].weiss>0) { /* gegnerischer Turm auf selben */ // wert = wert - reihe*2; /* Linie. */ // } // if(MatSumme[Tiefe]==0) { /* Reines Bauernendspiel. Freibauer */ // wert = wert + reihe*8; /* Besonders wertvoll. */ // } if((attack_w_min[feld]==w_p) or (attack_w_min[feld+10]==w_p)) { /* Unterstuetzter Freibauer */ wert += reihe*14; } /* Freibauer von schwarzer Figur blockiert. Figur wird auch */ /* nicht von eigenen Bauern bedroht. */ if((sq[feld+10]<=b_p) and (attack_w_min[feld+10]!=w_p)) { wert-= reihe*14; } } else { /* Freibauer im Mittelspiel */ wert += reihe * 27; if((attack_w_min[feld]==w_p) or (attack_w_min[feld+10]==w_p)) { /* Unterstuetzter Freibauer */ wert += reihe*8; } } } } fertig: return wert; } void init_bewertung(void) { int i, x; // Raender mit initialisieren. Damit braucht man bei Randlinien nicht // extra abfragen. for(i=0;i<=9;++i) { // kan optimeres - kun 1 t