DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦3e29b82c7⟧ TextFile

    Length: 35328 (0x8a00)
    Types: TextFile
    Names: »s5«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦this⟧ »s5« 

TextFile


begin


  integer procedure alphabeta(depth,alpha,beta);
  value depth,alpha,beta;
  integer depth,alpha,beta;
  begin

    integer actmover,widthlimit,newalpha,totval1,cr3,cr4,prm,prnx;
boolean array try(1:trywidth);
    boolean field ij,mn,next,w;

procedure selecttry(entry,maxtries,crlimit);
value entry,maxtries,crlimit;
integer entry,maxtries,crlimit;
begin
integer r,c,m,prnx;
boolean field next,u,v;
boolean force;
force:= (force1 and depth=3) or (force2 and depth=4);
if selecttest then write(testlog,<:<10>:>,
case actmover of (<:X:>,<:O:>),<: SEL:>,false add 32,
depth+1,<<ddd>,crlimit,<<ddddd>,entry);
if maxtries<100 and depth=threatdepth(mover) then maxtries:= 0;
prnx:= entry;
for prnx:= propose(prnx+1)
while prnx<1676 and w<maxtries and w<trywidth do
begin
next:= prnx shift (-1);
if selecttest then
begin
write(testlog,<: :>);
writefield(testlog,next);
end;
if totval(next) extract 7 >= crlimit then
begin
v:= 0;
u:= (next shift (-1) shift 1) +actmover-1;
for v:= v+1 while v<=w
and try.v extract 10 <> u  do  ;
if v>w then
begin
if depth>2 and crlimit>0 and -,force then
begin
v:= moveno+depth-1;
for v:= v-2 while v>=moveno and v<1000 do
begin
m:= moves.v extract 10;
r:= abs(u mod 42 - m mod 42)//2;
c:= abs(u//42 - m//42);
if (r=c or r=0 or c=0) and r<5 and c<5 then v:= 1002;
end
end;
if depth<=2 or v=1000 or crlimit=0 or force then
begin
if selecttest then write(testlog,<:+:>);
w:= w+1;
try.w:= false add (u+(if maxtries=100 then 2048 else 0)
+(if crlimit=0 then 1024 else 0));
if maxtries=100 then maxtries:= 1
end
end
end
end;
end selecttry;

actmover:= mover+(-mover+(3-mover))*(1-(depth extract 1));
prm:= 2*actmover;
cr3:= creative(mover,3)+creative(mover,2)*(depth-1);
cr4:= creative(mover,4)+creative(mover,5)*(depth-1);

w:= 0;
i:= 1;
for ij:= 166+prm, 172-prm,
        250+prm,256-prm,
        418+prm,424-prm do
if propose(ij+1) = 1676 then  i:= i+1
else  goto casei;
casei:
case i of
begin
begin
comment own5,win;
selecttry(166+prm,100,0)
end;
begin
comment opp5;
selecttry(172-prm,1,0)
end;
begin
comment own-open4.
  closed4+open3 => own-open4+own-closed4+opp-open4+opp-closed4,
  2*closed4 or open4 => ownopen4,win;
ij:= 250+prm;
for mn:= propose(ij+1)
while mn<1676 and totval(mn shift (-1)) extract 14 < 5*128 do ij:= mn;
if mn=1676 and depth<6 then
begin
selecttry(250+prm,trywidth,0);
selecttry(334+prm,trywidth,cr4);
selecttry(256-prm,trywidth,0);
selecttry(340-prm,trywidth,cr4)
end
else
if mn<1676 then selecttry(ij,100,0)
else
selecttry(250+prm,100,0)
end;
begin
comment opp-open4 => ownclosed4+oppopen4+oppclosed4;
selecttry(256-prm,trywidth,0);
if w<2 then
begin
if depth>5 then
selecttry(334+prm,trywidth,cr4);
selecttry(340-prm,trywidth,cr4);
selecttry(508-prm,trywidth,cr3)
end;
if depth<6 then
selecttry(334+prm,trywidth,1);
end;
begin 
comment own-double3.
  not opp-closed4 => own-double3,win
  else owndouble3+ownclosed4+oppclosed4;
selecttry(340-prm,trywidth,cr4);
if w=0 then  selecttry(418+prm,100,0)
else
begin
selecttry(418+prm,trywidth,0);
b:= try(w);
try(w):= try(1);
try(1):= b;
end
end;
begin
comment opp-double3 => ownclosed4+ownsingle3+oppdouble3;
selecttry(334+prm,trywidth,cr4);
selecttry(502+prm,trywidth,cr3);
selecttry(424-prm,trywidth,0);
selecttry(508-prm,trywidth,cr3);
selecttry(340-prm,trywidth,cr4)
end;
begin
comment ingen dobbelttrusler;
comment ownclosed4+ownsingle3+oppclosed4+strategiske træk;
selecttry(334+prm,trywidth,cr4+od(actmover));
selecttry(502+prm,trywidth,cr3+od(actmover));
ij:= 2034+prm;
mn:= 2040-prm;
j:= w;
for prnx:= (if ij >= mn -mnsub(actmover) then ij else mn)
while w<j+width(mover,depth) and (ij>0 or mn>0) do
begin
if propose(prnx+1) < 1676 then
selecttry(prnx,j+width(mover,depth),1);
if ij >= mn -mnsub(actmover) then
begin
for ij:= ij-4 while propose(ij+1) > 1675  do 
end
else
for mn:= mn-4 while propose(mn+1) > 1675  do ;
if ij>0 then
begin
if propose(ij+1) = 0 then  ij:= 0;
end;
if mn>0 then
begin
if propose(mn+1) = 0 then  mn:= 0
end
end next;
selecttry(340-prm,trywidth,cr4+od(3-actmover));
selecttry(508-prm,trywidth,cr3+od(3-actmover));
end;
end case i;
widthlimit:= w;
if depth=1 then
begin
if w=0 then
begin
row:= bestmove//2 mod 21;
col:= bestmove//2//21;
for ij:= 1 step 1 until 19 do
for i:= -ij step 1 until ij do
for j:= -ij step 1 until ij do
if (abs i=ij or abs j=ij) and
row+i>0 and row+i<20 and col+j>0 and col+j<20 then
begin
bestmove:= (row+i+(col+j)*21)*2+mover-1;
pq:= bestmove+3-2*mover;
if totval(bestmove) > 16383
and totval(pq) > 16383 then goto firstbestmove
end
end
else
begin
w:= 1;
bestmove:= try.w extract 10
end
end;
firstbestmove:
for i:= depth step 1 until 13 do
bestseq(depth,i):= 42;
timebase(depth):= timebase(depth-1);
newalpha:= stratval*((depth extract 1 shift 1) -1);
if w=0 and newalpha>alpha then alpha:= newalpha;
w:= 0;
for w:= w+1 while w<=widthlimit and alpha<beta do
begin
next:= try.w extract 10;
ij:= moveno+depth-1;
moves.ij:= false add next;
totval1:= totval(next) extract 14;
nodes:= nodes+1;
node(depth):= node(depth)+1;
steptest:
if alphatest then
begin
if lookaheadstep then
begin
write(out,xymode,1,<:<96><22><30>:>,false add 32,60,<:<13>try=:>);
for mn:= 1 step 1 until widthlimit do
begin
writefield(out,try.mn extract 10);
write(out,<: :>);
end;
write(out,<: commands::>);
setposition(out,0,0);
setposition(in,0,0);
i:= readchar(in,char);
if char>116 or i=7 then
begin
treatcommands;
goto steptest
end;
end;
writemoves(out,ij-mw,ij);
changeboard(ij,true);
writealphatest(actmover,depth,next,
boardvalue(mover),newalpha,alpha,beta,bestmove);
end;
comment  boardvalue ses fra Xs synspunkt,
  stratval ses fra moverens synspunkt,
  alpha og newalpha ses fra actmoverens synspunkt;
if depth=stdepth or moveno+depth>maxmoves 
or (widthlimit=1 and depth=1) then
stratval:= boardvalue(mover)*(3-2*mover)
+(totval1 extract 7)*((depth extract 1 shift 1) -1);
if try.w extract 12 >= 2048 then  newalpha:= 901-depth
-(if totval1>=11*128 then 0 else
if totval1>=5*128 then 2 else 4)
else
if depth=threatdepth(mover) or moveno+depth>maxmoves
or depth>=moveno+1
or (widthlimit=1 and depth=1) then
newalpha:= stratval*((depth extract 1 shift 1) -1)
else
begin
if depth=1 then force1:= try.w extract 11 >= 1024;
if depth=2 then force2:= try.w extract 11 >= 1024;
move(next,depth);
timeslice(depth):= timeslice(depth-1)*slice(widthlimit,w);
newalpha:= alphabeta(depth+1,-beta,-alpha);
move(next,depth);
timebase(depth):= timebase(depth)+timeslice(depth);
systime(1,movestart,movetime);
if movetime>timebase(depth-1)+timeslice(depth-1) 
or (movetime+4 > timeslice(0) and depth = 1) then
w:= widthlimit
end;
if depth=1 and -, alphatest then
begin
writefield(testlog,next);
write(testlog,<<-dd>,newalpha,<: :>);
writefield(out,next);
write(out,<<-dd>,newalpha,<: :>);
setposition(out,0,0)
end;
if newalpha>alpha then
begin
for i:= depth+1 step 1 until 13 do
bestseq(depth,i):= bestseq(depth+1,i);
bestseq(depth,depth):= next;
alpha:= newalpha;
if depth=1 then  bestmove:= next
end;
if alphatest then
begin
writemoves(out,moveno+depth-mw-2,moveno+depth-2);
changeboard(moveno+depth-1,false);
writealphatest(actmover,depth,next,
boardvalue(mover),newalpha,alpha,beta,bestmove);
end
end w;
if alphatest and alpha>=beta then
write(testlog,<:<10> CUT-OFF :>,widthlimit,widthlimit-w+1);
    alphabeta:= -alpha
  end alphabeta;
\f




  procedure move(xy,depth);
  value xy,depth;
integer xy,depth;
  begin



procedure propose_delete;
    begin
comment
if movetest then  writemovetest(<: DEL:>,gh,depth);
rs:= propose(gh);
tu:= propose(gh+1);
propose(rs+1):= tu;
propose(tu):= rs;
propose(gh+1):= 0
end propose_delete;


procedure propose_insert;
begin
rs:= (totval1 extract 7 shift 2)+(actmover+837)*2;
if threatval > 0 then
rs:= threat(threatval)+actmover*2;
comment
if movetest then  writemovetest(<: INS:>,gh,depth);
tu:= propose(rs+1);
propose(rs+1):= gh;
propose(gh):= rs;
propose(gh+1):= tu;
propose(tu):= gh
    end propose_insert;
\f


    integer actmover,pm1,distance,distsign,ws,dir,wing,ffield,dw,
threatval,totval1,totval2;
    boolean field gh,ij,mn,pq,rs,tu;
    boolean met1,met2,backwards;
actmover:= (xy extract 1) +1;
pm1:= 1-(xy extract 1 shift 1);
    ij:= xy;
gh:= ij shift 1;
comment
if movetest then  writemovetest(<: MOV:>,ij,depth);
    totval1:= totval(ij);
    pq:= ij+pm1;
    totval2:= totval(pq) extract 14;
    if totval1 > 16383 then
    begin
comment  feltet er frit, det besættes;
backwards:= false;
totval1:= totval1 extract 14;
      totval(ij):= totval1;
      boardvalue(mover):= boardvalue(mover) + (totval1 extract 7)*pm1;
      distsign:= 0;
      if propose(gh+1) > 0 then  propose_delete;
gh:= pq shift 1;
if propose(gh+1) > 0 then  proposedelete;
    end
    else
    begin
comment  feltet er besat, det frigives;
backwards:= true;
totval(ij):= totval1+16384;
boardvalue(mover):= boardvalue(mover)-(totval1 extract 7)*pm1;
      distsign:= 8;
threatval:= totval1 shift (-7);
if totval1 extract 7 > proposelow(mover,actmover)
or threatval > 0 then
      propose_insert;
threatval:= totval2 shift (-7);
if totval2 extract 7 > proposelow(mover,3-actmover) 
or threatval > 0 then
begin
gh:= pq shift 1;
        totval1:= totval2;
actmover:= 3-actmover;
        propose_insert
      end
    end;
    for dir:= 0,1,2,3 do
    for wing:= 0,4 do
    begin
comment  de 32 omegnsfelter opdateres;
dw:= (dir shift 3) +wing;
ws:= wing+distsign;
      met1:= met2 := false;
      for ffield:= 1 step 1 until 4 do
      begin
        ij:= xy+cd(dw+ffield);
comment
if movetest then  writemovetest(<: UPD:>,ij,depth);
        pq:= ij + pm1;
actmover:= (xy extract 1)+1;
        totval1:= totval(ij);
        totval2:= totval(pq);
        if totval1 > 16383 and totval2 > 16383 then
        begin
comment  omegnsfeltet er frit, det opdateres;
          distance:= dist(ffield+ws);
totval1:= totval1 extract 14;
distupdate:
gh:= ij shift 1;
comment
if movetest then  writemovetest(<: FRE:>,ij,depth);
if propose(gh+1) > 0 then
begin
rs:= propose(gh);
tu:= propose(gh+1);
propose(rs+1):= tu;
propose(tu):= rs;
propose(gh+1):= 0
end;
mn:= (ij shift 2) +dir;
          rs:= env(mn);
          tu:= rs+distance;
          env(mn):= tu;
totval1:= totval1+envval.tu extract 12-envval.rs extract 12;
totval(ij):= totval1+16384;
threatval:= totval1 shift (-7);
          if (totval1 extract 7 > proposelow(mover,actmover) 
and (depth<stdepth or backwards))
or threatval > 0 then
begin
rs:= (totval1 extract 7 shift 2) + 2*(actmover+837);
if threatval > 0 then
rs:= threat(threatval)+2*actmover;
tu:= propose(rs+1);
propose(rs+1):= gh;
propose(gh):= rs;
propose(gh+1):= tu;
propose(tu):= gh
end;
          if ij <> pq then
          begin
            ij:= pq;
            totval1:= totval2 extract 14;
actmover:= 3-actmover;
            distance:= distance+distance;
            goto distupdate
          end
        end
        else
        begin
comment  omegnsfeltet er besat;
comment
if movetest then  writemovetest(<: OCC:>,ij,depth);
          if totval1 < 16384 then  met1:= true;
          if totval2 < 16384 then  met2:= true;
          if met1 and met2 then  ffield:=4
        end
      end ffield;
  end wing;
if envtest then  writeenv(testlog,env);
if totvaltest then
begin
i:= 3*mover;
writetotval(testlog,totval,env,envval,
string playername(increase(i)));
end;
if proposetest then  writepropose;
  end move;
\f

procedure writemovetest(location,ij,depth);
value  ij,depth;
integer  ij,depth;
string  location;
begin
write(testlog,<:<10>:>,case ((ij extract 1)+1) of (<:X:>,<:O:>),
location,false add 32,depth+1);
writefield(testlog,ij);
write(testlog,<: totval=:>);
writefieldval(testlog,ij);
end;
  

procedure writealphatest(actmover,depth,next,board,
newalpha,alpha,beta,bestmove);
value  actmover,depth,next,board,newalpha,alpha,beta,bestmove;
integer actmover,depth,next,board,newalpha,alpha,beta,bestmove;
begin
write(testlog,<:<10>:>,case actmover of (<:X:>,<:O:>),
<: ALF:>,false add 32,depth+1,<:nx=:>);
writefield(testlog,next);
write(testlog,<: tv=:>);
writefieldval(testlog,next);
write(testlog,<: bv=:>,<<-ddd>,board,<<-ddd>,
<: na=:>,newalpha,<: al=:>,alpha,<: be=:>,beta,<: bm=:>);
writefield(testlog,bestmove);
end;


procedure writefield(outzone,ij);
value  ij;
zone  outzone;
integer  ij;
begin
write(outzone,false add (ij//2//21+(if ij>378 then 65 else 64)),
1,<<dd>,ij//2 mod 21);
end;


procedure writefieldval(outzone,ij);
value  ij;
zone  outzone;
integer  ij;
begin
boolean field  pq;
pq:= ij;
write(outzone,<<ddd>,totval(pq) extract 14 shift (-7),<:,:>,
<<dd>,totval(pq) extract 7)
end;
\f


procedure writenewboard;
begin
write(out,erase,1,<:  A B C D E F G H J K L M N O P Q R S T:>);
for i:= 1 step 1 until 19 do
write(out,down,1,return,1,<<dd>,20-i,
<:. . . . . . . . . . . . . . . . . . .:>,20-i);
write(out,down,1,return,1,<:  A B C D E F G H J K L M N O P Q R S T:>);
setposition(out,0,0)
end;



procedure writehead(out);
zone out;
begin
write(out,xymode,1,<:J:>,false,1,<<dd dd dd>,
systime(2,gamestart,clock),<:    :>,clock);
for mover:= 1,2 do
begin
i:= 3*mover;
write(out,xymode,1,<:J:>,false add (3*mover-2),1,
case mover of (<:X :>,<:O :>),
string playername(increase(i)));
if playertype(mover)=1 then
begin
write(out,<:  thr= :>,<<dd>,threatdepth(mover),
<:;  slicefactor= :>,<<d.d>,slicefactor(mover),<:;:>,
<<d>,xymode,1,<:T:>,false add(3*mover-1),1,
<:str= :>,stratdepth(mover),<:; wid=:>);
for i:= 1 step 1 until stratdepth(mover)+1 do
write(out,<<dd>,width(mover,i));
write(out,<:;:>,xymode,1,<:T:>,false add(3*mover),1,
<:cre= :>,creative(mover,4),<:+:>,creative(mover,5),<:,:>,
creative(mover,3),<:+:>,creative(mover,2),<:;:>);
end
end;
write(out,xymode,1,<:J<7>Moveno X    O:>);
setposition(out,0,0)
end;
\f

procedure writemoves(out,firstmove,lastmove);
value firstmove,lastmove;
integer firstmove,lastmove;
zone out;
begin
boolean field i;
for i:= firstmove step 1 until lastmove do
begin
write(out,xymode,1,<:J:>,false add(8+i-firstmove),1);
if i>0 then
begin
write(out,<<ddddd>,i,<:  :>);
if i mod 2 = 0 then write(out,<:     :>);
writefield(out,moves.i extract 10);
if i mod 2 = 1 then write(out,<:     :>)
end
else
write(out,<:               :>)
end;
setposition(out,0,0)
end;
\f

procedure changeboard(lastmoveno,forward);
value lastmoveno,forward;
integer lastmoveno;
boolean forward;
begin
if forward then
begin
if lastmoveno>1 then changemove(lastmoveno-1,1);
changemove(lastmoveno,2)
end
else
begin
changemove(lastmoveno,0);
changemove(lastmoveno-1,2)
end;
setposition(out,0,0)
end;


procedure changemove(moveno,option);
value moveno,option;
integer moveno,option;
begin
boolean field m;
integer move,row,col,char,mover;
m:= moveno;
mover:= 2 - m mod 2;
move:= moves.m extract 10;
row:= 20-move//2 mod 21;
col:= move//2//21*2;
col:= if col>31 then col+32 else col+96;
char:= case option+1 of
(46,if mover=1 then 120 else 111,
if mover=1 then 88 else 79);
write(out,xymode,1,false add col,1,false add row,1,false add char,1)
end;


procedure writedetails(out);
zone out;
begin
write(out,xymode,1,<:J<15>totval=  :>);
writefieldval(out,bestmove);
write(out,<:;  boardvalue=:>,<<-ddd>,boardvalue(mover),<:  ;:>,
xymode,1,<:J<16>movetime=:>,movetime,
<: s;  totaltime= :>,timeused(moveno),<: s;:>);
if playertype(mover)=1 then
begin
write(out,xymode,1,<:J<17>timeslice=:>,<<ddd>,timeslice(0),
<<-ddd>,<: s;  alfa=      :>,alpha,<:  ;:>,
xymode,1,<:J<18>nodes=   :>,<<-dddd>,nodes,
<: ;  nodetime=:>,(movetime-0.018*blocksread)/nodes*1000,
<: ms; :>,xymode,1,<:J<19>blocksread=:>,<<ddd>,blocksread,
<: ;:>,xymode,1,<:<96><22>:>);
for i:= 1 step 1 until threatdepth(mover) do
write(out,<<dddd>,node(i));
write(out,down,1,return,1);
for i:= 1 step 1 until threatdepth(mover) do
begin
write(out,<: :>);
writefield(out,bestseq(1,i));
end
end;
setposition(out,0,0)
end;
\f

procedure writeboard(out,lastmoveno);
value  lastmoveno;
integer  lastmoveno;
zone  out;
begin

procedure colnameline;
begin
write(out,<:<10>  :>);
for col:= collow-margin step 1 until colhigh+margin do
if col>0 and col<20 then
begin
char:= if col>8 then col+65 else col+64;
write(out,false add char,1)
end
end;

boolean array  board(1:19,1:19);
integer  row,rowlow,rowhigh,col,collow,colhigh;
boolean field  i;

for row:= 1 step 1 until 19 do
for col:= 1 step 1 until 19 do  board(row,col):= false add 46;
rowlow:= collow:= 19;
rowhigh:= colhigh:= 1;
for i:= 1 step 1 until lastmoveno do
begin
row:= (moves.i extract 12)//2 mod 21;
col:= (moves.i extract 12)//2//21;
board(row,col):= false add (79+9*(i extract 1));
 
if i<lastmoveno then  board(row,col):= board(row,col) add 32;
if row < rowlow then  rowlow:= row;
if row > rowhigh then rowhigh:= row;
if col < collow  then collow:=  col;
if col > colhigh then colhigh:= col;
end i;
colnameline;
for row:= rowhigh+margin step -1 until rowlow-margin do
if row>0 and row<20 then
begin
write(out,<:<10>:>,<<dd>,row);
for col:= collow-margin step 1 until colhigh+margin do
if col>0 and col<20 then  write(out,board(row,col),1);
write(out,<<d>,row)
end row;
colnameline;
write(out,<:<10><10>:>);
end;
\f

procedure writepropose;
begin

procedure writechain(totval);
value  totval;
integer  totval;
begin
boolean field  pq;
write(testlog,<:<10>:>,<<ddd>,totval);
pq:= ij;
for pq:= propose(pq+1) while pq>0 and pq<1676 do
begin
write(testlog,<:  :>);
writefield(testlog,pq shift (-1));
if totval<7 then writefieldval(testlog,pq shift (-1));
end
end;

boolean field  ij;
integer  player,prlow,i,j,pl;
for player:= 1,2 do
begin
pl:= 2*player;
i:= mover*3;
write(testlog,<:<12>:>,string playername(increase(i)),
<:-propose for :>,case player of (<:X:>,<:O:>),
<:<10><10>trusler :<10>:>);
for ij:= 166+pl,250+pl,334+pl,418+pl,502+pl do
if propose(ij+1) < 1676 then  writechain(7-ij//84);
write(testlog,<:<10><10>ikke-trusler :<10>:>);
prlow:= proposelow(mover,player)*4+1680;
for ij:= 2182+pl step -4 until prlow do
if propose(ij+1) < 1676 then  writechain((ij-1676)//4);
comment
goto wpout;
write(testlog,<:<10><10><10> :>);
for i:= 0 step 1 until 20 do
write(testlog,<<ddd>,i);
write(testlog,<:<10>A  . :>);
for ij:= 86+pl,ij+4 while ij<2188 do
begin
if ij mod 84 < 4 then
begin
write(testlog,<:<10>:>);
write(testlog,false add (ij//84
+(if ij//84 > 8 then 65 else 64)),1,<: :>);
end;
if propose(ij+1) = 0 then
write(testlog,<: . :>)
else
writefield(testlog,propose(ij+1) shift (-1));
end;
wpout:
write(testlog,<:<10>:>);
end player;
end writepropose;
\f

procedure discio(iotype);
value  iotype;
integer  iotype;
begin
real  plnostring;
plnostring:= real ( case mover of (<:spiller1:>,<:spiller2:>));
disk(envval,-5,6560,string plnostring,0,iotype);
disk(totval,0,1762,string plnostring,13,iotype);
disk(propose,175,4374,string plnostring,17,iotype);
disk(env,351,6702,string plnostring,26,iotype);
end;


procedure proposeclean(actmover);
value  actmover;
integer  actmover;
begin
integer  fieldcount;
fieldcount:= 0;
ij:= 2186+actmover*2;
for ij:= ij-4
while (ij-1676) shift (-2) > proposelow(mover,actmover)
and fieldcount < enoughfields(mover) do
begin
pq:= ij;
for pq:= propose(pq+1) while pq<1676 do
fieldcount:= fieldcount+1;
end;
proposelow(mover,actmover):= (ij-1676) shift (-2);
pq:= ij;
for ij:= propose(ij+1) while ij>0 do
begin
propose(pq+1):= 0;
pq:= ij
end;
if proposetest then  writepropose;
end;
\f


procedure gameinit;
begin
moveblock:= 82;
winner:= 0;
moveno:= 0;
for mover:= 1,2 do
begin
timeused(1-mover):= 0;
timeleft(1-mover):= if slicefactor(mover)>5 then 5000 else 650;
boardvalue(mover):= 0;
if playertype(mover) = 1 then
begin
enoughfields(mover):= enoughfactor*width(mover,1);
for i:= 1,2 do  proposelow(mover,i):= 0;
disk(env,351,6702,<:env:>,0,0);
i:= 3*mover;
disk(envval,-5,6560,string playername(increase(i)),0,0);
i:= 3*mover;
disk(totval,0,1762,string playername(increase(i)),13,0);
for i:= 88 step 1 until 1679 do  propose(i):= 0;
for i:= 2184 step -4 until 1680 do
begin
propose(i):= i+4;
propose(i+1):= i-4;
propose(i+2):= i+6;
propose(i+3):= i-2
end;
for i:= 169,171,253,255,337,339,421,423,505,507 do propose(i):= 1676;
discio(1)
end;
end;
writenewboard;
writehead(out)
end;
\f

procedure treatcommands;
begin
integer  gotomoveno;
boolean  testvalue;
repeatchar(in);
for i:= readchar(in,char) while char>31 do
if char = 63 and moveno=0 then
begin
comment forklaring til kommandoer;
write(out,<:
træk-syntax = A-T (ikke I) 1-19  (a-t tilladt)


kommandoer                                    defaults

  u n =  margenbredde n                           2
  v n =  n træk før diktat                      150   
  w n =  vinder nr. (0,1,2)
  x n =  gå tilbage til træk nr. n
y(-)p =  enabler/disabler test-switches :
    a =  alfatest                             false
    b =  look ahead, 1 trin ad gangen         false
    c =  movetest                             false
    d =  movedetails                          true
    e =  totvaltest                           false
    f =  proposetest                          false
    g =  envtest                              false
  h =  selecttest                            false
  z   =  tom

komma efter kommandoer.


:>);
readchar(in,char);
setposition(out,0,0);
end
else
if char > 116 and char < 123 then
begin
if movedetails then
write(testlog,<:<10>kommando :>,false add char,1);
case char-116 of
begin
begin
comment  u;
read(in,margin)
end;
begin
comment  v;
read(in,movegen);
if movedetails then  write(testlog,movegen);
end;
begin
comment  w;
read(in,winner);
winner:= winner+3;
goto game_end
end;
begin
comment  x;
read(in,gotomoveno);
if gotomoveno <= moveno then
begin
gameinit;
moveno:= 1
end;
for moveno:= moveno step 1 until gotomoveno-1 do
begin
bestmove:= moves.moveno extract 10;
writemoves(out,moveno-mw,moveno);
changeboard(moveno,true);
for mover:= 1,2 do
if playertype(mover) = 1 then
begin
discio(0);
if moveno<gotomoveno-1 or mover = 2-moveno mod 2 then
begin
move(bestmove,1);
proposeclean(1+moveno mod 2)
end;
moveblock:= moveblock-1;
if moveblock<2 then moveblock:= 21;
discio(1)
end;
end;
moveno:= moveno-1;
goto movenostep
end;
begin
comment  y;
readchar(in,char);
if movedetails then  write(testlog,false add char,1);
if char <> 45 then  testvalue:= true
else
begin
testvalue:= false;
readchar(in,char);
if movedetails then  write(testlog,false add char,1);
end;
if char > 96 and char < 105 then
begin
case char-96 of
begin
alphatest:= testvalue;
lookaheadstep:= testvalue;
movetest:= testvalue;
movedetails:= testvalue;
totvaltest:= testvalue;
proposetest:= testvalue;
envtest:= testvalue;
selecttest:= testvalue;
end;
end;
end;
begin
comment  z;
end;
end case char;
end;
end;
\f

procedure input_move;
begin
input_start:
if movegen>0 and playertype(mover)=1 then
goto input_end;
writemoves(out,moveno-mw,moveno-1);
write(out,xymode,1,<:J:>,false add(mw+8),1,
<<ddddd>,moveno,false add 32,10,back,8);
if mover = 2 then  write(out,<:     :>);
write(out,<:?<8>:>);
setposition(out,0,0);
setposition(in,0,0);
i:=readchar(in,char);
if char>116 or i>6 then
begin
treatcommands;
goto input_start
end;
if char>96 then  char:= char-32;
col:= if char>73 then  char-65  else  char-64;
read(in,row);
if row<1 or row>19 or col<1 or col>19 or char=73 then
begin
write(out,xymode,1,<:J:>,false add (mw+9),1,<:            ???:>);
goto input_start
end;
bestmove:= (row+col*21)*2+mover-1;
pq:= bestmove+3-2*mover;
if totval(bestmove) < 16384
or totval(pq) < 16384 then
begin
write(out,xymode,1,<:J:>,false add (mw+9),1,<:feltet er besat:>);
goto input_start
end;
input_end:
write(out,xymode,1,<:J:>,false add (mw+9),1,false add 32,15)
end;
\f

procedure write_move(outzone,actmover,ownmove);
value   actmover,ownmove;
integer actmover,ownmove;
zone  outzone;
begin
write(outzone,<:<10>:>,<<ddd>,moveno-1+ownmove,<:  :>);
if actmover=2 then  write(outzone,<:     :>);
writefield(outzone,bestmove);
if actmover=1 then  write(outzone,<:     :>);
if movedetails and playertype(mover)=1 then
begin
write(outzone,<:              :>);
writefieldval(outzone,bestmove);
write(outzone,<<-ddddd>,boardvalue(mover));
if ownmove=1 then
begin
write(outzone,<<-ddddd>,alpha,blocksread,nodes,
<<-dddd.d>,(movetime-0.018*blocksread)/nodes*1000);
write(outzone,<<-ddd.d>,timeslice(0),<:<10>                  :>);
for i:= 1 step 1 until threatdepth(mover) do
write(outzone,<<dddd>,node(i));
write(outzone,<:<10>                   :>);
for i:= 1 step 1 until threatdepth(mover) do
begin
writefield(outzone,bestseq(1,i));
write(outzone,<: :>);
end;
end;
write(outzone,<:<10>:>)
end
end;
\f


  integer array  totval(0:881),
propose(88:2187),
  env(176:3351),
  envval(-2:3280),
moves(1:75),
mnsub,od(1:2),
threat(1:63),
node(1:13),
bestseq(1:13,1:13),
enoughfields,boardvalue,
playertype,stratdepth,threatdepth,off,def(1:2),
creative(1:2,2:5),
width(1:2,1:13),
proposelow(1:2,1:2),
  cd(1:32),
  dist(1:16);
real array  slicefactor(1:2),timeleft,timeused(-1:150),playername(3:8),
answer(1:1),timebase,timeslice(0:13),slice(1:15,1:15);
real  gamestart,movestart,movetime,clock;
integer  i,j,alpha,char,row,col,maxmoves,mover,margin,winner,
mw,moveblock,trywidth,stratval,stdepth,col2,row2,
movegen,nodes,enoughfactor,bottomdivisor;
  boolean field  ij,mn,pq,bestmove,moveno;
boolean  alphatest,lookaheadstep,movetest,movedetails,
  totvaltest,proposetest,envtest,selecttest,force1,force2,b,
xymode,back,down,erase,return,forward,up,home;
zone  testlog(128,1,stderror);

open(testlog,4,<:testlog:>,0);
begin 
integer array ia(1:12);
getshare6(out,ia,1);
ia(4):= logor(ia(4),2);
setshare6(out,ia,1)
end;
for ij:= 0 step 1 until 881 do  totval(ij):= 16384;
maxmoves:= 150;
movegen:= maxmoves+1;
alphatest:= lookaheadstep:= movetest:= totvaltest:=
proposetest:= envtest:= selecttest:= false;
movedetails:= true;
margin:= 2;
for i:= 11 step 1 until 63 do  threat(i):= 166;
for i:= 10,9,8,7,6,5,4 do  threat(i):= 250;
threat(3):= 334;
threat(2):= 418;
threat(1):= 502;
for i:= 1 step 1 until 16 do
dist(i):= case i of (1,9,81,729,3,27,243,2187,
                       -1,-9,-81,-729,-3,-27,-243,-2187);
for i:= 1 step 1 until 32 do
cd(i):= case i of  
(-40,-80,-120,-160,40,80,120,160,
-42,-84,-126,-168,42,84,126,168,
-44,-88,-132,-176,44,88,132,176,
-2,-4,-6,-8,2,4,6,8);
trywidth:= 15;
for i:= 1 step 1 until 15 do
begin
integer s,t;
s:= 1;
for t:= 2 step 1 until i do  s:= s+t;
for j:= 1 step 1 until i do  slice(i,j):= (i+1-j)/s
end;
col2:= 2;
row2:= 1;
timebase(0):= 0;
totval(0):= 0;
bestmove:= 440;
enoughfactor:= 3;
\f

new_players:
for mover:= 1,2 do
begin
write(out,<:<10><13>:>,case mover of (<:X:>,<:O:>),<: spillernavn= :>);
setposition(out,0,0);
setposition(in,0,0);
readstring(in,playername,mover*3);
mw:= 2;
xymode:= false add 6;
back:= false add 8;
down:= false add 10;
erase:= false add 12;
return:= false add 13;
forward:= false add 24;
up:= false add 26;
home:= false add 29;
threatdepth(mover):= stratdepth(mover):= 0;
if playername(3*mover) = real <:0:> then goto afslut;
if playername(3*mover) = real <:caesa:>add 114 then
begin
threatdepth(mover):= 13;
stratdepth(mover):= 6;
playertype(mover):= 1;
for j:= 1 step 1 until 13 do
width(mover,j):= case j of (6,5,4,3,2,1,0,0,0,0,0,0,0);
for j:= 2,3,4,5 do
creative(mover,j):= case j-1 of (3,33,24,3);
slicefactor(mover):= 2.5;
write(out,<:<10><13>defaults:<10><13>a : threatdepth .. :>, threatdepth(mover),
<:<10><13>b : stratdepth ... :>,stratdepth(mover),
<:<10><13>c : widths ....... :>);
for j:= 1 step 1 until stratdepth(mover)+1 do
write(out,<<ddd>,width(mover,j));
write(out,<:<10><13>d : crlimits ..... :>);
for j:= 4,5,3,2 do write(out,<<ddd>,creative(mover,j));
write(out,<:<10><13>e : slicefactor .. :>,<<d.d>,slicefactor(mover));
if mover=2 then
write(out,<:<10><13>f : move2 ........ :>,<<dd>,col2,row2);
write(out,<:<10><13>indtast eventuelle ændringer:<10><13>:>);
setposition(out,0,0);
setposition(in,0,0);
for i:= readchar(in,char) while char>96 and char<103 do
case char-96 of
begin
begin
read(in,threatdepth(mover))
end;
begin
read(in,stratdepth(mover))
end;
begin
for j:= 1 step 1 until stratdepth(mover)+1 do
read(in,width(mover,j))
end;
begin
for j:= 4,5,3,2 do
read(in,creative(mover,j))
end;
begin
read(in,slicefactor(mover))
end;
begin
read(in,col2,row2)
end;
end;
end
else
playertype(mover):= 2
end mover;
\f

new_game:
moveno:= 0;
write(out,<:<10><13>kommandoer (u,v,w,x,y,z,?) :>);
setposition(out,0,0);
setposition(in,0,0);
readchar(in,char);
treatcommands;
systime(1,0,gamestart);
gameinit;
for mover:= 1,2 do
begin
off(mover):= def(mover):= stratdepth(mover);
if width(mover,stratdepth(mover)+1)<>0 then
begin
if stratdepth(mover) extract 1 = 1 then  
def(mover):= def(mover)+1
else 
off(mover):= off(mover)+1
end
end;
if movedetails then
begin
write(testlog,<:<12>:>,<<dd dd dd>,
systime(2,gamestart,clock),<:    :>,clock);
for mover:= 1,2 do
begin
i:= 3*mover;
write(testlog,case mover of (<:<10>X :>,<:<10>O :>),
string playername(increase(i)));
if playertype(mover) = 1 then
begin
write(testlog,<<ddd>,threatdepth(mover),stratdepth(mover),<:::>);
for i:= 1 step 1 until stratdepth(mover)+1 do
write(testlog,<<dd>,width(mover,i));
write(testlog,<:;:>,<<ddd>,creative(mover,4),
creative(mover,5),creative(mover,3),creative(mover,2));
end;
end;
write(testlog,<:<10>
Træk           move  total        board      blocks        node  time
nr.  X    O    time  time  totval value  alfa  read nodes  time  slice
<10>:>);
end;

movenostep:
for moveno:= moveno+1 while moveno<=maxmoves and winner=0 do
begin
mover:= 2-moveno mod 2;
stdepth:= 6;
systime(1,0,movestart);
blocksread:= 0;
for i:= 1 step 1 until 13 do  node(i):= 0;
nodes:= 1;
moveblock:= moveblock-1;
if moveblock<2 then
begin
timeleft(moveno-2):= timeleft(moveno-2)+200;
timeleft(moveno-1):= timeleft(moveno-1)+200;
moveblock:= 21;
end;
alpha:= 0;
\f

case playertype(mover) of
begin
begin
comment 1, intern spiller;
timeslice(0):= timeleft(moveno-2)/moveblock*slicefactor(mover)*2;
if timeslice(0)>timeleft(moveno-2) then
timeslice(0):= timeleft(moveno-2)/moveblock*2;
if playertype(3-mover)=1 then  discio(0);
for i:= 1 step 1 until 13 do
for j:= 1 step 1 until 13 do bestseq(i,j):= 42;

if moveno=1 and movegen>0 then  bestmove:= (10*21+10)*2
else
begin
if moveno > 1 then
begin
move(bestmove,0);
if movedetails then
write_move(testlog,3-mover,0);
proposeclean(mover);
end;
stratval:= boardvalue(mover)*(3-2*mover);
if -stratval > totval(bestmove) extract 7 shift (-1) then
begin
stdepth:= def(mover);
od(mover):= 3;
od(3-mover):= 0;
mnsub(mover):= 20;
mnsub(3-mover):= 20
end
else
begin
stdepth:= off(mover);
od(mover):= 0;
od(3-mover):= 3;
mnsub(mover):= 20;
mnsub(3-mover):= 20
end;
if stdepth>moveno then stdepth:= moveno+1;
if movegen < 1 then  input_move;
if movegen>0 then
begin
if moveno=2 then
begin
col:= bestmove//2//21;
row:= bestmove//2 mod 21;
comment i:= 1+round ((movestart-gamestart)*10) mod 3;
comment j:= case i of (0,1,1);
comment i:= case i of (1,0,1);
col:= col+(if col<10 then col2 else -col2);
row:= row+(if row<10 then row2 else -row2);
bestmove:= col*42+row*2+1;
end
else
begin
write(out,<:<6><96><21>:>,false add 32,80,<:<26>:>);
alpha:= -alphabeta(1,-900,900)
end
end
end;
if alpha<-900 then
begin
winner:= 3-mover;
write(out,<:<6><96><23><10><10>:>,
case mover of (<:X opgiver:>,<:O opgiver:>),<:<10><10>:>);
goto game_end
end;
move(bestmove,1);
systime(1,movestart,movetime);
if movedetails then  write_move(testlog,mover,1);
proposeclean(3-mover);
if playertype(3-mover)=1 then  discio(1)
end 1;
begin
comment 2, extern spiller;
input_move;
systime(1,movestart,movetime);
if movedetails then  write_move(testlog,mover,1);
end 2;
end case playertype;
moves.moveno:= false add bestmove;
writemoves(out,moveno-mw,moveno);
changeboard(moveno,true);
movegen:= movegen-1;
timeleft(moveno):= timeleft(moveno-2)-movetime;
timeused(moveno):= timeused(moveno-2)+movetime;
if movedetails then
begin
writedetails(out);
write(testlog,<:
             :>,<<-dddd.d>,movetime,timeused(moveno),<:<10>:>);
writeboard(testlog,moveno);
end;
if totval(bestmove) extract 14 >= 11 shift 7 then  winner:= mover
end moveno;
\f


game_end:
write(out,<:<6><96><22><30>:>,false add 32,52,<:<13><26>:>);
moveno:= moveno-1;
if winner >= 0 and winner <= 5 then
begin
write(out,case winner+1 of
(<:remis efter 150 træk:>,
<:X vinder:>,
<:O vinder:>,
<:spillet erklæret remis:>,
<:X erklæret vinder:>,
<:O erklæret vinder:>));
setposition(out,0,0);
if (winner=1 or winner=2)  then
begin
if playertype(winner)=2 then
begin
write(out,<: Sejren skal kræves, ellers fortsætter spillet.:>,
<: Kræves den ? (ja/nej):>);
setposition(out,0,0);
setposition(in,0,0);
i:= 1;
readstring(in,answer,i);
if answer(1) = real <:nej:> then
begin
winner:= 0;
  goto movenostep;
end

end;
end;
if movedetails then
write(testlog,<:<10><13><10><13>:>,case winner+1 of
(<:remis efter 150 træk:>,
<:X vinder:>,
<:O vinder:>,
<:spillet erklæret remis:>,
<:X erklæret vinder:>,
<:O erklæret vinder:>),<:<10><13>:>);
end
else  winner:= 0;

\f

begin
zone  gamerec(128,1,stderror);
boolean field  bf,bf1;
integer field  if1;
real field  rf;
integer  g,i;

open(gamerec,4,<:gamerecords:>,0);
if1:= 2;
swoprec6(gamerec,2);
g:= gamerec.if1:= gamerec.if1+1;
for i:= 1 step 1 until g do  swoprec6(gamerec,222);
for bf:= 1 step 1 until moveno do
gamerec.bf:= moves.bf;
bf:= 151;
gamerec.bf:= false add moveno;
bf:= 152;
gamerec.bf:= false add winner;
rf:= 156;
gamerec.rf:= gamestart;
for rf:= 160 step 4 until 180 do
gamerec.rf:= playername((rf-148)//4);
for mover:= 1,2 do
begin
bf:= 168+18*mover;
gamerec.bf:= false add threatdepth(mover) shift 4 add stratdepth(mover);
for i:= 1 step 1 until threatdepth(mover) do
begin
bf:= 168+18*mover+i;
gamerec.bf:= false add width(mover,i)
end;
for i:= 2,3,4,5 do
begin
bf:= 180+i+18*mover;
gamerec.bf:= false add creative(mover,i)
end
end;
close(gamerec,true)
end;
\f

write(out,
<:<10><13>Flere spil med samme navne og parametre ? (ja/nej) :>);
setposition(out,0,0);
setposition(in,0,0);
i:= 1;
readstring(in,answer,i);
if answer(1) = real <:ja:> then
begin
movegen:= maxmoves+1;
write(out,<:<10><13>Skal der byttes om på X og O ? (ja/nej) :>);
setposition(out,0,0);
setposition(in,0,0);
i:= 1;
readstring(in,answer,i);
if answer(1) = real <:ja:> then
begin
real r;
for i:= 3,4,5 do
begin
r:= playername(i);
playername(i):= playername(i+3);
playername(i+3):= r;
end;
i:= playertype(1);
playertype(1):= playertype(2);
playertype(2):= i;
r:= slicefactor(1);
slicefactor(1):= slicefactor(2);
slicefactor(2):= r;
for j:= 2,3,4,5 do
begin
i:= creative(1,j);
creative(1,j):= creative(2,j);
creative(2,j):= i
end;
i:= stratdepth(1);
stratdepth(1):= stratdepth(2);
stratdepth(2):= i;
i:= threatdepth(1);
threatdepth(1):= threatdepth(2);
threatdepth(2):= i;
for i:= 1 step 1 until 13 do
begin
j:= width(1,i);
width(1,i):= width(2,i);
width(2,i):= j
end;
end;
goto new_game
end;
write(out,<:<10><13>Flere spil med nye spillere ? (ja/nej) :>);
setposition(out,0,0);
setposition(in,0,0);
i:= 1;
readstring(in,answer,i);
if answer(1) = real <:ja:> then  goto new_players;
afslut:
begin
integer array ia(1:12);
getshare6(out,ia,1);
ia(4):= exor(ia(4),2);
setshare6(out,ia,1)
end;
write(testlog,<:<25>:>);
close(testlog,true)
end
end
end program
▶EOF◀