Source     Discussion     Modifier     Historique     Forums     Salon IRC

Source:Tetris simple.dbp

Un article de Games Creators Network.

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

 

Rechercher
Installer l'extension de recherche Plus d'informations

 

Comprendre
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

 

Partager
La connaissance est la seule chose qui s'accroit lorsqu'on la partage. - Sacha Boudjema

 

Créer
L'imagination est plus importante que la connaissance. - Albert Einstein

 

 

Le wiki en images Le wiki en images Image du mois: «Snowball: un prototype de jeu développé avec NeL.