sync on
sync rate 50
sync
`déclaration des variables
`grille(x,y) contiendra un
`1 ou un 0, si la case de la
`grille est remplie ou non
dim grille(10, 26) as byte
`construction d'un sol
for t=1 to 10
grille(t,26)=1
next t
`ce tableau contiendra les pièces.
`pour le moment, on n'a que le T,
`il faudrait faire les autres
dim piece(3,3)
`mettre toutes les variables globales
`dans un type rend le code plus propre
type t_glob
pieceX as integer
pieceY as integer
ajoutPiece as integer
deplacePiece as integer
endtype
global glob as t_glob
`ajoutPiece : cette variable est incrémentée
`non-stop. Lorsqu'elle est égale à 0, on ajoute
`une pièce.
`lorsqu'on veut ajouter une nouvelle pièce, il
`suffit de lui donner une valeure inférieure à
`zéro. Avec -50, on a environ une seconde
`d'attente avant l'ajout de la pièce
glob.ajoutPiece = -50
`même principe qu'ajoutPiece, mais pour le
`déplacement de la pièce
glob.deplacePiece = -100
`gestion du clavier : ces variables stockent
`l'état précédent d'une touche. Comme ça, on
`peut faire des conditions du type de "si
`la touche est pressée mais ne l'était pas
`lors de la dernière boucle"
lastLeft as byte
lastRight as byte
lastUp as byte
lastDown as byte
`boucle principale
do
`comme je l'ai dit plus haut, on incrémente
`ces variables
inc glob.ajoutPiece
inc glob.deplacePiece
`ajout d'une pièce
if glob.ajoutPiece = 0
fctAjoutePiece()
endif
`i glob.ajoutPiece est supérieur à 0, cela
`signifie qu'il y a une pièce à déplacer, donc
`on peut s'occupper de cette pièce
if glob.ajoutPiece > 0
`déplacement de la pièce
if lastLeft=0 and leftkey()=1
fctBougeAGauche()
endif
lastLeft = leftkey()
if lastRight=0 and rightkey()=1
fctBougeADroite()
endif
lastRight = rightkey()
`rotation de la pièce
if lastUp=0 and upkey()=1
fctTourneAGauche()
endif
lastUp = upkey()
if lastDOwn=0 and downkey()=1
fctTourneADroite()
endif
lastDown = downkey()
`si on presse espace, on descend la pièce
`rapidement
if spacekey()=1 then glob.deplacePiece = 0
`quand glob.deplacepiece est égal à 0, on
`la déplace vers le bas et on met la variable
`à -50
if glob.deplacePiece = 0
glob.deplacePiece = -50
goDown()
endif
endif
`affichage
cls
dessineGrille(10, 10, 232, 580)
dessinePiece(10, 10, 232, 580)
sync
loop
function dessineGrille(posx as integer, posy as integer, largeur as integer, hauteur as integer)
w as float
h as float
`calcul de la largeur et de la hauteur d'une case
w = (largeur / 10.0)
h = (hauteur / 25.0)
`couleur d'affichage de la grille et des boîtes placées
ink rgb(96,96,96),0
for x=0 to 10
for y=0 to 25
`lignes verticales
line posx + (w*x), posy, posx+(w*x), posy+hauteur
`lignes horizontales
line posx, posy+(y*h), posx+largeur, posy+(y*h)
if grille(x,y)=1
box posx+(w*(x-1)), posy+(w*(y-1)), posx+(w*x), posy+(w*y)
endif
next y
next x
endfunction
function delLines()
`cette commande supprime une ligne, si elle est complète.
for y=25 to 1 step -1
`on compte le nombre de cases remplies
nbr = 0
for x=1 to 10
inc nbr, grille(x,y)
next x
`s'il y en a 10...
if nbr=10
`... on descend toutes les cases se trouvant
`en-dessus de la ligne :
`grille(x,y) = grille(x,y-1)
for y2=y to 1 step -1
for x=1 to 10
grille(x,y2) = grille(x,y2-1)
next x
next y2
inc y
endif
next y
endfunction
function fctAjoutePiece()
`cette fonction crée une nouvelle pièce en
`haut de l'écran.
`sélection aléatoire de la forme de la pièce
num = rnd(5)
select num
case 0
restore _piece_T
endcase
case 1
restore _piece_L
endcase
case 2
restore _piece_L2
endcase
case 3
restore _piece_Z
endcase
case 4
restore _piece_Z2
endcase
case 5
restore _piece_I
endcase
endselect
for x=1 to 3
for y=1 to 3
read piece(x,y)
next y
next x
`positionnement de la pièce : en haut et aléatoirement
`le long de X (c'est plus marrant)
glob.pieceX = 1+rnd(6)
glob.pieceY = 0
endfunction
function fctTourneADroite()
`cette commande effectue une rotation à la pièce. En gros,
`je transforme
`ABC GDA
`DEF en HEB
`GHI IFC
dim temporaire(3,3)
for t=1 to 3
temporaire(t, 1) = piece(1, (4-t))
temporaire(3, t) = piece(t, 1)
temporaire(t, 3) = piece(3, (4-t))
temporaire(1, t) = piece(t, 3)
next t
temporaire(2,2) = piece(2,2)
for x=1 to 3
for y=1 to 3
piece(x,y) = temporaire(x,y)
next y
next x
`je regarde si, à cause de la rotation, il faut décaler
`la pièce
ToucheLesBords()
endfunction
function fctTourneAGauche()
`idem à fctTourneADroite mais dans l'autre sens
dim temporaire(3,3)
for t=1 to 3
temporaire(1, t) = piece((4-t), 1)
temporaire(t, 1) = piece(3, t)
temporaire(3, (4-t)) = piece(t, 3)
temporaire(t, 3) = piece(1, t)
next t
temporaire(2,2) = piece(2,2)
for x=1 to 3
for y=1 to 3
piece(x,y) = temporaire(x,y)
next y
next x
ToucheLesBords()
endfunction
function fctBougeAGauche()
`déplace la pièce vers la gauche
dec glob.pieceX
`elle dépasse le bord de l'écran ?
if glob.pieceX < -1 then glob.pieceX = -1
if glob.pieceX = -1
`Regardons cette même pièce, dans deux orientations
`différentes :
` 010 000
`1: 010 2: 111
` 010 000
`c'est une barre. Si elle est verticale, on peut la
`mettre à la position X=-1, la barre sera alignée le
`long du bord. Par contre, si elle est horizontale,
`on ne peut pas la mettre plus à gauche que X=0.
for t=1 to 3
if piece(1, t)=1 then glob.pieceX = 0
next t
endif
`si la pièce est en collision avec une autre, on la remet
`à la position X précédente.
if collision()=1 then inc glob.pieceX
endfunction
function fctBougeADroite()
`mêmes explications que fctBougeAGauche
inc glob.pieceX
if glob.pieceX > 8 then glob.pieceX = 8
if glob.pieceX = 8
for t=1 to 3
if piece(3, t)=1 then glob.pieceX = 7
next t
endif
if collision()=1 then dec glob.pieceX
endfunction
function ToucheLesBords()
`en gros, cette fonction ne faut que
`replacer la pièce si elle dépasse l'un
`des bords
if glob.pieceX > 8 then glob.pieceX = 8
if glob.pieceX = 8
for t=1 to 3
if piece(3, t)=1 then glob.pieceX = 7
next t
endif
if glob.pieceX < -1 then glob.pieceX = -1
if glob.pieceX = -1
for t=1 to 3
if piece(1, t)=1 then glob.pieceX = 0
next t
endif
endfunction
function dessinePiece(posx as integer, posy as integer, largeur as integer, hauteur as integer)
`cette fonction affiche la pièce sur la grille. Ses paramètres doivent
`être identiques à ceux de dessineGrille
w as float
h as float
if glob.ajoutPiece > 0
w = (largeur / 10.0)
h = (hauteur / 25.0)
ink rgb(255,255,255),0
for x=1 to 3
for y=1 to 3
if piece(x,y)=1
box posx+(w*((x+glob.pieceX)-1)), posy+(w*((y+glob.pieceY)-1)), posx+(w*(x+glob.pieceX)), posy+(w*(y+glob.pieceY))
endif
next y
next x
endif
endfunction
function auSol()
`cette fonction regarde si la pièce est "posée" sur des cases remplies
for x=1 to 3
for y=3 to 1 step -1
if piece(x,y)=1
`si une case de la grille juste sous une case de
`la pièce est remplie, la fonction renvoie la
`valeur 1
if grille(x+glob.pieceX, y+glob.pieceY+1)=1 then exitfunction 1
endif
next y
next x
`si aucune case de la grille n'était remplie, la fonction
`renvoie la valeur 0
endfunction 0
function collision()
`regarde si l'une des cases de la pièce est sur l'une
`des cases remplies de la grille. Si c'est le cas, renvoie
`1, sinon renvoie 0.
for x=1 to 3
for y=1 to 3
if piece(x,y)=1
if grille(x+glob.pieceX, y+glob.pieceY)=1 then exitfunction 1
endif
next y
next x
endfunction 0
function goDown()
`si la pièce est posée, on ne descend pas mais...
if auSol()=1
`... on "met la pièce dans la grille"
for x=1 to 3
for y=1 to 3
if piece(x,y)=1
grille(x+glob.pieceX, y+glob.pieceY)=1
endif
next y
next x
`on prépare l'ajout d'une nouvelle pièce
glob.ajoutPiece = -50
glob.deplacePiece = -100
`on supprime éventuellement les lignes, s'il le faut
delLines()
else
`descente de la pièce, si elle n'était pas au sol
inc glob.pieceY
endif
endfunction
`ces données servent à la construction des pièces. 0 indique
`une case vide, 1 une case pleine. Le tableau des pièces
`est de dimension 3x3.
_piece_T:
data 0,1,0
data 1,1,1
data 0,0,0
_piece_L:
data 1,1,1
data 0,0,1
data 0,0,0
_piece_L2:
data 1,1,1
data 1,0,0
data 0,0,0
_piece_Z:
data 1,1,0
data 0,1,1
data 0,0,0
_piece_Z2:
data 0,1,1
data 1,1,0
data 0,0,0
_piece_I:
data 0,1,0
data 0,1,0
data 0,1,0