Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | Calendrier |
|
| | Tangram | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Tangram Lun 23 Fév 2015 - 15:57 | |
| Voici une version de Tangram. Elle propose deux fenêtres: à gauche, on a un terrain de jeu dans lequel on trouve les 7 pièces classiques du Tangram, et la matérialisation de la cible au milieu. A droite, on a une fenêtre d'outils qui matérialise chacune de ces 7 pièces. Associés à chaque pièce, il y a 6 boutons: 2 pour la rotation à droite et à gauche, de 45 degrés chaque fois. Et 4 autres pour le déplacement dans les 4 directions. Il y a aussi un bouton pour réinitialiser le jeu, et un sélecteur de cibles (seul le carré est disponible pour le moment). Ce programme peut fonctionner en mode 100 % Panoramic. Mais il y a évidemment des problèmes de clignotement lors des différents affichages. Alors, en début du code, il y a une variable KGF$ qui contient le chemin complet vers KGF.dll. Si cette DLL est trouvée, elle sera alors utilisée pour une seule fonction: SetFormProperties, ce qui élimine complètement le clignotement. Spectaculaire. - Code:
-
' Tangram.bas
label click, touche
dim unite% : unite% = 160 dim bord% : bord% = 10 dim KGF$ : KGF$ = "C:\Users\klausgunther\Documents\Mes projets\Mes projets Delphi\KGF\KGF.dll" if file_exists(KGF$)=0 then KGF$ = ""
dim pieces%(7,6) ' (n%,d%) n%=numéro de pièce (1...7) ' d%=0 flag "présent" 0/1 ' d%=1 n% ' d%=2 x% dans 101 ' d%=3 y% dans 101 ' d%=4 degré de rotation ' d%=5 x% dans 1 ' d%=6 y% dans 1
dim xp%, yp%, base1%, modele%
width 0,4*unite%+2*bord% + 16 height 0,4.5*unite%+2*bord% + 39 caption 0,"Tangram" on_key_down 0,touche
picture 1 : width 1,4*unite%+2*bord% : height 1,4.5*unite%+2*bord% 2d_target_is 1 print_target_is 1
form 100 : top 100,top(0) : left 100,left(0)+width(0) height 100,height(0) : width 100,3*unite% picture 101 : parent 101,100 : full_space 101
button 102 : parent 102,100 : top 102,height(100)-80 : left 102,10 caption 102,"Initialiser" : on_click 102,click
combo 103 : parent 103,100 : top 103,height(100)-110 : left 103,10 : on_click 103,click item_add 103,"Le carré" text 103,item_read$(103,1) modele% = 1
if KGF$<>"" then dll_on KGF$ initialiser()
end
touche: return
click: traiter_click(number_click) return sub traiter_click(id%) dim_local res% off_click id% if KGF$<>"" then res% = dll_call3("SetFormProperties",object_internal(0),1,1+2+4) select id% case 1: ' terrain case 102: ' initialiser initialiser() case 103: ' choix du modèle modele% = item_index(103) initialiser() case 111: ' pièce 1 à gauche effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,1) case 121: ' pièce 1 à droite effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,-1) case 131: ' déplacement à gauche pieces%(1,5) = pieces%(1,5) - unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0) case 141: ' déplacement en haut pieces%(1,6) = pieces%(1,6) - unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0) case 151: ' déplacement à droite pieces%(1,5) = pieces%(1,5) + unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0) case 161: ' déplacement en bas pieces%(1,6) = pieces%(1,6) + unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0)
case 112: ' pièce 2 à gauche effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,1) case 122: ' pièce 2 à droite effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,-1) case 132: ' déplacement à gauche pieces%(2,5) = pieces%(2,5) - unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0) case 142: ' déplacement en haut pieces%(2,6) = pieces%(2,6) - unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0) case 152: ' déplacement à droite pieces%(2,5) = pieces%(2,5) + unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0) case 162: ' déplacement en bas pieces%(2,6) = pieces%(2,6) + unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0)
case 113: ' pièce 3 à gauche effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,1) case 123: ' pièce 3 à droite effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,-1) case 133: ' déplacement à gauche pieces%(3,5) = pieces%(3,5) - unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0) case 143: ' déplacement en haut pieces%(3,6) = pieces%(3,6) - unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0) case 153: ' déplacement à droite pieces%(3,5) = pieces%(3,5) + unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0) case 163: ' déplacement en bas pieces%(3,6) = pieces%(3,6) + unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0)
case 114: ' pièce 4 à gauche effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,1) case 124: ' pièce 4 à droite effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,-1) case 134: ' déplacement à gauche pieces%(4,5) = pieces%(4,5) - unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0) case 144: ' déplacement en haut pieces%(4,6) = pieces%(4,6) - unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0) case 154: ' déplacement à droite pieces%(4,5) = pieces%(4,5) + unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0) case 164: ' déplacement en bas pieces%(4,6) = pieces%(4,6) + unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0)
case 115: ' pièce 5 à gauche effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,1) case 125: ' pièce 5 à droite effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,-1) case 135: ' déplacement à gauche pieces%(5,5) = pieces%(5,5) - unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0) case 145: ' déplacement en haut pieces%(5,6) = pieces%(5,6) - unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0) case 155: ' déplacement à droite pieces%(5,5) = pieces%(5,5) + unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0) case 165: ' déplacement en bas pieces%(5,6) = pieces%(5,6) + unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0)
case 116: ' pièce 6 à gauche effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,1) case 126: ' pièce 6 à droite effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,-1) case 136: ' déplacement à gauche pieces%(6,5) = pieces%(6,5) - unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0) case 146: ' déplacement en haut pieces%(6,6) = pieces%(6,6) - unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0) case 156: ' déplacement à droite pieces%(6,5) = pieces%(6,5) + unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0) case 166: ' déplacement en bas pieces%(6,6) = pieces%(6,6) + unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0)
case 117: ' pièce 7 à gauche effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,1) case 127: ' pièce 7 à droite effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,-1) case 137: ' déplacement à gauche pieces%(7,5) = pieces%(7,5) - unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0) case 147: ' déplacement en haut pieces%(7,6) = pieces%(7,6) - unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0) case 157: ' déplacement à droite pieces%(7,5) = pieces%(7,5) + unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0) case 167: ' déplacement en bas pieces%(7,6) = pieces%(7,6) + unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0)
end_select if KGF$<>"" then res% = dll_call3("SetFormProperties",object_internal(0),1,0) on_click id%,click end_sub sub initialiser() dim_local i%, xbase%, ybase%, xunite%
if object_exists(131)=1 active 131 : active 132 : active 133 : active 134 : active 135 : active 136 : active 137 end_if xunite% = unite%/2 color 1,255,127,127 font_color 1,255,255,255 font_bold 1 2d_target_is 1 2d_pen_color 102,0,0 2d_pen_width 2 for i%=1 to 7 pieces%(i%,0) = 0 : ' pièce absente pieces%(i%,1) = i% : ' numéro de pièce pieces%(i%,2) = 0 : ' coordonnée x pieces%(i%,3) = 0 : ' coordonnée y pieces%(i%,4) = 0 : ' rotation en ° next i% ' afficher le modèle select modele% case 1: ' le carré 2d_target_is 1 2d_pen_color 0,0,0 2d_fill_color 255,127,127 2d_rectangle bord%+unite%,bord%+unite%,bord%+2*unite%,bord%+2*unite% 2d_pen_color 102,0,0 end_select color 101,255,127,127 2d_target_is 101 2d_pen_color 102,0,0 2d_fill_color 204,0,0 2d_pen_width 2 print_target_is 101 font_bold 101 ' pièce 1: grand triangle isocèle rectangle xbase% = bord% + 80 base1% = bord% ybase% = bord% dessiner_grand_triangle(101,1,xunite%,xbase%,ybase%,0) dessiner_grand_triangle( 1,1, -1,base1%, -1,0) creer_boutons(1,xbase%,ybase%)
' pièce 2: grand triangle isocèle rectangle ybase% = ybase% + unite%*1.25 dessiner_grand_triangle(101,2,xunite%,xbase%,ybase%,0) dessiner_grand_triangle( 1,2, -1,base1%, -1,0) creer_boutons(2,xbase%,ybase%)
' pièce 3: parallélogramme ybase% = ybase% + unite%*1.25 dessiner_parallelogramme(101,3,xunite%,xbase%,ybase%,0) dessiner_parallelogramme( 1,3, -1,base1%, -1,0) creer_boutons(3,xbase%,ybase%)
' piece 4: petit triangle isocèle xbase% = bord% + 80 + unite%*1.5 base1% = bord% + unite%*3.5 ybase% = bord% dessiner_petit_triangle(101,4,xunite%,xbase%,ybase%,0) dessiner_petit_triangle( 1,4, -1,base1%, -1,0) creer_boutons(4,xbase%,ybase%)
' pièce 5: carré ybase% = ybase% + unite%*1.25 dessiner_carre(101,5,xunite%,xbase%,ybase%,0) dessiner_carre( 1,5, -1,base1%, -1,0) creer_boutons(5,xbase%,ybase%)
' piece 6: petit triangle isocèle ybase% = ybase% + unite%*1.25 dessiner_petit_triangle(101,6,xunite%,xbase%,ybase%,0) dessiner_petit_triangle( 1,6, -1,base1%, -1,0) creer_boutons(6,xbase%,ybase%)
' pièce 7: moyen triangle isocèle ybase% = ybase% + unite%*1.25 dessiner_moyen_triangle(101,7,xunite%,xbase%,ybase%,0) dessiner_moyen_triangle( 1,7, -1,base1%, -1,0) creer_boutons(7,xbase%,ybase%)
end_sub
sub effacer_piece(xid%)
color 1,255,127,127
' afficher le modèle select modele% case 1: ' le carré 2d_target_is 1 2d_pen_color 0,0,0 2d_fill_color 255,127,127 2d_rectangle bord%+unite%,bord%+unite%,bord%+2*unite%,bord%+2*unite% 2d_pen_color 102,0,0 end_select
if xid%<>1 if pieces%(1,0)>0 then dessiner_grand_triangle(1,1,-1,-1,-1,0) end_if if xid%<>2 if pieces%(2,0)>0 then dessiner_grand_triangle(1,2,-1,-1,-1,0) end_if if xid%<>3 if pieces%(3,0)>0 then dessiner_parallelogramme(1,3,-1,-1,-1,0) end_if if xid%<>4 if pieces%(4,0)>0 then dessiner_petit_triangle(1,4,-1,-1,-1,0) end_if if xid%<>5 if pieces%(5,0)>0 then dessiner_carre(1,5,-1,-1,-1,0) end_if if xid%<>6 if pieces%(6,0)>0 then dessiner_petit_triangle(1,6,-1,-1,-1,0) end_if if xid%<>7 if pieces%(7,0)>0 then dessiner_moyen_triangle(1,7,-1,-1,-1,0) end_if end_sub
sub rotation(x0%,y0%,x1%,y1%,pix) xp% = (x1%-x0%)*cos(pix) - (y1%-y0%)*sin(pix) + x0% yp% = (x1%-x0%)*sin(pix) + (y1%-y0%)*cos(pix) + y0% end_sub
sub dessiner_grand_triangle(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, r%, x0%, y0%, angle% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' + xunite%/2 y0% = ybase% : ' + xunite% ' points du polygone rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+xunite%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+xunite%*2,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+xunite%/2,ybase%+xunite%,pix) 2d_flood xp%,yp%,204,0,0 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%) pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_parallelogramme(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' + xunite%/4 y0% = ybase% : ' +delta%+xunite%/4 ' points du polygone rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+delta%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+xunite%/4,ybase%+delta%+xunite%/4,pix) 2d_flood xp%,yp%,204,0,0 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%) pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_petit_triangle(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% y0% = ybase% : ' +delta% ' points du polygone rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%+delta%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+delta%/3,ybase%+delta%,pix) 2d_flood xp%,yp%,204,0,0 2d_circle xp%,yp%,10 print_locate xp%-5,yp%-7 print str$(id%) pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_carre(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' +delta% y0% = ybase% : ' +delta% ' points du polygone rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%+xunite%,ybase%+delta%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+delta%,ybase%+delta%,pix) 2d_flood xp%,yp%,204,0,0 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%)
pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_moyen_triangle(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' +delta%/2 y0% = ybase% : ' +delta%/2 ' points du polygone rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+xunite%,ybase%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+delta%/2,ybase%+delta%/2,pix) 2d_flood xp%,yp%,204,0,0 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%)
pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub creer_boutons(n%,xbase%,ybase%) dim_local b%, b1%, b2% b% = 110 + n% : ' rotation à gauche if object_exists(b%)=1 then exit_sub button b% : parent b%,100 : width b%,30 : left b%,xbase%-80 : top b%,ybase% on_click b%,click : caption b%,"<" b1% = 120 + n% : ' rotation à droite button b1% : parent b1%,100 : width b1%,30 : left b1%,xbase%-40 : top b1%,ybase% on_click b1%,click : caption b1%,">" b% = 130 + n% : ' déplacement à gauche button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-80 : top b%,ybase%+60 on_click b%,click : caption b%,"<" b% = 140 + n% : ' déplacement en haut button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-60 : top b%,ybase%+40 on_click b%,click : caption b%,"^" b% = 150 + n% : ' déplacement à droite button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-40 : top b%,ybase%+60 on_click b%,click : caption b%,">" b% = 160 + n% : ' déplacement en bas button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-60 : top b%,ybase%+80 on_click b%,click : caption b%,"v"
end_sub
Dernière édition par Klaus le Lun 23 Fév 2015 - 17:42, édité 2 fois | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Tangram Lun 23 Fév 2015 - 16:16 | |
| Super ton jeu. J'ai toutefois l'impression que la pièce 3 est à l'envers (ou c'est moi qui est mal positionné les pièce, ce qui est possible)
PS pour le déplacement des pièces, pourquoi n'utilises tu pas le drag and drop ? | |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tangram Lun 23 Fév 2015 - 16:45 | |
| | |
| | | Jean Claude
Nombre de messages : 5950 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Tangram Lun 23 Fév 2015 - 17:25 | |
| Salut Klaus, En pure Panoramic çà fonctionne. Mais avec kgf.dll il y a un problème à la ligne 59 - Code:
-
if KGF$<>"" then res% = dll_call3("SetFormProperties",object_internal(0),1,1+2+4) J'ai réussi ce jeu en moins de 5mn. A+ | |
| | | papydall
Nombre de messages : 7009 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Tangram Lun 23 Fév 2015 - 17:28 | |
| Bravo Klaus. - Citation :
- As-tu remarqué la différence entre les deux modes de fonctionnement, avec ou sans la DLL ?
Si Jack teste ce jeu, il sera sans doute plus motivé à résoudre une fois pour toute ce clignotement désagréable. Mais rien ne presse : la Kaus Gunther File.DLL est là! EDIT : @Jean Claude On s'est croisé. As-tu la dernière version de la KGF.dll? Chez moi, c'est nickel.
Dernière édition par papydall le Lun 23 Fév 2015 - 17:31, édité 1 fois | |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tangram Lun 23 Fév 2015 - 17:30 | |
| @Jean-Claude: tu n'as visiblement pas la dernière version, qui ajoute justement cette fonction...
@¨Papydall: Tu as presque décrypté mes initiales... Mais F ne représente pas File. | |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tangram Lun 23 Fév 2015 - 18:48 | |
| Voici une version qui permet d'utiliser le clavier également pour déplacer ou retourner les pièces. Il suffit de cliquer une fois sur une des pièces dans le terrain de jeu pour la sélectionner. Ensuite, on peut la déplacer également par les 4 flèches du clavier pour les directions, et la touche "Espace" pour une rotation à gauche. Les boutons de la fenêtre d'outils restent bien sûr actifs également. Et cette version permet également de "tirer" une pièce avec la souris, ce qui est utile si le positionnement par grille magnétique n'est pas suffisant ! - Code:
-
' Tangram.bas
label click, touche
dim unite% : unite% = 160 dim bord% : bord% = 10 dim KGF$ : KGF$ = "C:\Users\klausgunther\Documents\Mes projets\Mes projets Delphi\KGF\KGF.dll" if file_exists(KGF$)=0 then KGF$ = ""
dim pieces%(7,6) ' (n%,d%) n%=numéro de pièce (1...7) ' d%=0 flag "présent" 0/1 ' d%=1 n% ' d%=2 x% dans 101 ' d%=3 y% dans 101 ' d%=4 degré de rotation ' d%=5 x% dans 1 ' d%=6 y% dans 1
dim xp%, yp%, base1%, modele%, act%
width 0,4*unite%+2*bord% + 16 height 0,4.5*unite%+2*bord% + 39 caption 0,"Tangram" on_key_down 0,touche
picture 1 : width 1,4*unite%+2*bord% : height 1,4.5*unite%+2*bord% on_click 1,click 2d_target_is 1 print_target_is 1
form 100 : top 100,top(0) : left 100,left(0)+width(0) height 100,height(0) : width 100,3*unite% picture 101 : parent 101,100 : full_space 101
button 102 : parent 102,100 : top 102,height(100)-80 : left 102,10 caption 102,"Initialiser" : on_click 102,click
combo 103 : parent 103,100 : top 103,height(100)-110 : left 103,10 : on_click 103,click item_add 103,"Le carré" text 103,item_read$(103,1) modele% = 1
if KGF$<>"" then dll_on KGF$ initialiser()
end
touche: traiter_touche() return
click: traiter_click(number_click) return sub traiter_touche() off_key_down 0 dim_local scn% if act%>0 scn% = scancode select scn% case 37: ' flèche gauche pieces%(act%,5) = pieces%(act%,5) - unite%/4 effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select case 38: ' flèche haut pieces%(act%,6) = pieces%(act%,6) - unite%/4 effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select case 39: ' flèche droite pieces%(act%,5) = pieces%(act%,5) + unite%/4 effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select case 40: ' flèche bas pieces%(act%,6) = pieces%(act%,6) + unite%/4 effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select case 32: ' espace (rotation gauche) effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,1) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,1) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,1) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,1) case 5: dessiner_carre(1,act%,-1,-1,-1,1) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,1) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,1) end_select end_select end_if on_key_down 0,touche end_sub sub traiter_click(id%) off_click id% dim_local res%, xpos%, ypos% if KGF$<>"" then res% = dll_call3("SetFormProperties",object_internal(0),1,1+2+4) act% = 0 if (id%>110) and (id%<170) then act% = id% - int(id%/10)*10 select id% case 1: ' terrain xpos% = mouse_x_position(1) ypos% = mouse_y_position(1) act% = color_pixel_blue(1,mouse_x_left_down(1),mouse_y_left_down(1)) if act%>7 then act% = 0 if act%>0 if (xpos%<>mouse_x_left_down(1)) or (xpos%<>mouse_y_left_down(1)) pieces%(act%,5) = pieces%(act%,5) + xpos% - mouse_x_left_down(1) pieces%(act%,6) = pieces%(act%,6) + ypos% - mouse_y_left_down(1) effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select end_if end_if case 102: ' initialiser initialiser() case 103: ' choix du modèle modele% = item_index(103) initialiser() case 111: ' pièce 1 à gauche effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,1) case 121: ' pièce 1 à droite effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,-1) case 131: ' déplacement à gauche pieces%(1,5) = pieces%(1,5) - unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0) case 141: ' déplacement en haut pieces%(1,6) = pieces%(1,6) - unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0) case 151: ' déplacement à droite pieces%(1,5) = pieces%(1,5) + unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0) case 161: ' déplacement en bas pieces%(1,6) = pieces%(1,6) + unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0)
case 112: ' pièce 2 à gauche effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,1) case 122: ' pièce 2 à droite effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,-1) case 132: ' déplacement à gauche pieces%(2,5) = pieces%(2,5) - unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0) case 142: ' déplacement en haut pieces%(2,6) = pieces%(2,6) - unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0) case 152: ' déplacement à droite pieces%(2,5) = pieces%(2,5) + unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0) case 162: ' déplacement en bas pieces%(2,6) = pieces%(2,6) + unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0)
case 113: ' pièce 3 à gauche effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,1) case 123: ' pièce 3 à droite effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,-1) case 133: ' déplacement à gauche pieces%(3,5) = pieces%(3,5) - unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0) case 143: ' déplacement en haut pieces%(3,6) = pieces%(3,6) - unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0) case 153: ' déplacement à droite pieces%(3,5) = pieces%(3,5) + unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0) case 163: ' déplacement en bas pieces%(3,6) = pieces%(3,6) + unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0)
case 114: ' pièce 4 à gauche effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,1) case 124: ' pièce 4 à droite effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,-1) case 134: ' déplacement à gauche pieces%(4,5) = pieces%(4,5) - unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0) case 144: ' déplacement en haut pieces%(4,6) = pieces%(4,6) - unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0) case 154: ' déplacement à droite pieces%(4,5) = pieces%(4,5) + unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0) case 164: ' déplacement en bas pieces%(4,6) = pieces%(4,6) + unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0)
case 115: ' pièce 5 à gauche effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,1) case 125: ' pièce 5 à droite effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,-1) case 135: ' déplacement à gauche pieces%(5,5) = pieces%(5,5) - unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0) case 145: ' déplacement en haut pieces%(5,6) = pieces%(5,6) - unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0) case 155: ' déplacement à droite pieces%(5,5) = pieces%(5,5) + unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0) case 165: ' déplacement en bas pieces%(5,6) = pieces%(5,6) + unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0)
case 116: ' pièce 6 à gauche effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,1) case 126: ' pièce 6 à droite effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,-1) case 136: ' déplacement à gauche pieces%(6,5) = pieces%(6,5) - unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0) case 146: ' déplacement en haut pieces%(6,6) = pieces%(6,6) - unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0) case 156: ' déplacement à droite pieces%(6,5) = pieces%(6,5) + unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0) case 166: ' déplacement en bas pieces%(6,6) = pieces%(6,6) + unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0)
case 117: ' pièce 7 à gauche effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,1) case 127: ' pièce 7 à droite effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,-1) case 137: ' déplacement à gauche pieces%(7,5) = pieces%(7,5) - unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0) case 147: ' déplacement en haut pieces%(7,6) = pieces%(7,6) - unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0) case 157: ' déplacement à droite pieces%(7,5) = pieces%(7,5) + unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0) case 167: ' déplacement en bas pieces%(7,6) = pieces%(7,6) + unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0)
end_select if KGF$<>"" then res% = dll_call3("SetFormProperties",object_internal(0),1,0) on_click id%,click end_sub
sub initialiser() dim_local i%, xbase%, ybase%, xunite%
if object_exists(131)=1 active 131 : active 132 : active 133 : active 134 : active 135 : active 136 : active 137 end_if xunite% = unite%/2 color 1,255,127,127 font_color 1,255,255,255 font_bold 1 2d_target_is 1 2d_pen_color 102,0,0 2d_pen_width 2 for i%=1 to 7 pieces%(i%,0) = 0 : ' pièce absente pieces%(i%,1) = i% : ' numéro de pièce pieces%(i%,2) = 0 : ' coordonnée x pieces%(i%,3) = 0 : ' coordonnée y pieces%(i%,4) = 0 : ' rotation en ° next i% ' afficher le modèle select modele% case 1: ' le carré 2d_target_is 1 2d_pen_color 0,0,0 2d_fill_color 255,127,127 2d_rectangle bord%+unite%,bord%+unite%,bord%+2*unite%,bord%+2*unite% 2d_pen_color 102,0,0 end_select color 101,255,127,127 2d_target_is 101 2d_pen_color 102,0,0 2d_fill_color 204,0,0 2d_pen_width 2 print_target_is 101 font_bold 101 ' pièce 1: grand triangle isocèle rectangle xbase% = bord% + 80 base1% = bord% ybase% = bord% dessiner_grand_triangle(101,1,xunite%,xbase%,ybase%,0) dessiner_grand_triangle( 1,1, -1,base1%, -1,0) creer_boutons(1,xbase%,ybase%)
' pièce 2: grand triangle isocèle rectangle ybase% = ybase% + unite%*1.25 dessiner_grand_triangle(101,2,xunite%,xbase%,ybase%,0) dessiner_grand_triangle( 1,2, -1,base1%, -1,0) creer_boutons(2,xbase%,ybase%)
' pièce 3: parallélogramme ybase% = ybase% + unite%*1.25 dessiner_parallelogramme(101,3,xunite%,xbase%,ybase%,0) dessiner_parallelogramme( 1,3, -1,base1%, -1,0) creer_boutons(3,xbase%,ybase%)
' piece 4: petit triangle isocèle xbase% = bord% + 80 + unite%*1.5 base1% = bord% + unite%*3.5 ybase% = bord% dessiner_petit_triangle(101,4,xunite%,xbase%,ybase%,0) dessiner_petit_triangle( 1,4, -1,base1%, -1,0) creer_boutons(4,xbase%,ybase%)
' pièce 5: carré ybase% = ybase% + unite%*1.25 dessiner_carre(101,5,xunite%,xbase%,ybase%,0) dessiner_carre( 1,5, -1,base1%, -1,0) creer_boutons(5,xbase%,ybase%)
' piece 6: petit triangle isocèle ybase% = ybase% + unite%*1.25 dessiner_petit_triangle(101,6,xunite%,xbase%,ybase%,0) dessiner_petit_triangle( 1,6, -1,base1%, -1,0) creer_boutons(6,xbase%,ybase%)
' pièce 7: moyen triangle isocèle ybase% = ybase% + unite%*1.25 dessiner_moyen_triangle(101,7,xunite%,xbase%,ybase%,0) dessiner_moyen_triangle( 1,7, -1,base1%, -1,0) creer_boutons(7,xbase%,ybase%)
end_sub
sub effacer_piece(xid%)
color 1,255,127,127
' afficher le modèle select modele% case 1: ' le carré 2d_target_is 1 2d_pen_color 0,0,0 2d_fill_color 255,127,127 2d_rectangle bord%+unite%,bord%+unite%,bord%+2*unite%,bord%+2*unite% 2d_pen_color 102,0,0 end_select
if xid%<>1 if pieces%(1,0)>0 then dessiner_grand_triangle(1,1,-1,-1,-1,0) end_if if xid%<>2 if pieces%(2,0)>0 then dessiner_grand_triangle(1,2,-1,-1,-1,0) end_if if xid%<>3 if pieces%(3,0)>0 then dessiner_parallelogramme(1,3,-1,-1,-1,0) end_if if xid%<>4 if pieces%(4,0)>0 then dessiner_petit_triangle(1,4,-1,-1,-1,0) end_if if xid%<>5 if pieces%(5,0)>0 then dessiner_carre(1,5,-1,-1,-1,0) end_if if xid%<>6 if pieces%(6,0)>0 then dessiner_petit_triangle(1,6,-1,-1,-1,0) end_if if xid%<>7 if pieces%(7,0)>0 then dessiner_moyen_triangle(1,7,-1,-1,-1,0) end_if end_sub
sub rotation(x0%,y0%,x1%,y1%,pix) xp% = (x1%-x0%)*cos(pix) - (y1%-y0%)*sin(pix) + x0% yp% = (x1%-x0%)*sin(pix) + (y1%-y0%)*cos(pix) + y0% end_sub
sub dessiner_grand_triangle(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, r%, x0%, y0%, angle% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' + xunite%/2 y0% = ybase% : ' + xunite% ' points du polygone rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+xunite%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+xunite%*2,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+xunite%/2,ybase%+xunite%,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%) pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_parallelogramme(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' + xunite%/4 y0% = ybase% : ' +delta%+xunite%/4 ' points du polygone rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+delta%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+xunite%/4,ybase%+delta%+xunite%/4,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%) pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_petit_triangle(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% y0% = ybase% : ' +delta% ' points du polygone rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%+delta%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+delta%/3,ybase%+delta%,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,10 print_locate xp%-5,yp%-7 print str$(id%) pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_carre(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' +delta% y0% = ybase% : ' +delta% ' points du polygone rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%+xunite%,ybase%+delta%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+delta%,ybase%+delta%,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%)
pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_moyen_triangle(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' +delta%/2 y0% = ybase% : ' +delta%/2 ' points du polygone rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+xunite%,ybase%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+delta%/2,ybase%+delta%/2,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%)
pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub creer_boutons(n%,xbase%,ybase%) dim_local b%, b1%, b2% b% = 110 + n% : ' rotation à gauche if object_exists(b%)=1 then exit_sub button b% : parent b%,100 : width b%,30 : left b%,xbase%-80 : top b%,ybase% on_click b%,click : caption b%,"<" b1% = 120 + n% : ' rotation à droite button b1% : parent b1%,100 : width b1%,30 : left b1%,xbase%-40 : top b1%,ybase% on_click b1%,click : caption b1%,">" b% = 130 + n% : ' déplacement à gauche button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-80 : top b%,ybase%+60 on_click b%,click : caption b%,"<" b% = 140 + n% : ' déplacement en haut button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-60 : top b%,ybase%+40 on_click b%,click : caption b%,"^" b% = 150 + n% : ' déplacement à droite button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-40 : top b%,ybase%+60 on_click b%,click : caption b%,">" b% = 160 + n% : ' déplacement en bas button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-60 : top b%,ybase%+80 on_click b%,click : caption b%,"v"
end_sub
| |
| | | Jean Claude
Nombre de messages : 5950 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Tangram Lun 23 Fév 2015 - 19:14 | |
| J'aurais du penser que je n'avais pas la bonne dll Elle change tellement souvent... @Papydall, Klaus à choisi le F car le B çà fait trop soviétique A+ | |
| | | Yannick
Nombre de messages : 8611 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 23 Fév 2015 - 21:00 | |
| Par les temps qui courent, avec un B, on aurait pu la prendre pour un spyware... Edit : désolé, c' était trop tentant... ...c' est bon, je sors. | |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tangram Lun 23 Fév 2015 - 22:37 | |
| Voici une version qui offre 4 possibilités pour le modèle: 1 - aucun (page vierge) 2 - carré (défaut) 3 - pyramide 4 - chameau Tous ces modèles sont affichés sous forme de contours noirs dans le terrain de jeu, et il faut les remplir. Il y aura sûrement d'autres modèles. - Code:
-
' Tangram.bas
label click, touche
dim unite% : unite% = 160 dim bord% : bord% = 10 dim KGF$ : KGF$ = "C:\Users\klausgunther\Documents\Mes projets\Mes projets Delphi\KGF\KGF.dll" if file_exists(KGF$)=0 then KGF$ = ""
dim pieces%(7,6) ' (n%,d%) n%=numéro de pièce (1...7) ' d%=0 flag "présent" 0/1 ' d%=1 n% ' d%=2 x% dans 101 ' d%=3 y% dans 101 ' d%=4 degré de rotation ' d%=5 x% dans 1 ' d%=6 y% dans 1
dim xp%, yp%, base1%, modele%, act%
width 0,4*unite%+2*bord% + 16 height 0,4.5*unite%+2*bord% + 39 caption 0,"Tangram" on_key_down 0,touche
picture 1 : width 1,4*unite%+2*bord% : height 1,4.5*unite%+2*bord% on_click 1,click 2d_target_is 1 print_target_is 1
form 100 : top 100,top(0) : left 100,left(0)+width(0) height 100,height(0) : width 100,3*unite% picture 101 : parent 101,100 : full_space 101
button 102 : parent 102,100 : top 102,height(100)-80 : left 102,10 caption 102,"Initialiser" : on_click 102,click
combo 103 : parent 103,100 : top 103,height(100)-110 : left 103,10 : on_click 103,click item_add 103,"<aucun>" item_add 103,"Le carré" item_add 103,"La pyramide" item_add 103,"Le chameau" modele% = 2 text 103,item_read$(103,modele%)
if KGF$<>"" then dll_on KGF$ initialiser()
end
touche: traiter_touche() return
click: traiter_click(number_click) return sub traiter_touche() dim_local res% off_key_down 0 dim_local scn% if act%>0 if KGF$<>"" then res% = dll_call3("SetFormProperties",object_internal(0),1,1+2+4) scn% = scancode select scn% case 37: ' flèche gauche pieces%(act%,5) = pieces%(act%,5) - unite%/4 effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select case 38: ' flèche haut pieces%(act%,6) = pieces%(act%,6) - unite%/4 effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select case 39: ' flèche droite pieces%(act%,5) = pieces%(act%,5) + unite%/4 effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select case 40: ' flèche bas pieces%(act%,6) = pieces%(act%,6) + unite%/4 effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select case 32: ' espace (rotation gauche) effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,1) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,1) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,1) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,1) case 5: dessiner_carre(1,act%,-1,-1,-1,1) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,1) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,1) end_select end_select if KGF$<>"" then res% = dll_call3("SetFormProperties",object_internal(0),1,0) end_if on_key_down 0,touche end_sub sub traiter_click(id%) off_click id% dim_local res%, xpos%, ypos% if KGF$<>"" then res% = dll_call3("SetFormProperties",object_internal(0),1,1+2+4) act% = 0 if (id%>110) and (id%<170) then act% = id% - int(id%/10)*10 select id% case 1: ' terrain xpos% = mouse_x_position(1) ypos% = mouse_y_position(1) act% = color_pixel_blue(1,mouse_x_left_down(1),mouse_y_left_down(1)) if act%>7 then act% = 0 if act%>0 if (xpos%<>mouse_x_left_down(1)) or (xpos%<>mouse_y_left_down(1)) pieces%(act%,5) = pieces%(act%,5) + xpos% - mouse_x_left_down(1) pieces%(act%,6) = pieces%(act%,6) + ypos% - mouse_y_left_down(1) effacer_piece(act%) select act% case 1: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 2: dessiner_grand_triangle(1,act%,-1,-1,-1,0) case 3: dessiner_parallelogramme(1,act%,-1,-1,-1,0) case 4: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 5: dessiner_carre(1,act%,-1,-1,-1,0) case 6: dessiner_petit_triangle(1,act%,-1,-1,-1,0) case 7: dessiner_moyen_triangle(1,act%,-1,-1,-1,0) end_select end_if end_if case 102: ' initialiser initialiser() case 103: ' choix du modèle modele% = item_index(103) initialiser() case 111: ' pièce 1 à gauche effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,1) case 121: ' pièce 1 à droite effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,-1) case 131: ' déplacement à gauche pieces%(1,5) = pieces%(1,5) - unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0) case 141: ' déplacement en haut pieces%(1,6) = pieces%(1,6) - unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0) case 151: ' déplacement à droite pieces%(1,5) = pieces%(1,5) + unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0) case 161: ' déplacement en bas pieces%(1,6) = pieces%(1,6) + unite%/4 effacer_piece(1) dessiner_grand_triangle(1,1,-1,-1,-1,0)
case 112: ' pièce 2 à gauche effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,1) case 122: ' pièce 2 à droite effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,-1) case 132: ' déplacement à gauche pieces%(2,5) = pieces%(2,5) - unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0) case 142: ' déplacement en haut pieces%(2,6) = pieces%(2,6) - unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0) case 152: ' déplacement à droite pieces%(2,5) = pieces%(2,5) + unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0) case 162: ' déplacement en bas pieces%(2,6) = pieces%(2,6) + unite%/4 effacer_piece(2) dessiner_grand_triangle(1,2,-1,-1,-1,0)
case 113: ' pièce 3 à gauche effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,1) case 123: ' pièce 3 à droite effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,-1) case 133: ' déplacement à gauche pieces%(3,5) = pieces%(3,5) - unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0) case 143: ' déplacement en haut pieces%(3,6) = pieces%(3,6) - unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0) case 153: ' déplacement à droite pieces%(3,5) = pieces%(3,5) + unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0) case 163: ' déplacement en bas pieces%(3,6) = pieces%(3,6) + unite%/4 effacer_piece(3) dessiner_parallelogramme(1,3,-1,-1,-1,0)
case 114: ' pièce 4 à gauche effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,1) case 124: ' pièce 4 à droite effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,-1) case 134: ' déplacement à gauche pieces%(4,5) = pieces%(4,5) - unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0) case 144: ' déplacement en haut pieces%(4,6) = pieces%(4,6) - unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0) case 154: ' déplacement à droite pieces%(4,5) = pieces%(4,5) + unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0) case 164: ' déplacement en bas pieces%(4,6) = pieces%(4,6) + unite%/4 effacer_piece(4) dessiner_petit_triangle(1,4,-1,-1,-1,0)
case 115: ' pièce 5 à gauche effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,1) case 125: ' pièce 5 à droite effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,-1) case 135: ' déplacement à gauche pieces%(5,5) = pieces%(5,5) - unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0) case 145: ' déplacement en haut pieces%(5,6) = pieces%(5,6) - unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0) case 155: ' déplacement à droite pieces%(5,5) = pieces%(5,5) + unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0) case 165: ' déplacement en bas pieces%(5,6) = pieces%(5,6) + unite%/4 effacer_piece(5) dessiner_carre(1,5,-1,-1,-1,0)
case 116: ' pièce 6 à gauche effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,1) case 126: ' pièce 6 à droite effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,-1) case 136: ' déplacement à gauche pieces%(6,5) = pieces%(6,5) - unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0) case 146: ' déplacement en haut pieces%(6,6) = pieces%(6,6) - unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0) case 156: ' déplacement à droite pieces%(6,5) = pieces%(6,5) + unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0) case 166: ' déplacement en bas pieces%(6,6) = pieces%(6,6) + unite%/4 effacer_piece(6) dessiner_petit_triangle(1,6,-1,-1,-1,0)
case 117: ' pièce 7 à gauche effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,1) case 127: ' pièce 7 à droite effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,-1) case 137: ' déplacement à gauche pieces%(7,5) = pieces%(7,5) - unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0) case 147: ' déplacement en haut pieces%(7,6) = pieces%(7,6) - unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0) case 157: ' déplacement à droite pieces%(7,5) = pieces%(7,5) + unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0) case 167: ' déplacement en bas pieces%(7,6) = pieces%(7,6) + unite%/4 effacer_piece(7) dessiner_moyen_triangle(1,7,-1,-1,-1,0)
end_select if KGF$<>"" then res% = dll_call3("SetFormProperties",object_internal(0),1,0) on_click id%,click end_sub
sub modele_carre() dim_local xunite%, x0%, y0%, x1%, y1% 2d_target_is 1 2d_pen_color 0,0,0 2d_fill_color 255,127,127 2d_rectangle bord%+unite%,bord%+unite%,bord%+2*unite%,bord%+2*unite% 2d_pen_color 102,0,0 end_sub
sub modele_pyramide() dim_local xunite%, x0%, y0%, x1%, y1% 2d_target_is 1 2d_pen_color 0,0,0 xunite% = unite%/2 x0% = bord% + unite% y0% = bord% + 3*unite% 2d_poly_from x0%,y0% x1% = x0% + 4*xunite% y1% = y0% 2d_poly_to x1%,y1% x0% = x1% - 2*xunite% y0% = y1% - 2*xunite% 2d_poly_to x0%,y0% x1% = x0% - 2*xunite% y1% = y0% + 2*xunite% 2d_poly_to x1%,y1% 2d_pen_color 102,0,0 end_sub
sub modele_chameau() dim_local xunite%,x0%,y0%,x1%,y1% dim_local x2%,y2% 2d_target_is 1 2d_pen_color 0,0,0 xunite% = unite%/2 x1% = bord%+2*unite% y1% = bord%+3*unite% x2% = x1% y2% = y1%
2d_poly_from x1%,y1% x0% = x1% y0% = y1% - xunite% 2d_poly_to x0%,y0% x1% = x0% + xunite%/2 y1% = y0% - xunite%/2 2d_poly_to x1%,y1% x0% = x1% y0% = y1% - xunite% 2d_poly_to x0%,y0% x1% = x0% + xunite%/2 y1% = y0% - xunite%/2 2d_poly_to x1%,y1% x0% = x1% - xunite% y0% = y1% 2d_poly_to x0%,y0% x1% = x0% y1% = y1% + xunite% 2d_poly_to x1%,y1% x0% = x1% - xunite%/2 y0% = y1% - xunite%/2 2d_poly_to x0%,y0% x1% = x0% - xunite%/2 y1% = y0% + xunite%/2 2d_poly_to x1%,y1% x0% = x1% - xunite%*(sqr(2)/2-0.5) y0% = y1% - xunite%*(sqr(2)/2-0.5) 2d_poly_to x0%,y0% x1% = x0% - xunite%*sqr(2)/2 y1% = y0% + xunite%*sqr(2)/2 2d_poly_to x1%,y1% x0% = x1% y0% = y1% + xunite%*sqr(2) 2d_poly_to x0%,y0% x1% = x0% + xunite%*0.91 y1% = y0% - xunite%*0.91 2d_poly_to x1%,y1% x0% = bord%+2*unite% y0% = bord%+3*unite% 2d_poly_to x0%,y0%
2d_pen_color 102,0,0 end_sub
sub initialiser() dim_local i%, xbase%, ybase%, xunite%
if object_exists(131)=1 active 131 : active 132 : active 133 : active 134 : active 135 : active 136 : active 137 end_if xunite% = unite%/2 for i%=1 to 7 pieces%(i%,0) = 0 : ' pièce absente pieces%(i%,1) = i% : ' numéro de pièce pieces%(i%,2) = 0 : ' coordonnée x pieces%(i%,3) = 0 : ' coordonnée y pieces%(i%,4) = 0 : ' rotation en ° next i% color 1,255,127,127 font_color 1,255,255,255 font_bold 1 2d_pen_width 2
' afficher le modèle select modele% case 1: ' aucun modèle case 2: modele_carre() case 3: modele_pyramide() case 4: modele_chameau() end_select color 101,255,127,127 2d_target_is 101 2d_pen_color 102,0,0 2d_fill_color 204,0,0 2d_pen_width 2 print_target_is 101 font_bold 101 ' pièce 1: grand triangle isocèle rectangle xbase% = bord% + 80 base1% = bord% ybase% = bord% dessiner_grand_triangle(101,1,xunite%,xbase%,ybase%,0) dessiner_grand_triangle( 1,1, -1,base1%, -1,0) creer_boutons(1,xbase%,ybase%)
' pièce 2: grand triangle isocèle rectangle ybase% = ybase% + unite%*1.25 dessiner_grand_triangle(101,2,xunite%,xbase%,ybase%,0) dessiner_grand_triangle( 1,2, -1,base1%, -1,0) creer_boutons(2,xbase%,ybase%)
' pièce 3: parallélogramme ybase% = ybase% + unite%*1.25 dessiner_parallelogramme(101,3,xunite%,xbase%,ybase%,0) dessiner_parallelogramme( 1,3, -1,base1%, -1,0) creer_boutons(3,xbase%,ybase%)
' piece 4: petit triangle isocèle xbase% = bord% + 80 + unite%*1.5 base1% = bord% + unite%*3.5 ybase% = bord% dessiner_petit_triangle(101,4,xunite%,xbase%,ybase%,0) dessiner_petit_triangle( 1,4, -1,base1%, -1,0) creer_boutons(4,xbase%,ybase%)
' pièce 5: carré ybase% = ybase% + unite%*1.25 dessiner_carre(101,5,xunite%,xbase%,ybase%,0) dessiner_carre( 1,5, -1,base1%, -1,0) creer_boutons(5,xbase%,ybase%)
' piece 6: petit triangle isocèle ybase% = ybase% + unite%*1.25 dessiner_petit_triangle(101,6,xunite%,xbase%,ybase%,0) dessiner_petit_triangle( 1,6, -1,base1%, -1,0) creer_boutons(6,xbase%,ybase%)
' pièce 7: moyen triangle isocèle ybase% = ybase% + unite%*1.25 dessiner_moyen_triangle(101,7,xunite%,xbase%,ybase%,0) dessiner_moyen_triangle( 1,7, -1,base1%, -1,0) creer_boutons(7,xbase%,ybase%)
end_sub
sub effacer_piece(xid%)
color 1,255,127,127
' afficher le modèle select modele% case 1: ' aucun modèle case 2: modele_carre() case 3: modele_pyramide() case 4: modele_chameau() end_select
if xid%<>1 if pieces%(1,0)>0 then dessiner_grand_triangle(1,1,-1,-1,-1,0) end_if if xid%<>2 if pieces%(2,0)>0 then dessiner_grand_triangle(1,2,-1,-1,-1,0) end_if if xid%<>3 if pieces%(3,0)>0 then dessiner_parallelogramme(1,3,-1,-1,-1,0) end_if if xid%<>4 if pieces%(4,0)>0 then dessiner_petit_triangle(1,4,-1,-1,-1,0) end_if if xid%<>5 if pieces%(5,0)>0 then dessiner_carre(1,5,-1,-1,-1,0) end_if if xid%<>6 if pieces%(6,0)>0 then dessiner_petit_triangle(1,6,-1,-1,-1,0) end_if if xid%<>7 if pieces%(7,0)>0 then dessiner_moyen_triangle(1,7,-1,-1,-1,0) end_if end_sub
sub rotation(x0%,y0%,x1%,y1%,pix) xp% = (x1%-x0%)*cos(pix) - (y1%-y0%)*sin(pix) + x0% yp% = (x1%-x0%)*sin(pix) + (y1%-y0%)*cos(pix) + y0% end_sub
sub dessiner_grand_triangle(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, r%, x0%, y0%, angle% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' + xunite%/2 y0% = ybase% : ' + xunite% ' points du polygone rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+xunite%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+xunite%*2,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+xunite%/2,ybase%+xunite%,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%) pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_parallelogramme(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' + xunite%/4 y0% = ybase% : ' +delta%+xunite%/4 ' points du polygone rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+delta%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+xunite%/4,ybase%+delta%+xunite%/4,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%) pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_petit_triangle(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% y0% = ybase% : ' +delta% ' points du polygone rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%+delta%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+delta%/3,ybase%+delta%,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,10 print_locate xp%-5,yp%-7 print str$(id%) pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_carre(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' +delta% y0% = ybase% : ' +delta% ' points du polygone rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%+xunite%,ybase%+delta%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%+delta%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+delta%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+delta%,ybase%+delta%,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%)
pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub dessiner_moyen_triangle(target%,id%,pxunite%,pxbase%,pybase%,pxdegre%) dim_local delta%, degre%, xunite%,xbase%,ybase%, x0%, y0% dim_local pi4 : pi4 = atn(1) dim_local pix 2d_target_is target% print_target_is target% if pxunite%<0 xunite% = unite%/2 else xunite% = pxunite% end_if if pxbase%<0 xbase% = pieces%(id%,5) else xbase% = pxbase% end_if if pybase%<0 ybase% = pieces%(id%,6) else ybase% = pybase% end_if delta% = xunite%/2 degre% = pieces%(id%,4) + pxdegre% if degre%>7 then degre% = 0 if degre%<0 then degre% = 7
' centre de rotation pix = pi4*(8 - degre%) x0% = xbase% : ' +delta%/2 y0% = ybase% : ' +delta%/2 ' points du polygone rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_from xp%,yp% rotation(x0%,y0%,xbase%+xunite%,ybase%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%+xunite%,pix) 2d_poly_to xp%,yp% rotation(x0%,y0%,xbase%,ybase%,pix) 2d_poly_to xp%,yp% ' remplissage et étiquette rotation(x0%,y0%,xbase%+delta%/2,ybase%+delta%/2,pix) 2d_flood xp%,yp%,204,0,id% 2d_circle xp%,yp%,15 print_locate xp%-5,yp%-7 print str$(id%)
pieces%(id%,0) = 1 : ' présent pieces%(id%,1) = id% : ' type de pièce pieces%(id%,2) = xbase% : ' adresse horizontale dans 101 pieces%(id%,3) = ybase% : ' adresse verticale dans 101 pieces%(id%,4) = degre% : ' rotation en multiples de 45 degrés pieces%(id%,5) = xbase% : ' adresse horizontale dans 1 pieces%(id%,6) = ybase% : ' adresse verticale dans 1 end_sub
sub creer_boutons(n%,xbase%,ybase%) dim_local b%, b1%, b2% b% = 110 + n% : ' rotation à gauche if object_exists(b%)=1 then exit_sub button b% : parent b%,100 : width b%,30 : left b%,xbase%-80 : top b%,ybase% on_click b%,click : caption b%,"<" b1% = 120 + n% : ' rotation à droite button b1% : parent b1%,100 : width b1%,30 : left b1%,xbase%-40 : top b1%,ybase% on_click b1%,click : caption b1%,">" b% = 130 + n% : ' déplacement à gauche button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-80 : top b%,ybase%+60 on_click b%,click : caption b%,"<" b% = 140 + n% : ' déplacement en haut button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-60 : top b%,ybase%+40 on_click b%,click : caption b%,"^" b% = 150 + n% : ' déplacement à droite button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-40 : top b%,ybase%+60 on_click b%,click : caption b%,">" b% = 160 + n% : ' déplacement en bas button b% : parent b%,100 : width b%,20 : height b%,20 left b%,xbase%-60 : top b%,ybase%+80 on_click b%,click : caption b%,"v"
end_sub
| |
| | | Yannick
Nombre de messages : 8611 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 23 Fév 2015 - 23:44 | |
| Super jeu ! je viens de faire les trois figures et j' ai un peu galéré pour le triangle. | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Tangram Mar 24 Fév 2015 - 1:33 | |
| Testé, nickel (à part quelques problèmes de remplissages quand les pièces passent sur des lignes | |
| | | Jean Claude
Nombre de messages : 5950 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Tangram Mar 24 Fév 2015 - 7:41 | |
| C'est bien plus facile que l’âne rouge, On commence à avoir une belle panoplie de jeux A+ | |
| | | Contenu sponsorisé
| Sujet: Re: Tangram | |
| |
| | | | Tangram | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |