Comment nous avons perdu 230 euros chez CJ Affiliate (Conversant)

[accueil] [menu] [suivez-nous !] [chercher]
Bataille navale (à jouer sur PC et Minitel reliés)
Article paru dans
Science & Vie Micro n°58 (février 1989), page 101 et suivantes, republié avec l'aimable autorisation de son auteur, Christophe Chantraine.
Ce n'est peut-être pas le plus vieux jeu du monde, mais il reste toujours l'un des plus pratiqués. L'idée astucieuse de Christophe Chantraine est de proposer une partie de bataille navale avec deux machines qui se côtoient de plus en plus fréquemment, un ordinateur et un Minitel, reliés par un câble spécifique. Ce programme est simple, écrit dans un langage des plus courants, le GW Basic, et donc facilement adaptable. Cette façon très séduisante et peu coûteuse de détourner le Minitel pourrait faire des émules…
Aucune crainte à avoir côté facture téléphonique : cette bataille navale originale coûte juste le prix du câble qui relie la sortie série de l'ordinateur à la prise péri-informatique située à l'arrière du Minitel: environ 200 F. On devrait trouver ce câble dans toutes les boutiques spécialisées, généralement avec un logiciel de communication, inutile ici. Rappelons brièvement le principe de ce jeu facile et attrayant. Deux adversaires disposent chacun, sur une grille de 10 cases sur 10, un certain nombre de navires : un navire amiral de quatre cases, deux croiseurs de trois cases, trois destroyers de deux cases et quatre sous-marins d'une case. Chaque case est repérée par ses coordonnées (une lettre de À à J et un chiffre de 0 à 9, par exemple). Dans la convention retenue pour écrire le programme, un navire ne peut occuper que des cases contigues, suivant une ligne horizontale ou verticale. Mais deux navires ne doivent pas se toucher, même en diagonale.
Dans la bataille navale traditionnelle, chaque joueur remplit une grille avec ses propres navires sur une première feuille de papier (elle
tient lieu de preuve en cas de contestation). Une deuxième grille sert à contrôler les coups et les résultats des tirs sur l'adversaire. Les traditionnels papiers et crayons sont donc remplacés maintenant par les deux écrans, sur chacun desquels figurent les deux grilles.
Un coup consiste à proposer une case en tapant ses coordonnées, puis à attendre la réponse de l'adversaire : « TOUCHÉ » si l'on a visé une case contenant un navire, mais que celui-ci dispose encore de cases valides ; « COULÉ » si toutes les cases d'un navire ont été touchées ; « DEPEU » si le coup tombe dans une case à proximité immédiate d'un bâtiment, et « PLOUF » si le coup est à l'eau. Le premier qui coule tous les navires adverses a gagné.
Le programme suit les règles ainsi exposées, avec toutefois quelques restrictions techniques, qu'il sera facile de modifier si le besoin s'en fait sentir. Ainsi, les emplacements des navires doivent être entrés en respectant certaines formes : les coordonnées des cases sont tapées à la suite les unes des autres, sans espace ou caractère séparateur. Les lettres viennent avant les chiffres (A1 et non 1A) et toujours par ordre croissant. Par exemple, B2B3B4 sera considéré comme correct, alors que F6E6D6 sera refusé (il aurait fallu taper D6E6F6). Un contrôle est effectué lors de la saisie, pour éviter tout risque d'erreur, Les bâtiments sont introduits à tour de rôle, en commençant par le navire amiral, puis les deux croiseurs, etc.
Une fois l'ensemble des navires placés, le joueur sur Minitel, toujours prioritaire, gage la partie : il répond à la demande « Votre coup : … » et valide par ENVOI. Le coup est affiché sur l'écran de l'ordinateur, en même temps que la question : « TOUCHÉ, COULÉ, PLOUF ou DEPEU ». L'adversaire tape alors sa réponse, la valide par RETURN (ou Entrée) et elle apparaît à l'écran du Minitel. S'il s'agit de PLOUF ou de DEPEU, la main passe à l'ordinateur qui se voit demander à son tour : « Votre coup : … ». Si la réponse est TOUCHÉ ou COULÉ, elle reste au joueur sur Minitel, qui devra toutefois attendre l'affichage de « Votre coup : … », avant de recommencer.
Les délais de réponse varient en fonction de l'ordinateur choisi. Sur les deux écrans, les navires sont représentés par des $. Lors des attaques, des signes remplacent les messages :
* signifie DEPEU, c'est-à-dire qu'il y a au moins un $ dans l’une des huit cases adjacentes ;
0 signifie PLOUF : il n'y a rien dans aucune des huit cases adjacentes ;
@ signifie : détruit par l'ennemi.
A priori, l'ordinateur ne contrôle pas la validité des réponses des joueurs, ce qui laisse à chacun la possibilité de tricher. comme dans le jeu réel. Cependant, un tel contrôle peut facilement être programmé, et l'ordinateur se charge alors de la gestion des réponses à envoyer sur un coup donné.
En fin de partie, c'est-à-dire lorsque tous les bâtiments d'un même joueur ont été coulés, les résultats s'affichent sur les écrans. A chacun son message, gagné ou perdu. Une autre partie est alors proposée et n'aura lieu que si les réponses sont positives des deux côtés.
Quelques informations techniques permettront de mieux comprendre le programme. Le Minitel est initialisé en mode terminal, 40 colonnes (pour pouvoir fonctionner avec tous les modèles). Pour afficher quelque chose sur l'écran du Minitel, on utilise l'instruction PRINT 1,...
Pour des codes d'affichage compris entre 32 et 126, le Minitel affiche les codes vidéotex GO (c'est-à-dire les lettres, chiffres, minuscules normales).
Les codes inférieurs à 32 sont des codes de contrôle :
7 pour la sonnerie ;
8 pour le retour arrière ;
10 pour le saut de ligne (qui n'est pas automatique) ;
12 pour l'effacement d'écran ;
153 pour le retour du curseur en colonne 1 de la ligne courante ;
14 pour le passage en mode vidéotex G1 (semi-graphique) ;
15 pour le retour au mode vidéotex précédent ;
24 pour l'effacement de la ligne depuis la position du curseur (ce qui correspond à l'instruction CLREOL du Pascal) ;
27 pour Escape ;
27 suivi de 64 à 71 pour la couleur du caractère ;
27 suivi de 80 à 87 pour la couleur de fond ;
27 suivi de 76 à 79 pour la taille des caractères ;
27 suivi de 72 pour le clignotement ;
27 suivi de 73 pour la fin de clignotement ;
27 suivi de 953 pour la vidéo inverse ;
27 suivi de 92 pour la vidéo normale ;
31 pour cursor ;
31 suivi de deux codes supérieurs à 64 pour la position du curseur + 64.
Code des touches de commande :
19 et 65 pour ENVOI ;
19 et 69 pour ANNULATION ;
19 et 71 pour CORRECTION ;
19 et 72 pour SUITE ;
19 et 66 pour RETOUR ;
19 et 70 pour SOMMAIRE ;
19 et 68 pour QUIDE.
Écrit en GW Basic, le programme Batnavtel est articulé autour d'un certain nombre de sous-programmes. L'indentation met clairement en évidence les diverses structures. Chaque fonction importante est commentée directement sur le listing, ce qui permet de comprendre son fonctionnement et de l'adapter assez facilement à un autre micro-ordinateur. Mais si la bataille navale n'est pas votre jeu favori, il ne devrait pas être difficile de s'inspirer du principe mis en œuvre pour détourner le Minitel à d'autres fins, qu'elles soient ludiques ou non.
80 CLS
81 LOCATE 12,20:PRINT "Un minitel est-il bien branché au PC ? (O/N)"
82 S$="" : WHILE S$="" : S$=INKEY$:WEND
83 IF S$="O" OR S$="o" THEN CLS:GOTO 90
84 LOCATE 16,20:PRINT "Haltes-le et appuyez sur une touche"
85 WHILE INKEY$="":WEND:CLS:GOTO 81
90 DEF SEG=64:IF (PEEK(23) AND 64)=64 THEN BEEP:LOCATE 12,20:PRINT
"Appuyer sur la touche 'CAPS LOCK'":GOTO 90
100 DEF SEG
110 KEY OFF:DEFINT A-Z
120 KEY(10) ON:ON KEY(10) GOSUB 4290
130 '
140 ' BAT(1,0:1:10:11) contient le jeu du joueur-minitel
150 ' BAT(2,0:1:10:11) contient le jeu du joueur-ordinateur
160 '
170 DIM BAT(2,11,1),LETT$(4),CHIF$(4)
180 FOR I=0 TO 11
190 FOR J=0 TO 1
200 BAT(1,I,J)=0:BAT(2,I,J)=0
210 NEXT
220 NEXT
230 '
240 ' Initialisations Minitel
250 '
260 OPEN "com1:1200,e,7,1,cs,ds,cd" AS #1 LEN=2000
270 PRINT #1,CHR$(27)+CHR$(59)+CHR$(96)+"XR"
280 PRINT #1,CHR$(1)+"L E"
290 PRINT #1,CHR$(1)+"E D"
300 PRINT #1,CHR$(27)+":IC"
310 PRINT #1,CHR$(0)
320 PRINT #1,CHR$(12)
330 CLS
340 GOSUB 2970 ' aff. écran minitel
350 GOSUB 3240 ' aff. écran ordi
360 GOSUB 4270 ' vidage tampon-clavier Minitel
370 GOSUB 1870 ' création du plateau de jeu
380 GOSUB 4270
390 GOSUB 580 ' jeu
400 GOSUB 4270
410 '
420 ' fin de jeu, encore une fois ?
430 '
440 LIG=15:COL=5:GOSUB 3440 ' = LOCATE 15,5 pour Minitel
450 PRINT #1,"ENCORE UNE PARTIE ? (O/N)"
460 LOCATE 15,5: PRINT "ENCORE UNE PARTIE ? (O/N)"
470 LIG=16:COL=15:GOSUB 3440:PRINT #1,"," :LIG=16:COL=15:GOSUB 3440
480 GOSUB 4270
490 S$=INPUT$(1, #1)
500 LOCATE 16,15:S2$=INPUT$(1)
510 IF S$=S2$ AND S$="O" THEN 330 ' on rejoue si les 2 joueurs le veulent
520 END
530 '
540 ' ********************************************
550 ' jeu
560 ' ********************************************
570 '
580 FINMINI=0:FINORDI=0
590 WHILE FINMINI=0 AND FINORDI=0
600 JOUEURS$="mini"
610 WHILE JOUEURS$="mini"
620 GOSUB 930 ' coup mini
630 WEND
640 IF FINMINI=1 THEN 690
650 JOUEURS$="ordi"
660 WHILE JOUEUR$="ordi"
670 GOSUB 1370 ' coup ordi
680 WEND
690 WEND
700 FOR QQ=1 TO 15000:NEXT
710 CLS:PRINT #1,CHR$(12)
720 IF FINMINI=0 THEN 810
730 CLS:LOCATE 5,18:PRINT "HELAS !";LOCATE 10,14:PRINT "VOUS AVEZ PERDU"
740 LIG=5:COL=1:GOSUB 3440
750 PRINT #1,CHR$(27);CHR$(79);CHR$(27);CHR$(72); " BRAVO !"
760 LIG=10:COL=1:GOSUB 3440
770 PRINT #1,CHR$(27);CHR$(79);CHR$(27);CHR$(72); " VOUS AVEZ GAGNE"
780 PRINT #1,CHR$(27);CHR$(73)
790 RETURN
800 ' ELSE
810 CLS:LOCATE 5,18:PRINT "BRAVO ":LOCATE 10,14:PRINT "VOUS AVEZ GAGNE"
820 LIG=5:COL=1:GOSUB 3440
830 PRINT #1,CHR$(27);CHR$(79);CHR$(27);CHR$(72); " HELAS !"
840 LIG=10:COL=1:GOSUB 3440
850 PRINT #1,CHR$(27);CHR$(79);CHR$(27);CHR$(72); " VOUS AVEZ PERDU"
860 PRINT #1,CHR$(27);CHR$(73)
870 RETURN
880 '
890 ' ********************************************
900 ' coup joueur-Minitel
910 ' ********************************************
920 '
930 LIG=21:COL=1:GOSUB 3440:PRINT #1,CHR$(27)+CHR$(91)+CHR$(74)
940 LIG=21:COL=1:GOSUB 3440
950 PRINT #1,"QUELLE CASE ? ";CHR$(24)
960 COL=10:LIG=22:GOSUB 3440:PRINT #1,".."
970 COL=10:LIG=22:GOSUB 3440
980 GOSUB 4270
990 PLACES$="" ' saisie réponse Minitel
1000 ARRET=0
1010 WHILE ARRET=0
1020 GOSUB 3510
1030 WHILE CORREC=1
1040 PLACES=LEFT$(PLACE$, LEN(PLACE$)-1)
1050 GOSUB 3510
1060 WEND
1070 PLACE$=PLACE$+S$
1080 WEND
1090 PLACE$=LEFT$(PLACE$,2)
1100 OK=0:GOSUB 1760:IF OK=0 THEN PRINT #1,CHR$(7):GOTO 930
1110 FOR I=20 TO 24:LOCATE I,1:PRINT SPACE$(35):NEXT
1120 LOCATE 21,1:PRINT "VOTRE ADVERSAIRE JOUE EN ";PLACE$;SPACE$(9)
1130 LOCATE 22,1:PRINT "TOUCHE, COULE, PLOUF OU DEPEU ?"
1140 LOCATE 23,10:PRINT SPACE$(10):LOCATE 23,10:INPUT REPS$:IF REPS$<>"TOUCHE" ANF REPS$<>"COULE" AND REPS$<>"PLOUF" AND REPS$<>"DEPEU" THEN 1140
1150 LIG=21:COL=1:GOSUB 3440:PRINT #1,CHR$(27)+CHR$(91)+CHR$(74)
1160 LIG=23:COL=1:GOSUB 3440
1170 PRINT #1,"VOTRE ADVERSAIRE REPOND :";REP$;CHR$(24)
1180 P1$=MID$(PLACE$,1,1):P2$=MID$(PLACE$,2,1):BAT(2,ASC(P1$)-64,ASC(P2$)-47)=0
1190 IF REPS$="TOUCHE" OR REPS$="COULE" THEN LIG=P2+6:COL=P1+25:GOSUB 3440:PRINT #1,"$";:LOCATE P2+6,P1+5:PRINT "@";
1200 IF REPS$="DEPEU" THEN LIG=P2+6:COL=P1+25:GOSUB 3440:PRINT #1,"*";
1210 IF REPS$="PLOUF" THEN LIG=P2+6:COL=P1+25:GOSUB 3440:PRINT #1,"0";
1220 FOR QQ=1 to 15000:NEXT
1230 FOR K=0 TO 11
1240 FOR L=0 TO 11
1250 IF BAT(2,K,L)=1 THEN TOT=TOT+1
1260 NEXT
1270 NEXT
1280 IF TOT=0 THEN FINMINI=1 ' fin de partie ?
1290 TOT=0
1300 IF (REPS$="TOUCHE" OR REPS$="COULE") AND FINMINI=0 THEN
JOUEURS$="mini" ELSE JOUEURS$="ordi"
1310 RETURN
1320 '
1330 ' ********************************************
1340 ' coup joueur-ordinateur
1350 ' ********************************************
1360 '
1370 FOR I=20 TO 24:LOCATE I,1:PRINT SPACE$(35):NEXT
1380 LOCATE 21,1
1390 PRINT "QUELLE CASE ? ";SPACE$(20)
1400 LOCATE 22,10:PRINT ".."
1410 LOCATE 22,8
1420 INPUT PLACES$
1430 PLACE$=LEFT$(PLACE$,2)
1440 OK=0:GOSUB 1760:IF OK=0 THEN BEEP:GOTO 1370
1450 LIG=21:COL=1:GOSUB 3440:PRINT #1,CHR$(27)+CHR$(91)+CHR$(74)
1460 LIG=21:COL=1:GOSUB 3440:PRINT #1,"VOTRE ADVERSAIRE JOUE EN ";PLACE$;CHR$(24)
1470 LIG=22:COL=1:GOSUB 3440:PRINT #1,"TOUCHE, COULE, PLOUF OU DEPEU ?";CHR$(24)
1480 LIG=23:COL=10:GOSUB 3440:PRINT #1,"....."
1490 GOSUB 4270
1500 REPS$="":LIG=23:COL=10:GOSUB 3440
1510 FOR I= 1 TO 5:ANCOR=0:GOSUB 3510
1520 IF ANCOR=1 THEN I=I-1
1530 REPS$=REPS$+S$
1540 NEXT
1550 IF REPS$<>"COULE" AND REPS$<>"TOUCHE" AND REPS$<>"PLOUF" AND REPS$<>"DEPEU" THEN 1480
1560 FOR I=20 TO 24:LOCATE I,1:PRINT SPACE$(35):NEXT
1570 LOCATE 23,1
1580 PRINT "VOTRE ADVERSAIRE REPOND :";REP$;SPACE$(9);
1590 P1%=MID$(PLACE$,1,1):P2%=MID$(PLACE$,2,1):BAT(1,ASC(P1$)-64,ASC(P2$)-47)=0
1600 IF REP$="TOUCH" OR REP$="COULE" THEN LOCATE P2+6,P1+25:PRINT "$":LIG=P2+6:COL=P1+5:GOSUB 3440:PRINT #1,"@";
1610 IF REP$="DEPEU" THEN LOCATE P2+6,P1+25:PRINT "*"
1620 IF REP$="PLOUF" THEN LOCATE P2+6,P1+25:PRINT "0"
1630 FOR Q0=1 TO 15000:NEXT
1640 FOR K=0 TO 11
1650 FOR L+0 TO 11
1660 IF BAT(1,K,L)=1 THEN TOT=TOT+1
1670 NEXT
1680 NEXT
1690 IF TOT=0 THEN FINORDI=1
1700 TOT=0
1710 IF (REP$="TOUCH" OR REP$="COULE") AND FINORDI=0 THEN JOUEUR$="ordi" ELSE JOUEUR$="mini"
1720 RETURN
1730 '
1740 'vérification coup joué
1750 '
1760 FOR K=1 TO LEN(PLACE$) STEP 2
1770 P1$=MID$(PLACE$,K11):P2$=MID$(PLACE$,K+1,1)
1780 IF P1$="A" OR P1$="J" THEN OK=0:RETURN
1790 IF P2$="0" OR P2$="9" THEN OK=0:RETURN
1800 NEXT
1810 P1=ASC(P1$)-64:P2=VAL(P2$)+1
1820 OK=1:RETURN
1830 '
1840 ' ****************************************
1850 'création du jeu
1860 ' ****************************************
1870 '
1880 COL=1:LIG=21:GOSUB 3440
1890 PRINT #1,"Tapez les 4 cases du vaisseau amiral"
1900 LOCATE 10:LIG=22:GOSUB 3440:PRINT #1,"......."
1910 COL=10:LIG=22:GOSUB 3440
1920 PLACE$="":GOSUB 3440
1930 ARRET=0
1940 WHILE ARRET=0
1950 GOSUB 3510
1960 WHILE CORREC=1
1970 PLACE$=LEFT$(PLACE$,LEN(PLACE$)-1)
1980 GOSUB 3510
1990 WEND
2000 PLACE$=PLACE$+S$
2010 WEND
2020 PLACE$=LEFT$(PLACE$,8)
2030 JOUEUR$="mini":GOSUB 3620 ' vérification
2040 IF OK=0 THEN PRINT #1,CHR$(7);:GOTO 1880
2050 LOCATE 21,1:PRINT "Tapez les 4 cases du vaisseau amiral"
2060 LOCATE 22,10:PRINT SPACE$(18)
2070 LOCATE 22,10:INPUT PLACE$:PLACE$=LEFT$(PLACE$,8)
2080 JOUEUR$="ordi":GOSUB 3620
2090 IF OK=0 THEN BEEP:GOTO 2050
2100 FOR J=1 TO 3
2110 COL=1:LIG=21:GOSUB 3440
2120 PRINT #1,"Tapez les 3 cases du croiseur";J;CHR$(24)
2130 COL=10:LIG=22:GOSUB 3440:PRINT #1,"....."
2140 COL=10:LIG=22:GOSUB 3440
2150 PLACE$=""
2160 GOSUB 4270
2170 ARRET=0
2180 WHILE ARRET=0
2190 GOSUB 3510
2200 WHILE CORREC=1
2210 PLACE$=LEFT$(PLACE$,LEN(PLACE$)-1)
2220 GOSUB 3510
2230 WEND
2240 PLACE$=PLACE$+S$
2250 WEND
2260 PLACE$=LEFT$(PLACE$,6)
2270 JOUEUR$="mini":GOSUB 3620 'vérification
2280 IF OK=0 THEN PRINT #1,CHR$(7);:GOTO 2110
2290 NEXT
2300 FOR J=1 TO 2
2310 LOCATE 21,1:PRINT "Tapez les 3 cases du ccroiseur";J;
2320 LOCATE 22,10:PRINT SPACE$(18)
2330 LOCATE 22,10:INPUT PLACE$:PLACE$=LEFT$(PLACE$,6)
2340 JOUEUR$="ordi":GOSUB 3620
2350 IF OK=0 THEN BEEP:GOTO 2310
2360 NEXT
2370 FOR J=1 TO 3
2380 COL=1:LIG=21:GOSUB 3440
2390 PRINT #1,"Tapez les 2 cases du destroyer";J;CHR$(24)
2400 COL=10:LIG=22:GOSUB 3440:PRINT #1,"........."
2410 COL=10:LIG=22:GOSIB 3440
2420 GOSUB 4270
2430 PLACE$=""
2440 ARRET=0
2450 WHILE ARRET=0
2460 GOSUB 3510
2470 WHILE CORREC=1
2480 PLACE$=LEFT$(PLACE$,LEN(PLACE$)-1)
2490 GOSUB 3510
2500 WEND
2510 PLACE$=PLACE$+S$
2520 WEND
2530 PLACE$=LEFT$(PLACE$,4)
2540 JOUEUR$="mini":GOSUB 3620
2550 IF OK=0 THEN PRINT #1,CHR$(7);:GOTO 2380
2560 NEXT
2570 FOR J=1 TO 3
2580 LOCATE 21,1:PRINT "Tapez les 2 cases du destroyer";J;" "
2590 LOCATE 22,10:PRINT SPACES${(18)
2600 LOCATE 22,10:INPUT PLACES:PLACES$=LEFTS$(PLACES,4)
2610 JOUEUR$="ordi":GOSUB 3620
2620 IF OK=0 THEN BEEP:GOTO 2580
2630 NEXT
2640 FOR J=1 TO 4
2650 COL=1:LIG=21:GOSUB 3440
2660 PRINT #1,"Tapez la case du sous-marin";J;CHR$(24)
2670 COL=10:LIG=22:GOSUB 3440:PRINT #1,".. "
2680 COL=10:LIG=22:GOSUB 3440
2690 GOSUB 4270
2700 PLACES$="
2710 ARRET=O
2720 WHILE ARRET=0
2730 GOSUB 3510
2740 WHILE CORREC=1
2750 PLACE$=LEFT$(PLACE$,LEN(PLACE$)-1)
2760 GOSUB 3510
2770 WEND
2780 PLACE$=PLACES+S$
2790 WEND
2800 PLACE$=LEFT$(PLACE$,2)
2810 JOUEUR$="mini":GOSUB 3620
2820 IF OK=0 THEN PRINT #1,CHR$(7);:GOTO 2650
2830 NEXT
2840 FOR J=1 TO 4
2850 LOCATE 21,1:PRINT “Tapez la case du sous-marin";J;" "
2860 LOCATE 22,10:PRINT SPACE$(18)
2870 LOCATE 22,10:INPUT PLACES$:PLACE$=LEFTS$(PLACE$,2)
2880 JOUEUR$="ordi":GOSUB 3620
2890 IF OK=0 THEN BEEP:GOTO 2850
2900 NEXT
2910 RETURN
2920 '
2930 ' ***********************
2940 ' affichage écran minitel
2950 ' ***********************
2960 '
2970 PRINT #1,CHR$(12)
2980 LIG=4:COL=5:GOSUB 3440
2990 PRINT #1,"VOS NAVIRES : CEUX DE L'ENNEMI :"
3000 LIG=18:COL=6:GOSUB 3440:PRINT #1,"ABCDEFGHIJ ABCDEFGHIJ"
3010 FOR I=0 TO 9
3020 COL=3:LIG=I+7:GOSUB 3440:PRINT #1,I;
3030 COL=23:LIG=I+7:GOSUB 3440:PRINT #1,I;
3040 NEXT
3050 COL=5:LIG=6:GOSUB 3440:PRINT #1,CHR$(14); ' passage mode caractères G1
3060 PRINT #1," 7##########k"
3070 COL=25:LIG=6:GOSUB 3440:PRINT #1,CHR$(14);
3080 PRINT #1," 7##########k"
3090 FOR I=1 TO 10
3100 COL=5:LIG=6+I:GOSUB 3440:PRINT #1,CHRS$(14);
3110 PRINT #1,"5 j"
3120 COL=25:LIG=6+I:GOSUB 3440:PRINT #1,CHR$(14);
3130 PRINT #1,"5 j"
3140 NEXT
3150 COL=5:LIG=17:GOSUB 3440:PRINT #1,CHR$(14)
3160 PRINT #1," uppppppppppz uppppppppppz"
3170 PRINT #1,CHR$(15)
3180 RETURN
3190 '
3200 ' *********************************
3210 ' affichage écran-ordinateur
3220 ' *********************************
3230 '
3240 CLS:WIDTH 40
3250 LOCATE 4,5:PRINT "VOS NAVIRES : CEUX DE L'ENNEMI :"
3260 FOR I=0 TO 9
3270 LOCATE I+7,3:PRINT I;
3280 LOCATE I+7,23:PRINT I;
3290 NEXT
3300 LOCATE 16,6:PRINT "ABCDEFGHIJ ABCDEFGHIJ"
3310 LOCATE 6,5:PRINT "__________ __________"
3320 FOR I=1 TO 10
3330 LOCATE I+6,5:PRINT "I I";
3340 LOCATE I+6,25:PRINT "I I";
3350 NEXT
3360 LOCATE 17,5:PRINT "__________ __________"
3370 RETURN
3380 '
3390 ' ********************************
3400 'équivalent d'un LOCATE pour MINITEL
3410 'en entrée, LIG et COL
3420 ' ********************************
3430 '
3440 PRINT #1,CHR$(31)+CHR$(LIG+64)+CHR$(COL+64);
3450 RETURN
3460 '
3470 ' ********************************
3480 ' gestion des entrées d'un caractère depuis Minitel dans S$
3490 ' ********************************
3500 '
3510 S$="":CORREC=0:S$=INPUTS$(1,#1)
3520 IF ASC(S$)<>19 THEN 3550
3530 S$=INPUTS$(1,#1):IF ASC(S$)=71 THEN CORREC=1:S$="":GOTO 3550
3540 IF ASC(S$)=65 THEN ARRET=1:S$=""
3550 IF CORREC=0 THEN PRINT #1,S$::RETURN
3560 PRINT #1,CHR$(8);".";CHR$(8);:RETURN
3570 '
3580 ' ********************************
3590 ' vérification validité entrée, mise dans TAB
3600 ' ********************************
3610 '
3620 OK=0
3630 FOR K=1 TO LEN(PLACES$) STEP 2
3640 P1$=MID$(PLACES,K,1):P2$=MID$(PLACES,K+1,1)
3650 IF P1$<"A" OR P1$>"J" THEN OKaO:RETURN
3660 IF P2$<"0" OR P2$>"9" THEN OK=0:RETURN
3670 NEXT
3680 IF JOUEUR$="mini" THEN JOU=1 ELSE JOU=2
3690 ‘
3700 TOT=0
3710 P1=ASC(LEFTS(PLACE$,1))-64:P2=VAL(MIDS(PLACE$,2,1))+1
3720 P3=ASC(MID$(PLACE$,LEN(PLACE$)-1,1))-64:P4=VAL(RIGHTS$(PLACE$, 1 )+ 1
3730 P1=P1-1:P2=P2-1:P3=P3+1:P4=P4+1
3740 FOR K=P1 TO P3
3750 FOR L=P2 TO P4
3760 TOT=TOT+BAT(JOU,K,L)
3770 NEXT
3780 NEXT
3790 IF TOT<>0 THEN OK=O:RETURN
3800 ' place libre ?
3810 FOR K=1 TO LEN(PLACES) STEP 2
3820 P1$=MID$(PLACE$,K,1):P2$=MID$(PLACE$,K+1,1)
3830 P1=ASC(P1$)-64:P2=VAL(P2$)+1
3840 IF BAT(JOU,P1,P2)=1 THEN OK=0:RETURN
3850 NEXT
3860 IF LEN(PLACE$)=2 THEN 4040
3870 ' positionnement valide ?
3880 FOR K=1 TO LEN(PLACE$)-2 STEP 2 ' horizontale
3890 P1$=MID$(PLACE$,K,1):P2$=MID$(PLACE$,K+1,1)
3900 P3$=MIDS(PLACE$,K+2,1):P4$=MIDS$(PLACE$,K+3,1)
3910 IF (P1$=P3$) AND (VAL(P4$)<>VAL(P2$)+1) THEN OK=O:RETURN
3920 IF (P2$=P4$) AND (ASC(P3$)<>ASC(P1$)+1) THEN OK=0:RETURN
3930 NEXT K
3940 FOR K=1 TO LEN(PLACES$) STEP 2 ' verticale
3950 LETT$(.5*K+.5)=MID$(PLACE$,K,1)
3960 CHIF$(.5*K+.5)=MID$(PLACE$,K+1,1)
3970 NEXT K
3980 OK 1=0:OK2=0 ‘ diagonale
3990 FOR K=2 TO LEN(PLACE$)}/2
4000 IF LETTS$(K)<>LETTS$(K-1) THEN OK1=1
4010 IF CHIF$(K)<>CHIF$(K-1) THEN OK2=1
4020 NEXT
4030 IF OK1+OK2=2 THEN OK=0:RETURN
4040 FOR K=1 TO LEN(PLACE$) STEP 2 ' remplissage du tableau BAT
4050 P1$=MIDS$(PLACE$,K,1):P2$=MIDS(PLACE$,K+1,1)
4060 P1=ASC(P1$)-64:P2=VAL(P2$)+1
4070 BAT(JOU,P1,P2)=1
4080 NEXT
4090 'si correct, affichage à l'écran
4100 FOR K=1 TO LEN(PLACE$) STEP 2
4110 P1$=MID$(PLACE$,K1,1):P2$=MID$(PLACE$,K1+1,1)
4120 P1=ASC(P1$)-64:P2=VAL(P2$)+1
4130 IF JOU=1 THEN 4180
4140 LOCATE P2+7,P1+6:PRINT "$"
4150 GOTO 4200
4160 ELSE
4170 LIG=P2+7:COL=P1+6:GOSUB 3440
4180 PRINT #1,"$"
4200 NEXT
4210 OK=1:RETURN
4220 '
4230 ' ***************************
4240 ' vidage tampon-clavier du Minitel
4250 ' ***************************
4260 '
4270 WHILE NOT EOF(1):S$=INPUT$(1,#1):WEND
4280 RETURN
4290 TR=O
4300 FOR II=0 TO 11
4310 FOR JJ=0 TO 11
4320 IF BAT(1,JJ,II}=1 THEN 4360
4330 NEXT
4340 NEXT
4350 RETURN
4360 LOCATE 1,10:PRINT CHRS$(64+JJ),11-1;
4370 FOR AA=1 TO 1000:NEXT
4380 LOCATE 1,1:PRINT SPACES$(30);
4390 RETURN
4400 FOR II=0 TO 11
4410 FOR JJ=0 TO 11
4420 PLACE$="":GOSUB 4270
4430 ARRET=0
4440 WHILE ARRET=0
4450 GOSUB 3510
4460 WHILE CORREC=1
4470 PLACE$=LEFT$(PLACE$,LEN(PLACE$)-1)
4480 GOSUB 3510
4490 WEND
4500 PLACE$=PLACE$+S£
4510 WEND
4520 NEXT
4540 NEXT
4550 RETURN
4560 '
4570 ' FIN DU PROGRAMME
4580 '
Christophe Chantraine Vous voulez soutenir une information indépendante ? Rejoignez notre
Club privé !
Vous cherchez un ancien numéro ?
Nous avons peut-être un exemplaire pour vous ! !
Certains liens présents dans cette page peuvent être affiliés. Sauf si c'est spécifié dans le texte, cela ne veut pas dire que la rédaction vous recommande les produits/services en question.
[homepage] [RSS] [archives]
[contact & legal & cookies] [since 1997]