Le 03/08/2024 à 02:06, Samuel Devulder a écrit :
Il y avait un algo simple (puisque capable de tourner en basic interprété 8bits à l'époque) dans le SVM-Micro indiqué plus haut.
Par contre j'ai pas de chance avec google, plus moyen de trouver les scans des pages "bleues : le cahier des programmes" en abandonware.
De mémoire il s'agissait d'un algo de programmation dynamique pour décider de la meilleure case à remplir.
Oh punaise, j'ai retrouvé une diskette d'époque !!
<
http://news2.nemoweb.net/jntp?ZZWFtMTWkpF3_H4PXbwxqMI4scw@jntp/Data.Media:1>
Il y a une version Basic et ASM.. Ah oui je me souviens, le basic n'était pas assez rapide à mon gout et j'avais tour ré-écrit en ASM. C'était joli mais ca bugait :(
<
http://news2.nemoweb.net/jntp?ZZWFtMTWkpF3_H4PXbwxqMI4scw@jntp/Data.Media:2>
<
http://news2.nemoweb.net/jntp?ZZWFtMTWkpF3_H4PXbwxqMI4scw@jntp/Data.Media:3>
<
http://news2.nemoweb.net/jntp?ZZWFtMTWkpF3_H4PXbwxqMI4scw@jntp/Data.Media:4>
<
http://news2.nemoweb.net/jntp?ZZWFtMTWkpF3_H4PXbwxqMI4scw@jntp/Data.Media:5>
La version basic, plus lente donc, ne bug pas et se débrouille pas (trop) mal si on le laisse commencer.. Il me semble que j'avais une heuristique pour quasimment toujours gagner en 6x6 si je commencais. Il fallait toujours choisir l'option "ligne-droite N/S" en prenant soin de laisser 2 degrés de libertés dans les trous à combler:
<
http://news2.nemoweb.net/jntp?ZZWFtMTWkpF3_H4PXbwxqMI4scw@jntp/Data.Media:6jntp:ZZWFtMTWkpF3_H4PXbwxqMI4scw@jntp/Data.Media:7>
Quoi qu'il en soit le programme basic ne fait que 4K et je peux mettre le listing dans ce message:
--------8<----------------------------------------------------------------------
10 CLEAR,,1
20 DEFINTA-Z
30 DEFGR$(0)=204,153,51,102,204,153,51,102
40 CONSOLE,,0:PALETTE0,256:PALETTE1,255:COLOR1,0:SCREEN,,0:CLS:CONSOLE,,1
50 TURTLE0,0,0,"L0D4L128U4L64D4L128U4R96D5L32U1L96D4L64U1L64D4
60 INPUT"Nombre de colones (6 conseillees):",N
70 ECA=CINT(15*6/N)
80 EC2=ECA*2-2
90 EC1=ECA-1
100 EC3=
ECA@2110 DIM HH(N,N),T(N,N),D(N,N),DA(N+1,N+1),DR(N+1,N+1)
120 DIM IP(N*N),JP(N*N)
130 I1=
N@2:J1=
N@2140 GOTO 1190
150 '
160 '
170 ' Affichage
180 '
190 '
200 CLS:X=30:Y=50
210 FOR I=1 TO N
220 FOR J=1 TO N
230 X=X+ECA*2
240 GOSUB 290
250 NEXT
260 X=X-ECA*N*2+ECA:Y=Y+3*
ECA@2270 NEXT
280 RETURN
290 PSET(X,Y-ECA)
300 LINE-(X+ECA,Y-EC3)
310 LINE-(X+ECA,Y+EC3)
320 LINE-(X,Y+ECA)
330 LINE-(X-ECA,Y+EC3)
340 LINE-(X-ECA,Y-EC3)
350 LINE-(X,Y-ECA)
360 RETURN
370 '
380 '
390 ' Transposition
400 '
410 '
420 FOR I=1 TO N-1
430 FOR J=I+1 TO N
440 SWAP T(I,J),T(J,I)
450 NEXT
460 NEXT
470 RETURN
480 '
490 ' Calcul des distances
500 ' T est le tableau des position
510 ' D est le tableau des distances
520 ' f est un semaphore indiquant quel joueur est examine
530 '
540 FOR I=0 TO N+1
550 FOR J=0 TO N+1
560 DA(I,J)=3200
570 DR(I,J)=3200
580 NEXT:NEXT
590 FOR J=0 TO N+1
600 DA(0,J)=0
610 DR(N+1,J)=0
620 NEXT
630 FC=0
640 '
650 '
660 FOR I=1 TO N
670 FOR J=1 TO N
680 IF T(I,J)=-F THEN 790
690 DM=MIN(DA(I-1,J),DA(I-1,J+1),DA(I,J-1),DA(I,J+1),DA(I+1,J-1),DA(I+1,J))
700 IF T(I,J)=0 AND DA(I,J)<>DM+1 THEN FC=1:DA(I,J)=DM+1
710 '
720 '
730 '
740 '
750 IF T(I,J)=F AND DA(I,J)<>DM THEN FC=1:DA(I,J)=DM
760 '
770 '
780 '
790 NEXT
800 NEXT
810 IF FC<>0 THEN 630
820 FC=0
830 FOR I=N TO 1 STEP -1
840 FOR J=1 TO N
850 IF T(I,J)=-F THEN 950
860 DM=MIN(DR(I-1,J),DR(I-1,J+1),DR(I,J-1),DR(I,J+1),DR(I+1,J-1),DR(I+1,J))
870 IF T(I,J)=0 AND DR(I,J)<>DM+1 THEN FC=1:DR(I,J)=DM+1
880 '
890 '
900 '
910 IF T(I,J)=F AND DR(I,J)<>DM THEN FC=1:DR(I,J)=DM
920 '
930 '
940 '
950 NEXT
960 NEXT
970 IF FC<>0 THEN 820
980 DM=3200
990 FOR J=1 TO N
1000 DM=MIN(DA(N,J),DM)
1010 NEXT
1020 FOR I=1 TO N
1030 FOR J=1 TO N
1040 D(I,J)=DA(I,J)+DR(I,J)
1050 NEXT
1060 NEXT
1070 RETURN
1080 '
1090 '
1100 '
1110 '
1120 '
1130 RETURN
1140 '
1150 '
1160 '
1170 '
1180 '
1190 F=1
1200 '
1210 '
1220 INPUT"Voulez-vous commencer:",R$
1230 LOCATE0,0,0
1240 '
1250 IF LEFT$(R$,1)<>"O" AND LEFT$(R$,1)<>"o" THEN GOSUB 200:GOTO1370
1260 GOSUB 200
1270 '
1280 I=I1:J=J1:GOSUB 1770:I1=I:J1=J
1290 IF I>N OR I<1 THEN 1280
1300 IF J>N OR J<1 THEN 1280
1310 IF T(I,J)<>0 THEN 1280
1320 T(I,J)=F
1330 PATTERN 127
1340 X=30+EC2*J+EC1*(I-1)
1350 Y=50+(3*
ECA@2)*(I-1)
1360 PAINT(X,Y)
1370 GOSUB 540
1380 IF DM=0 THEN PRINT"Vous avez gagne":END
1390 FOR I=1 TO N
1400 FOR J=1 TO N
1410 HH(I,J)=D(I,J)
1420 NEXT
1430 NEXT
1440 GOSUB 420
1450 F=-F
1460 GOSUB 540
1470 FOR I=1 TO N
1480 FOR J=1 TO N
1490 HH(I,J)=HH(I,J)+D(J,I)
1500 NEXT
1510 NEXT
1520 GOSUB 420
1530 GOSUB 1130
1540 DM=3200
1550 NC=0
1560 FOR I=1 TO N
1570 FOR J=1 TO N
1580 IF HH(I,J)>DM THEN 1640
1590 IF HH(I,J)=DM THEN NC=NC+1:IP(NC)=I:JP(NC)=J:GOTO1640
1600 NC=1
1610 IP(NC)=I
1620 JP(NC)=J
1630 DM=HH(I,J)
1640 NEXT
1650 NEXT
1660 NP=1+INT(RND(1)*NC)
1670 T(IP(NP),JP(NP))=F
1680 X=30+EC2*JP(NP)+EC1*(IP(NP)-1)
1690 Y=50+(3*
ECA@2)*(IP(NP)-1)
1700 PATTERN128:PAINT(X,Y)
1710 GOSUB 420
1720 GOSUB 540
1730 GOSUB 420
1740 IF DM=0 THEN PRINT"J'ai gagne ":END
1750 F=1
1760 GOTO 1270
1770 ' CHOIX
1780 SHOW1:DO
1790 A$=INKEY$
1800 IF A$=CHR$(11) THEN I=I-1:IF I<1 THEN I=1
1810 IF A$=CHR$(10) THEN I=I+1:IF I>N THEN I=N
1820 IF A$=CHR$(09) THEN J=J+1:IF J>N THEN J=N
1830 IF A$=CHR$(08) THEN J=J-1:IF J<1 THEN J=1
1840 X=30+EC2*J+EC1*(I-1)
1850 Y=50+(3*
ECA@2)*(I-1)
1860 TURTLE 0,X,Y
1870 IF A$=CHR$(13) THEN EXIT
1880 LOOP
1890 SHOW0
1900 RETURN
--------8<----------------------------------------------------------------------
Sam (qui faisait de l'ASM à l'époque des peek et poke)