Page 1 sur 1

A l'aide !!!

Publié : ven. 23/avr./2004 18:20
par Good07
Bonjour à tous.

Je suis nouveau dans la programmation en Pure Basic même si mes débuts en langage Basic date de l’Atari. Je voulais réaliser pour mon gamin un petit jeu style cascade qui était présent sur les ordinateurs « Révo » de Psion. Je me suis dit « Facile », avec Pure Basic c’est l’affaire de quelques heures. Et bien j’en suis à quelques jours et je m’arrache les cheveux (le peu qui me reste…) pour arriver à comprendre pourquoi ce damné programme ne fonctionne pas.
Le but du jeu est assez simple. On clique sur une boule de couleur et toutes les boules de même couleur disparaissent. Les boules situées au-dessus tombent par gravité pour combler les vides.
Ne riez pas en voyant mon listing, je suis sûr que l’on peu l’améliorer. Ce que je ne comprends pas c’est pourquoi l’affichage ne suit pas le programme. J’ai tapé le même listing en l’adaptant sur excel et cela fonctionne parfaitement. Dans Pure Basic il semblerai que le rafraîchissement de l’image ne se fait pas correctement ou alors que la gestion de la souris me pose quelques problèmes ainsi que l’emplacement du flipbuffers. Mais même en insérant un delay(300) cela ne résout pas le problème…
Mis à part le problème de l’affichage je n’arrive pas à trouver un algorithme qui me permette d’enlever toutes les boules qui se touchent. Mon listing ne permet à l’heure actuelle de n’enlever que les boules qui sont sur la même ligne ou la même colonne. On m’a parlé de fonction récursive mais alors là…J’en perd mon latin.
Si vous pouviez me donner un petit coup de main sur ce programme je vous en remercie par avance. Je joins le listing que j’ai simplifié au niveau de la fabrication des sprites pour que le programme puisse fonctionner sans chargement d’images.

André :cry:


Dim tableau_jeu(10,25)
Dim buf.b(10)
InitSprite()
InitKeyboard()
InitMouse()
InitSound()
OpenScreen(1024,768,16,"Cascade")
CreateSprite(0,32,32,0)
StartDrawing(SpriteOutput(0))
Box(0,0,32,32,RGB(255,255,255))
StopDrawing()
CreateSprite(1,32,32,1)
StartDrawing(SpriteOutput(1))
Box(0,0,32,32,RGB(255,255,255))
FrontColor(255,0,0)
Circle(16,16,16)
StopDrawing()
CreateSprite(2,32,32,1)
StartDrawing(SpriteOutput(2))
Box(0,0,32,32,RGB(255,255,255))
FrontColor(0,0,255)
Circle(16,16,16)
StopDrawing()
CreateSprite(3,32,32,1)
StartDrawing(SpriteOutput(3))
Box(0,0,32,32,RGB(255,255,255))
FrontColor(0,0,0)
Circle(16,16,16)
StopDrawing()
LoadSound(0,"C:\data\catch.wav")
LoadSound(1,"C:\data\blip.wav")
LoadFont(1,"arial",20)
Global cb.b,l.b,c.b,nb.s,x,y,im,res.b,hdl,px,py,li,co,ncoul.b,z,cptl.b,k,ligne.s,posy.l,lettre.s,boutonclick.b
couleur.b

Procedure boule(couleur)
cb=0
Repeat
l=Random(8)+1
c=Random(24)+1
If tableau_jeu(l,c)=0
tableau_jeu(l,c)=couleur
cb=cb+1
a=a+1
EndIf
Until cb=75
EndProcedure

Procedure init_tableau()
For l=1 To 9
For c=1 To 25
tableau_jeu(l,c)=0
Next c
Next l
EndProcedure

Global txtx.l,txty.l,txt.s
; remplissage du tableau avec les boules de couleurs
init_tableau()
couleur=1
boule(couleur);boules rouges
couleur=2
boule(couleur);boules bleus
couleur=3
boule(couleur);boules noires

Gosub Dessin_jeu

Repeat
ExamineKeyboard()
ExamineMouse()
FlipBuffers()
Gosub Dessin_jeu
px=MouseX()
py=MouseY()
co=((px-100)/32)+1
li=((py-100)/32)+1
StartDrawing(ScreenOutput())
Circle(MouseX(),MouseY(),2,RGB(0,0,0))
StopDrawing()
boutonclick=MouseButton(1)
If boutonclick=1
Delay(600)
boutonclick=0
ncoul=tableau_jeu(li,co)
;tableau_jeu(li,co)=0
PlaySound(1)
Gosub Analyse
Gosub Mise_a_jour
EndIf
Until KeyboardReleased(#PB_Key_Escape)
End

Dessin_jeu:
StartDrawing(ScreenOutput())
DrawingMode(1)
Box(0,0,1024,768,RGB($FF,$FF,$FF))
FrontColor(255,0,0)
UseFont(1)
DrawingFont(FontID())
Locate (860,10)
DrawText("SCORE")
x=100:y=100
StopDrawing()
For l=1 To 9
For c=1 To 25
im=(tableau_jeu(l,c))
DisplaySprite(im,x,y)
x=x+32
Next c
x=100
y=y+32
Next l
Return

Mise_a_jour:
cptl = 1
restl = 0
For k = 1 To 9
buf(k) = 0
Next k
For c = 1 To 25
cptl = 1
For l = 1 To 9
cptl = 1
If tableau_jeu(l, c) = 0
For k = 1 To 9
If tableau_jeu(k, c) <> 0
buf(cptl) = tableau_jeu(k, c)
cptl = cptl + 1
tableau_jeu(k, c) = 0
EndIf
Next k
restl = cptl - 1
For k = 9 To 9 - restl Step -1
tableau_jeu(k, c) = buf(restl)
restl = restl - 1
Next k
EndIf
Next l
For k = 1 To 9
buf(k) = 0
Next k
Next c
Return
; Analyse du tableau pour retirer les boules de même couleur.
Analyse:
For k = li To 1 Step -1
If tableau_jeu(k, co) <> ncoul
Break
Else
tableau_jeu(k, co) = 0
EndIf
Next k
For k = li + 1 To 9
If tableau_jeu(k, co) <> ncoul
Break
Else
tableau_jeu(k, co) = 0
EndIf
Next k
For k = co - 1 To 1 Step -1
If tableau_jeu(li, k) <> ncoul
Break
Else
tableau_jeu(li, k) = 0
EndIf
Next k
For k = co + 1 To 25
If tableau_jeu(li, k) <> ncoul
Break
Else
tableau_jeu(li, k) = 0
EndIf
Next k
Return

Publié : ven. 23/avr./2004 18:45
par comtois
pour la fonction récursive , voila une idée de ce que tu peux faire .
elle reste à adapter dans ton jeu .
Pour le reste , je n'ai pas encore regardé ton code .

Code : Tout sélectionner

Procedure TestProche(x,y,couleur) 
cp = tableau_jeu(x,y) 
If cp = couleur
   supprime(x,y)
   TestProche(x,y+1,couleur)
   TestProche(x,y-1,couleur)
   TestProche(x+1,y,couleur)
   TestProche(x-1,y,couleur)
EndIf
EndProcedure

Publié : ven. 23/avr./2004 19:10
par comtois
c'est ta fonction Mise a jour qui doit déconne , en mettant le Gosub Mise_a_jour en commentaire , les boules s'effacent correctement.

Code : Tout sélectionner

Dim tableau_jeu(10,25) 
Dim buf.b(10) 
InitSprite() 
InitKeyboard() 
InitMouse() 
InitSound() 
OpenScreen(1024,768,16,"Cascade") 

CreateSprite(0,32,32,0) 
StartDrawing(SpriteOutput(0)) 
   Box(0,0,32,32,RGB(255,255,255)) 
StopDrawing() 
CreateSprite(1,32,32,1) 
StartDrawing(SpriteOutput(1)) 
   Box(0,0,32,32,RGB(255,255,255)) 
   FrontColor(255,0,0) 
   Circle(16,16,16) 
StopDrawing() 
CreateSprite(2,32,32,1) 
   StartDrawing(SpriteOutput(2)) 
   Box(0,0,32,32,RGB(255,255,255)) 
   FrontColor(0,0,255) 
   Circle(16,16,16) 
StopDrawing() 
CreateSprite(3,32,32,1) 
StartDrawing(SpriteOutput(3)) 
   Box(0,0,32,32,RGB(255,255,255)) 
   FrontColor(0,0,0) 
   Circle(16,16,16) 
StopDrawing() 
;LoadSound(0,"C:\data\catch.wav") 
;LoadSound(1,"C:\data\blip.wav") 
LoadFont(1,"arial",20) 
Global cb.b,l.b,c.b,nb.s,x,y,im,res.b,hdl,px,py,li,co,ncoul.b,z,cptl.b,k,Ligne.s,posy.l,lettre.s,boutonclick.b 
Global txtx.l,txty.l,txt.s 


Procedure boule(couleur) 
   cb=0 
   Repeat 
      l=Random(8)+1 
      c=Random(24)+1 
      If tableau_jeu(l,c)=0 
         tableau_jeu(l,c)=couleur 
         cb=cb+1 
         A=A+1 
      EndIf 
   Until cb=75 
EndProcedure 

Procedure init_tableau() 
   For l=1 To 9 
      For c=1 To 25 
         tableau_jeu(l,c)=0 
      Next c 
   Next l 
EndProcedure 

Procedure TestProche(xx,yy,couleur) 
   cp = tableau_jeu(xx,yy) 
   If cp = couleur
      tableau_jeu(xx,yy)=0
      If yy<25 : TestProche(xx,yy+1,couleur) : EndIf
      If yy>1  : TestProche(xx,yy-1,couleur) : EndIf
      If xx<9  : TestProche(xx+1,yy,couleur) : EndIf
      If xx>1  : TestProche(xx-1,yy,couleur) : EndIf
   EndIf
EndProcedure

;/remplissage du tableau avec les boules de couleurs 
init_tableau() 
couleur=1 
boule(couleur);boules rouges 
couleur=2 
boule(couleur);boules bleus 
couleur=3 
boule(couleur);boules noires 

Gosub Dessin_jeu 

Repeat 
   ExamineKeyboard() 
   ExamineMouse() 
   FlipBuffers() 
   Gosub Dessin_jeu 
   px=MouseX() 
   py=MouseY() 
   co=((px-100)/32)+1 
   li=((py-100)/32)+1 
   StartDrawing(ScreenOutput()) 
   Circle(MouseX(),MouseY(),5,RGB(0,0,0)) 
   Circle(MouseX(),MouseY(),4,RGB(255,255,255)) 
   StopDrawing() 
   If MouseButton(1)=1 
      Delay(600) 
      ncoul=tableau_jeu(li,co) 
      ;PlaySound(1) 
      TestProche(li,co,ncoul)
      ;Gosub Mise_a_jour ; << a revoir !!
   EndIf 
Until KeyboardReleased(#PB_Key_Escape) 

End 

Dessin_jeu: 
ClearScreen($FF,$FF,$FF) 
StartDrawing(ScreenOutput()) 
DrawingMode(1) 
FrontColor(255,0,0) 
UseFont(1) 
DrawingFont(FontID()) 
Locate (860,10) 
DrawText("SCORE") 
x=100:y=100 
StopDrawing() 
For l=1 To 9 
   For c=1 To 25 
      im=(tableau_jeu(l,c)) 
      DisplaySprite(im,x,y) 
      x=x+32 
   Next c 
   x=100 
   y=y+32 
Next l 
Return 
 

Publié : ven. 23/avr./2004 20:25
par comtois
nouvelle version , avec une procedure de mise à jour pour la gravité des boules , bon , je n'ai pas trop testé ,je ne sais pas si ça fonctionne correctement .J'en reste là , à toi de jouer :)

Code : Tout sélectionner

Dim tableau_jeu(10,25) 
Dim buf.b(10) 
InitSprite() 
InitKeyboard() 
InitMouse() 
InitSound() 
OpenScreen(1024,768,16,"Cascade") 

CreateSprite(0,32,32,0) 
StartDrawing(SpriteOutput(0)) 
   Box(0,0,32,32,RGB(255,255,255)) 
StopDrawing() 
CreateSprite(1,32,32,1) 
StartDrawing(SpriteOutput(1)) 
   Box(0,0,32,32,RGB(255,255,255)) 
   FrontColor(255,0,0) 
   Circle(16,16,16) 
StopDrawing() 
CreateSprite(2,32,32,1) 
   StartDrawing(SpriteOutput(2)) 
   Box(0,0,32,32,RGB(255,255,255)) 
   FrontColor(0,0,255) 
   Circle(16,16,16) 
StopDrawing() 
CreateSprite(3,32,32,1) 
StartDrawing(SpriteOutput(3)) 
   Box(0,0,32,32,RGB(255,255,255)) 
   FrontColor(0,0,0) 
   Circle(16,16,16) 
   StopDrawing() 
CreateSprite(4,16,16)   
StartDrawing(SpriteOutput(4)) 
   DrawingMode(4) 
   Circle(8,8,8,RGB(255,255,255)) 
   Circle(8,8,7,RGB(255,55,55)) 
StopDrawing()    
;LoadSound(0,"C:\data\catch.wav") 
;LoadSound(1,"C:\data\blip.wav") 
LoadFont(1,"arial",20) 
Global cb.b,l.b,c.b,nb.s,x,y,im,res.b,hdl,li,co,ncoul.b,z,cptl.b,k,Ligne.s,posy.l,lettre.s,boutonclick.b 
Global txtx.l,txty.l,txt.s 

Procedure boule(couleur) 
   cb=0 
   Repeat 
      l=Random(8)+1 
      c=Random(24)+1 
      If tableau_jeu(l,c)=0 
         tableau_jeu(l,c)=couleur 
         cb=cb+1 
         A=A+1 
      EndIf 
   Until cb=75 
EndProcedure 

Procedure init_tableau() 
   For l=1 To 9 
      For c=1 To 25 
         tableau_jeu(l,c)=0 
      Next c 
   Next l 
EndProcedure 

Procedure TestProche(xx,yy,couleur) 
   If couleur = 0 : ProcedureReturn : EndIf
   cp = tableau_jeu(xx,yy) 
   If cp = couleur 
      tableau_jeu(xx,yy)=0
      If yy<25 : TestProche(xx,yy+1,couleur) : EndIf
      If yy>1  : TestProche(xx,yy-1,couleur) : EndIf
      If xx<9  : TestProche(xx+1,yy,couleur) : EndIf
      If xx>1  : TestProche(xx-1,yy,couleur) : EndIf
   EndIf
EndProcedure

Procedure Gravite(xx,yy)
   If tableau_jeu(xx-1,yy)<>0
      tableau_jeu(xx,yy)=tableau_jeu(xx-1,yy) 
      tableau_jeu(xx-1,yy)=0
      Gravite(xx-1,yy)      
   EndIf   
EndProcedure

Procedure MiseAJour()
   For c=1 To 25
      For l=1 To 9  
         If tableau_jeu(l,c)=0 
            Gravite(l,c)
         EndIf   
      Next l
   Next c   
EndProcedure   

;/remplissage du tableau avec les boules de couleurs 
init_tableau() 
For couleur=1 To 3
   boule(couleur)
Next couleur

Gosub Dessin_jeu 

Repeat 
   ExamineKeyboard() 
   ExamineMouse() 
   FlipBuffers() 
   Gosub Dessin_jeu 
   co=((MouseX() -100)/32)+1 
   li=((MouseY()-100)/32)+1 
   DisplayTransparentSprite(4,MouseX(),MouseY())
   If MouseButton(1)=1 And boutonclick=0 And co>0 And co<26 And li>0 And li<10
      boutonclick=1
      ncoul=tableau_jeu(li,co) 
      ;PlaySound(1) 
      TestProche(li,co,ncoul)
      MiseAJour()
   EndIf 
   If MouseButton(1)=0 
      boutonclick=0
   EndIf   
Until KeyboardReleased(#PB_Key_Escape) 
End 

Dessin_jeu: 
ClearScreen($FF,$FF,$FF) 
StartDrawing(ScreenOutput()) 
DrawingMode(1) 
FrontColor(255,0,0) 
UseFont(1) 
DrawingFont(FontID()) 
Locate (860,10) 
DrawText("SCORE") 
x=100:y=100 
StopDrawing() 
For l=1 To 9 
   For c=1 To 25 
      im=(tableau_jeu(l,c)) 
      DisplaySprite(im,x,y) 
      x=x+32 
   Next c 
   x=100 
   y=y+32 
Next l 
Return 

Publié : ven. 23/avr./2004 20:42
par Oliv
J'ai fait une mise à jour, normalement ça fonctionne

Code : Tout sélectionner

Dim tableau_jeu(10,25) 
Dim buf.b(10) 
InitSprite() 
InitKeyboard() 
InitMouse() 
InitSound() 
OpenScreen(1024,768,16,"Cascade") 

CreateSprite(0,32,32,0) 
StartDrawing(SpriteOutput(0)) 
   Box(0,0,32,32,RGB(255,255,255)) 
StopDrawing() 
CreateSprite(1,32,32,1) 
StartDrawing(SpriteOutput(1)) 
   Box(0,0,32,32,RGB(255,255,255)) 
   FrontColor(255,0,0) 
   Circle(16,16,16) 
StopDrawing() 
CreateSprite(2,32,32,1) 
   StartDrawing(SpriteOutput(2)) 
   Box(0,0,32,32,RGB(255,255,255)) 
   FrontColor(0,0,255) 
   Circle(16,16,16) 
StopDrawing() 
CreateSprite(3,32,32,1) 
StartDrawing(SpriteOutput(3)) 
   Box(0,0,32,32,RGB(255,255,255)) 
   FrontColor(0,0,0) 
   Circle(16,16,16) 
StopDrawing() 
;LoadSound(0,"C:\data\catch.wav") 
;LoadSound(1,"C:\data\blip.wav") 
LoadFont(1,"arial",20) 
Global cb.b,l.b,c.b,nb.s,x,y,im,res.b,hdl,px,py,li,co,ncoul.b,z,cptl.b,k,Ligne.s,posy.l,lettre.s,boutonclick.b 
Global txtx.l,txty.l,txt.s 


Procedure boule(couleur) 
   cb=0 
   Repeat 
      l=Random(8)+1 
      c=Random(24)+1 
      If tableau_jeu(l,c)=0 
         tableau_jeu(l,c)=couleur 
         cb=cb+1 
         A=A+1 
      EndIf 
   Until cb=75 
EndProcedure 

Procedure init_tableau() 
   For l=1 To 9 
      For c=1 To 25 
         tableau_jeu(l,c)=0 
      Next c 
   Next l 
EndProcedure

Procedure Mise_A_Jour()
  For xx = 1 To 8 ; On le fait 8 fois car la procédure suivante ne gère la descente que d'une ligne
    For l = 1 To 8 ; de 1 à 8 car ça nesert à rien de vérrifier la ligne la plus basse et ne serait pas compatible avec le code après
      For c = 1 To 25
        If tableau_jeu(l,c) > 0 And tableau_jeu(l + 1,c) = 0 ; Si il y a un cercle et rien en dessous
          tableau_jeu(l + 1,c) = tableau_jeu(l,c) ; On met un cercle en dessous
          tableau_jeu(l,c) = 0 ; On efface le cercle
        EndIf
      Next c
    Next l
  Next xx
EndProcedure
        

Procedure TestProche(xx,yy,couleur) 
   cp = tableau_jeu(xx,yy) 
   If cp = couleur 
      tableau_jeu(xx,yy)=0 
      If yy<25 : TestProche(xx,yy+1,couleur) : EndIf 
      If yy>1  : TestProche(xx,yy-1,couleur) : EndIf 
      If xx<9  : TestProche(xx+1,yy,couleur) : EndIf 
      If xx>1  : TestProche(xx-1,yy,couleur) : EndIf 
   EndIf
EndProcedure 

;/remplissage du tableau avec les boules de couleurs 
init_tableau() 
couleur=1 
boule(couleur);boules rouges 
couleur=2 
boule(couleur);boules bleus 
couleur=3 
boule(couleur);boules noires 

Gosub Dessin_jeu 

Repeat 
   ExamineKeyboard() 
   ExamineMouse() 
   FlipBuffers() 
   Gosub Dessin_jeu 
   px=MouseX() 
   py=MouseY() 
   co=((px-100)/32)+1 
   li=((py-100)/32)+1 
   StartDrawing(ScreenOutput()) 
   Circle(MouseX(),MouseY(),5,RGB(0,0,0)) 
   Circle(MouseX(),MouseY(),4,RGB(255,255,255)) 
   StopDrawing() 
   If MouseButton(1)=1 
      Delay(600) 
      ncoul=tableau_jeu(li,co)
      ;PlaySound(1) 
      TestProche(li,co,ncoul)
      Mise_A_Jour()
      ;Gosub Mise_a_jour ; << a revoir !! 
   EndIf 
Until KeyboardReleased(#PB_Key_Escape) 

End 

Dessin_jeu: 
ClearScreen($FF,$FF,$FF) 
StartDrawing(ScreenOutput()) 
DrawingMode(1) 
FrontColor(255,0,0) 
UseFont(1) 
DrawingFont(FontID()) 
Locate (860,10) 
DrawText("SCORE") 
x=100:y=100 
StopDrawing() 
For l=1 To 9 
   For c=1 To 25 
      im=(tableau_jeu(l,c)) 
      DisplaySprite(im,x,y) 
      x=x+32 
   Next c 
   x=100 
   y=y+32 
Next l 
Return 

Publié : ven. 23/avr./2004 20:43
par Oliv
Pardon Comtois, j'avais pas rechargé la page avant de poster et j'avais pas vu ton post, pas grave, ça fait deux méthodes

Publié : ven. 23/avr./2004 20:49
par comtois
C'est bien Oliv ,c'est toujours intéressant de voir plusieurs méthodes :)

Publié : ven. 23/avr./2004 21:23
par Good07
Alors là Chapeau :!: :!: :!:

Je remercie Comtois et Oliv pour leur aide. C'est super 8O .
Pour la récurcivité j'avoue que c'est génial. A 51 ans mes neurones ne sont plus récurcives, mais je vois que la relève est assurées et bien assurée... :lol:

Il ne me reste plus qu'a programmer le score , a changer complètement la présentation mettre un peu de musique et mon gamin n'en croira pas ces yeux.

Par contre je ne comprend pas quelque chose, ma procedure Mise_a_jour si elle n'était pas du tout à la hauteur des votres, marchait parfaitement sous excel ou j'avais déja tester la procédure de récurcivité de Comtois qui marchait super bien.
Enfin bref merci encore à tous et bonne soirée

André super content.

:D :D :D :D :D :D :D

Publié : ven. 23/avr./2004 21:48
par comtois
encore quelques petites remarques

-1-
c'est inutile de faire une procédure init_tableau()
il suffit de faire un Dim tableau_jeu(10,25) pour que le tableau soit initialisé.

-2-
ensuite pour la souris , plutôt que de tracer un cercle comme tu le faisais , il est préférable de définir un sprite , et de l'afficher aux coordonnées de la souris .

-3-
plutôt que de faire
Box(0,0,1024,768,RGB($FF,$FF,$FF))
tu peux faire
ClearScreen($FF,$FF,$FF)

Et bonne continuation dans ton jeu :)

A+