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

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Gestion d'un système client-serveur.
Tangram Emptypar Klaus Ven 17 Mai 2024 - 14:02

» item_index(résolu)
Tangram Emptypar jjn4 Mar 14 Mai 2024 - 19:38

» Bataille terrestre
Tangram Emptypar jjn4 Lun 13 Mai 2024 - 15:01

» SineCube
Tangram Emptypar Marc Sam 11 Mai 2024 - 12:38

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Tangram Emptypar Marc Sam 11 Mai 2024 - 12:22

» Philharmusique
Tangram Emptypar jjn4 Ven 10 Mai 2024 - 13:58

» PANORAMIC V 1
Tangram Emptypar papydall Jeu 9 Mai 2024 - 3:22

» select intégrés [résolu]
Tangram Emptypar jjn4 Mer 8 Mai 2024 - 17:00

» number_mouse_up
Tangram Emptypar jjn4 Mer 8 Mai 2024 - 11:59

» Aide de PANORAMIC
Tangram Emptypar jjn4 Mer 8 Mai 2024 - 11:16

» trop de fichiers en cours
Tangram Emptypar lepetitmarocain Mer 8 Mai 2024 - 10:43

» Je teste PANORAMIC V 1 beta 1
Tangram Emptypar papydall Mer 8 Mai 2024 - 4:17

» bouton dans autre form que 0(résolu)
Tangram Emptypar leclode Lun 6 Mai 2024 - 13:59

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

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

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le Deal du moment :
ETB Pokémon Fable Nébuleuse : où ...
Voir le deal

 

 Tangram

Aller en bas 
5 participants
AuteurMessage
Klaus

Klaus


Nombre de messages : 12301
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Tangram Empty
MessageSujet: Tangram   Tangram EmptyLun 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jicehel

Jicehel


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

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyLun 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 ?
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12301
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyLun 23 Fév 2015 - 16:45

Voici une capture d'écran:
Tangram Aa117
de de site:
http://soutien67.free.fr/math/activites/tangram/tangram.htm

Et, de fait, le carré peut être reconstitué par de simples rotations et translations, y compris la pièce 3.

As-tu remarqué la différence entre les deux modes de fonctionnement, avec ou sans la DLL ?
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jean Claude

Jean Claude


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

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyLun 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. Very Happy

A+
Revenir en haut Aller en bas
papydall

papydall


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

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyLun 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 KausGuntherFile.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
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Klaus

Klaus


Nombre de messages : 12301
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyLun 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12301
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyLun 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Jean Claude

Jean Claude


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

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyLun 23 Fév 2015 - 19:14

J'aurais du penser que je n'avais pas la bonne dll Embarassed

Elle change tellement souvent... Very Happy

@Papydall,
Klaus à choisi le F car le B çà fait trop soviétique Razz

A+
Revenir en haut Aller en bas
Yannick




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

Tangram Empty
MessageSujet: re   Tangram EmptyLun 23 Fév 2015 - 21:00

Par les temps qui courent, avec un B,  on aurait pu la prendre pour un spyware...
lol!

Edit : désolé, c' était trop tentant...
...c' est bon, je sors.
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12301
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyLun 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
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Yannick




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

Tangram Empty
MessageSujet: re   Tangram EmptyLun 23 Fév 2015 - 23:44

cheers Super jeu !

je viens de faire les trois figures et j' ai un peu galéré pour le triangle. Laughing
Revenir en haut Aller en bas
Jicehel

Jicehel


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

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyMar 24 Fév 2015 - 1:33

Testé, nickel (à part quelques problèmes de remplissages quand les pièces passent sur des lignes
Revenir en haut Aller en bas
Jean Claude

Jean Claude


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

Tangram Empty
MessageSujet: Re: Tangram   Tangram EmptyMar 24 Fév 2015 - 7:41

C'est bien plus facile que l’âne rouge,

On commence à avoir une belle panoplie de jeux cheers

A+
Revenir en haut Aller en bas
Contenu sponsorisé





Tangram Empty
MessageSujet: Re: Tangram   Tangram Empty

Revenir en haut Aller en bas
 
Tangram
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Tangram
» Récapitulatif ludothèque panoramic jjn4
» Tangram-Toukaré

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: