FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Mah-Jong américain
par Jean Claude Hier à 19:37

» StratégoV8 et V9
par Jean Claude Hier à 13:18

» Problème avec Deepl
par Klaus Hier à 0:34

» Déformation d'image en trapèze
par Klaus Dim 14 Jan 2018 - 16:22

» Quelques nouvelles ...
par Jean Claude Ven 12 Jan 2018 - 22:40

» Renommer les instructions ITEM_... ?
par Jicehel Ven 12 Jan 2018 - 18:56

» Ludothèque Panoramic
par jjn4 Ven 12 Jan 2018 - 18:11

» sous-programmes et fonctions
par Jack Ven 12 Jan 2018 - 17:51

» KGF_dll - nouvelles versions
par Minibug Ven 12 Jan 2018 - 0:21

» Mah-Jong français
par Jean Claude Jeu 11 Jan 2018 - 22:15

» HVIEWER
par Klaus Mer 10 Jan 2018 - 2:06

» panoramic 0.9.28
par gigi75 Ven 5 Jan 2018 - 14:06

» Un jeu qui va vous énerver!
par Jean Claude Jeu 4 Jan 2018 - 22:05

» Bonne fêtes de fin d'année ! Meilleurs Vœux 2018 !
par Jicehel Jeu 4 Jan 2018 - 17:28

» Mah-Jong international
par jjn4 Jeu 4 Jan 2018 - 16:55

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Janvier 2018
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
293031    
CalendrierCalendrier

Partagez | 
 

 Tangram

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Klaus

avatar

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

MessageSujet: Tangram   Lun 23 Fév 2015 - 17: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 - 19:42, édité 2 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5871
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Tangram   Lun 23 Fév 2015 - 18: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
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Tangram   Lun 23 Fév 2015 - 18:45

Voici une capture d'écran:

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
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jean Claude

avatar

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

MessageSujet: Re: Tangram   Lun 23 Fév 2015 - 19: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
Voir le profil de l'utilisateur
papydall

avatar

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

MessageSujet: Re: Tangram   Lun 23 Fév 2015 - 19: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 - 19:31, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Klaus

avatar

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

MessageSujet: Re: Tangram   Lun 23 Fév 2015 - 19: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
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

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

MessageSujet: Re: Tangram   Lun 23 Fév 2015 - 20: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
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jean Claude

avatar

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

MessageSujet: Re: Tangram   Lun 23 Fév 2015 - 21: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
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 8009
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Lun 23 Fév 2015 - 23: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
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Tangram   Mar 24 Fév 2015 - 0: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
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 8009
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mar 24 Fév 2015 - 1: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
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5871
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Tangram   Mar 24 Fév 2015 - 3:33

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

avatar

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

MessageSujet: Re: Tangram   Mar 24 Fév 2015 - 9: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
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Tangram   

Revenir en haut Aller en bas
 
Tangram
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Tangram

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: