|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 46848 (0xb700)
Types: TextFile
Names: »s5f«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦this⟧ »s5f«
; gomuko codepr * page 1 08 04 81, 17.07;
begin
integer procedure alphabeta(depth, alpha, beta);
value depth, alpha, beta;
integer depth, alpha, beta;
begin
integer actmover, widthlimit, newalpha, totval1,
maxtries, cr3, cr4, prm, prnx;
boolean array try(1:trywidth);
boolean defmove;
boolean field ij, mn, next, w;
procedure selecttry(entry, crlimit);
value entry, crlimit;
integer entry, crlimit;
begin
integer r, c, m, prnx;
boolean field next, u, v;
boolean select;
if selecttest then write(testlog, <:<10>:>,
case actmover of (<:X:>, <:O:>), <: SEL:>, false add 32,
depth+1, <<ddd>, crlimit, <<ddddd>, entry);
if crlimit=-2 then maxtries:= 1;
if depth=threatdepth(mover) and crlimit>-2 then maxtries:= 0;
select:= defmove or defense(depth-2) or crlimit<1;
prnx:= entry;
for prnx:= propose(prnx+1) shift (-1)
while prnx<1676 and w<maxtries 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 -, select then
begin
v:= moveno+depth-1;
for v:= v-2 while v>=moveno and -, select 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<5 or r=c then select:= true
end
end;
if select then
begin
if selecttest then write(testlog, <:+:>);
w:= w+1;
try.w:= false add (u+(if crlimit=-2 then 2048 else 0)
+(if defmove then 1024 else 0))
end
end
else
if try.v extract 12 < 1024 and defmove then
try.v:= try.v add 1024
end
end;
end selecttry;
actmover:= mover+(-mover+(3-mover))*(1-(depth extract 1));
prm:= 2*actmover;
defmove:= false;
maxtries:= trywidth;
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) = 3352 then i:= i+1
else goto casei;
casei:
case i of
begin
begin
comment own5, win;
selecttry(166+prm, -2)
end;
begin
comment opp5;
selecttry(172-prm, 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) shift (-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, 0);
selecttry(334+prm, cr4);
defmove:= true;
selecttry(256-prm, 0);
selecttry(340-prm, cr4)
end
else
if mn<1676 then selecttry(ij, -2)
else
selecttry(250+prm, -2)
end;
begin
comment opp-open4 => ownclosed4+oppopen4+oppclosed4;
defmove:= true;
selecttry(256-prm, 0);
if w<2 then
begin
if depth>4 then
selecttry(334+prm, cr4);
selecttry(340-prm, cr4);
selecttry(424-prm, cr3);
selecttry(508-prm, cr3)
end;
if depth<5 then
selecttry(334+prm, 1);
end;
begin
comment own-double3.
not opp-closed4 => own-double3, win
else owndouble3+ownclosed4+oppclosed4;
defmove:= true;
selecttry(340-prm, cr4);
defmove:= false;
if w=0 then selecttry(418+prm, -2)
else
begin
selecttry(418+prm, 0);
b:= try(w);
try(w):= try(1);
try(1):= b;
end
end;
begin
comment opp-double3 => ownclosed4+ownsingle3+oppdouble3;
defmove:= true;
selecttry(334+prm, cr4);
selecttry(502+prm, cr3);
selecttry(424-prm, 0);
selecttry(508-prm, cr3);
selecttry(340-prm, cr4)
end;
begin
comment ingen dobbelttrusler;
comment ownclosed4+ownsingle3+oppclosed4+strategiske træk;
selecttry(334+prm, cr4);
selecttry(502+prm, cr3);
defmove:= true;
ij:= 1994+prm;
mn:= 2000-prm;
maxtries:= w+width(mover, depth);
for prnx:= (if ij >= mn-2 then ij else mn)
while w<maxtries and (ij>0 or mn>0) do
begin
if propose(prnx+1) < 3352 then
begin
if prnx = ij then
selecttry(prnx, 1)
else
selecttry(prnx, 1)
end;
if prnx = ij then
begin
for ij:= ij-4 while propose(ij+1) > 3350 do
end
else
for mn:= mn-4 while propose(mn+1) > 3350 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;
maxtries:= trywidth;
selecttry(340-prm, cr4);
selecttry(508-prm, cr3);
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
begin
colsum(actmover):= colsum(actmover)+next//2//21;
rowsum(actmover):= rowsum(actmover)+next//2 mod 21;
stratval:= boardvalue(mover)*(3-2*mover)
+(totval1 extract 7 shift (-1))*((depth extract 1 shift 1) -1)
+round(3*balance*sqrt((rowsum(1)//((moveno+depth+1)//2)
-rowsum(2)/((moveno+depth)//2))**2
+(colsum(1)/((moveno+depth+1)//2)
-colsum(2)/((moveno+depth)//2))**2));
colsum(actmover):= colsum(actmover)-next//2//21;
rowsum(actmover):= rowsum(actmover)-next//2 mod 21
end;
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 (moveno<6 and depth=stdepth)
or (widthlimit=1 and depth=1) then
newalpha:= stratval*((depth extract 1 shift 1) -1)
else
begin
defense(depth):= defense(depth-2) and 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
comment gomuko * page 2 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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) shift (-1);
tu:= propose(gh+1) shift (-1);
propose(rs+1):= tu shift 1;
propose(tu):= rs shift 1;
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) shift (-1);
propose(rs+1):= gh shift 1;
propose(gh):= rs shift 1;
propose(gh+1):= tu shift 1;
propose(tu):= gh shift 1
end propose_insert;
\f
comment gomuko * page 3 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
integer actmover, pm1, distance, distsign, ws, dir, wing, ffield, dw,
threatval, totval1, totval2, actopp, updmover;
boolean field gh, ij, mn, pq, rs, tu;
boolean met1, met2, backwards, dsb;
integer array cval(0:4);
actmover:= (xy extract 1) +1;
comment actopp:= 3-actmover;
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;
colsum(actmover):= colsum(actmover)+ij//2//21;
rowsum(actmover):= rowsum(actmover)+ij//2 mod 21;
distsign:= 32;
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;
colsum(actmover):= colsum(actmover)-ij//2//21;
rowsum(actmover):= rowsum(actmover)-ij//2 mod 21;
distsign:= 40;
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;
cval(0):= if depth<stdepth or backwards then 1 else 0;
cval(1):= 4*mover;
cval(2):= 2*distsign;
cval(3):= 2*pm1;
cval(4):= 2*xy;
moveupdate(totval,env,envval,propose,proposelow,cd,cval);
comment if envtest then writeenv(testlog, env);
comment if totvaltest then
begin
i:= 3*mover;
comment writetotval(testlog, totval, env, envval,
string playername(increase(i)));
comment end;
if proposetest then writepropose;
end move;
\f
comment gomuko * page 4 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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
comment gomuko * page 5 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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
comment gomuko * page 6 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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
comment gomuko * page 7 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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
comment gomuko * page 8 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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
comment gomuko * page 9 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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) shift (-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) < 3352 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) < 3352 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 (-2));
end;
wpout:
write(testlog, <:<10>:>);
end player;
end writepropose;
\f
comment gomuko * page 10 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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) shift (-1) while pq<1676 do
fieldcount:= fieldcount+1;
end;
proposelow(mover, actmover):= (ij-1676) shift (-2);
pq:= ij;
for ij:= propose(ij+1) shift (-1) while ij>0 do
begin
propose(pq+1):= 0;
pq:= ij
end;
if proposetest then writepropose;
end;
\f
comment gomuko * page 11 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
procedure gameinit;
begin
moveblock:= 82;
winner:= 0;
moveno:= 0;
for mover:= 1, 2 do
begin
timeused(mover-2):= 0;
timeleft(mover-2):= if slicefactor(mover)>5 then 5000 else 950;
boardvalue(mover):= rowsum(mover):= colsum(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;
for i:= 88 step 1 until 2187 do propose(i):= 2*propose(i);
discio(1)
end;
end;
writenewboard;
writehead(out)
end;
\f
comment gomuko * page 12 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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
comment gomuko * page 13 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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
comment gomuko * page 14 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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
comment gomuko * page 15 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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,rowsum,colsum,
playertype, stratdepth, threatdepth, off, def(1:2),
creative(1:2, 2:5),
width(1:2, 1:13),
proposelow(1:2, 1:2),
cd(0:47);
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, col1, row1, col2, row2,
balance, movegen, nodes, enoughfactor, bottomdivisor;
boolean array defense(-1:15);
boolean field ij, mn, pq, bestmove, moveno;
boolean alphatest, lookaheadstep, movetest, movedetails,
totvaltest, proposetest, envtest, selecttest, 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;
defense(-1):= defense(0):= true;
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
cd(i+31):= 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-1):= 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);
for i:= 0 step 1 until 31 do cd(i):= 2*cd(i);
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;
col1:= 10;
row1:= 10;
col2:= 0;
row2:= 1;
timebase(0):= 0;
totval(0):= 0;
bestmove:= 440;
enoughfactor:= 3;
\f
comment gomuko * page 16 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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):= 11;
stratdepth(mover):= 6;
playertype(mover):= 1;
for j:= 1 step 1 until 13 do
width(mover, j):= case j of (6, 5, 4, 3, 3, 2, 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.4;
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=1 then
write(out, <:<10><13>f : move1 ........:>, <<ddd>, col1, row1)
else
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
if mover=1 then
read(in, col1, row1)
else
read(in, col2, row2)
end;
end;
end
else
playertype(mover):= 2
end mover;
\f
comment gomuko * page 17 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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:= stratdepth(mover);
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
comment gomuko * page 18 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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:= (col1*21+row1)*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);
balance:= stratval+totval(bestmove) extract 7 shift (-1);
if balance<0 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 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
comment gomuko * page 19 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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
comment gomuko * page 20 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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);
if gamerec.if1>99 then gamerec.if1:= 0;
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
comment gomuko * page 21 19 03 81, 18.25
0 1 2 3 4 5 6 7 8 9 ;
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◀