- begin comment L. Meertens, R 1082, LM 010964/9219. QUINIO (GO-MOKU). Zie voor de spelregels aparte beschrijving. Indien X1 moet beginnen, d25 = 0 maken, anders d25 = 1 maken. Inbrengen van zet: x-coordinaat binair in d9 t/m d5, y-coordinaat in d4 t/m d0. Bijv. 11-7 wordt in d9 t/m d0 (XEEN (1023)) genoteerd als 01011 00111. Doorstarten met BVA. De zet wordt uitgetypt, en de machine stopt weer. Indien nu blijkt dat men zich vergist heeft, dan kan men met negatief consolewoord doorstarten, waarna opnieuw gelegenheid geboden wordt een zet in te brengen. Wordt met positief consolewoord doorgestart, dan wordt de zet uitgevoerd en bezint de X1 zich op zijn volgende zet. Is bijgeval helemaal geen zet uitgetypt, dan correspondeert de stand van de tien rechter- schakelaars niet met een correcte zet. Men kan alsnog een betere zet inbrengen; integer k, j, av, tn, nt, vnl, x, y, sw, wm, kleur, znr, km; Boolean klaar; integer array DP[-6 : +6, 0 : 2], Z[1 : 6]; Boolean procedure minim (x, p); value p; integer x, p; if p < x then begin x:= p; minim:= true end else minim:= false; Boolean procedure maxim (x, p); value p; integer x, p; if p > x then begin x:= p; maxim:= true end else maxim:= false; nt:= entier (sqrt ((available - 1000) % 36) - 1) % 2 * 2 + 1; minim (nt, 19); av:= nt * nt; tn:= 1 + nt % 2; NLCR; print (nt); begin integer array RNUM, RLANG, RVRY[1 : av, 0 : 1, 1 : 4], RVAL[1 : av, 1 : 4], TEMPO, WT[1 : av, 0 : 1], X, Y[1 : av], BORD, VNL[1 : nt, 1 : nt]; procedure CORR (x0, y0); value x0, y0; integer x0, y0; begin integer x, y, dx, dy, min, max, q, k, j, b, t, d, w, xdx, ydy, zdz; dx:= +1; dy:= -1; klaar:= false; for q:= 1, 2, 3, 4 do begin zdz:= xdx:= (x0 - tn) * dx; ydy:= (y0 - tn) * dy; minim (zdz, ydy); min:= 3 - tn - zdz; max:= - min - xdx - ydy; maxim (min, -6); minim (max, +6); if min > max then go to NOR; for k:= 0, 1, 2 do DP[min, k]:= 0; for k:= -2 step 1 until +2 do begin b:= BORD[x0 + (min + k) * dx, y0 + (min + k) * dy]; DP[min, b]:= DP[min, b] + 1 end; for k:= min + 1 step 1 until max do begin if DP[k - 1, kleur] = 5 then go to WIN; for b:= 0, 1, 2 do DP[k, b]:= DP[k - 1, b]; for j:= -3, +2 do begin b:= BORD[x0 + (k + j) * dx, y0 + (k + j) * dy]; DP[k, b]:= DP[k, b] + sign (j) end end; if DP[max, kleur] = 5 then WIN: begin klaar:= true; go to UIT end; for k:= -6 step 1 until min - 1, max + 1 step 1 until 6 do DP[k, 0]:= DP[k, 1]:= 1; min:= 1 - tn - zdz; max:= - min - xdx - ydy; maxim (min, -4); minim (max, +4); for k:= min step 1 until -1, +1 step 1 until max do begin x:= x0 + k * dx; y:= y0 + k * dy; if BORD[x, y] = 2 then begin vnl:= VNL[x, y]; if vnl > sw then begin VNL[x, y]:= 0; go to NXT end; if vnl != 0 then begin RVAL[vnl, q]:= 0; for b:= 0, 1 do RNUM[vnl, b, q]:= RLANG[vnl, b, q]:= RVRY[vnl, b, q]:= 0 end else begin vnl:= VNL[x, y]:= sw; X[sw]:= x; Y[sw]:= y; sw:= sw + 1; for j:= 1, 2, 3, 4 do begin RVAL[vnl, j]:= 0; for b:= 0, 1 do RNUM[vnl, b, j]:= RLANG[vnl, b, j]:= RVRY[vnl, b, j]:= 0 end end; for j:= -2 step 1 until +2 do for b:= 0, 1 do begin if DP[k + j, 1 - b] = 0 then begin d:= DP[k + j, b]; RVAL[vnl, q]:= RVAL[vnl, q] + d; if maxim (RLANG[vnl, b, q], d) then RVRY[vnl, b, q]:= 0 else if RLANG[vnl, b, q] = d then RVRY[vnl, b, q]:= 1; RNUM[vnl, b, q]:= RNUM[vnl, b, q] + 1 end end; TEMPO[vnl, 0]:= TEMPO[vnl, 1]:= WT[vnl, 0]:= WT[vnl, 1]:= 4; for j:= 1, 2, 3, 4 do for b:= 0, 1 do begin t:= 4 - RLANG[vnl, b, j]; w:= t - RVRY[vnl, b, j]; minim (TEMPO[vnl, b], t); if if minim (WT[vnl, b], w) then false else w = 1 & WT[vnl, b] = 1 then WT[vnl, b]:= 0 end end; NXT: end; NOR: if q = 3 then dx:= 0 else dy:= dy + 1 end; UIT: end; procedure ZET (x, y); value x, y; integer x, y; begin BORD[x, y]:= kleur; CORR (x, y); kleur:= 1 - kleur; znr:= znr + 1 end; procedure PRINTZET (x, y); value x, y; integer x, y; begin if EVEN (znr) < 0 | XEEN (-1) < 0 then NLCR; ABSFIXT (5, 0, znr); PRINTTEXT ("."); ABSFIXT (3, 0, x); FIXT (3, 0, -y) end; integer procedure SEL; begin integer v, k, j, wsl, w, m; w:= 4; v:= m:= 0; for k:= sw - 1 step -1 until 1 do begin if if BORD[X[k], Y[k]] = 2 then WT[k, 1 - kleur] = 0 else false then minim (w, TEMPO[k, 1 - kleur]) end; for k:= sw - 1 step -1 until 1 do begin if if BORD[X[k], Y[k]] = 2 then (if TEMPO[k, kleur] <= w then true else if WT[k, 1 - kleur] = 0 then w = TEMPO[k, 1 - kleur] else false) else false then begin if maxim (v, SUM (j, 1, 4, 2 * RVAL[k, j] + RNUM[k, kleur, j]) + SUM (j, 0, 1, 2 ** (7 - WT[k, j] - abs (j - kleur) / 2))) then m:= k end end; SEL:= m end; NLCR; for x:= 1 step 1 until nt do for y:= 1 step 1 until nt do begin BORD[x, y]:= 2; VNL[x, y]:= 0 end; kleur:= sign (XEEN (33554432)); NLCR; sw:= znr:= 1; if kleur = 0 then begin PRINTTEXT (" X1 N.N."); PRINTZET (tn, tn); ZET (tn, tn) end else PRINTTEXT (" N.N. X1"); MENS: stop; x:= XEEN (992) % 32; y:= XEEN (31); if x = 0 | x > nt | y = 0 | y > nt then go to MENS; if BORD[x, y] != 2 then go to MENS; PRINTZET (x, y); stop; if XEEN (-1) < 0 then go to MENS; ZET (x, y); if klaar then go to KLAAR; MACH: km:= SEL; if km = 0 then begin NLCR; PRINTTEXT (" Ik geef op"); go to KLAAR end; x:= X[km]; y:= Y[km]; PRINTZET (x, y); ZET (x, y); if ! klaar then go to MENS; KLAAR: NLCR; if kleur = 0 then PRINTTEXT (" U hebt gewonnen") else PRINTTEXT (" Ik heb gewonnen") end end