FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Dessin 2D: largeur de trait
par papydall Hier à 23:31

» Projet de planétarium virtuel.
par Jean Claude Hier à 21:59

» PanExpress : l'éditeur Panoramic avec création d'objet
par Jean Claude Hier à 20:32

» Animation: Feux de signalisation
par Minibug Hier à 20:28

» Quantité de mémoire utilisée par un exe
par Jack Mar 19 Juin 2018 - 16:39

» Problème avec 'file_load'.
par Pedro Alvarez Lun 18 Juin 2018 - 8:12

» Version instantanée V 0.9.28i20 du 13/06/2018
par jjn4 Sam 16 Juin 2018 - 14:25

» string$(0,chr$(32)) sans erreur
par silverman Ven 15 Juin 2018 - 19:56

» Version instantanée V 0.9.28i19 du 13/06/2018
par Minibug Ven 15 Juin 2018 - 19:14

» Mes souhaits d'amélioration de Panoramic.
par Pedro Alvarez Jeu 14 Juin 2018 - 20:17

» [RÉSOLU] Message d'erreur impossible à indentifier
par Minibug Mer 13 Juin 2018 - 20:52

» Cadre pour image
par Jean Claude Mar 12 Juin 2018 - 16:31

» Créateur d'objets Panoramic
par Minibug Mar 12 Juin 2018 - 14:02

» Planétarium gratuit.
par Jean Claude Sam 9 Juin 2018 - 18:50

» Comment afficher une image sans fond.
par JL35 Sam 9 Juin 2018 - 14:16

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juin 2018
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier

Partagez | 
 

 Tetris

Aller en bas 
AuteurMessage
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Tetris   Jeu 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
Voir le profil de l'utilisateur
Jean Claude

avatar

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

MessageSujet: Re: Tetris   Ven 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.



A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

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

MessageSujet: Re: Tetris   Ven 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
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Tetris   Ven 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
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Tetris   Ven 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
Voir le profil de l'utilisateur
Jean Claude

avatar

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

MessageSujet: Re: Tetris   Ven 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
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Tetris   Ven 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
Voir le profil de l'utilisateur
Minibug

avatar

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

MessageSujet: Re: Tetris   Ven 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
Voir le profil de l'utilisateur http://gpp.panoramic.free.fr
Yannick

avatar

Nombre de messages : 8077
Age : 47
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Ven 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
Voir le profil de l'utilisateur
Jean Claude

avatar

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

MessageSujet: Re: Tetris   Ven 20 Fév 2015 - 20:50

Il est temps que tu mettes le zip à jour Jicehel Very Happy
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Minibug

avatar

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

MessageSujet: Re: Tetris   Ven 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
Voir le profil de l'utilisateur http://gpp.panoramic.free.fr
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Tetris   Ven 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
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Tetris   Dim 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
Voir le profil de l'utilisateur
Jean Claude

avatar

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

MessageSujet: Re: Tetris   Dim 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
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

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

Dans ce cas, je vais rajouter une petite procédure d'initialisation
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Tetris   Dim 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
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8077
Age : 47
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Dim 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
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Tetris   Dim 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
Voir le profil de l'utilisateur
papydall

avatar

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

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

On finira par en trouver plus coriace !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Jean Claude

avatar

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

MessageSujet: Re: Tetris   Dim 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
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5923
Age : 45
Localisation : 77500
Date d'inscription : 18/04/2011

MessageSujet: Re: Tetris   Dim 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
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Tetris   

Revenir en haut Aller en bas
 
Tetris
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Tetris

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: