Page 1 sur 2

un petit jeu que j'ai cree- il faut effacer la moitie, mais

Publié : mar. 24/août/2010 4:26
par Parole De JOJO

Code : Tout sélectionner

#White=$FFFFFF:#Black=$000000:#Red=$0000FF:#Yellow=$00FFFF:#Bordo=$9F0560:#Gris=$384053:#pink=$745DDA:#Blu=$FCE303:#Gren=$6EFF91

#pourtour=#Black
#interieur=#Blu
#numero=#Black
#case_proposee=#Bordo
#case_remplie=#Pink
#tableau=#Black
#essai_1ere_case=#Bordo

Global etape=1,x=1,y=1,cas=31,nextcase,choix,num=1,pa,fin
Global Dim Lis.l(197):For k=1 To 28:lis(k)=-1:lis(k+168)=-1:Next
For k=1 To 13:For l=0 To 3:lis(k*14+l-1)=-1:Next:Next
Global Dim opt.l(9):opt(1)=12:opt(2)=27:opt(3)=29:opt(4)=16:opt(5)=-12:opt(6)=-27:opt(7)=-29:opt(8)=-16
Procedure.d Rnd(x,y):ProcedureReturn Int(x*Pow(10,y))/Pow(10,y):EndProcedure
Procedure Mod(x,y):a.d=rnd(x-Int(x/y)*y,5):If a<0:a+y:EndIf:ProcedureReturn a:EndProcedure
Procedure GetXY(a):x=Int((a-1)/14):y=a-14*x:x+1:x-2:y-2:EndProcedure
Procedure Next_Case(p):For choix=1 To 8:nextcase=cas+opt(mod(choix+p-2,8)+1)
If lis(nextcase)=0:Break:EndIf:Next
If choix=9:fin=1:Else:GetXY(nextcase):FillArea(20*x-9,20*y-9,-1,#case_proposee):pa=mod(choix+p-1,8):EndIf
EndProcedure
Procedure Draw_Num(num):DrawText(20*x-8,20*y-7,Str(num),#numero,#case_remplie)
FillArea(20*x-9, 20*y-9, -1, #case_remplie):SetWindowTitle(0,"SUS 100 !!! sus="+Str(num))
EndProcedure
Procedure Fin():MessageRequester("SUS 100","Died at "+Str(num)+Chr(10)+"Programmed by ramam2000@gmail.com"):End:EndProcedure
    
  If OpenWindow(0,0,0,220,220,"SUS 100 !!!",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    If CreateImage(0,220,220) And StartDrawing(ImageOutput(0))
    CreateGadgetList(WindowID(0)):Box(0,0,220,220,#interieur)
    For k=1 To 11:LineXY(10,20*k-10,210,20*k-10,#tableau):LineXY(20*k-10,10,20*k-10,210,#tableau):Next
    FillArea(1,1,-1,#pourtour):GetXY(cas):FillArea(20*x-9,20*y-9,-1,#essai_1ere_case)
    StopDrawing():ImageGadget(0,0,0,200,200,ImageID(0)):EndIf
  AddKeyboardShortcut(0,#PB_Shortcut_Space,1):AddKeyboardShortcut(0,#PB_Shortcut_Return,2)
  AddKeyboardShortcut(0,#PB_Shortcut_Left,3):AddKeyboardShortcut(0,#PB_Shortcut_Up,4)
  AddKeyboardShortcut(0,#PB_Shortcut_Right,5):AddKeyboardShortcut(0,#PB_Shortcut_Down,6)
  AddKeyboardShortcut(0,#PB_Shortcut_Escape,7)

  Repeat:Event=WaitWindowEvent()

    If event=#PB_Event_Menu:touche=EventMenu():If touche=7:fin():EndIf
      If etape=1
        If touche<7 And touche>0
          If touche=4:cas-1:ElseIf touche=3:cas-14:ElseIf touche=6:cas+1:ElseIf touche=5:cas+14:EndIf
          If cas<28:cas+14:ElseIf cas>168:cas-14:EndIf
          If mod(cas,14)=2:cas+1:ElseIf mod(cas,14)=13:cas-1:EndIf
          StartDrawing(ImageOutput(0)):FillArea(20*x-9,20*y-9,-1,#interieur) 
          GetXY(cas):FillArea(20*x-9,20*y-9,-1,#essai_1ere_case) 
          StopDrawing():ImageGadget(0,0,0,200,200,ImageID(0)):EndIf
        If touche=2:etape=2
          StartDrawing(ImageOutput(0)):FillArea(20*x-9,20*y-9,-1,#interieur) 
          GetXY(cas):Draw_Num(1):Next_Case(1):lis(cas)=1
          StopDrawing():ImageGadget(0, 0, 0, 200, 200, ImageID(0)):EndIf
      ElseIf etape=2
        If touche=1
        StartDrawing(ImageOutput(0)):FillArea(20*x-9,20*y-9,-1,#interieur) 
        Next_Case(pa+1):StopDrawing():ImageGadget(0,0,0,200,200,ImageID(0))
        ElseIf touche=2
        cas=nextcase:lis(cas)=num:num+1:StartDrawing(ImageOutput(0))
        FillArea(20*x-9, 20*y-9, -1, #interieur):Draw_Num(num)
        Next_Case(1):StopDrawing():ImageGadget(0, 0, 0, 200, 200, ImageID(0)):If fin=1:fin():EndIf
        EndIf
      EndIf
    EndIf
  Until Event = #PB_Event_CloseWindow:EndIf
il y a plein de code en trop mais je ne sais pas quoi enlever
j'aimerai entendre votre avis

merci

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mar. 24/août/2010 9:20
par SPH
Parole De JOJO a écrit :il y a plein de code en trop mais je ne sais pas quoi enlever
j'aimerai entendre votre avis

merci
Erreur ligne 16.

Quand tu dis "il y a plein de code en trop", je dis, en effet ! Programmer, ce n'est pas entasser des bouts de code comme ca...
A la base, tu voulais faire quoi ?????

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mar. 24/août/2010 9:37
par flaith
Ça ressemble à un démineur, non ? :mrgreen:

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mar. 24/août/2010 13:20
par Ar-S
@SPH => renomme tous les "Mod(" en "Modif("

@JOJO
ça fonctionne chez moi après renommage (une commande externe du même non existe)
Par contre un petit conseils, pour plus de lisibilité, évite d'étouffer le code avec des fonction:fonction:fonction,
la place en ligne que tu y gagnes, nous on la perd en visibilité, et c'est jamais bien agréable à lire (on a purepunch pour ça ;))
Donc si tu partage du code, essaye de l'aérer voir de le commenter.

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mar. 24/août/2010 17:07
par Parole De JOJO
c'est vrai, je n'ais pas ete clair
a la base je voulais creer un programme en 2D, il faut choisir une case avec les fleches, presser entrer, et ensuite arriver le plus proche possible de 100, en faisantdes bons comme le cheval dans le jeu d'echec. la touche espace sert a passer a la prochaine case, et la touche entrer sert a selectionner la case requise
le probleme est que pour chaque changement dans l'image je dois faire startdraw, stopdraw, et ImageGadget
et c'eat pas tres joli
comment supprimer cela

merci en tout cas

c'est koi, purepunch?

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mar. 24/août/2010 17:16
par Ar-S
Voir ici

Code : Tout sélectionner

http://www.purebasic.fr/french/viewtopic.php?f=6&t=10746

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mar. 24/août/2010 19:03
par Warkering
Je suis au Cégep donc je n'ai pas PureBasic sous la main pour tester mais il est vrai que ton code est plutôt barbare! :roll:

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mer. 25/août/2010 7:17
par SPH
On dirait le deplacement d'un cavalier sur un plateau de jeu d'echec. A part ca, je n'ai rien capté a la regle du jeu...

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mer. 25/août/2010 9:15
par Parole De JOJO
bon apparement je n'ai pas ete tres clair
le jeu est de remplir le plus de cases possibles
il faut remplir avec metode sinon on se bloque tres vite
effectivement, les bons sont ceux du cavaliers dans le jeu d'echec
ce que je veux en fait c'est rendre le code plus rapide parcequ'il est assez lent a cause du drawimage a chaque fois

merci

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mer. 25/août/2010 9:23
par SPH
Parole De JOJO a écrit :bon apparement je n'ai pas ete tres clair
le jeu est de remplir le plus de cases possibles
il faut remplir avec metode sinon on se bloque tres vite
Nan mais en fait, on peux choisir la case de depart mais apres, on ne controle plus rien ! Alors je ne sais pas si c'est voulu...

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mer. 25/août/2010 9:38
par Parole De JOJO
si, on change de case avec espace et on selectione avec enter

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mer. 25/août/2010 14:58
par SPH
Parole De JOJO a écrit :si, on change de case avec espace et on selectione avec enter
Ha oui ok :mrgreen:

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mer. 25/août/2010 17:00
par Backup
quoiqu'il en soit ton code est rapide !

mais ne demande pas qu'on t'aide a optimiser ce code
alors que tu le présente tout condensé avec des ":"
faut pas exagerer non plus !

je me demande ce qui t'a empêché d'utiliser les Macro en plus !! :lol:

serieux , présente ton code de façon normal , sans utilisation des lignes a rallonges , sans utiliser
les ":" ce sera deja plus clair !



pour ma part, ce que j'en ai vu , ce serai plutôt ta gestion des touches , qui me font
un peu peur ! :)
il y a trop de "if-endif" , a remplacer par des select-case , bien plus lisible
de plus tu as utilisé les raccourcis, il y a moyen de mieux faire (voir les Tutos du site ..)


autre chose , ceci :

Code : Tout sélectionner

Procedure Fin():MessageRequester("SUS 100","Died at "+Str(num)+Chr(10)+"Programmed by ramam2000@gmail.com"):End:EndProcedure
soit de façon clair et civilisé ; ceci :

Code : Tout sélectionner

Procedure Fin()
    MessageRequester("SUS 100","Died at "+Str(num)+Chr(10)+"Programmed by ramam2000@gmail.com")
    End
EndProcedure
tu entre dans la procedure , (donc l'adresse de retour est implicitement empilé)
seulement arrivé au "End" , le programme quit !
que ce passe t'il au niveau de la pile ??

ça doit laisser un sacré bazars !! :lol:

le Endprocedure est en principe là pour dépiller l'adresse de retour de la procédure

sortir d'une procédure par un "End" ou un "Goto"
est une chose a Bannir ... ! :wink:

pense y dans tes futurs créations ...

autre chose :

Code : Tout sélectionner

CreateGadgetList(WindowID(0))
ne sert plus a rien ! :)

il y a surement d'autre trucs , mais avec un listing aussi mal présenté , je ne cherche meme pas :lol:

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mer. 25/août/2010 17:24
par Parole De JOJO
tu as raison
je vais l'arrenger et le representer
je n'ais pas compris ce qu'est la pile

en tout cas merci

Re: un petit jeu que j'ai cree- il faut effacer la moitie, m

Publié : mer. 25/août/2010 18:40
par Backup
la pile c'est un espace mémoire ou s'entasse les instructions, ou les adresses memoire

en assembleur , la pile est tres importante a gerer !

en purebasic on a moins l'impression qu'elle est là, mais ton code Purebasic va etre transformé en assembleur puis linké (la compilation)

ton programme purebasic gere la pile sans que tu le sache !
il faut avoir utilisé un débugger (comme ollydbg par ex) pour comprendre comment se passe
l'appel a une procédure

au moment de l'appel de la procédure l'adresse du pointeur de programme est placé sur la pile
pour que le programme sache ou il faut revenir apres l'appel de la procédure ..

la procedure est exécuté , puis a la fin (procedurereturn) l'adresse de retour est retiré de la pile
pour actualiser le pointeur de programme , et effectuer un saut vers l'instruction qui suit l'appel
de façon a continuer le prg ...

lorsque tu fait exécuter un "End" ou un goto , alors que l'adresse de retour se trouve toujours sur la pile , tu peux générer des problèmes grave de mémoire, car l'adresse n'as pas ete dépilé par la fin de la procédure !

alors je pose la question, que deviens cette adresse présente dans la pile ??

je pense que c'est simplement une valeur qui va trainer là , et qui risque de mettre le basarre ...


faudrait qu'un pro de l'assembleur confirme ... ;) (Denis, tonton , etc ...)