FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» PANORAMIC V 1
Tetris Emptypar jjn4 Aujourd'hui à 17:49

» select intégrés [résolu]
Tetris Emptypar jjn4 Aujourd'hui à 17:00

» number_mouse_up
Tetris Emptypar jjn4 Aujourd'hui à 11:59

» Aide de PANORAMIC
Tetris Emptypar jjn4 Aujourd'hui à 11:16

» trop de fichiers en cours
Tetris Emptypar lepetitmarocain Aujourd'hui à 10:43

» Je teste PANORAMIC V 1 beta 1
Tetris Emptypar papydall Aujourd'hui à 4:17

» bouton dans autre form que 0
Tetris Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
Tetris Emptypar Klaus Lun 6 Mai 2024 - 11:41

» Gestion d'un système client-serveur.
Tetris Emptypar Klaus Lun 6 Mai 2024 - 10:23

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Tetris Emptypar Froggy One Jeu 2 Mai 2024 - 11:16

» @Jack
Tetris Emptypar Jack Mar 30 Avr 2024 - 20:40

» Une calculatrice en une ligne de programme
Tetris Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
Tetris Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
Tetris Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
Tetris Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le Deal du moment : -29%
PC portable – MEDION 15,6″ FHD Intel i7 ...
Voir le deal
499.99 €

 

 Tetris

Aller en bas 
5 participants
AuteurMessage
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Tetris   Tetris EmptyJeu 19 Fév 2015 - 23:06

Je vous mets ci dessous le listing du programme Tetris. C'est une première version jouable.
Si vous voyez des améliorations
Un article vas être fait pour le mag et vous trouverez les ressources sur le site du mag également.
N'hésitez pas à améliorer le code si vous avez des idées.
Une fonction manquante mais pour laquelle il faut quand même bien réfléchir c'est la chute de pièce si rien ne la retient et qu'il y a un trou dessous. Ça parait simple, mais ça ne l'est pas tant que ça.
Il y a d'autres choses améliorables
Bon et si d'autres personnes ont le message "Exception Exception in module kgf.dll at 00041F18. qu'ils n'hésitent pas à l'écrire, je ne vois pas pourquoi j'ai ce problème et que les autres ne l'ont pas ... d'ailleur, je ne sais pas non plus pourquoi il ne fait pas mon on_error_goto puisqu'à la base, je l'avais rajout exprès pour ne pas bloquer le jeu....

Code:
' Tetris par Jicehel
' Version 1.0
' Ecrit en Panoramic, le 13/02/2015
'

' Déclaration des sous-programmes évenementiels
label boucle_principale, quitte, t1, chutte, err, lance_musique

' variables de la fenêtre principale
dim l_fenetre : l_fenetre = 610
dim h_fenetre : h_fenetre = 700

' variables de la grille
dim marge_grille : marge_grille =15  : ' marge entre la fenêtre et la grille
dim h_carre_grille : h_carre_grille = 30 : ' taille d'une case de la grille

' variables d'un carré élementaire
dim h_carre : h_carre = h_carre_grille - 1 : ' taille d'un carré de base
dim m_carre : m_carre = int(h_carre /   : ' taille la bordure du carré pour le relief

' définition des pièces
dim couleur_piece(6,3)
dim d_piece(3,3) : ' contient les "carrés" occupés par la pièce dans son état de rotation actuelle
dim d_piece_temp(3,3) : ' copie temporaire de la piece pour les rotations

' pièce O
dim piece_O(3,3)
piece_O(0,0) = 0 : piece_O(0,1) = 0:  piece_O(0,2) = 0:  piece_O(0,3) = 0
piece_O(1,0) = 0 : piece_O(1,1) = 1:  piece_O(1,2) = 1:  piece_O(1,3) = 0
piece_O(2,0) = 0 : piece_O(2,1) = 1:  piece_O(2,2) = 1:  piece_O(2,3) = 0
piece_O(3,0) = 0 : piece_O(3,1) = 0:  piece_O(3,2) = 0:  piece_O(3,3) = 0

couleur_piece(0,0) = 220 : couleur_piece(0,1) = 220 :  couleur_piece(0,2) = 0

' pièce I
dim piece_I(3,3)
piece_I(0,0) = 0 : piece_I(0,1) = 0:  piece_I(0,2) = 0:  piece_I(0,3) = 0
piece_I(1,0) = 1 : piece_I(1,1) = 1:  piece_I(1,2) = 1:  piece_I(1,3) = 1
piece_I(2,0) = 0 : piece_I(2,1) = 0:  piece_I(2,2) = 0:  piece_I(2,3) = 0
piece_I(3,0) = 0 : piece_I(3,1) = 0:  piece_I(3,2) = 0:  piece_I(3,3) = 0

couleur_piece(1,0) = 100 : couleur_piece(1,1) = 220 :  couleur_piece(1,2) = 220

' pièce S
dim piece_S(3,3)
piece_S(0,0) = 0 : piece_S(0,1) = 0:  piece_S(0,2) = 0:  piece_S(0,3) = 0
piece_S(1,0) = 0 : piece_S(1,1) = 0:  piece_S(1,2) = 1:  piece_S(1,3) = 1
piece_S(2,0) = 0 : piece_S(2,1) = 1:  piece_S(2,2) = 1:  piece_S(2,3) = 0
piece_S(3,0) = 0 : piece_S(3,1) = 0:  piece_S(3,2) = 0:  piece_S(3,3) = 0

couleur_piece(2,0) = 0 : couleur_piece(2,1) = 220 :  couleur_piece(2,2) = 0

' pièce Z
dim piece_Z(3,3)
piece_Z(0,0) = 0 : piece_Z(0,1) = 0:  piece_Z(0,2) = 0:  piece_Z(0,3) = 0
piece_Z(1,0) = 0 : piece_Z(1,1) = 1:  piece_Z(1,2) = 1:  piece_Z(1,3) = 0
piece_Z(2,0) = 0 : piece_Z(2,1) = 0:  piece_Z(2,2) = 1:  piece_Z(2,3) = 1
piece_Z(3,0) = 0 : piece_Z(3,1) = 0:  piece_Z(3,2) = 0:  piece_Z(3,3) = 0

couleur_piece(3,0) = 220 : couleur_piece(3,1) = 0 :  couleur_piece(3,2) = 0

' pièce L
dim piece_L(3,3)
piece_L(0,0) = 0 : piece_L(0,1) = 0:  piece_L(0,2) = 0:  piece_L(0,3) = 0
piece_L(1,0) = 0 : piece_L(1,1) = 1:  piece_L(1,2) = 1:  piece_L(1,3) = 1
piece_L(2,0) = 0 : piece_L(2,1) = 1:  piece_L(2,2) = 0:  piece_L(2,3) = 0
piece_L(3,0) = 0 : piece_L(3,1) = 0:  piece_L(3,2) = 0:  piece_L(3,3) = 0

couleur_piece(4,0) = 220 : couleur_piece(4,1) = 120 :  couleur_piece(4,2) = 0

' pièce J
dim piece_J(3,3)
piece_J(0,0) = 0 : piece_J(0,1) = 0:  piece_J(0,2) = 0:  piece_J(0,3) = 0
piece_J(1,0) = 0 : piece_J(1,1) = 1:  piece_J(1,2) = 1:  piece_J(1,3) = 1
piece_J(2,0) = 0 : piece_J(2,1) = 0:  piece_J(2,2) = 0:  piece_J(2,3) = 1
piece_J(3,0) = 0 : piece_J(3,1) = 0:  piece_J(3,2) = 0:  piece_J(3,3) = 0

couleur_piece(5,0) = 0 : couleur_piece(5,1) = 0 :  couleur_piece(5,2) = 220

' pièce T
dim piece_T(3,3)
piece_T(0,0) = 0 : piece_T(0,1) = 0:  piece_T(0,2) = 0:  piece_T(0,3) = 0
piece_T(1,0) = 0 : piece_T(1,1) = 1:  piece_T(1,2) = 1:  piece_T(1,3) = 1
piece_T(2,0) = 0 : piece_T(2,1) = 0:  piece_T(2,2) = 1:  piece_T(2,3) = 0
piece_T(3,0) = 0 : piece_T(3,1) = 0:  piece_T(3,2) = 0:  piece_T(3,3) = 0

couleur_piece(6,0) = 220 : couleur_piece(6,1) = 0 :  couleur_piece(6,2) = 220


' dessin des carrés de couleur
dim p_carre : ' Picture des carré pour la pièce 0, 6 autres objets seront créés pour les autres carés de base
'              On créé ensuite 7 autres pictures pour stocker les différentes pièces
'              On créera les pièces tournées à 90°, 180° et -90° à la suite
dim i_temp% : ' Image servant à faire la copie du carré correspondant à la pièce

' définition des noms d'obhets
dim a_grille1%  : ' picture ou l'on crée la grille comme fond et ou on mettra les blocs inactifs
dim a_grille2%  : ' nom de la grille 2 sur laquelle on affiche les sprites de la pièce et le fond avec les blocs figés
dim a_suivante% : ' nom du "picture" où l'on affiche la pièce suivante
dim a_score%    : ' nom de l'affichage du score
dim a_lignes%   : ' nom de l'affichage du nombre de lignes faites
dim a_nb_lignes%: ' affichage du nombre de lignes faites
dim a_niveau%   : ' affichage du niveau actuel

' définition des variables du jeu
dim iter%, iter2% : ' Compteurs d'itérations
dim objet%: objet% = 0 : ' Compteur d'objets créés
dim p_suivante : ' prochaine pièce qui sera affichée
dim piece : ' Numero de la pièce active. Si la pièce vaut -1, prendre la pièce suivante
dim x_piece, y_piece : ' Coordonnées de la pièce courante en cases
dim x_initial, y_initial : ' Coordonnées initiale d'une nouvelle pièce
x_initial = 4 : y_initial = -4
dim diff_couleur : diff_couleur = 100 : ' Ombres et lumière
dim ind_c% : ind_c% = int(diff_couleur / h_carre) : ' variation de lumiere par pas
dim temps% : temps% = 75 : ' temps d'une boucle principale
dim v_dep : v_dep = 0.2 : ' Vitesse de descente de la pièce
dim t_principal : ' Numéro du timer principal
dim t_musique : ' ' Timer pour relancer la musique
dim sprite_piece : sprite_piece = 1 : ' Le sprite de la pièce !!
dim test_dep% : ' Vaut 1 si le déplacement est possible
dim grille%(9,19) : ' Mémorise les carrés des pièces dans la grille
dim rotation% : ' Indique si la pièce est tournée
dim nb_lignes%: ' Le compteur de ligne
dim niveau%   : ' Niveau actuel
dim score%    : ' Le score
dim player_musique: ' Objet qui jouera la musique
dim s$ : ' chaine de caractères temporaire

' définitions des sons
dim s_dep_impossible : ' mouvement impossible
dim s_dep_lateral    : ' deplacement à droit ou a gauche
dim s_rotation       : ' tourne la pièce de 90°
dim s_gameover       : ' son de fin de partie
dim s_verouillee     : ' la pièce est bloquée (arrivée, on passe à la pièce suivante)
dim s_niveau         : ' passage au niveau supérieur
dim s_chutte         : ' son de la chutte d'une pièce quand on appuie sur espace
dim s1_ligne, s2_lignes, s3_lignes, s4_lignes : '  sons de 1 à 4 lignes complètes
dim m_gameover  : ' Musique après la fin de partie
dim m_theme     : ' Musique durant le jeu
dim m_highscore : ' Musique sur l'ecran des high_score

dim grille_active% : grille_active%=2 : ' Définit la grille de travail

' ****************************** COMMANDES CLAVIER **************************
dim esc,cesc : cesc=27 : ' * TOUCHE "ESC"  ==> MET FIN AU PROGRAMME:... 27  *
dim tfg,ctfg : ctfg=37 : ' * FLÈCHE GAUCHE ==> DEPLACER À GAUCHE:...... 37  *
dim tfh,ctfh : ctfh=38 : ' * FLÈCHE HAUTE  ==> PIVOTER A GAUCHE........ 38  *
dim tfd,ctfd : ctfd=39 : ' * FLÈCHE DROITE ==> DEPLACER À DROITE:...... 39  *
dim tfb,ctfb : ctfb=40 : ' * FLÈCHE BASSE  ==> PIVOTER À DROITE:....... 40  *
dim esp,cesp : cesp=32 : ' * ESPACE        ==> TOMBER:................. 32  *
' ***************************************************************************


' initialisation de la fenêtre de jeu
width 0, l_fenetre : height 0,h_fenetre

objet% = objet% + 1 : a_grille1% = objet%
picture a_grille1%  : hide a_grille1%: left a_grille1%, marge_grille : top a_grille1%, marge_grille
width a_grille1%, 10*h_carre_grille : height a_grille1%,20*h_carre_grille
color a_grille1%,200, 150, 150 : 2D_target_is a_grille1% : trace_grille()
file_save a_grille1%,"fond.bmp"

objet% = objet% + 1: a_grille2% = objet%
scene2D a_grille2% : left a_grille2%, marge_grille : top a_grille2%, marge_grille
width a_grille2%, 10*h_carre_grille : height a_grille2%,20*h_carre_grille
file_load a_grille2%,"fond.bmp"
sprite sprite_piece

objet% = objet% + 1: i_temp% = objet% : image i_temp%
objet% = objet% + 1 : picture objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, marge_grille : width objet%,250: height objet%,172 : file_load objet%,titre.jpg

objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 3* marge_grille + 172 : width objet%,250: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Pièce suivante :"

objet% = objet% + 1 : a_suivante% = objet% : picture objet% : left objet%, 2*marge_grille + 12 * h_carre_grille
top objet%, 4* marge_grille + 202 : width objet%,4* h_carre_grille: height objet%, 4* h_carre_grille

' Création des 7 pièces dans les 4 directions

for iter% = 0 to 6

  objet% = objet% + 1 :  if iter%= 0 then p_carre = objet%

  picture objet% : 2d_target_is objet%
  top objet%, -400: width objet%, h_carre_grille : height objet%, h_carre_grille
  dessine_carre(iter%)

  picture objet%+7 :  hide objet% +7
  width objet%+7, 4*h_carre_grille: height objet%+7, 4*h_carre_grille : top objet%+7, -400
  color objet%+7,0,0,0: 2d_target_is objet%+7 : dessine_piece(iter%,1)

  picture objet%+14 :  hide objet% + 14
  width objet%+14, 4*h_carre_grille: height objet%+14, 4*h_carre_grille: top objet%+14, -400
  color objet%+14,0,0,0: 2d_target_is objet%+14 : dessine_piece(iter%,2)

  picture objet%+21 :  hide objet% + 21
  width objet%+21, 4*h_carre_grille: height objet%+21, 4*h_carre_grille : top objet%+21, -400
  color objet%+21,0,0,0: 2d_target_is objet%+21 : dessine_piece(iter%,3)

  picture objet%+28 :  hide objet% + 28
  width objet%+28, 4*h_carre_grille: height objet%+28, 4*h_carre_grille:  top objet%+28, -400
  color objet%+28,0,0,0: 2d_target_is objet%+28 : dessine_piece(iter%,4)

next iter%

objet% = objet% + 28
piece = -1 : vide_grille() :  Cree_piece_suivante()
dll_on "kgf.dll"

' Debug Windows
dim debug_mode : debug_mode = 0 : ' Active ou non le mode debug
dim debug_windows
if debug_mode = 1
  objet% = objet% + 1 : debug_windows = objet%
  form debug_windows : command_target_is debug_windows
  left debug_windows, 700 : height debug_windows,700 : width debug_windows, 250
  objet% = objet% + 1 : list objet% : width objet%, 220
  height objet%, 650
  command_target_is 0 : set_focus 0
end_if

' Demarrage du jeu, on lance les cycle du jeu au travers d'un timer qui va rythmer les actions

score% = 0 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 12* marge_grille + 242 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Score :"

objet% = objet% + 1 : a_score% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 12* marge_grille + 242 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000000"

nb_lignes% = 0 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 14* marge_grille + 272 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Lignes :"

objet% = objet% + 1 : a_nb_lignes% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 14* marge_grille + 272 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000000"

niveau% = 1 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 16* marge_grille + 302 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Niveau :"

objet% = objet% + 1 : a_niveau% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 16* marge_grille + 302 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000001"

' Chargement des sons
objet% = objet% + 1 :  s_dep_impossible = objet% : sound objet% : file_load objet%,"sons\Deplacement impossible.mp3"
objet% = objet% + 1 :  s_dep_lateral = objet%    : sound objet% : file_load objet%,"sons\Deplacement lateral.mp3"
objet% = objet% + 1 :  s_rotation = objet%       : sound objet% : file_load objet%,"sons\Rotation piece.mp3"
objet% = objet% + 1 :  s_gameover = objet%       : sound objet% : file_load objet%,"sons\Game Over.mp3"
objet% = objet% + 1 :  s_verouillee = objet%     : sound objet% : file_load objet%,"sons\Piece verouillee.mp3"
objet% = objet% + 1 :  s_niveau = objet%         : sound objet% : file_load objet%,"sons\Niveau superieur.mp3"
objet% = objet% + 1 :  s_chutte = objet%      : sound objet% : file_load objet%,"sons\Chutte.mp3"
objet% = objet% + 1 :  s1_ligne  = objet%     : sound objet% : file_load objet%,"sons\Simple Ligne.mp3"
objet% = objet% + 1 :  s2_lignes = objet%     : sound objet% : file_load objet%,"sons\Double ligne.mp3"
objet% = objet% + 1 :  s3_lignes = objet%     : sound objet% : file_load objet%,"sons\Triple ligne.mp3"
objet% = objet% + 1 :  s4_lignes = objet%     : sound objet% : file_load objet%,"sons\Tetris.mp3"
objet% = objet% + 1 :  m_gameover = objet%    : sound objet% : file_load objet%,"sons\Musique - Game Over.mp3"
objet% = objet% + 1 :  m_theme = objet%       : sound objet% : file_load objet%,"sons\Musique - Theme Tetris.mp3"
objet% = objet% + 1 :  m_highscore = objet%   : sound objet% : file_load objet%,"sons\Musique - High Scores.mp3"


objet% = objet% + 1 : player_musique = objet%
panel objet% : hide objet% : iter% = dll_call5("CreatePlayer",handle(player_musique),0,0,100,100)
s$ = "sons\Musique - Theme Tetris.mp3"
iter% = dll_call1("LoadFileIntoPlayer",adr(s$))
iter% = dll_call0("PlayPlayer")
iter% = dll_call1("VolumePlayer",30)

objet%= objet% + 1 : t_musique = objet%
timer t_musique : timer_interval t_musique,83000 : on_timer t_musique, lance_musique

objet%= objet% + 1 : t_principal = objet%
timer t_principal : timer_interval t_principal,temps% : on_timer t_principal, boucle_principale

' On détecte le changement d'état des touches
on_key_down 0,t1

end

lance_musique:
   iter% = dll_call0("PlayPlayer")
return

sub dessine_piece(num%,rot%)
dim_local d_piece(3,3)
dim_local i%,j%

select num%
  case 0 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_O(i%,j%) : next j% : next i%
  case 1 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_I(i%,j%) : next j% : next i%
  case 2 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_S(i%,j%) : next j% : next i%
  case 3 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_Z(i%,j%) : next j% : next i%
  case 4 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_L(i%,j%) : next j% : next i%
  case 5 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_J(i%,j%) : next j% : next i%
  case 6 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_T(i%,j%) : next j% : next i%
end_select

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        if rot% = 1 then copie_carre(num%,i%,j%,rot%)
        if rot% = 2 then copie_carre(num%,3-j%,i%,rot%)
        if rot% = 3 then copie_carre(num%,3-i%,3-j%,rot%)
        if rot% = 4 then copie_carre(num%,j%,3-i%,rot%)
    end_if
  next j%
next i%
end_sub


sub dessine_carre(num%)
dim_local c1%,c2%,c3%, k%,l%, temp1%,temp2%,temp3%
c1% = couleur_piece(num%, 0) : c2% = couleur_piece(num%, 1) : c3% = couleur_piece(num%,2)
for k% = 0 to h_carre-1
  for l% = 0 to m_carre-1
      temp1% = c1% + ind_c%*(h_carre - k%) : if temp1% > 255 then temp1% = 255
      temp2% = c2% + ind_c%*(h_carre - k%) : if temp2% > 255 then temp2% = 255
      temp3% = c3% + ind_c%*(h_carre - k%) : if temp3% > 255 then temp3% = 255
      2d_pen_color temp1%,temp2%,temp3%
      if k% >= l%
          2d_point k%,l%
          2d_point l%,k%
        end_if
      temp1% = c1% - ind_c% * k% : if temp1% < 0 then temp1% = 0
      temp2% = c2% - ind_c% * k% : if temp2% < 0 then temp2% = 0
      temp3% = c3% - ind_c% * k% : if temp3% < 0 then temp3% = 0
      2d_pen_color temp1%,temp2%,temp3%
      if k% >= l%
          2d_point k%,h_carre-l%
          2d_point h_carre-l%,k%
        end_if
  next l%
next k%
2d_pen_color c1%,c2%,c3% : 2d_fill_color c1%,c2%,c3%
2d_rectangle m_carre, m_carre , h_carre - m_carre +1, h_carre - m_carre +1
end_sub


sub copie_carre(num%,x_dest,y_dest, rot%)
  2D_target_is p_carre + num%
  2D_image_copy i_temp%,0,0,h_carre,h_carre
  2d_target_is p_carre+num%+7*rot%
  2D_image_paste i_temp%,x_dest * h_carre_grille +1,y_dest * h_carre_grille +1
end_sub


sub vide_grille()
  for iter% = 0 to 9
    for iter2% = 0 to 19
      grille%(iter%,iter2%) = -1
    next iter2%
  next iter%
end_sub


sub trace_grille()
  2D_pen_color 180,180,255
  for iter% = 1 to 10
    2D_line iter%*h_carre_grille, 0, iter%*h_carre_grille,20*h_carre_grille
  next iter%
  for iter% = 1 to 20
    2D_line 0, iter%*h_carre_grille, 10*h_carre_grille,iter%*h_carre_grille
  next iter%
end_sub


sub Cree_piece_suivante()
  p_suivante = int(rnd(6.9999))
end_sub


sub test_dep_bas()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece - 0.001) + 1 + j%
        temp2% = x_piece + i%
        if temp% = 20 then test_dep% = 0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
    end_if
  next j%
next i%

end_sub


sub test_dep_gauche()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% -1
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% <= 19
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
          if temp% <> y_piece + j%
            temp% = int(y_piece) + j% +1
            if temp% <= 19
              if temp% >= 0
                if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
              end_if
            end_if
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_rot_gauche()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece_temp(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i%
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% > 19 then test_dep%=0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
        if temp% <> y_piece + j%
          temp% = int(y_piece) + j% +1
          if temp% > 19 then test_dep%=0 : exit_sub
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_dep_droite()

dim_local i%,j%,temp%, temp2%
test_dep% = 1
for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% +1
        if temp2% > 9 then test_dep%=0 : exit_sub
        if temp% <= 19
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
          if temp% <> y_piece + j%
            temp% = int(y_piece) + j% +1
            if temp% <= 19
              if temp% >= 0
                if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
              end_if
            end_if
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_rot_droite()

dim_local i%,j%,temp%, temp2%
test_dep% = 1
for i% = 0 to 3
  for j% = 0 to 3
    if d_piece_temp(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% +1
        if temp2% > 9 then test_dep%=0 : exit_sub
        if temp% > 19 then test_dep%=0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
        if temp% <> y_piece + j%
          temp% = int(y_piece) + j% +1
          if temp% > 19 then test_dep%=0 : exit_sub
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
        end_if
    end_if
  next j%
next i%

end_sub


sub test_ligne()
dim_local i%,j%,ligne%, nbligne%
  nbligne%=0
  for i% = 0 to 3
    ligne%=1
    for j% = 0 to 9
      if y_piece + i% < 20
          if grille%(j%,y_piece + i%) < 0 then ligne% = 0 : exit_for
      else
          ligne%= 0
      end_if
    next j%
    if ligne%=1 then suppr_ligne(y_piece + i%) : nbligne% = nbligne% +1
  next i%
  if nbligne% > 0
    2D_target_is a_grille1% : trace_grille()
    file_save a_grille1%,"fond.bmp" : file_load a_grille2%,"fond.bmp"
    select nbligne%
      case 1 : score% = score% + niveau% *  40 : play s1_ligne
      case 2 : score% = score% + niveau% * 100 : play s2_lignes
      case 3 : score% = score% + niveau% * 300 : play s3_lignes
      case 4 : score% = score% + niveau% *1200 : play s4_lignes
    end_select
    caption a_score%,right$("000000" + str$(score%),6)
    nb_lignes% = nb_lignes% + nbligne%
    caption a_nb_lignes%,right$("000000" + str$(nb_lignes%),6)
  end_if
end_sub


sub suppr_ligne(l%)
dim_local i%,j%
  2D_target_is a_grille1%
  2D_image_copy i_temp%,0,0,10*h_carre_grille,l%*h_carre_grille
  2D_image_paste i_temp%,0,1 * h_carre_grille
  for i% = l% to 1 step -1
    for j% = 0 to 9
        grille%(j%,i%) = grille%(j%,i%-1)
    next j%
  next i%
  for j% = 0 to 9
      grille%(j%,0) = -1
  next j%
end_sub


sub bloque_piece()
  dim_local i%,j%,s$
  for i% = 0 to 3
    for j% = 0 to 3
      if d_piece(i%,j%) = 1 and y_piece >= 0
        if (int(y_piece)+j%) < 20 then grille%(x_piece + i%, int(y_piece)+j%) = piece
      end_if
    next j%
  next i%
  if debug_mode =1
    clear debug_windows +1
    item_add debug_windows +1,"XX | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
    for i% = 0 to 19
      s$=right$("0" + str$(i%),2) + " | "
      for j%=0 to 9
          s$=s$ + right$("  " + str$(grille%(j%,i%)),2) + " | "
      next j%
      item_add debug_windows +1,s$
    next i%
    set_focus 0
  end_if
  on_error_goto err
  err:
  ' on place le fond dans le presse-papier
  clipboard_copy a_grille1%
  repeat
    i% = dll_call1("ClipboardFunction",1)
  until i%=0
  ' on charge cette image dans l'image interne
  i% = dll_call0("LoadPicture")
  repeat
    i% = dll_call1("ClipboardFunction",1)
  until i%=0
  ' on place la pièce à bloquer dans le presse-papier
  clipboard_copy p_carre+piece+7*rotation%
  repeat
    i% = dll_call1("ClipboardFunction",1)
  until i%=0
' KGF_res% = dll_call6("ModifyPicture",x%,y%,T%,R%,G%,B%)
  i% = dll_call6("ModifyPicture",x_piece*h_carre_grille, int(y_piece)*h_carre_grille,100,0,0,0)
' récupérer l'image interne vers le presse-papier
  i% = dll_call0("SavePicture")
  repeat
    i% = dll_call1("ClipboardFunction",1)
  until i%=0
'    i% = dll_call1("ClipboardFunction",2)
' et copier le résultat dans le picture d'affichage:
  clipboard_paste a_grille1%
  repeat
    i% = dll_call1("ClipboardFunction",1)
  until i%=0
  file_save a_grille1%,"fond.bmp" : file_load a_grille2%,"fond.bmp"
  off_error_goto
end_sub


boucle_principale:

timer_off t_principal
set_focus 0
if esc = 1
  if message_confirmation_yes_no ("Voulez-vous vraiment quitter le jeu ?") = 1 then goto quitte
  esc = 0
end_if

' dessin d'une pièce
if piece = -1
  sprite_hide sprite_piece : piece =  p_suivante
  x_piece = x_initial : y_piece = y_initial : rotation% = 1
  Cree_piece_suivante()
  2d_target_is p_carre+piece+7
  2d_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
  sprite_image_load sprite_piece, i_temp%
  sprite_position sprite_piece,x_initial * h_carre_grille,y_initial * h_carre_grille
  sprite_show sprite_piece
  2d_target_is p_carre+p_suivante+7
  2d_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
  2d_target_is a_suivante%
  2d_image_paste i_temp%,0,0
  2d_target_is 0
  select piece
    case 0 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_O(iter%,iter2%) : next iter2% : next iter%
    case 1 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_I(iter%,iter2%) : next iter2% : next iter%
    case 2 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_S(iter%,iter2%) : next iter2% : next iter%
    case 3 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_Z(iter%,iter2%) : next iter2% : next iter%
    case 4 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_L(iter%,iter2%) : next iter2% : next iter%
    case 5 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_J(iter%,iter2%) : next iter2% : next iter%
    case 6 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_T(iter%,iter2%) : next iter2% : next iter%
  end_select
end_if
y_piece = y_piece + v_dep

if tfg = 1
  test_dep_gauche()
  if test_dep%= 1
    x_piece = x_piece - 1
    play s_dep_lateral
  else
    play s_dep_impossible
  end_if
  tfg = 0
end_if

if tfh = 1
  test_dep% = 1
  for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece_temp(3-iter2%,iter%) = d_piece(iter%,iter2%) : next iter2% : next iter%
  test_rot_gauche()
  if test_dep%= 1
    rotation%=rotation%+1
    if rotation%=5 then rotation% = 1
    2D_target_is p_carre+piece+7*rotation%
    2D_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
    sprite_image_load sprite_piece, i_temp%
    play s_rotation
    for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece(iter%,iter2%) = d_piece_temp(iter%,iter2%) : next iter2% : next iter%
  else
    play s_dep_impossible
  end_if
  tfh = 0
end_if

if tfd = 1
  test_dep_droite()
  if test_dep%= 1
    x_piece = x_piece + 1
    play s_dep_lateral
  else
    play s_dep_impossible
  end_if
  tfd = 0
end_if

if tfb = 1
  test_dep% = 1
  for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece_temp(iter2%,3-iter%) = d_piece(iter%,iter2%) : next iter2% : next iter%
  test_rot_droite()
  if test_dep%= 1
    rotation%=rotation%-1
    if rotation%=0 then rotation% = 4
    2D_target_is p_carre+piece+7*rotation%
    2D_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
    sprite_image_load sprite_piece, i_temp%
    play s_rotation
    for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece(iter%,iter2%) = d_piece_temp(iter%,iter2%) : next iter2% : next iter%
  else
    play s_dep_impossible
  end_if
  tfb = 0
end_if

if esp = 1 then play s_chutte
chutte:
test_dep_bas()
if test_dep%=0
  play s_verouillee
  if y_piece < 0
      goto quitte
  else
    bloque_piece()
    esp = 0
    y_piece = int(y_piece)
    test_ligne()
    piece = -1
  end_if
  play s_verouillee
else
  sprite_position sprite_piece,x_piece * h_carre_grille,y_piece * h_carre_grille
end_if
if esp = 1 then y_piece = y_piece + v_dep : wait 10 : goto chutte
temps% = 80 - niveau% * 2 :  v_dep = 1 - (0.85 - niveau% / 10) : timer_interval t_principal,temps%
if int(nb_lignes% / 30) + 1 > niveau% then play s_niveau
niveau% = int(nb_lignes% / 30) + 1 : caption a_niveau%,right$("000000" + str$(niveau%),6)
timer_on t_principal
return

' ****** Gestion du clavier

t1:
  if key_down_code=cesp then esp=1
  if key_down_code=cesc then esc=1
  if key_down_code=ctfg then tfg=1
  if key_down_code=ctfh then tfh=1
  if key_down_code=ctfd then tfd=1
  if key_down_code=ctfb then tfb=1
return


quitte:
  timer_off_all
  play s_gameover : wait 300
  play m_gameover
  Message "Partie terminée"
  wait 4000
  iter% = dll_call1("KillProcessByHandle",handle(0))
  dll_off
  end
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 7:57

Salut Jicehel,

Dans le code ci-dessus il y a un petit bug (un oubli) en ligne 19.

J'ai testé, mais voila ce que çà donne dès que le premier objet arrive en bas.
Tetris Image_16


A+
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 8:06

Nouvel essai,

cette fois-ci, çà passe Question MAIS

J'ai un message d'erreur en fin de partie: m_gameover, is not floating point value
Je précise que c'est avec le code tetris V3.bas du zip

A+
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 10:23

En effet Jean-Claude, le Zip n'est pas à jour au niveau du programme, je vais le mettre à jour ce soir.
Pareil pour le Clipboard, je pense qu'avec la modif de KGF de Klaus, le problème ne devrait plus se poser.
Pour que tu puisses tester, télécharge la DLL de Klaus et prends le code posté ici.
Moi, j'ai encore un problème avec de temps en temps, le message le message "Exception Exception in module kgf.dll at 00041F18" qui apparait lors de la copie d'image. Je remplacerais cette partie du programme qui pose problème si Jack permet la copie avec gestion de la transprence ou je chercherais un autre moyen de faire. En fait j'ai déjà une idée qui serait tout aussi simple avec la modif que j'ai faite et la pièce courante. Je pourrais juste simplement recopier les carrés directement où il faut. Je vais essayer et je pense qu'en plus, ça simplifiera le code...
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 11:11

Voilà, j'ai fais la modif du code. C'est plus simple, ça va plus vite et je pense que je n'aurais plus d'erreur sur ma machine.
Si quelqu'un voit une petite astuce pour ne plus avoir le petit bug visuel quand on fait tourner la pièce et que l'on charge le sprite avec l'image de la pièce, qu'il n'hésite pas à m'en faire part. J'ai essayé de mettre tous les objets de construction en dehors de la zone affichée et je les masque, mais lors de la copie de la pièce pendant la rotation, l'image de la pièce s'affiche quand même très brièvement. A part ça sinon, ça me plait bien.

Code:
' Tetris par Jicehel
' Version 1.0
' Ecrit en Panoramic, le 13/02/2015
'

' Déclaration des sous-programmes évenementiels
label boucle_principale, quitte, t1, chutte, lance_musique

' variables de la fenêtre principale
dim l_fenetre : l_fenetre = 610
dim h_fenetre : h_fenetre = 700

' variables de la grille
dim marge_grille : marge_grille =15  : ' marge entre la fenêtre et la grille
dim h_carre_grille : h_carre_grille = 30 : ' taille d'une case de la grille

' variables d'un carré élementaire
dim h_carre : h_carre = h_carre_grille - 1 : ' taille d'un carré de base
dim m_carre : m_carre = int(h_carre / 8)  : ' taille la bordure du carré pour le relief

' définition des pièces
dim couleur_piece(6,3)
dim d_piece(3,3) : ' contient les "carrés" occupés par la pièce dans son état de rotation actuelle
dim d_piece_temp(3,3) : ' copie temporaire de la piece pour les rotations

' pièce O
dim piece_O(3,3)
piece_O(0,0) = 0 : piece_O(0,1) = 0:  piece_O(0,2) = 0:  piece_O(0,3) = 0
piece_O(1,0) = 0 : piece_O(1,1) = 1:  piece_O(1,2) = 1:  piece_O(1,3) = 0
piece_O(2,0) = 0 : piece_O(2,1) = 1:  piece_O(2,2) = 1:  piece_O(2,3) = 0
piece_O(3,0) = 0 : piece_O(3,1) = 0:  piece_O(3,2) = 0:  piece_O(3,3) = 0

couleur_piece(0,0) = 220 : couleur_piece(0,1) = 220 :  couleur_piece(0,2) = 0

' pièce I
dim piece_I(3,3)
piece_I(0,0) = 0 : piece_I(0,1) = 0:  piece_I(0,2) = 0:  piece_I(0,3) = 0
piece_I(1,0) = 1 : piece_I(1,1) = 1:  piece_I(1,2) = 1:  piece_I(1,3) = 1
piece_I(2,0) = 0 : piece_I(2,1) = 0:  piece_I(2,2) = 0:  piece_I(2,3) = 0
piece_I(3,0) = 0 : piece_I(3,1) = 0:  piece_I(3,2) = 0:  piece_I(3,3) = 0

couleur_piece(1,0) = 100 : couleur_piece(1,1) = 220 :  couleur_piece(1,2) = 220

' pièce S
dim piece_S(3,3)
piece_S(0,0) = 0 : piece_S(0,1) = 0:  piece_S(0,2) = 0:  piece_S(0,3) = 0
piece_S(1,0) = 0 : piece_S(1,1) = 0:  piece_S(1,2) = 1:  piece_S(1,3) = 1
piece_S(2,0) = 0 : piece_S(2,1) = 1:  piece_S(2,2) = 1:  piece_S(2,3) = 0
piece_S(3,0) = 0 : piece_S(3,1) = 0:  piece_S(3,2) = 0:  piece_S(3,3) = 0

couleur_piece(2,0) = 0 : couleur_piece(2,1) = 220 :  couleur_piece(2,2) = 0

' pièce Z
dim piece_Z(3,3)
piece_Z(0,0) = 0 : piece_Z(0,1) = 0:  piece_Z(0,2) = 0:  piece_Z(0,3) = 0
piece_Z(1,0) = 0 : piece_Z(1,1) = 1:  piece_Z(1,2) = 1:  piece_Z(1,3) = 0
piece_Z(2,0) = 0 : piece_Z(2,1) = 0:  piece_Z(2,2) = 1:  piece_Z(2,3) = 1
piece_Z(3,0) = 0 : piece_Z(3,1) = 0:  piece_Z(3,2) = 0:  piece_Z(3,3) = 0

couleur_piece(3,0) = 220 : couleur_piece(3,1) = 0 :  couleur_piece(3,2) = 0

' pièce L
dim piece_L(3,3)
piece_L(0,0) = 0 : piece_L(0,1) = 0:  piece_L(0,2) = 0:  piece_L(0,3) = 0
piece_L(1,0) = 0 : piece_L(1,1) = 1:  piece_L(1,2) = 1:  piece_L(1,3) = 1
piece_L(2,0) = 0 : piece_L(2,1) = 1:  piece_L(2,2) = 0:  piece_L(2,3) = 0
piece_L(3,0) = 0 : piece_L(3,1) = 0:  piece_L(3,2) = 0:  piece_L(3,3) = 0

couleur_piece(4,0) = 220 : couleur_piece(4,1) = 120 :  couleur_piece(4,2) = 0

' pièce J
dim piece_J(3,3)
piece_J(0,0) = 0 : piece_J(0,1) = 0:  piece_J(0,2) = 0:  piece_J(0,3) = 0
piece_J(1,0) = 0 : piece_J(1,1) = 1:  piece_J(1,2) = 1:  piece_J(1,3) = 1
piece_J(2,0) = 0 : piece_J(2,1) = 0:  piece_J(2,2) = 0:  piece_J(2,3) = 1
piece_J(3,0) = 0 : piece_J(3,1) = 0:  piece_J(3,2) = 0:  piece_J(3,3) = 0

couleur_piece(5,0) = 0 : couleur_piece(5,1) = 0 :  couleur_piece(5,2) = 220

' pièce T
dim piece_T(3,3)
piece_T(0,0) = 0 : piece_T(0,1) = 0:  piece_T(0,2) = 0:  piece_T(0,3) = 0
piece_T(1,0) = 0 : piece_T(1,1) = 1:  piece_T(1,2) = 1:  piece_T(1,3) = 1
piece_T(2,0) = 0 : piece_T(2,1) = 0:  piece_T(2,2) = 1:  piece_T(2,3) = 0
piece_T(3,0) = 0 : piece_T(3,1) = 0:  piece_T(3,2) = 0:  piece_T(3,3) = 0

couleur_piece(6,0) = 220 : couleur_piece(6,1) = 0 :  couleur_piece(6,2) = 220


' dessin des carrés de couleur
dim p_carre : ' Picture des carré pour la pièce 0, 6 autres objets seront créés pour les autres carés de base
'              On créé ensuite 7 autres pictures pour stocker les différentes pièces
'              On créera les pièces tournées à 90°, 180° et -90° à la suite
dim i_temp% : ' Image servant à faire la copie du carré correspondant à la pièce

' définition des noms d'obhets
dim a_grille1%  : ' picture ou l'on crée la grille comme fond et ou on mettra les blocs inactifs
dim a_grille2%  : ' nom de la grille 2 sur laquelle on affiche les sprites de la pièce et le fond avec les blocs figés
dim a_suivante% : ' nom du "picture" où l'on affiche la pièce suivante
dim a_score%    : ' nom de l'affichage du score
dim a_lignes%  : ' nom de l'affichage du nombre de lignes faites
dim a_nb_lignes%: ' affichage du nombre de lignes faites
dim a_niveau%  : ' affichage du niveau actuel

' définition des variables du jeu
dim iter%, iter2% : ' Compteurs d'itérations
dim objet%: objet% = 0 : ' Compteur d'objets créés
dim p_suivante : ' prochaine pièce qui sera affichée
dim piece : ' Numero de la pièce active. Si la pièce vaut -1, prendre la pièce suivante
dim x_piece, y_piece : ' Coordonnées de la pièce courante en cases
dim x_initial, y_initial : ' Coordonnées initiale d'une nouvelle pièce
x_initial = 4 : y_initial = -4
dim diff_couleur : diff_couleur = 100 : ' Ombres et lumière
dim ind_c% : ind_c% = int(diff_couleur / h_carre) : ' variation de lumiere par pas
dim temps% : temps% = 75 : ' temps d'une boucle principale
dim v_dep : v_dep = 0.2 : ' Vitesse de descente de la pièce
dim t_principal : ' Numéro du timer principal
dim t_musique : ' ' Timer pour relancer la musique
dim sprite_piece : sprite_piece = 1 : ' Le sprite de la pièce !!
dim test_dep% : ' Vaut 1 si le déplacement est possible
dim grille%(9,19) : ' Mémorise les carrés des pièces dans la grille
dim rotation% : ' Indique si la pièce est tournée
dim nb_lignes%: ' Le compteur de ligne
dim niveau%  : ' Niveau actuel
dim score%    : ' Le score
dim player_musique: ' Objet qui jouera la musique
dim s$ : ' chaine de caractères temporaire

' définitions des sons
dim s_dep_impossible : ' mouvement impossible
dim s_dep_lateral    : ' deplacement à droit ou a gauche
dim s_rotation      : ' tourne la pièce de 90°
dim s_gameover      : ' son de fin de partie
dim s_verouillee    : ' la pièce est bloquée (arrivée, on passe à la pièce suivante)
dim s_niveau        : ' passage au niveau supérieur
dim s_chutte        : ' son de la chutte d'une pièce quand on appuie sur espace
dim s1_ligne, s2_lignes, s3_lignes, s4_lignes : '  sons de 1 à 4 lignes complètes
dim m_gameover  : ' Musique après la fin de partie
dim m_theme    : ' Musique durant le jeu
dim m_highscore : ' Musique sur l'ecran des high_score

dim grille_active% : grille_active%=2 : ' Définit la grille de travail

' ****************************** COMMANDES CLAVIER **************************
dim esc,cesc : cesc=27 : ' * TOUCHE "ESC"  ==> MET FIN AU PROGRAMME:... 27  *
dim tfg,ctfg : ctfg=37 : ' * FLÈCHE GAUCHE ==> DEPLACER À GAUCHE:...... 37  *
dim tfh,ctfh : ctfh=38 : ' * FLÈCHE HAUTE  ==> PIVOTER A GAUCHE........ 38  *
dim tfd,ctfd : ctfd=39 : ' * FLÈCHE DROITE ==> DEPLACER À DROITE:...... 39  *
dim tfb,ctfb : ctfb=40 : ' * FLÈCHE BASSE  ==> PIVOTER À DROITE:....... 40  *
dim esp,cesp : cesp=32 : ' * ESPACE        ==> TOMBER:................. 32  *
' ***************************************************************************


' initialisation de la fenêtre de jeu
width 0, l_fenetre : height 0,h_fenetre

objet% = objet% + 1 : a_grille1% = objet%
picture a_grille1%  : hide a_grille1%: left a_grille1%, marge_grille : top a_grille1%, marge_grille
width a_grille1%, 10*h_carre_grille : height a_grille1%,20*h_carre_grille
color a_grille1%,200, 150, 150 : 2D_target_is a_grille1% : trace_grille()
file_save a_grille1%,"fond.bmp"

objet% = objet% + 1: a_grille2% = objet%
scene2D a_grille2% : left a_grille2%, marge_grille : top a_grille2%, marge_grille
width a_grille2%, 10*h_carre_grille : height a_grille2%,20*h_carre_grille
file_load a_grille2%,"fond.bmp"
sprite sprite_piece

objet% = objet% + 1: i_temp% = objet% : image i_temp%  :  top objet%, -800 : hide i_temp%

objet% = objet% + 1 : picture objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, marge_grille : width objet%,250: height objet%,172 : file_load objet%,titre.jpg

objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 3* marge_grille + 172 : width objet%,250: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Pièce suivante :"

objet% = objet% + 1 : a_suivante% = objet% : picture objet% : left objet%, 2*marge_grille + 12 * h_carre_grille
top objet%, 4* marge_grille + 202 : width objet%,4* h_carre_grille: height objet%, 4* h_carre_grille

' Création des 7 pièces dans les 4 directions

for iter% = 0 to 6

  objet% = objet% + 1 :  if iter%= 0 then p_carre = objet%

  picture objet% : 2d_target_is objet%  : hide objet%
  top objet%, -400: width objet%, h_carre_grille : height objet%, h_carre_grille
  dessine_carre(iter%)

  picture objet%+7 :  hide objet% +7
  width objet%+7, 4*h_carre_grille: height objet%+7, 4*h_carre_grille : top objet%+7, -400
  color objet%+7,0,0,0: 2d_target_is objet%+7 : dessine_piece(iter%,1)

  picture objet%+14 :  hide objet% + 14
  width objet%+14, 4*h_carre_grille: height objet%+14, 4*h_carre_grille: top objet%+14, -400
  color objet%+14,0,0,0: 2d_target_is objet%+14 : dessine_piece(iter%,2)

  picture objet%+21 :  hide objet% + 21
  width objet%+21, 4*h_carre_grille: height objet%+21, 4*h_carre_grille : top objet%+21, -400
  color objet%+21,0,0,0: 2d_target_is objet%+21 : dessine_piece(iter%,3)

  picture objet%+28 :  hide objet% + 28
  width objet%+28, 4*h_carre_grille: height objet%+28, 4*h_carre_grille:  top objet%+28, -400
  color objet%+28,0,0,0: 2d_target_is objet%+28 : dessine_piece(iter%,4)

next iter%

objet% = objet% + 28
piece = -1 : vide_grille() :  Cree_piece_suivante()
dll_on "kgf.dll"

' Debug Windows
dim debug_mode : debug_mode = 0 : ' Active ou non le mode debug
dim debug_windows
if debug_mode = 1
  objet% = objet% + 1 : debug_windows = objet%
  form debug_windows : command_target_is debug_windows
  left debug_windows, 700 : height debug_windows,700 : width debug_windows, 250
  objet% = objet% + 1 : list objet% : width objet%, 220
  height objet%, 650
  command_target_is 0 : set_focus 0
end_if

' Demarrage du jeu, on lance les cycle du jeu au travers d'un timer qui va rythmer les actions

score% = 0 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 12* marge_grille + 242 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Score :"

objet% = objet% + 1 : a_score% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 12* marge_grille + 242 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000000"

nb_lignes% = 0 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 14* marge_grille + 272 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Lignes :"

objet% = objet% + 1 : a_nb_lignes% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 14* marge_grille + 272 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000000"

niveau% = 1 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 16* marge_grille + 302 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Niveau :"

objet% = objet% + 1 : a_niveau% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 16* marge_grille + 302 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000001"

' Chargement des sons
objet% = objet% + 1 :  s_dep_impossible = objet% : sound objet% : file_load objet%,"sons\Deplacement impossible.mp3"
objet% = objet% + 1 :  s_dep_lateral = objet%    : sound objet% : file_load objet%,"sons\Deplacement lateral.mp3"
objet% = objet% + 1 :  s_rotation = objet%      : sound objet% : file_load objet%,"sons\Rotation piece.mp3"
objet% = objet% + 1 :  s_gameover = objet%      : sound objet% : file_load objet%,"sons\Game Over.mp3"
objet% = objet% + 1 :  s_verouillee = objet%    : sound objet% : file_load objet%,"sons\Piece verouillee.mp3"
objet% = objet% + 1 :  s_niveau = objet%        : sound objet% : file_load objet%,"sons\Niveau superieur.mp3"
objet% = objet% + 1 :  s_chutte = objet%      : sound objet% : file_load objet%,"sons\Chutte.mp3"
objet% = objet% + 1 :  s1_ligne  = objet%    : sound objet% : file_load objet%,"sons\Simple Ligne.mp3"
objet% = objet% + 1 :  s2_lignes = objet%    : sound objet% : file_load objet%,"sons\Double ligne.mp3"
objet% = objet% + 1 :  s3_lignes = objet%    : sound objet% : file_load objet%,"sons\Triple ligne.mp3"
objet% = objet% + 1 :  s4_lignes = objet%    : sound objet% : file_load objet%,"sons\Tetris.mp3"
objet% = objet% + 1 :  m_gameover = objet%    : sound objet% : file_load objet%,"sons\Musique - Game Over.mp3"
objet% = objet% + 1 :  m_theme = objet%      : sound objet% : file_load objet%,"sons\Musique - Theme Tetris.mp3"
objet% = objet% + 1 :  m_highscore = objet%  : sound objet% : file_load objet%,"sons\Musique - High Scores.mp3"


objet% = objet% + 1 : player_musique = objet%
panel objet% : hide objet% : iter% = dll_call5("CreatePlayer",handle(player_musique),0,0,100,100)
s$ = "sons\Musique - Theme Tetris.mp3"
iter% = dll_call1("LoadFileIntoPlayer",adr(s$))
iter% = dll_call0("PlayPlayer")
iter% = dll_call1("VolumePlayer",30)

objet%= objet% + 1 : t_musique = objet%
timer t_musique : timer_interval t_musique,83000 : on_timer t_musique, lance_musique

objet%= objet% + 1 : t_principal = objet%
timer t_principal : timer_interval t_principal,temps% : on_timer t_principal, boucle_principale

' On détecte le changement d'état des touches
on_key_down 0,t1

end

lance_musique:
  iter% = dll_call0("PlayPlayer")
return

sub dessine_piece(num%,rot%)
dim_local d_piece(3,3)
dim_local i%,j%

select num%
  case 0 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_O(i%,j%) : next j% : next i%
  case 1 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_I(i%,j%) : next j% : next i%
  case 2 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_S(i%,j%) : next j% : next i%
  case 3 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_Z(i%,j%) : next j% : next i%
  case 4 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_L(i%,j%) : next j% : next i%
  case 5 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_J(i%,j%) : next j% : next i%
  case 6 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_T(i%,j%) : next j% : next i%
end_select

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        if rot% = 1 then copie_carre(num%,i%,j%,rot%)
        if rot% = 2 then copie_carre(num%,3-j%,i%,rot%)
        if rot% = 3 then copie_carre(num%,3-i%,3-j%,rot%)
        if rot% = 4 then copie_carre(num%,j%,3-i%,rot%)
    end_if
  next j%
next i%
end_sub


sub dessine_carre(num%)
dim_local c1%,c2%,c3%, k%,l%, temp1%,temp2%,temp3%
c1% = couleur_piece(num%, 0) : c2% = couleur_piece(num%, 1) : c3% = couleur_piece(num%,2)
for k% = 0 to h_carre-1
  for l% = 0 to m_carre-1
      temp1% = c1% + ind_c%*(h_carre - k%) : if temp1% > 255 then temp1% = 255
      temp2% = c2% + ind_c%*(h_carre - k%) : if temp2% > 255 then temp2% = 255
      temp3% = c3% + ind_c%*(h_carre - k%) : if temp3% > 255 then temp3% = 255
      2d_pen_color temp1%,temp2%,temp3%
      if k% >= l%
          2d_point k%,l%
          2d_point l%,k%
        end_if
      temp1% = c1% - ind_c% * k% : if temp1% < 0 then temp1% = 0
      temp2% = c2% - ind_c% * k% : if temp2% < 0 then temp2% = 0
      temp3% = c3% - ind_c% * k% : if temp3% < 0 then temp3% = 0
      2d_pen_color temp1%,temp2%,temp3%
      if k% >= l%
          2d_point k%,h_carre-l%
          2d_point h_carre-l%,k%
        end_if
  next l%
next k%
2d_pen_color c1%,c2%,c3% : 2d_fill_color c1%,c2%,c3%
2d_rectangle m_carre, m_carre , h_carre - m_carre +1, h_carre - m_carre +1
end_sub


sub copie_carre(num%,x_dest,y_dest, rot%)
  2D_target_is p_carre + num%
  2D_image_copy i_temp%,0,0,h_carre,h_carre
  2D_target_is p_carre+num%+7*rot%
  2D_image_paste i_temp%,x_dest * h_carre_grille +1,y_dest * h_carre_grille +1
end_sub


sub vide_grille()
  for iter% = 0 to 9
    for iter2% = 0 to 19
      grille%(iter%,iter2%) = -1
    next iter2%
  next iter%
end_sub


sub trace_grille()
  2D_pen_color 180,180,255
  for iter% = 1 to 10
    2D_line iter%*h_carre_grille, 0, iter%*h_carre_grille,20*h_carre_grille
  next iter%
  for iter% = 1 to 20
    2D_line 0, iter%*h_carre_grille, 10*h_carre_grille,iter%*h_carre_grille
  next iter%
end_sub


sub Cree_piece_suivante()
  p_suivante = int(rnd(6.9999))
end_sub


sub test_dep_bas()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece - 0.001) + 1 + j%
        temp2% = x_piece + i%
        if temp% = 20 then test_dep% = 0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
    end_if
  next j%
next i%

end_sub


sub test_dep_gauche()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% -1
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% <= 19
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
          if temp% <> y_piece + j%
            temp% = int(y_piece) + j% +1
            if temp% <= 19
              if temp% >= 0
                if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
              end_if
            end_if
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_rot_gauche()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece_temp(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i%
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% > 19 then test_dep%=0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
        if temp% <> y_piece + j%
          temp% = int(y_piece) + j% +1
          if temp% > 19 then test_dep%=0 : exit_sub
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_dep_droite()

dim_local i%,j%,temp%, temp2%
test_dep% = 1
for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% +1
        if temp2% > 9 then test_dep%=0 : exit_sub
        if temp% <= 19
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
          if temp% <> y_piece + j%
            temp% = int(y_piece) + j% +1
            if temp% <= 19
              if temp% >= 0
                if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
              end_if
            end_if
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_rot_droite()

dim_local i%,j%,temp%, temp2%
test_dep% = 1
for i% = 0 to 3
  for j% = 0 to 3
    if d_piece_temp(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% +1
        if temp2% > 9 then test_dep%=0 : exit_sub
        if temp% > 19 then test_dep%=0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
        if temp% <> y_piece + j%
          temp% = int(y_piece) + j% +1
          if temp% > 19 then test_dep%=0 : exit_sub
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
        end_if
    end_if
  next j%
next i%

end_sub


sub test_ligne()
dim_local i%,j%,ligne%, nbligne%
  nbligne%=0
  for i% = 0 to 3
    ligne%=1
    for j% = 0 to 9
      if y_piece + i% < 20
          if grille%(j%,y_piece + i%) < 0 then ligne% = 0 : exit_for
      else
          ligne%= 0
      end_if
    next j%
    if ligne%=1 then suppr_ligne(y_piece + i%) : nbligne% = nbligne% +1
  next i%
  if nbligne% > 0
    2D_target_is a_grille1% : trace_grille()
    file_save a_grille1%,"fond.bmp" : file_load a_grille2%,"fond.bmp"
    select nbligne%
      case 1 : score% = score% + niveau% *  40 : play s1_ligne
      case 2 : score% = score% + niveau% * 100 : play s2_lignes
      case 3 : score% = score% + niveau% * 300 : play s3_lignes
      case 4 : score% = score% + niveau% *1200 : play s4_lignes
    end_select
    caption a_score%,right$("000000" + str$(score%),6)
    nb_lignes% = nb_lignes% + nbligne%
    caption a_nb_lignes%,right$("000000" + str$(nb_lignes%),6)
  end_if
end_sub


sub suppr_ligne(l%)
dim_local i%,j%
  2D_target_is a_grille1%
  2D_image_copy i_temp%,0,0,10*h_carre_grille,l%*h_carre_grille
  2D_image_paste i_temp%,0,1 * h_carre_grille
  for i% = l% to 1 step -1
    for j% = 0 to 9
        grille%(j%,i%) = grille%(j%,i%-1)
    next j%
  next i%
  for j% = 0 to 9
      grille%(j%,0) = -1
  next j%
end_sub


sub bloque_piece()
  dim_local i%,j%,s$
  for i% = 0 to 3
    for j% = 0 to 3
      if d_piece(i%,j%) = 1 and y_piece >= 0
        if (int(y_piece)+j%) < 20 then grille%(x_piece + i%, int(y_piece)+j%) = piece
      end_if
    next j%
  next i%
  if debug_mode =1
    clear debug_windows +1
    item_add debug_windows +1,"XX | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
    for i% = 0 to 19
      s$=right$("0" + str$(i%),2) + " | "
      for j%=0 to 9
          s$=s$ + right$("  " + str$(grille%(j%,i%)),2) + " | "
      next j%
      item_add debug_windows +1,s$
    next i%
    set_focus 0
  end_if
  for i% = 0 to 3
    for j% = 0 to 3
      if d_piece(i%,j%) = 1
        2D_target_is p_carre + piece
        2D_image_copy i_temp%,0,0,h_carre,h_carre
        2D_target_is a_grille1%
        2D_image_paste i_temp%,(x_piece+i%) * h_carre_grille +1,int(y_piece+j%) * h_carre_grille +1
      end_if
    next j%
  next i%
  file_save a_grille1%,"fond.bmp" : file_load a_grille2%,"fond.bmp"
end_sub


boucle_principale:

timer_off t_principal
set_focus 0
if esc = 1
  if message_confirmation_yes_no ("Voulez-vous vraiment quitter le jeu ?") = 1 then goto quitte
  esc = 0
end_if

' dessin d'une pièce
if piece = -1
  sprite_hide sprite_piece : piece =  p_suivante
  x_piece = x_initial : y_piece = y_initial : rotation% = 1
  Cree_piece_suivante()
  2d_target_is p_carre+piece+7
  2d_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
  sprite_image_load sprite_piece, i_temp%
  sprite_position sprite_piece,x_initial * h_carre_grille,y_initial * h_carre_grille
  sprite_show sprite_piece
  2d_target_is p_carre+p_suivante+7
  2d_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
  2d_target_is a_suivante%
  2d_image_paste i_temp%,0,0
  2d_target_is 0
  select piece
    case 0 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_O(iter%,iter2%) : next iter2% : next iter%
    case 1 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_I(iter%,iter2%) : next iter2% : next iter%
    case 2 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_S(iter%,iter2%) : next iter2% : next iter%
    case 3 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_Z(iter%,iter2%) : next iter2% : next iter%
    case 4 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_L(iter%,iter2%) : next iter2% : next iter%
    case 5 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_J(iter%,iter2%) : next iter2% : next iter%
    case 6 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_T(iter%,iter2%) : next iter2% : next iter%
  end_select
end_if
y_piece = y_piece + v_dep

if tfg = 1
  test_dep_gauche()
  if test_dep%= 1
    x_piece = x_piece - 1
    play s_dep_lateral
  else
    play s_dep_impossible
  end_if
  tfg = 0
end_if

if tfh = 1
  test_dep% = 1
  for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece_temp(3-iter2%,iter%) = d_piece(iter%,iter2%) : next iter2% : next iter%
  test_rot_gauche()
  if test_dep%= 1
    rotation%=rotation%+1
    if rotation%=5 then rotation% = 1
    2D_target_is p_carre+piece+7*rotation%
    2D_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
    sprite_image_load sprite_piece, i_temp%
    play s_rotation
    for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece(iter%,iter2%) = d_piece_temp(iter%,iter2%) : next iter2% : next iter%
  else
    play s_dep_impossible
  end_if
  tfh = 0
end_if

if tfd = 1
  test_dep_droite()
  if test_dep%= 1
    x_piece = x_piece + 1
    play s_dep_lateral
  else
    play s_dep_impossible
  end_if
  tfd = 0
end_if

if tfb = 1
  test_dep% = 1
  for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece_temp(iter2%,3-iter%) = d_piece(iter%,iter2%) : next iter2% : next iter%
  test_rot_droite()
  if test_dep%= 1
    rotation%=rotation%-1
    if rotation%=0 then rotation% = 4
    2D_target_is p_carre+piece+7*rotation%
    2D_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
    sprite_image_load sprite_piece, i_temp%
    play s_rotation
    for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece(iter%,iter2%) = d_piece_temp(iter%,iter2%) : next iter2% : next iter%
  else
    play s_dep_impossible
  end_if
  tfb = 0
end_if

if esp = 1 then play s_chutte
chutte:
test_dep_bas()
if test_dep%=0
  play s_verouillee
  if y_piece < 0
      goto quitte
  else
    y_piece = int(y_piece)
    bloque_piece()
    esp = 0
    test_ligne()
    piece = -1
  end_if
  play s_verouillee
else
  sprite_position sprite_piece,x_piece * h_carre_grille,y_piece * h_carre_grille
end_if
if esp = 1 then y_piece = y_piece + v_dep : wait 10 : goto chutte
temps% = 80 - niveau% * 2 :  v_dep = 1 - (0.85 - niveau% / 10) : timer_interval t_principal,temps%
if int(nb_lignes% / 30) + 1 > niveau% then play s_niveau
niveau% = int(nb_lignes% / 30) + 1 : caption a_niveau%,right$("000000" + str$(niveau%),6)
timer_on t_principal
return

' ****** Gestion du clavier

t1:
  if key_down_code=cesp then esp=1
  if key_down_code=cesc then esc=1
  if key_down_code=ctfg then tfg=1
  if key_down_code=ctfh then tfh=1
  if key_down_code=ctfd then tfd=1
  if key_down_code=ctfb then tfb=1
return


quitte:
  timer_off_all
  play s_gameover : wait 300
  play m_gameover
  Message "Partie terminée"
  wait 4000
  iter% = dll_call1("KillProcessByHandle",handle(0))
  dll_off
  end
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 13:15

Cette fois-ci c'est jouable et sans erreur (avec le code ci-dessus).

Belle prise de tête ! Very Happy

A+
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 13:38

Very Happy Quand j'aurais fini l'article je vais essayer de reprendre un ancien projet que je n'ai pas terminé.
Je pense que ce sera Barbarian, j'ai envie de terminer de le rendre jouable.
Dans les améliorations qui seraient à faire, il y aurait:
- Un mode VS : 2 écrans et 2 séries de touches (une de chaque coté du clavier quand tu fais 2 lignes, ça en envoi une à ton adversaire. 3, ça en envoie 2, et 4 (tetris), ça en envoie 4 (avec à chaque fois un trou dans une des colonnes)
- Choix du niveau de difficulté pour régler la vitesse de départ (à la fin de toute façon, ça va trop vite ... Wink )
- Un menu Options pour choisir le mode de jeu, le niveau de difficulté et la musique
- L'option pour faire tomber les pièces quand il n'y a rien en dessous suite à la disparition d'une ou plusieurs lignes (et des pièces au dessus si du coup, elle se retrouvent avec rien en dessous)
- Un tableau des Highscores
- Une aide intégrée qui explique tout ça ...

Je l'écris ici pour que ça me serve de pense bête pour un de ces jours si je reviens sur le programme pour l'améliorer ou pour donner des idées si quelqu'un veut le faire.


Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 18:24

Bonsoir a tous !

ou peut on trouver la version *.ZIP de TETRIS ?

j'ai copié le fichier mis en ligne sur le forum mais a priori il me manque quelque chose...
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Yannick




Nombre de messages : 8610
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Tetris Empty
MessageSujet: re   Tetris EmptyVen 20 Fév 2015 - 18:51

http://www.fichier-zip.com/2015/02/19/tetris/
Et tu remplaces le source par celui que tu as copié...
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 20:50

Il est temps que tu mettes le zip à jour Jicehel Very Happy
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 21:42

bon ! j'ai enfin réussi a tester ce superbe jeu !!!

J'ai un plantage en 397.
cela arrive lorsque l'on manipule l'orientation de la pièce et que l'on est sur les bords.

D'autre part, étant un puriste de ce jeu, je propose de d'inverser les touche "flèche bas" et espace"

flèche vers le bas : pour descendre la pièce rapidement
espace : pour changer le sens de la pièce.

Hors mis ces petits détails, il n'y a rien a dire, tout est parfaitement jouable.
Encore merci pour la réalisation de ce jeu.

Bravo Jicehel !

Et un programme de plus pour agrandir la bibliothèque Panoramic. cheers cheers
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyVen 20 Fév 2015 - 22:56

Bien vu Minibug, il y avait une erreur de +1 en trop dans une formule de test. C'est corrigé
J'ai changé la gestion des touches comme indiqué
J'ai fais aussi un petit ajustement sur le son.
Maintenant je n'ai plus de plantage sur mon W8

Si quelqu'un trouve une solution par contre pour qu'il n'y ait plus de bug visuel lors de la rotation, je serais très content.

Code:
' Tetris par Jicehel
' Version 1.0
' Ecrit en Panoramic, le 13/02/2015
' Déplacement par les flèches droite / gauche
' Faire tomber la pièce: Flèche vers le bas
' Tourner la pièce : Espace

' Déclaration des sous-programmes évenementiels
label boucle_principale, quitte, t1, chutte, lance_musique

' variables de la fenêtre principale
dim l_fenetre : l_fenetre = 610
dim h_fenetre : h_fenetre = 700

' variables de la grille
dim marge_grille : marge_grille =15  : ' marge entre la fenêtre et la grille
dim h_carre_grille : h_carre_grille = 30 : ' taille d'une case de la grille

' variables d'un carré élementaire
dim h_carre : h_carre = h_carre_grille - 1 : ' taille d'un carré de base
dim m_carre : m_carre = int(h_carre / 8)  : ' taille la bordure du carré pour le relief

' définition des pièces
dim couleur_piece(6,3)
dim d_piece(3,3) : ' contient les "carrés" occupés par la pièce dans son état de rotation actuelle
dim d_piece_temp(3,3) : ' copie temporaire de la piece pour les rotations

' pièce O
dim piece_O(3,3)
piece_O(0,0) = 0 : piece_O(0,1) = 0:  piece_O(0,2) = 0:  piece_O(0,3) = 0
piece_O(1,0) = 0 : piece_O(1,1) = 1:  piece_O(1,2) = 1:  piece_O(1,3) = 0
piece_O(2,0) = 0 : piece_O(2,1) = 1:  piece_O(2,2) = 1:  piece_O(2,3) = 0
piece_O(3,0) = 0 : piece_O(3,1) = 0:  piece_O(3,2) = 0:  piece_O(3,3) = 0

couleur_piece(0,0) = 220 : couleur_piece(0,1) = 220 :  couleur_piece(0,2) = 0

' pièce I
dim piece_I(3,3)
piece_I(0,0) = 0 : piece_I(0,1) = 0:  piece_I(0,2) = 0:  piece_I(0,3) = 0
piece_I(1,0) = 1 : piece_I(1,1) = 1:  piece_I(1,2) = 1:  piece_I(1,3) = 1
piece_I(2,0) = 0 : piece_I(2,1) = 0:  piece_I(2,2) = 0:  piece_I(2,3) = 0
piece_I(3,0) = 0 : piece_I(3,1) = 0:  piece_I(3,2) = 0:  piece_I(3,3) = 0

couleur_piece(1,0) = 100 : couleur_piece(1,1) = 220 :  couleur_piece(1,2) = 220

' pièce S
dim piece_S(3,3)
piece_S(0,0) = 0 : piece_S(0,1) = 0:  piece_S(0,2) = 0:  piece_S(0,3) = 0
piece_S(1,0) = 0 : piece_S(1,1) = 0:  piece_S(1,2) = 1:  piece_S(1,3) = 1
piece_S(2,0) = 0 : piece_S(2,1) = 1:  piece_S(2,2) = 1:  piece_S(2,3) = 0
piece_S(3,0) = 0 : piece_S(3,1) = 0:  piece_S(3,2) = 0:  piece_S(3,3) = 0

couleur_piece(2,0) = 0 : couleur_piece(2,1) = 220 :  couleur_piece(2,2) = 0

' pièce Z
dim piece_Z(3,3)
piece_Z(0,0) = 0 : piece_Z(0,1) = 0:  piece_Z(0,2) = 0:  piece_Z(0,3) = 0
piece_Z(1,0) = 0 : piece_Z(1,1) = 1:  piece_Z(1,2) = 1:  piece_Z(1,3) = 0
piece_Z(2,0) = 0 : piece_Z(2,1) = 0:  piece_Z(2,2) = 1:  piece_Z(2,3) = 1
piece_Z(3,0) = 0 : piece_Z(3,1) = 0:  piece_Z(3,2) = 0:  piece_Z(3,3) = 0

couleur_piece(3,0) = 220 : couleur_piece(3,1) = 0 :  couleur_piece(3,2) = 0

' pièce L
dim piece_L(3,3)
piece_L(0,0) = 0 : piece_L(0,1) = 0:  piece_L(0,2) = 0:  piece_L(0,3) = 0
piece_L(1,0) = 0 : piece_L(1,1) = 1:  piece_L(1,2) = 1:  piece_L(1,3) = 1
piece_L(2,0) = 0 : piece_L(2,1) = 1:  piece_L(2,2) = 0:  piece_L(2,3) = 0
piece_L(3,0) = 0 : piece_L(3,1) = 0:  piece_L(3,2) = 0:  piece_L(3,3) = 0

couleur_piece(4,0) = 220 : couleur_piece(4,1) = 120 :  couleur_piece(4,2) = 0

' pièce J
dim piece_J(3,3)
piece_J(0,0) = 0 : piece_J(0,1) = 0:  piece_J(0,2) = 0:  piece_J(0,3) = 0
piece_J(1,0) = 0 : piece_J(1,1) = 1:  piece_J(1,2) = 1:  piece_J(1,3) = 1
piece_J(2,0) = 0 : piece_J(2,1) = 0:  piece_J(2,2) = 0:  piece_J(2,3) = 1
piece_J(3,0) = 0 : piece_J(3,1) = 0:  piece_J(3,2) = 0:  piece_J(3,3) = 0

couleur_piece(5,0) = 0 : couleur_piece(5,1) = 0 :  couleur_piece(5,2) = 220

' pièce T
dim piece_T(3,3)
piece_T(0,0) = 0 : piece_T(0,1) = 0:  piece_T(0,2) = 0:  piece_T(0,3) = 0
piece_T(1,0) = 0 : piece_T(1,1) = 1:  piece_T(1,2) = 1:  piece_T(1,3) = 1
piece_T(2,0) = 0 : piece_T(2,1) = 0:  piece_T(2,2) = 1:  piece_T(2,3) = 0
piece_T(3,0) = 0 : piece_T(3,1) = 0:  piece_T(3,2) = 0:  piece_T(3,3) = 0

couleur_piece(6,0) = 220 : couleur_piece(6,1) = 0 :  couleur_piece(6,2) = 220


' dessin des carrés de couleur
dim p_carre : ' Picture des carré pour la pièce 0, 6 autres objets seront créés pour les autres carés de base
'              On créé ensuite 7 autres pictures pour stocker les différentes pièces
'              On créera les pièces tournées à 90°, 180° et -90° à la suite
dim i_temp% : ' Image servant à faire la copie du carré correspondant à la pièce

' définition des noms d'obhets
dim a_grille1%  : ' picture ou l'on crée la grille comme fond et ou on mettra les blocs inactifs
dim a_grille2%  : ' nom de la grille 2 sur laquelle on affiche les sprites de la pièce et le fond avec les blocs figés
dim a_suivante% : ' nom du "picture" où l'on affiche la pièce suivante
dim a_score%    : ' nom de l'affichage du score
dim a_lignes%  : ' nom de l'affichage du nombre de lignes faites
dim a_nb_lignes%: ' affichage du nombre de lignes faites
dim a_niveau%  : ' affichage du niveau actuel

' définition des variables du jeu
dim iter%, iter2% : ' Compteurs d'itérations
dim objet%: objet% = 0 : ' Compteur d'objets créés
dim p_suivante : ' prochaine pièce qui sera affichée
dim piece : ' Numero de la pièce active. Si la pièce vaut -1, prendre la pièce suivante
dim x_piece, y_piece : ' Coordonnées de la pièce courante en cases
dim x_initial, y_initial : ' Coordonnées initiale d'une nouvelle pièce
x_initial = 4 : y_initial = -4
dim diff_couleur : diff_couleur = 100 : ' Ombres et lumière
dim ind_c% : ind_c% = int(diff_couleur / h_carre) : ' variation de lumiere par pas
dim temps% : temps% = 75 : ' temps d'une boucle principale
dim v_dep : v_dep = 0.2 : ' Vitesse de descente de la pièce
dim t_principal : ' Numéro du timer principal
dim t_musique : ' ' Timer pour relancer la musique
dim sprite_piece : sprite_piece = 1 : ' Le sprite de la pièce !!
dim test_dep% : ' Vaut 1 si le déplacement est possible
dim grille%(9,19) : ' Mémorise les carrés des pièces dans la grille
dim rotation% : ' Indique si la pièce est tournée
dim nb_lignes%: ' Le compteur de ligne
dim niveau%  : ' Niveau actuel
dim score%    : ' Le score
dim player_musique: ' Objet qui jouera la musique
dim s$ : ' chaine de caractères temporaire

' définitions des sons
dim s_dep_impossible : ' mouvement impossible
dim s_dep_lateral    : ' deplacement à droit ou a gauche
dim s_rotation      : ' tourne la pièce de 90°
dim s_gameover      : ' son de fin de partie
dim s_verouillee    : ' la pièce est bloquée (arrivée, on passe à la pièce suivante)
dim s_niveau        : ' passage au niveau supérieur
dim s_chutte        : ' son de la chutte d'une pièce quand on appuie sur espace
dim s1_ligne, s2_lignes, s3_lignes, s4_lignes : '  sons de 1 à 4 lignes complètes
dim m_gameover  : ' Musique après la fin de partie
dim m_theme    : ' Musique durant le jeu
dim m_highscore : ' Musique sur l'ecran des high_score

dim grille_active% : grille_active%=2 : ' Définit la grille de travail

' ****************************** COMMANDES CLAVIER **************************
dim esc,cesc : cesc=27 : ' * TOUCHE "ESC"  ==> MET FIN AU PROGRAMME:... 27  *
dim tfg,ctfg : ctfg=37 : ' * FLÈCHE GAUCHE ==> DEPLACER À GAUCHE:...... 37  *
dim tfh,ctfh : ctfh=38 : ' * FLÈCHE HAUTE  ==> INUTILISEE.............. 38  *
dim tfd,ctfd : ctfd=39 : ' * FLÈCHE DROITE ==> DEPLACER À DROITE:...... 39  *
dim tfb,ctfb : ctfb=40 : ' * FLÈCHE BASSE  ==> FAIRE TOMBER LA PIECE... 40  *
dim esp,cesp : cesp=32 : ' * ESPACE        ==> PIVOTER À DROITE........ 32  *
' ***************************************************************************


' initialisation de la fenêtre de jeu
width 0, l_fenetre : height 0,h_fenetre

objet% = objet% + 1 : a_grille1% = objet%
picture a_grille1%  : hide a_grille1%: left a_grille1%, marge_grille : top a_grille1%, marge_grille
width a_grille1%, 10*h_carre_grille : height a_grille1%,20*h_carre_grille
color a_grille1%,200, 150, 150 : 2D_target_is a_grille1% : trace_grille()
file_save a_grille1%,"fond.bmp"

objet% = objet% + 1: a_grille2% = objet%
scene2D a_grille2% : left a_grille2%, marge_grille : top a_grille2%, marge_grille
width a_grille2%, 10*h_carre_grille : height a_grille2%,20*h_carre_grille
file_load a_grille2%,"fond.bmp"
sprite sprite_piece

objet% = objet% + 1: i_temp% = objet% : image i_temp%  :  top objet%, -800 : hide i_temp%

objet% = objet% + 1 : picture objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, marge_grille : width objet%,250: height objet%,172 : file_load objet%,titre.jpg

objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 3* marge_grille + 172 : width objet%,250: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Pièce suivante :"

objet% = objet% + 1 : a_suivante% = objet% : picture objet% : left objet%, 2*marge_grille + 12 * h_carre_grille
top objet%, 4* marge_grille + 202 : width objet%,4* h_carre_grille: height objet%, 4* h_carre_grille

' Création des 7 pièces dans les 4 directions

for iter% = 0 to 6

  objet% = objet% + 1 :  if iter%= 0 then p_carre = objet%

  picture objet% : 2d_target_is objet%  : hide objet%
  top objet%, -400: width objet%, h_carre_grille : height objet%, h_carre_grille
  dessine_carre(iter%)

  picture objet%+7 :  hide objet% +7
  width objet%+7, 4*h_carre_grille: height objet%+7, 4*h_carre_grille : top objet%+7, -400
  color objet%+7,0,0,0: 2d_target_is objet%+7 : dessine_piece(iter%,1)

  picture objet%+14 :  hide objet% + 14
  width objet%+14, 4*h_carre_grille: height objet%+14, 4*h_carre_grille: top objet%+14, -400
  color objet%+14,0,0,0: 2d_target_is objet%+14 : dessine_piece(iter%,2)

  picture objet%+21 :  hide objet% + 21
  width objet%+21, 4*h_carre_grille: height objet%+21, 4*h_carre_grille : top objet%+21, -400
  color objet%+21,0,0,0: 2d_target_is objet%+21 : dessine_piece(iter%,3)

  picture objet%+28 :  hide objet% + 28
  width objet%+28, 4*h_carre_grille: height objet%+28, 4*h_carre_grille:  top objet%+28, -400
  color objet%+28,0,0,0: 2d_target_is objet%+28 : dessine_piece(iter%,4)

next iter%

objet% = objet% + 28
piece = -1 : vide_grille() :  Cree_piece_suivante()
dll_on "kgf.dll"

' Debug Windows
dim debug_mode : debug_mode = 0 : ' Active ou non le mode debug
dim debug_windows
if debug_mode = 1
  objet% = objet% + 1 : debug_windows = objet%
  form debug_windows : command_target_is debug_windows
  left debug_windows, 700 : height debug_windows,700 : width debug_windows, 250
  objet% = objet% + 1 : list objet% : width objet%, 220
  height objet%, 650
  command_target_is 0 : set_focus 0
end_if

' Demarrage du jeu, on lance les cycle du jeu au travers d'un timer qui va rythmer les actions

score% = 0 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 12* marge_grille + 242 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Score :"

objet% = objet% + 1 : a_score% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 12* marge_grille + 242 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000000"

nb_lignes% = 0 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 14* marge_grille + 272 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Lignes :"

objet% = objet% + 1 : a_nb_lignes% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 14* marge_grille + 272 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000000"

niveau% = 1 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 16* marge_grille + 302 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Niveau :"

objet% = objet% + 1 : a_niveau% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 16* marge_grille + 302 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000001"

' Chargement des sons
objet% = objet% + 1 :  s_dep_impossible = objet% : sound objet% : file_load objet%,"sons\Deplacement impossible.mp3"
objet% = objet% + 1 :  s_dep_lateral = objet%    : sound objet% : file_load objet%,"sons\Deplacement lateral.mp3"
objet% = objet% + 1 :  s_rotation = objet%      : sound objet% : file_load objet%,"sons\Rotation piece.mp3"
objet% = objet% + 1 :  s_gameover = objet%      : sound objet% : file_load objet%,"sons\Game Over.mp3"
objet% = objet% + 1 :  s_verouillee = objet%    : sound objet% : file_load objet%,"sons\Piece verouillee.mp3"
objet% = objet% + 1 :  s_niveau = objet%        : sound objet% : file_load objet%,"sons\Niveau superieur.mp3"
objet% = objet% + 1 :  s_chutte = objet%      : sound objet% : file_load objet%,"sons\Chutte.mp3"
objet% = objet% + 1 :  s1_ligne  = objet%    : sound objet% : file_load objet%,"sons\Simple Ligne.mp3"
objet% = objet% + 1 :  s2_lignes = objet%    : sound objet% : file_load objet%,"sons\Double ligne.mp3"
objet% = objet% + 1 :  s3_lignes = objet%    : sound objet% : file_load objet%,"sons\Triple ligne.mp3"
objet% = objet% + 1 :  s4_lignes = objet%    : sound objet% : file_load objet%,"sons\Tetris.mp3"
objet% = objet% + 1 :  m_gameover = objet%    : sound objet% : file_load objet%,"sons\Musique - Game Over.mp3"
objet% = objet% + 1 :  m_theme = objet%      : sound objet% : file_load objet%,"sons\Musique - Theme Tetris.mp3"
objet% = objet% + 1 :  m_highscore = objet%  : sound objet% : file_load objet%,"sons\Musique - High Scores.mp3"


objet% = objet% + 1 : player_musique = objet%
panel objet% : hide objet% : iter% = dll_call5("CreatePlayer",handle(player_musique),0,0,100,100)
s$ = "sons\Musique - Theme Tetris.mp3"
iter% = dll_call1("LoadFileIntoPlayer",adr(s$))
iter% = dll_call0("PlayPlayer")
iter% = dll_call1("VolumePlayer",30)

objet%= objet% + 1 : t_musique = objet%
timer t_musique : timer_interval t_musique,8300 : on_timer t_musique, lance_musique

objet%= objet% + 1 : t_principal = objet%
timer t_principal : timer_interval t_principal,temps% : on_timer t_principal, boucle_principale

' On détecte le changement d'état des touches
on_key_down 0,t1

end

lance_musique:
  iter% = dll_call0("PlayPlayer")
return

sub dessine_piece(num%,rot%)
dim_local d_piece(3,3)
dim_local i%,j%

select num%
  case 0 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_O(i%,j%) : next j% : next i%
  case 1 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_I(i%,j%) : next j% : next i%
  case 2 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_S(i%,j%) : next j% : next i%
  case 3 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_Z(i%,j%) : next j% : next i%
  case 4 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_L(i%,j%) : next j% : next i%
  case 5 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_J(i%,j%) : next j% : next i%
  case 6 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_T(i%,j%) : next j% : next i%
end_select

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        if rot% = 1 then copie_carre(num%,i%,j%,rot%)
        if rot% = 2 then copie_carre(num%,3-j%,i%,rot%)
        if rot% = 3 then copie_carre(num%,3-i%,3-j%,rot%)
        if rot% = 4 then copie_carre(num%,j%,3-i%,rot%)
    end_if
  next j%
next i%
end_sub


sub dessine_carre(num%)
dim_local c1%,c2%,c3%, k%,l%, temp1%,temp2%,temp3%
c1% = couleur_piece(num%, 0) : c2% = couleur_piece(num%, 1) : c3% = couleur_piece(num%,2)
for k% = 0 to h_carre-1
  for l% = 0 to m_carre-1
      temp1% = c1% + ind_c%*(h_carre - k%) : if temp1% > 255 then temp1% = 255
      temp2% = c2% + ind_c%*(h_carre - k%) : if temp2% > 255 then temp2% = 255
      temp3% = c3% + ind_c%*(h_carre - k%) : if temp3% > 255 then temp3% = 255
      2d_pen_color temp1%,temp2%,temp3%
      if k% >= l%
          2d_point k%,l%
          2d_point l%,k%
        end_if
      temp1% = c1% - ind_c% * k% : if temp1% < 0 then temp1% = 0
      temp2% = c2% - ind_c% * k% : if temp2% < 0 then temp2% = 0
      temp3% = c3% - ind_c% * k% : if temp3% < 0 then temp3% = 0
      2d_pen_color temp1%,temp2%,temp3%
      if k% >= l%
          2d_point k%,h_carre-l%
          2d_point h_carre-l%,k%
        end_if
  next l%
next k%
2d_pen_color c1%,c2%,c3% : 2d_fill_color c1%,c2%,c3%
2d_rectangle m_carre, m_carre , h_carre - m_carre +1, h_carre - m_carre +1
end_sub


sub copie_carre(num%,x_dest,y_dest, rot%)
  2D_target_is p_carre + num%
  2D_image_copy i_temp%,0,0,h_carre,h_carre
  2D_target_is p_carre+num%+7*rot%
  2D_image_paste i_temp%,x_dest * h_carre_grille +1,y_dest * h_carre_grille +1
end_sub


sub vide_grille()
  for iter% = 0 to 9
    for iter2% = 0 to 19
      grille%(iter%,iter2%) = -1
    next iter2%
  next iter%
end_sub


sub trace_grille()
  2D_pen_color 180,180,255
  for iter% = 1 to 10
    2D_line iter%*h_carre_grille, 0, iter%*h_carre_grille,20*h_carre_grille
  next iter%
  for iter% = 1 to 20
    2D_line 0, iter%*h_carre_grille, 10*h_carre_grille,iter%*h_carre_grille
  next iter%
end_sub


sub Cree_piece_suivante()
  p_suivante = int(rnd(6.9999))
end_sub


sub test_dep_bas()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece - 0.001) + 1 + j%
        temp2% = x_piece + i%
        if temp% = 20 then test_dep% = 0 : exit_sub
        if temp% >= 0 and temp2% >= 0 and temp2% <= 9
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
    end_if
  next j%
next i%

end_sub


sub test_dep_gauche()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% -1
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% <= 19
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
          if temp% <> y_piece + j%
            temp% = int(y_piece) + j% +1
            if temp% <= 19
              if temp% >= 0
                if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
              end_if
            end_if
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_rot_gauche()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece_temp(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i%
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% > 19 then test_dep%=0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
        if temp% <> y_piece + j%
          temp% = int(y_piece) + j% +1
          if temp% > 19 then test_dep%=0 : exit_sub
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_dep_droite()

dim_local i%,j%,temp%, temp2%
test_dep% = 1
for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% +1
        if temp2% > 9 then test_dep%=0 : exit_sub
        if temp% <= 19
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
          if temp% <> y_piece + j%
            temp% = int(y_piece) + j% +1
            if temp% <= 19
              if temp% >= 0
                if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
              end_if
            end_if
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_rot_droite()

dim_local i%,j%,temp%, temp2%
test_dep% = 1
for i% = 0 to 3
  for j% = 0 to 3
    if d_piece_temp(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i%
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% > 19 then test_dep%=0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
        if temp% <> y_piece + j%
          temp% = int(y_piece) + j% +1
          if temp% > 19 then test_dep%=0 : exit_sub
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
        end_if
    end_if
  next j%
next i%

end_sub


sub test_ligne()
dim_local i%,j%,ligne%, nbligne%
  nbligne%=0
  for i% = 0 to 3
    ligne%=1
    for j% = 0 to 9
      if y_piece + i% < 20
          if grille%(j%,y_piece + i%) < 0 then ligne% = 0 : exit_for
      else
          ligne%= 0
      end_if
    next j%
    if ligne%=1 then suppr_ligne(y_piece + i%) : nbligne% = nbligne% +1
  next i%
  if nbligne% > 0
    2D_target_is a_grille1% : trace_grille()
    file_save a_grille1%,"fond.bmp" : file_load a_grille2%,"fond.bmp"
    select nbligne%
      case 1 : score% = score% + niveau% *  40 : play s1_ligne
      case 2 : score% = score% + niveau% * 100 : play s2_lignes
      case 3 : score% = score% + niveau% * 300 : play s3_lignes
      case 4 : score% = score% + niveau% *1200 : play s4_lignes
    end_select
    caption a_score%,right$("000000" + str$(score%),6)
    nb_lignes% = nb_lignes% + nbligne%
    caption a_nb_lignes%,right$("000000" + str$(nb_lignes%),6)
  end_if
end_sub


sub suppr_ligne(l%)
dim_local i%,j%
  2D_target_is a_grille1%
  2D_image_copy i_temp%,0,0,10*h_carre_grille,l%*h_carre_grille
  2D_image_paste i_temp%,0,1 * h_carre_grille
  for i% = l% to 1 step -1
    for j% = 0 to 9
        grille%(j%,i%) = grille%(j%,i%-1)
    next j%
  next i%
  for j% = 0 to 9
      grille%(j%,0) = -1
  next j%
end_sub


sub bloque_piece()
  dim_local i%,j%,s$
  for i% = 0 to 3
    for j% = 0 to 3
      if d_piece(i%,j%) = 1 and y_piece >= 0
        if (int(y_piece)+j%) < 20 then grille%(x_piece + i%, int(y_piece)+j%) = piece
      end_if
    next j%
  next i%
  if debug_mode =1
    clear debug_windows +1
    item_add debug_windows +1,"XX | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
    for i% = 0 to 19
      s$=right$("0" + str$(i%),2) + " | "
      for j%=0 to 9
          s$=s$ + right$("  " + str$(grille%(j%,i%)),2) + " | "
      next j%
      item_add debug_windows +1,s$
    next i%
    set_focus 0
  end_if
  for i% = 0 to 3
    for j% = 0 to 3
      if d_piece(i%,j%) = 1
        2D_target_is p_carre + piece
        2D_image_copy i_temp%,0,0,h_carre,h_carre
        2D_target_is a_grille1%
        2D_image_paste i_temp%,(x_piece+i%) * h_carre_grille +1,int(y_piece+j%) * h_carre_grille +1
      end_if
    next j%
  next i%
  file_save a_grille1%,"fond.bmp" : file_load a_grille2%,"fond.bmp"
end_sub


boucle_principale:

timer_off t_principal
off_key_down 0
set_focus 0
if esc = 1
  if message_confirmation_yes_no ("Voulez-vous vraiment quitter le jeu ?") = 1 then goto quitte
  esc = 0
end_if

' dessin d'une pièce
if piece = -1
  sprite_hide sprite_piece : piece =  p_suivante
  x_piece = x_initial : y_piece = y_initial : rotation% = 1
  Cree_piece_suivante()
  2d_target_is p_carre+piece+7
  2d_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
  sprite_image_load sprite_piece, i_temp%
  sprite_position sprite_piece,x_initial * h_carre_grille,y_initial * h_carre_grille
  sprite_show sprite_piece
  2d_target_is p_carre+p_suivante+7
  2d_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
  2d_target_is a_suivante%
  2d_image_paste i_temp%,0,0
  2d_target_is 0
  select piece
    case 0 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_O(iter%,iter2%) : next iter2% : next iter%
    case 1 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_I(iter%,iter2%) : next iter2% : next iter%
    case 2 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_S(iter%,iter2%) : next iter2% : next iter%
    case 3 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_Z(iter%,iter2%) : next iter2% : next iter%
    case 4 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_L(iter%,iter2%) : next iter2% : next iter%
    case 5 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_J(iter%,iter2%) : next iter2% : next iter%
    case 6 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_T(iter%,iter2%) : next iter2% : next iter%
  end_select
end_if
y_piece = y_piece + v_dep

if tfg = 1
  test_dep_gauche()
  if test_dep%= 1
    x_piece = x_piece - 1
    play s_dep_lateral
  else
    play s_dep_impossible
  end_if
  tfg = 0
end_if

' if tfh = 1
'  test_dep% = 1
'  for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece_temp(3-iter2%,iter%) = d_piece(iter%,iter2%) : next iter2% : next iter%
'  test_rot_gauche()
'  if test_dep%= 1
'    rotation%=rotation%+1
'    if rotation%=5 then rotation% = 1
'    2D_target_is p_carre+piece+7*rotation%
'    2D_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
'    sprite_image_load sprite_piece, i_temp%
'    play s_rotation
'    for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece(iter%,iter2%) = d_piece_temp(iter%,iter2%) : next iter2% : next iter%
'  else
'    play s_dep_impossible
'  end_if
'  tfh = 0
' end_if

if tfd = 1
  test_dep_droite()
  if test_dep%= 1
    x_piece = x_piece + 1
    play s_dep_lateral
  else
    play s_dep_impossible
  end_if
  tfd = 0
end_if

if esp = 1
  test_dep% = 1
  for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece_temp(iter2%,3-iter%) = d_piece(iter%,iter2%) : next iter2% : next iter%
  test_rot_droite()
  if test_dep%= 1
    rotation%=rotation%-1
    if rotation%=0 then rotation% = 4
    2D_target_is p_carre+piece+7*rotation%
    2D_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
    sprite_image_load sprite_piece, i_temp%
    play s_rotation
    for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece(iter%,iter2%) = d_piece_temp(iter%,iter2%) : next iter2% : next iter%
  else
    play s_dep_impossible
  end_if
  esp = 0
end_if

if tfb = 1 then play s_chutte
chutte:
test_dep_bas()
if test_dep%=0
  play s_verouillee
  if y_piece < 0
      goto quitte
  else
    y_piece = int(y_piece)
    bloque_piece()
    tfb = 0
    test_ligne()
    piece = -1
  end_if
  play s_verouillee
else
  sprite_position sprite_piece,x_piece * h_carre_grille,y_piece * h_carre_grille
end_if
if tfb = 1 then y_piece = y_piece + v_dep : wait 10 : goto chutte
temps% = 80 - niveau% * 2 :  v_dep = 1 - (0.85 - niveau% / 10) : timer_interval t_principal,temps%
if int(nb_lignes% / 30) + 1 > niveau% then play s_niveau
niveau% = int(nb_lignes% / 30) + 1 : caption a_niveau%,right$("000000" + str$(niveau%),6)
timer_on t_principal
on_key_down 0,t1
return

' ****** Gestion du clavier

t1:
  if key_down_code=cesp then esp=1
  if key_down_code=cesc then esc=1
  if key_down_code=ctfg then tfg=1
  if key_down_code=ctfh then tfh=1
  if key_down_code=ctfd then tfd=1
  if key_down_code=ctfb then tfb=1
return


quitte:
  timer_off_all
  iter% = dll_call0("PausePlayer") : wait 50
  play s_gameover : wait 300
  play m_gameover
  Message "Partie terminée"
  wait 4000
  iter% = dll_call1("KillProcessByHandle",handle(0))
  dll_off
  end
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyDim 22 Fév 2015 - 11:59

En rallumant mes neurones ce matin, j'ai trouvé la solution pour éviter le problème d'affichage quand on fait tourner la pièce. C'est un mécanisme que j'ai déjà utilisé dans plusieurs jeux, mais comme je le disais à Minibug, je crois, j'oublie souvent mes solutions ...
Là, graphiquement, je pense que c'est correct maintenant.
Code:
' Tetris par Jicehel
' Version 1.0
' Ecrit en Panoramic, le 13/02/2015
' Déplacement par les flèches droite / gauche
' Faire tomber la pièce: Flèche vers le bas
' Tourner la pièce : Espace

' Déclaration des sous-programmes évenementiels
label boucle_principale, quitte, t1, chutte, lance_musique

' variables de la fenêtre principale
dim l_fenetre : l_fenetre = 610
dim h_fenetre : h_fenetre = 700

' variables de la grille
dim marge_grille : marge_grille =15  : ' marge entre la fenêtre et la grille
dim h_carre_grille : h_carre_grille = 30 : ' taille d'une case de la grille

' variables d'un carré élementaire
dim h_carre : h_carre = h_carre_grille - 1 : ' taille d'un carré de base
dim m_carre : m_carre = int(h_carre / 8)  : ' taille la bordure du carré pour le relief

' définition des pièces
dim couleur_piece(6,3)
dim d_piece(3,3) : ' contient les "carrés" occupés par la pièce dans son état de rotation actuelle
dim d_piece_temp(3,3) : ' copie temporaire de la piece pour les rotations

' pièce O
dim piece_O(3,3)
piece_O(0,0) = 0 : piece_O(0,1) = 0:  piece_O(0,2) = 0:  piece_O(0,3) = 0
piece_O(1,0) = 0 : piece_O(1,1) = 1:  piece_O(1,2) = 1:  piece_O(1,3) = 0
piece_O(2,0) = 0 : piece_O(2,1) = 1:  piece_O(2,2) = 1:  piece_O(2,3) = 0
piece_O(3,0) = 0 : piece_O(3,1) = 0:  piece_O(3,2) = 0:  piece_O(3,3) = 0

couleur_piece(0,0) = 220 : couleur_piece(0,1) = 220 :  couleur_piece(0,2) = 0

' pièce I
dim piece_I(3,3)
piece_I(0,0) = 0 : piece_I(0,1) = 0:  piece_I(0,2) = 0:  piece_I(0,3) = 0
piece_I(1,0) = 1 : piece_I(1,1) = 1:  piece_I(1,2) = 1:  piece_I(1,3) = 1
piece_I(2,0) = 0 : piece_I(2,1) = 0:  piece_I(2,2) = 0:  piece_I(2,3) = 0
piece_I(3,0) = 0 : piece_I(3,1) = 0:  piece_I(3,2) = 0:  piece_I(3,3) = 0

couleur_piece(1,0) = 100 : couleur_piece(1,1) = 220 :  couleur_piece(1,2) = 220

' pièce S
dim piece_S(3,3)
piece_S(0,0) = 0 : piece_S(0,1) = 0:  piece_S(0,2) = 0:  piece_S(0,3) = 0
piece_S(1,0) = 0 : piece_S(1,1) = 0:  piece_S(1,2) = 1:  piece_S(1,3) = 1
piece_S(2,0) = 0 : piece_S(2,1) = 1:  piece_S(2,2) = 1:  piece_S(2,3) = 0
piece_S(3,0) = 0 : piece_S(3,1) = 0:  piece_S(3,2) = 0:  piece_S(3,3) = 0

couleur_piece(2,0) = 0 : couleur_piece(2,1) = 220 :  couleur_piece(2,2) = 0

' pièce Z
dim piece_Z(3,3)
piece_Z(0,0) = 0 : piece_Z(0,1) = 0:  piece_Z(0,2) = 0:  piece_Z(0,3) = 0
piece_Z(1,0) = 0 : piece_Z(1,1) = 1:  piece_Z(1,2) = 1:  piece_Z(1,3) = 0
piece_Z(2,0) = 0 : piece_Z(2,1) = 0:  piece_Z(2,2) = 1:  piece_Z(2,3) = 1
piece_Z(3,0) = 0 : piece_Z(3,1) = 0:  piece_Z(3,2) = 0:  piece_Z(3,3) = 0

couleur_piece(3,0) = 220 : couleur_piece(3,1) = 0 :  couleur_piece(3,2) = 0

' pièce L
dim piece_L(3,3)
piece_L(0,0) = 0 : piece_L(0,1) = 0:  piece_L(0,2) = 0:  piece_L(0,3) = 0
piece_L(1,0) = 0 : piece_L(1,1) = 1:  piece_L(1,2) = 1:  piece_L(1,3) = 1
piece_L(2,0) = 0 : piece_L(2,1) = 1:  piece_L(2,2) = 0:  piece_L(2,3) = 0
piece_L(3,0) = 0 : piece_L(3,1) = 0:  piece_L(3,2) = 0:  piece_L(3,3) = 0

couleur_piece(4,0) = 220 : couleur_piece(4,1) = 120 :  couleur_piece(4,2) = 0

' pièce J
dim piece_J(3,3)
piece_J(0,0) = 0 : piece_J(0,1) = 0:  piece_J(0,2) = 0:  piece_J(0,3) = 0
piece_J(1,0) = 0 : piece_J(1,1) = 1:  piece_J(1,2) = 1:  piece_J(1,3) = 1
piece_J(2,0) = 0 : piece_J(2,1) = 0:  piece_J(2,2) = 0:  piece_J(2,3) = 1
piece_J(3,0) = 0 : piece_J(3,1) = 0:  piece_J(3,2) = 0:  piece_J(3,3) = 0

couleur_piece(5,0) = 0 : couleur_piece(5,1) = 0 :  couleur_piece(5,2) = 220

' pièce T
dim piece_T(3,3)
piece_T(0,0) = 0 : piece_T(0,1) = 0:  piece_T(0,2) = 0:  piece_T(0,3) = 0
piece_T(1,0) = 0 : piece_T(1,1) = 1:  piece_T(1,2) = 1:  piece_T(1,3) = 1
piece_T(2,0) = 0 : piece_T(2,1) = 0:  piece_T(2,2) = 1:  piece_T(2,3) = 0
piece_T(3,0) = 0 : piece_T(3,1) = 0:  piece_T(3,2) = 0:  piece_T(3,3) = 0

couleur_piece(6,0) = 220 : couleur_piece(6,1) = 0 :  couleur_piece(6,2) = 220


' dessin des carrés de couleur
dim p_carre : ' Picture des carré pour la pièce 0, 6 autres objets seront créés pour les autres carés de base
'              On créé ensuite 7 autres pictures pour stocker les différentes pièces
'              On créera les pièces tournées à 90°, 180° et -90° à la suite
dim i_temp% : ' Image servant à faire la copie du carré correspondant à la pièce

' définition des noms d'obhets
dim a_grille1%  : ' picture ou l'on crée la grille comme fond et ou on mettra les blocs inactifs
dim a_grille2%  : ' nom de la grille 2 sur laquelle on affiche les sprites de la pièce et le fond avec les blocs figés
dim a_suivante% : ' nom du "picture" où l'on affiche la pièce suivante
dim a_score%    : ' nom de l'affichage du score
dim a_lignes%  : ' nom de l'affichage du nombre de lignes faites
dim a_nb_lignes%: ' affichage du nombre de lignes faites
dim a_niveau%  : ' affichage du niveau actuel

' définition des variables du jeu
dim iter%, iter2% : ' Compteurs d'itérations
dim objet%: objet% = 0 : ' Compteur d'objets créés
dim p_suivante : ' prochaine pièce qui sera affichée
dim piece : ' Numero de la pièce active. Si la pièce vaut -1, prendre la pièce suivante
dim x_piece, y_piece : ' Coordonnées de la pièce courante en cases
dim x_initial, y_initial : ' Coordonnées initiale d'une nouvelle pièce
x_initial = 4 : y_initial = -4
dim diff_couleur : diff_couleur = 100 : ' Ombres et lumière
dim ind_c% : ind_c% = int(diff_couleur / h_carre) : ' variation de lumiere par pas
dim temps% : temps% = 75 : ' temps d'une boucle principale
dim v_dep : v_dep = 0.2 : ' Vitesse de descente de la pièce
dim t_principal : ' Numéro du timer principal
dim t_musique : ' ' Timer pour relancer la musique
dim sprite_piece : sprite_piece = 1 : ' Le sprite de la pièce !!
dim test_dep% : ' Vaut 1 si le déplacement est possible
dim grille%(9,19) : ' Mémorise les carrés des pièces dans la grille
dim rotation% : ' Indique si la pièce est tournée
dim nb_lignes%: ' Le compteur de ligne
dim niveau%  : ' Niveau actuel
dim score%    : ' Le score
dim player_musique: ' Objet qui jouera la musique
dim s$ : ' chaine de caractères temporaire

' définitions des sons
dim s_dep_impossible : ' mouvement impossible
dim s_dep_lateral    : ' deplacement à droit ou a gauche
dim s_rotation      : ' tourne la pièce de 90°
dim s_gameover      : ' son de fin de partie
dim s_verouillee    : ' la pièce est bloquée (arrivée, on passe à la pièce suivante)
dim s_niveau        : ' passage au niveau supérieur
dim s_chutte        : ' son de la chutte d'une pièce quand on appuie sur espace
dim s1_ligne, s2_lignes, s3_lignes, s4_lignes : '  sons de 1 à 4 lignes complètes
dim m_gameover  : ' Musique après la fin de partie
dim m_theme    : ' Musique durant le jeu
dim m_highscore : ' Musique sur l'ecran des high_score

dim grille_active% : grille_active%=2 : ' Définit la grille de travail

' ****************************** COMMANDES CLAVIER **************************
dim esc,cesc : cesc=27 : ' * TOUCHE "ESC"  ==> MET FIN AU PROGRAMME:... 27  *
dim tfg,ctfg : ctfg=37 : ' * FLÈCHE GAUCHE ==> DEPLACER À GAUCHE:...... 37  *
dim tfh,ctfh : ctfh=38 : ' * FLÈCHE HAUTE  ==> INUTILISEE.............. 38  *
dim tfd,ctfd : ctfd=39 : ' * FLÈCHE DROITE ==> DEPLACER À DROITE:...... 39  *
dim tfb,ctfb : ctfb=40 : ' * FLÈCHE BASSE  ==> FAIRE TOMBER LA PIECE... 40  *
dim esp,cesp : cesp=32 : ' * ESPACE        ==> PIVOTER À DROITE........ 32  *
' ***************************************************************************


' initialisation de la fenêtre de jeu
width 0, l_fenetre : height 0,h_fenetre

objet% = objet% + 1 : a_grille1% = objet%
picture a_grille1%  : hide a_grille1%: left a_grille1%, marge_grille : top a_grille1%, marge_grille
width a_grille1%, 10*h_carre_grille : height a_grille1%,20*h_carre_grille + 300
color a_grille1%,200, 150, 150 : 2D_target_is a_grille1% : trace_grille()
file_save a_grille1%,"fond.bmp"

objet% = objet% + 1: a_grille2% = objet%
scene2D a_grille2% : left a_grille2%, marge_grille : top a_grille2%, -300
width a_grille2%, 10*h_carre_grille : height a_grille2%,20*h_carre_grille + 300
file_load a_grille2%,"fond.bmp"
sprite sprite_piece

objet% = objet% + 1: i_temp% = objet% : image i_temp%  :  top objet%, -800 : hide i_temp%

objet% = objet% + 1 : picture objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, marge_grille : width objet%,250: height objet%,172 : file_load objet%,titre.jpg

objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 3* marge_grille + 172 : width objet%,250: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Pièce suivante :"

objet% = objet% + 1 : a_suivante% = objet% : picture objet% : left objet%, 2*marge_grille + 12 * h_carre_grille
top objet%, 4* marge_grille + 202 : width objet%,4* h_carre_grille: height objet%, 4* h_carre_grille

' Création des 7 pièces dans les 4 directions

for iter% = 0 to 6

  objet% = objet% + 1 :  if iter%= 0 then p_carre = objet%

  picture objet% : 2d_target_is objet%  : hide objet%
  top objet%, -400: width objet%, h_carre_grille : height objet%, h_carre_grille
  dessine_carre(iter%)

  picture objet%+7 :  hide objet% +7
  width objet%+7, 4*h_carre_grille: height objet%+7, 4*h_carre_grille : top objet%+7, -400
  color objet%+7,0,0,0: 2d_target_is objet%+7 : dessine_piece(iter%,1)

  picture objet%+14 :  hide objet% + 14
  width objet%+14, 4*h_carre_grille: height objet%+14, 4*h_carre_grille: top objet%+14, -400
  color objet%+14,0,0,0: 2d_target_is objet%+14 : dessine_piece(iter%,2)

  picture objet%+21 :  hide objet% + 21
  width objet%+21, 4*h_carre_grille: height objet%+21, 4*h_carre_grille : top objet%+21, -400
  color objet%+21,0,0,0: 2d_target_is objet%+21 : dessine_piece(iter%,3)

  picture objet%+28 :  hide objet% + 28
  width objet%+28, 4*h_carre_grille: height objet%+28, 4*h_carre_grille:  top objet%+28, -400
  color objet%+28,0,0,0: 2d_target_is objet%+28 : dessine_piece(iter%,4)

next iter%

objet% = objet% + 28
piece = -1 : vide_grille() :  Cree_piece_suivante()
dll_on "kgf.dll"

' Debug Windows
dim debug_mode : debug_mode = 0 : ' Active ou non le mode debug
dim debug_windows
if debug_mode = 1
  objet% = objet% + 1 : debug_windows = objet%
  form debug_windows : command_target_is debug_windows
  left debug_windows, 700 : height debug_windows,700 : width debug_windows, 250
  objet% = objet% + 1 : list objet% : width objet%, 220
  height objet%, 650
  command_target_is 0 : set_focus 0
end_if

' Demarrage du jeu, on lance les cycle du jeu au travers d'un timer qui va rythmer les actions

score% = 0 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 12* marge_grille + 242 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Score :"

objet% = objet% + 1 : a_score% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 12* marge_grille + 242 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000000"

nb_lignes% = 0 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 14* marge_grille + 272 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Lignes :"

objet% = objet% + 1 : a_nb_lignes% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 14* marge_grille + 272 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000000"

niveau% = 1 :  objet% = objet% + 1 : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille
top objet%, 16* marge_grille + 302 : width objet%,130: height objet%,30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"Niveau :"

objet% = objet% + 1 : a_niveau% = objet% : alpha objet% : left objet%, 2*marge_grille + 10 * h_carre_grille + 140
top objet%, 16* marge_grille + 302 : width objet%,130: height objet%, 30
font_size objet%,20 : font_name objet%,"Times news roman" : font_bold objet%
caption objet%,"000001"

' Chargement des sons
objet% = objet% + 1 :  s_dep_impossible = objet% : sound objet% : file_load objet%,"sons\Deplacement impossible.mp3"
objet% = objet% + 1 :  s_dep_lateral = objet%    : sound objet% : file_load objet%,"sons\Deplacement lateral.mp3"
objet% = objet% + 1 :  s_rotation = objet%      : sound objet% : file_load objet%,"sons\Rotation piece.mp3"
objet% = objet% + 1 :  s_gameover = objet%      : sound objet% : file_load objet%,"sons\Game Over.mp3"
objet% = objet% + 1 :  s_verouillee = objet%    : sound objet% : file_load objet%,"sons\Piece verouillee.mp3"
objet% = objet% + 1 :  s_niveau = objet%        : sound objet% : file_load objet%,"sons\Niveau superieur.mp3"
objet% = objet% + 1 :  s_chutte = objet%      : sound objet% : file_load objet%,"sons\Chutte.mp3"
objet% = objet% + 1 :  s1_ligne  = objet%    : sound objet% : file_load objet%,"sons\Simple Ligne.mp3"
objet% = objet% + 1 :  s2_lignes = objet%    : sound objet% : file_load objet%,"sons\Double ligne.mp3"
objet% = objet% + 1 :  s3_lignes = objet%    : sound objet% : file_load objet%,"sons\Triple ligne.mp3"
objet% = objet% + 1 :  s4_lignes = objet%    : sound objet% : file_load objet%,"sons\Tetris.mp3"
objet% = objet% + 1 :  m_gameover = objet%    : sound objet% : file_load objet%,"sons\Musique - Game Over.mp3"
objet% = objet% + 1 :  m_theme = objet%      : sound objet% : file_load objet%,"sons\Musique - Theme Tetris.mp3"
objet% = objet% + 1 :  m_highscore = objet%  : sound objet% : file_load objet%,"sons\Musique - High Scores.mp3"


objet% = objet% + 1 : player_musique = objet%
panel objet% : hide objet% : iter% = dll_call5("CreatePlayer",handle(player_musique),0,0,100,100)
s$ = "sons\Musique - Theme Tetris.mp3"
iter% = dll_call1("LoadFileIntoPlayer",adr(s$))
iter% = dll_call0("PlayPlayer")
iter% = dll_call1("VolumePlayer",30)

objet%= objet% + 1 : t_musique = objet%
timer t_musique : timer_interval t_musique,8300 : on_timer t_musique, lance_musique

objet%= objet% + 1 : t_principal = objet%
timer t_principal : timer_interval t_principal,temps% : on_timer t_principal, boucle_principale

' On détecte le changement d'état des touches
on_key_down 0,t1

end

lance_musique:
  iter% = dll_call0("PlayPlayer")
return

sub dessine_piece(num%,rot%)
dim_local d_piece(3,3)
dim_local i%,j%

select num%
  case 0 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_O(i%,j%) : next j% : next i%
  case 1 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_I(i%,j%) : next j% : next i%
  case 2 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_S(i%,j%) : next j% : next i%
  case 3 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_Z(i%,j%) : next j% : next i%
  case 4 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_L(i%,j%) : next j% : next i%
  case 5 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_J(i%,j%) : next j% : next i%
  case 6 : for i%= 0 to 3 : for j% = 0 to 3 : d_piece(i%,j%) = piece_T(i%,j%) : next j% : next i%
end_select

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        if rot% = 1 then copie_carre(num%,i%,j%,rot%)
        if rot% = 2 then copie_carre(num%,3-j%,i%,rot%)
        if rot% = 3 then copie_carre(num%,3-i%,3-j%,rot%)
        if rot% = 4 then copie_carre(num%,j%,3-i%,rot%)
    end_if
  next j%
next i%
end_sub


sub dessine_carre(num%)
dim_local c1%,c2%,c3%, k%,l%, temp1%,temp2%,temp3%
c1% = couleur_piece(num%, 0) : c2% = couleur_piece(num%, 1) : c3% = couleur_piece(num%,2)
for k% = 0 to h_carre-1
  for l% = 0 to m_carre-1
      temp1% = c1% + ind_c%*(h_carre - k%) : if temp1% > 255 then temp1% = 255
      temp2% = c2% + ind_c%*(h_carre - k%) : if temp2% > 255 then temp2% = 255
      temp3% = c3% + ind_c%*(h_carre - k%) : if temp3% > 255 then temp3% = 255
      2d_pen_color temp1%,temp2%,temp3%
      if k% >= l%
          2d_point k%,l%
          2d_point l%,k%
        end_if
      temp1% = c1% - ind_c% * k% : if temp1% < 0 then temp1% = 0
      temp2% = c2% - ind_c% * k% : if temp2% < 0 then temp2% = 0
      temp3% = c3% - ind_c% * k% : if temp3% < 0 then temp3% = 0
      2d_pen_color temp1%,temp2%,temp3%
      if k% >= l%
          2d_point k%,h_carre-l%
          2d_point h_carre-l%,k%
        end_if
  next l%
next k%
2d_pen_color c1%,c2%,c3% : 2d_fill_color c1%,c2%,c3%
2d_rectangle m_carre, m_carre , h_carre - m_carre +1, h_carre - m_carre +1
end_sub


sub copie_carre(num%,x_dest,y_dest, rot%)
  2D_target_is p_carre + num%
  2D_image_copy i_temp%,0,0,h_carre,h_carre
  2D_target_is p_carre+num%+7*rot%
  2D_image_paste i_temp%,x_dest * h_carre_grille +1,y_dest * h_carre_grille + 1
end_sub


sub vide_grille()
  for iter% = 0 to 9
    for iter2% = 0 to 19
      grille%(iter%,iter2%) = -1
    next iter2%
  next iter%
end_sub


sub trace_grille()
  2D_pen_color 180,180,255
  for iter% = 1 to 10
    2D_line iter%*h_carre_grille, 0, iter%*h_carre_grille,20*h_carre_grille + 300
  next iter%
  for iter% = 1 to 20
    2D_line 0, iter%*h_carre_grille + 300, 10*h_carre_grille,iter%*h_carre_grille + 300
  next iter%
end_sub


sub Cree_piece_suivante()
  p_suivante = int(rnd(6.9999))
end_sub


sub test_dep_bas()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece - 0.001) + 1 + j%
        temp2% = x_piece + i%
        if temp% = 20 then test_dep% = 0 : exit_sub
        if temp% >= 0 and temp2% >= 0 and temp2% <= 9
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
    end_if
  next j%
next i%

end_sub


sub test_dep_gauche()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% -1
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% <= 19
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
          if temp% <> y_piece + j%
            temp% = int(y_piece) + j% +1
            if temp% <= 19
              if temp% >= 0
                if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
              end_if
            end_if
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_rot_gauche()

dim_local i%,j%,temp%, temp2%
test_dep% = 1

for i% = 0 to 3
  for j% = 0 to 3
    if d_piece_temp(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i%
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% > 19 then test_dep%=0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
        if temp% <> y_piece + j%
          temp% = int(y_piece) + j% +1
          if temp% > 19 then test_dep%=0 : exit_sub
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_dep_droite()

dim_local i%,j%,temp%, temp2%
test_dep% = 1
for i% = 0 to 3
  for j% = 0 to 3
    if d_piece(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i% +1
        if temp2% > 9 then test_dep%=0 : exit_sub
        if temp% <= 19
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
          if temp% <> y_piece + j%
            temp% = int(y_piece) + j% +1
            if temp% <= 19
              if temp% >= 0
                if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
              end_if
            end_if
          end_if
        end_if
    end_if
  next j%
next i%

end_sub

sub test_rot_droite()

dim_local i%,j%,temp%, temp2%
test_dep% = 1
for i% = 0 to 3
  for j% = 0 to 3
    if d_piece_temp(i%,j%) = 1
        temp% = int(y_piece) + j%
        temp2% = x_piece + i%
        if temp2% < 0 or temp2% > 9 then test_dep%=0 : exit_sub
        if temp% > 19 then test_dep%=0 : exit_sub
        if temp% >= 0
          if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
        end_if
        if temp% <> y_piece + j%
          temp% = int(y_piece) + j% +1
          if temp% > 19 then test_dep%=0 : exit_sub
          if temp% >= 0
            if grille%(temp2%,temp%)>=0 then test_dep%=0 : exit_sub
          end_if
        end_if
    end_if
  next j%
next i%

end_sub


sub test_ligne()
dim_local i%,j%,ligne%, nbligne%
  nbligne%=0
  for i% = 0 to 3
    ligne%=1
    for j% = 0 to 9
      if y_piece + i% < 20
          if grille%(j%,y_piece + i%) < 0 then ligne% = 0 : exit_for
      else
          ligne%= 0
      end_if
    next j%
    if ligne%=1 then suppr_ligne(y_piece + i%) : nbligne% = nbligne% +1
  next i%
  if nbligne% > 0
    2D_target_is a_grille1% : trace_grille()
    file_save a_grille1%,"fond.bmp" : file_load a_grille2%,"fond.bmp"
    select nbligne%
      case 1 : score% = score% + niveau% *  40 : play s1_ligne
      case 2 : score% = score% + niveau% * 100 : play s2_lignes
      case 3 : score% = score% + niveau% * 300 : play s3_lignes
      case 4 : score% = score% + niveau% *1200 : play s4_lignes
    end_select
    caption a_score%,right$("000000" + str$(score%),6)
    nb_lignes% = nb_lignes% + nbligne%
    caption a_nb_lignes%,right$("000000" + str$(nb_lignes%),6)
  end_if
end_sub


sub suppr_ligne(l%)
dim_local i%,j%
  2D_target_is a_grille1%
  2D_image_copy i_temp%,0,300,10*h_carre_grille,l%*h_carre_grille + 300
  2D_image_paste i_temp%,0,1 * h_carre_grille + 300
  for i% = l% to 1 step -1
    for j% = 0 to 9
        grille%(j%,i%) = grille%(j%,i%-1)
    next j%
  next i%
  for j% = 0 to 9
      grille%(j%,0) = -1
  next j%
end_sub


sub bloque_piece()
  dim_local i%,j%,s$
  for i% = 0 to 3
    for j% = 0 to 3
      if d_piece(i%,j%) = 1 and y_piece >= 0
        if (int(y_piece)+j%) < 20 then grille%(x_piece + i%, int(y_piece)+j%) = piece
      end_if
    next j%
  next i%
  if debug_mode =1
    clear debug_windows +1
    item_add debug_windows +1,"XX | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
    for i% = 0 to 19
      s$=right$("0" + str$(i%),2) + " | "
      for j%=0 to 9
          s$=s$ + right$("  " + str$(grille%(j%,i%)),2) + " | "
      next j%
      item_add debug_windows +1,s$
    next i%
    set_focus 0
  end_if
  for i% = 0 to 3
    for j% = 0 to 3
      if d_piece(i%,j%) = 1
        2D_target_is p_carre + piece
        2D_image_copy i_temp%,0,0,h_carre,h_carre
        2D_target_is a_grille1%
        2D_image_paste i_temp%,(x_piece+i%) * h_carre_grille +1,int(y_piece+j%) * h_carre_grille + 301
      end_if
    next j%
  next i%
  file_save a_grille1%,"fond.bmp" : file_load a_grille2%,"fond.bmp"
end_sub


boucle_principale:

timer_off t_principal
off_key_down 0
set_focus 0
if esc = 1
  if message_confirmation_yes_no ("Voulez-vous vraiment quitter le jeu ?") = 1 then goto quitte
  esc = 0
end_if

' dessin d'une pièce
if piece = -1
  sprite_hide sprite_piece : piece =  p_suivante
  x_piece = x_initial : y_piece = y_initial : rotation% = 1
  Cree_piece_suivante()
  2d_target_is p_carre+piece+7
  2d_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
  sprite_image_load sprite_piece, i_temp%
  sprite_position sprite_piece,x_initial * h_carre_grille,y_initial * h_carre_grille + 300
  sprite_show sprite_piece
  2d_target_is p_carre+p_suivante+7
  2d_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
  2d_target_is a_suivante%
  2d_image_paste i_temp%,0,0
  2d_target_is 0
  select piece
    case 0 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_O(iter%,iter2%) : next iter2% : next iter%
    case 1 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_I(iter%,iter2%) : next iter2% : next iter%
    case 2 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_S(iter%,iter2%) : next iter2% : next iter%
    case 3 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_Z(iter%,iter2%) : next iter2% : next iter%
    case 4 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_L(iter%,iter2%) : next iter2% : next iter%
    case 5 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_J(iter%,iter2%) : next iter2% : next iter%
    case 6 : for iter%= 0 to 3 : for iter2% = 0 to 3 : d_piece(iter%,iter2%) = piece_T(iter%,iter2%) : next iter2% : next iter%
  end_select
end_if
y_piece = y_piece + v_dep

if tfg = 1
  test_dep_gauche()
  if test_dep%= 1
    x_piece = x_piece - 1
    play s_dep_lateral
  else
    play s_dep_impossible
  end_if
  tfg = 0
end_if

' if tfh = 1
'  test_dep% = 1
'  for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece_temp(3-iter2%,iter%) = d_piece(iter%,iter2%) : next iter2% : next iter%
'  test_rot_gauche()
'  if test_dep%= 1
'    rotation%=rotation%+1
'    if rotation%=5 then rotation% = 1
'    2D_target_is p_carre+piece+7*rotation%
'    2D_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
'    sprite_image_load sprite_piece, i_temp%
'    play s_rotation
'    for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece(iter%,iter2%) = d_piece_temp(iter%,iter2%) : next iter2% : next iter%
'  else
'    play s_dep_impossible
'  end_if
'  tfh = 0
' end_if

if tfd = 1
  test_dep_droite()
  if test_dep%= 1
    x_piece = x_piece + 1
    play s_dep_lateral
  else
    play s_dep_impossible
  end_if
  tfd = 0
end_if

if esp = 1
  test_dep% = 1
  for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece_temp(iter2%,3-iter%) = d_piece(iter%,iter2%) : next iter2% : next iter%
  test_rot_droite()
  if test_dep%= 1
    rotation%=rotation%-1
    if rotation%=0 then rotation% = 4
    2D_target_is p_carre+piece+7*rotation%
    2D_image_copy i_temp%,0,0,4*h_carre_grille,4*h_carre_grille
    sprite_image_load sprite_piece, i_temp%
    play s_rotation
    for iter% = 0 to 3 :  for iter2% = 0 to 3 : d_piece(iter%,iter2%) = d_piece_temp(iter%,iter2%) : next iter2% : next iter%
  else
    play s_dep_impossible
  end_if
  esp = 0
end_if

if tfb = 1 then play s_chutte
chutte:
test_dep_bas()
if test_dep%=0
  play s_verouillee
  if y_piece < 0
      goto quitte
  else
    y_piece = int(y_piece)
    bloque_piece()
    tfb = 0
    test_ligne()
    piece = -1
  end_if
  play s_verouillee
else
  sprite_position sprite_piece,x_piece * h_carre_grille,y_piece * h_carre_grille + 300
end_if
if tfb = 1 then y_piece = y_piece + v_dep : wait 10 : goto chutte
temps% = 80 - niveau% * 2 :  v_dep = 1 - (0.85 - niveau% / 10) : timer_interval t_principal,temps%
if int(nb_lignes% / 30) + 1 > niveau% then play s_niveau
niveau% = int(nb_lignes% / 30) + 1 : caption a_niveau%,right$("000000" + str$(niveau%),6)
timer_on t_principal
on_key_down 0,t1
return

' ****** Gestion du clavier

t1:
  if key_down_code=cesp then esp=1
  if key_down_code=cesc then esc=1
  if key_down_code=ctfg then tfg=1
  if key_down_code=ctfh then tfh=1
  if key_down_code=ctfd then tfd=1
  if key_down_code=ctfb then tfb=1
return


quitte:
  timer_off_all
  iter% = dll_call0("PausePlayer") : wait 50
  play s_gameover : wait 300
  play m_gameover
  Message "Partie terminée"
  wait 4000
  iter% = dll_call1("KillProcessByHandle",handle(0))
  dll_off
  end

Plus qu'à expliquer un peu tout ça dans l'article.
Sinon Ygeronimi, tous les jeux qui viennent d'être fait (en dehors du Tetris), tu vas les rajouter dans les téléchargements du mag (ça fait quelques trucs sympa) ?
Revenir en haut Aller en bas
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyDim 22 Fév 2015 - 13:51

Là, c'est parfait cheers


PS: il reste un souci,
Quand je transforme en application (exe) la piste n'est pas vierge (il reste plein d'objets) Question Question Question

A+
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyDim 22 Fév 2015 - 14:52

Dans ce cas, je vais rajouter une petite procédure d'initialisation
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyDim 22 Fév 2015 - 15:47

Hum, non en fait, j'ai regardé, je ne comprends pas ce qui ce passe quand tu le fait. A priori, l'initialisation a bien lieu...
Revenir en haut Aller en bas
Yannick




Nombre de messages : 8610
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Tetris Empty
MessageSujet: re   Tetris EmptyDim 22 Fév 2015 - 15:52

Jicehel a écrit:
Sinon Ygeronimi, tous les jeux qui viennent d'être fait (en dehors du Tetris), tu vas les rajouter dans les téléchargements du mag (ça fait quelques trucs sympa) ?

Je le répète, je peux tout mettre sur le site ou presque.
Pour ajouter un jeu, une sub ou ..... l' auteur fait un zip qu' il place sur mon webdav.
Dans le zip (cas d' un programme ) il faut que tout y soit pour que le soit executable
( Sources, images) + un petit fichier *.txt  style "lisez moi" ( vous savez, c' est celui que personne ne lit)
Bref le seul élément qui peut être absent c' est la dll de Klaus mais en spécifiant qu' il en a besoin et le lieu 
où l' utilisateur peut la télécharger.

Dans le cas du Tétris, ou du Taquin, j' ai lu que vous souhaitiez faire des articles sur ces jeux.
Donc, je pense que leur publication devrait se faire en même temps que celle des articles.

Pour l' "âne rouge", j' ai peur que l' on finisse par remplir un asile psychiatrique en très peu de temps
et que l' on finisse avec un procès du ministère de la santé.
lol!
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyDim 22 Fév 2015 - 16:02

mdr Smile Mais il est très bien (dur, mais très bien)
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7006
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyDim 22 Fév 2015 - 16:42

On finira par en trouver plus coriace !
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyDim 22 Fév 2015 - 19:57

@Jicehel,

Citation :
Quand je transforme en application (exe) la piste n'est pas vierge (il reste plein d'objets)

Ne cherche pas, j'ai recommencé la transformation du code.bas en application exe et tout va bien, il y a certainement eu un incident la première fois que je l'ai fait. confused Embarassed

A+
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Tetris Empty
MessageSujet: Re: Tetris   Tetris EmptyDim 22 Fév 2015 - 20:24

Ah tant mieux, ça me rassure, je ne voyais vraiment pas pourquoi et je n'arrivais pas à le reproduire... Content que ça marche bien.
Revenir en haut Aller en bas
Contenu sponsorisé





Tetris Empty
MessageSujet: Re: Tetris   Tetris Empty

Revenir en haut Aller en bas
 
Tetris
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Les jeux faits avec Panoramic-
Sauter vers: