Serpent
GW-Basic, utilisé par PC-Basic
Programme avec Graphique et Texte
Snake, l'un des jeux vidéo les plus populaires de tous les temps, existe depuis plus de quarante ans.
L'une de ses incarnations les plus
célèbres est la course mortelle de motos lumineuses du classique Disney de 1982,
Tron.
De nombreuses versions de Snake ont également été programmées en
BASIC, notamment des jeux en noir et blanc pour les premiers TRS-80.
Le
principe est simple : le joueur contrôle un « serpent » (une ligne) qui
s'allonge sans cesse et qui « meurt » au contact de deux éléments : lui-même et
la paroi de la cage.
Pour survivre et passer au niveau suivant, la tête du serpent doit consommer toutes les pastilles blanches affichées à l'écran.
Le programme SNAKE.BAS, dont le code est présenté ci-dessous, respecte scrupuleusement ces spécifications de jeu.
Les variables importantes sont
déclarées et initialisées à la ligne 15 : le nombre de vies, le niveau actuel,
le nombre total de points (pastilles) à l’écran, l’incrément (ou vitesse) du
serpent et le nombre de pastilles collectées par l’utilisateur dans ce niveau (DCOLLECT).
Les pastilles sont réparties aléatoirement à l’écran (voir ligne 502) et une
cage est dessinée autour du périmètre (voir ligne 505).
Une instruction INKEY$ gère les entrées clavier, qui consistent simplement à attendre la pression des touches du pavé numérique pour changer de direction.
Sans surprise, une série de fonctions POINT est utilisée pour détecter les collisions : avec le « corps » du serpent, les parois de la cage ou les pastilles blanches.
Lorsqu’une pastille est consommée, une instruction GOSUB exécute une courte sous-routine, commençant à la ligne 2000, qui comptabilise le nombre de pastilles consommées et détermine si toutes les pastilles disponibles ont été mangées.
De même, en cas de contact avec le mur ou le corps du serpent, le programme est renvoyé à une sous-routine, commençant à la ligne 1000, qui décrémente la variable LIFE, puis vérifie si la partie est terminée.
En réalité, les règles du jeu Snake décrites ci-dessus ne sont pas particulièrement immuables.
Certaines versions proposent une ligne de traînée de longueur fixe : le corps du serpent a donc une longueur finie et constante lorsqu'il se déplace à l'écran.
Certaines versions poussent le concept plus loin : à chaque pastille avalée, le corps du serpent s'allonge.
D'autres variantes permettent même de jouer à deux, comme dans la scène de la moto lumineuse de Tron.
Si vous êtes suffisamment motivé, ces défis de programmation pour Snake, et bien d'autres encore, vous attendent.
SNAKE.BAS
10 KEY OFF:SCREEN 7:COLOR
10,0:CLS
15 LIVES=3:LEVEL=1:DOTS=2:INCREMENT=.1:DCOLLECT=0
20 LOCATE
5,15:PRINT"--- SNAKE! ---"
22 COLOR 15
25 LOCATE 8,1:PRINT"Move the snake
with the numeric keypad (6,4,2,8)"
30 PRINT:PRINT"Don't contact yourself or
the wall"
40 PRINT:PRINT"Collect all of the white dots to move on to the next
level"
50 PRINT:PRINT:PRINT"Press the Spacebar to begin, or <ESC> to
exit..."
60 P$=INKEY$
70 IF P$=CHR$(27) THEN CLS:END
80 IF P$=" "
THEN 495
90 GOTO 60
495
X=INT(1+100*RND(1))+50:Y=INT(1+100*RND(1))+50:DIRECTION=INT(1+4*RND(1))
500
CLS
501 LOCATE 1,5:PRINT"LIVES REMAINING:";LIVES: LOCATE 1,29:PRINT"LEVEL ";LEVEL
502 FOR T=1 TO DOTS:PSET(INT(1+200*RND(1))+30,INT (1+150*RND(1))+30),15:NEXT T
505 LINE(10,20)-(300,20),10:LINE -(300,180),10:LINE -(10,180),10:LINE
-(10,20),10
510 I$=INKEY$
520 PSET(X,Y),10
525 'Let the snake move on
its own momentum
530 IF DIRECTION=1 THEN X=X+INCREMENT
540 IF
DIRECTION=2 THEN X=X-INCREMENT
550 IF DIRECTION=3 THEN Y=Y+INCREMENT
560
IF DIRECTION=4 THEN Y=Y-INCREMENT
590 'Change the direction of the snake
using the keypad
600 IF I$="6" THEN DIRECTION =1
610 IF I$="4" THEN
DIRECTION=2
630 IF I$="2" THEN DIRECTION=3
640 IF I$="8" THEN DIRECTION=4
690 'Check to see if the snake has hit itself
700 IF DIRECTION=1 AND
POINT(X+1,Y)=10 THEN GOTO 1000
710 IF DIRECTION=2 AND POINT(X-1,Y)=10 THEN
GOTO 1000
715 IF DIRECTION=3 AND POINT(X,Y+1)=10 THEN GOTO 1000
720 IF
DIRECTION=4 AND POINT(X,Y-1)=10 THEN GOTO 1000
750 'Check to see if the
snake has collected a white dot
760 IF DIRECTION=1 AND POINT(X+2,Y)=15 THEN
PSET(X+2,Y),0:GOSUB 2000
770 IF DIRECTION=2 AND POINT(X-1,Y)=15 THEN
PSET(X-1,Y),0:GOSUB 2000
780 IF DIRECTION=3 AND POINT(X,Y+2)=15 THEN
PSET(X,Y+2),0:GOSUB 2000
790 IF DIRECTION=4 AND POINT(X,Y-1)=15 THEN
PSET(X,Y-1),0:GOSUB 2000
990 IF I$=CHR$(27) THEN CLS:END
999 GOTO 510
1000 'Lost a life
1010 FOR G=1 TO 15
1020 COLOR ,15
1030 FOR PAUSE=1
TO 200: NEXT PAUSE
1040 COLOR ,0
1050 NEXT G
1060 LIVES=LIVES-1
1070
IF LIVES<=0 THEN LOCATE 12,17:PRINT"GAME OVER":FOR PAUSE=1 TO 25000:NEXT
PAUSE:GOTO 10
1090 FOR PAUSE=1 TO 2000: NEXT PAUSE
1200 GOTO 495
2000
'Check if all dots are collected
2005 DCOLLECT=DCOLLECT+1
2010 IF
DCOLLECT=DOTS THEN
DOTS=DOT+1:INCREMENT=INCREMENT+.01:LEVEL=LEVEL+1:DCOLLECT=0:GOTO 495
2020
RETURN