L'intérêt de l'exercice consiste à optimiser la partie résolution afin que le temps de réponse reste jouable.
Programme entier
Après quelques heures que le week-end pascal a rendu possibles, voici mon programme :
Initialisations :
A() : matrice des valeurs - B() et C() : utilisés pour le traitement d'une ligne de la matrice.
T servira à détecter qu'au moins une des valeurs a été modifiée (sinon, aucun nouveau chiffre n’apparaît).
N : nombre de coups - P : nombre de points
B : option pour émettre en Beep lorsque la machine est dispo pour la commande suivante
C=26 : position d'impression des points.
Code : Tout sélectionner
1 REM ****************
2 REM ***** 2048 *****
3 REM ****************
5 CLEAR
10 ERASE A,B,C:DIM A(5,5),B(5),C(5)
20 N=0:P=0:C=26:B=0:ANGLE 0:T=2
50 GOSUB 950: GOSUB 900
Code : Tout sélectionner
100 REM BOUCLE DE JEU
105 REM INITIALISATION AVEC DEUX 2
110 GOSUB 1000
120 IF T>1 THEN GOSUB 900
130 K$=INKEY$
140 IF K$="B" OR K$="b" THEN B=1-B:BEEP:ANGLE B
150 IF ASC(K$)<28 OR ASC(K$)>31 THEN GOTO 130
155 IN=0:T=0
160 ON ASC(K$)-27 GOSUB 500,600,800,700
170 GOTO 100
Ainsi dans l'image, la deuxième ligne est stockée dans B ainsi (. 2 16 2). Le bloc 1200 ne changera rien dans ce cas.
Au retour on recadre à droite et on remet dans A().
Code : Tout sélectionner
500 REM JEU A DROITE
510 FOR I=1 TO 4:IN=1
520 REM Copie Cadree du Vecteur dans B
525 IF T=1 THEN T=0
530 MM=4:CC=1:FOR J=4 TO 1 STEP -1 :IF A(I,J)<>0 THEN B(MM)=A(I,J):MM=MM-1:IN=0:T=T*2 ELSE B(CC)=0:CC=CC+1:IF T=0 THEN T=1
535 NEXT J
537 IF IN=1 THEN GOTO 560
540 GOSUB 1200
550 MM=4:CC=1:FOR J=4 TO 1 STEP -1:IF B(J)<>0 THEN A(I,MM)=B(J):MM=MM-1 ELSE A(I,CC)=0:CC=CC+1
555 NEXT J
560 NEXT I
570 RETURN
Boucle sur les lignes cadrées à gauche
Code : Tout sélectionner
600 REM JEU A GAUCHE
610 FOR I=1 TO 4:IN=1
620 REM Copie Cadree du Vecteur dans B
625 IF T=1 THEN T=0
630 MM=1:CC=4:FOR J=1 TO 4 :IF A(I,J)<>0 THEN B(5-MM)=A(I,J):MM=MM+1:IN=0:T=T*2 ELSE B(5-CC)=0:CC=CC-1:IF T=0 THEN T=1
635 NEXT J
637 IF IN THEN 660
640 GOSUB 1200
650 MM=1:CC=4:FOR J=1 TO 4:IF B(5-J)<>0 THEN A(I,MM)=B(5-J):MM=MM+1 ELSE A(I,CC)=0:CC=CC-1
655 NEXT J
660 NEXT I
670 RETURN
Boucle sur les colonnes cadrées en haut :la 4ème colonne de l'image est stockée dans B ainsi : (. 4 2 8 )
Code : Tout sélectionner
700 REM JEU en HAUT
710 FOR I=1 TO 4:IN=1
720 REM Copie Cadree du Vecteur dans B
725 IF T=1 THEN T=0
730 MM=4:CC=1:FOR J=4 TO 1 STEP -1:IF A(J,I)<>0 THEN B(MM)=A(J,I):MM=MM-1:IN=0:T=2*T ELSE B(CC)=0:CC=CC+1:IF T=0 THEN T=1
735 NEXT J
737 IF IN THEN 760
740 GOSUB 1200
750 MM=4:CC=1:FOR J=4 TO 1 STEP -1:IF B(J)<>0 THEN A(MM,I)=B(J):MM=MM-1 ELSE A(CC,I)=0:CC=CC+1
755 NEXT J
760 NEXT I
790 RETURN
Boucle sur les colonnes cadrées en bas : la 4ème colonne de l'image est stockée dans B ainsi : (. 8 2 4)
Code : Tout sélectionner
800 REM JEU en BAS
805 IN=1
810 FOR I=1 TO 4:IN=1
820 REM Copie Cadree du Vecteur dans B
825 IF T=1 THEN T=0
830 MM=1:CC=4:FOR J=1 TO 4 :IF A(J,I)<>0 THEN B(5-MM)=A(J,I):MM=MM+1:IN=0:T=2*T ELSE B(5-CC)=0:CC=CC-1:IF T=0 THEN T=1
835 NEXT J
837 IF IN THEN 860
840 GOSUB 1200
850 MM=1:CC=4:FOR J=1 TO 4:IF B(5-J)<>0 THEN A(MM,I)=B(5-J):MM=MM+1 ELSE A(CC,I)=0:CC=CC-1
855 NEXT J
860 NEXT I
890 RETURN
Code : Tout sélectionner
900 REM TIRAGE ALEATOIRE
910 X=INT(RAN#*4+1):Y=INT(RAN#*4+1)
920 IF A(X,Y)<>0 THEN 910
930 A(X,Y)=2:N=N+1
935 LOCATE (Y-1)*6,X-1:PRINT " 2";
936 LOCATE C-LOG(N+1)/2,1:PRINT N
938 IF B=1 THEN BEEP
940 RETURN
Code : Tout sélectionner
950 REM Preparation du plateau
952 CLS
955 DRAW (35,0)-(35,30)
960 DRAW (70,0)-(70,30)
965 DRAW (105,0)-(105,30)
970 DRAW (140,0)-(140,30)
980 LOCATE C,0:PRINT "Nbr:";
985 LOCATE C,2:PRINT "Pts:";
990 RETURN
Code : Tout sélectionner
1000 REM Impression des chiffres
1020 FOR I=1 TO 4
1030 FOR J=1 TO 4
1035 P$=" "
1040 IF A(I,J)<>0 THEN P$=LEFT$(STR$(A(I,J))+" " ,5)
1045 LOCATE (J-1)*6,I-1:PRINT P$;
1050 NEXT J
1060 NEXT I
1074 LOCATE C-LOG(P+1)/2,3:PRINT P;
1090 RETURN
(1 1 2 2) devient (. 2 . 4)
(1 1 . 3) devient (. 2 . 3)
Le cadrage à droite sera fait au moment de la recopie dans A()
Code : Tout sélectionner
1200 REM ELIMINATION
1220 FOR J=4 TO 2 STEP -1
1230 IF B(J)=B(J-1) AND B(J)<>0 THEN B(J)=B(J)*2:B(J-1)=0:P=P+B(J):T=2
1240 NEXT J
1260 RETURN