Page 1 sur 1

Tron

Publié : ven. 14/oct./2005 16:49
par Backup
je remet mon tron ici parceque je suis mem pas sur de l'avoir posté !!
comme je suis retombé dessus , cela peut etre utile au debutants , sait on jamais !! :D

se dirige avec les touche fleché !!

la direction est active si la touche est relaché !!

Code : Tout sélectionner



; Version Purebasic V4.00 modifié Djes
; Tron  creé Par Dobro  V3.5.2 avec score (non sauvegardé)
; pour le sens j'ai choisi

;le sens des aiguilles d'une montre en commencant par midi

;sens=1  : monte ver midi
;sens=2  : va a droite vers 3 heures
;sens=3 : descend vers 6 heures
;sens=4 : va a gauche vers 9 heures
;(c'est le langage utilise dans l'aviation)
; "fait gaffe a tes 6 heures"
; veut dire qu vous avez quelqu'un derriere vous !!

; la variable pos c'est pareil mais pour le joueur
;pos=1 en haut ect..
Declare tir(sens)
Global xordi,yordi,ymissille,tir
#dobro=1
#Police=1
#ordi=1
#joueur=2
#test=3
#missordih=4
#missordiv=5
#missordihoff=6
#missordivoff=7
missordi=3
InitKeyboard() :; j'espere qu'il y a un clavier au moins !!
vitesse=10
vitessejoueur=10

Declare test_coul(x)
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 9 ,#PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
  WindowID = OpenWindow(1, 0, 0, 800, 600, "TRON Par Dobro", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
  WindowID = WindowID(1)
  Result = OpenWindowedScreen(WindowID,0,0, 800, 600, 1, 0,0)
  SetFrameRate(60)
  
  CreateSprite(#ordi, 10,10 )
  CreateSprite(#joueur, 10,10)
  CreateSprite(#test, 10,10)
  
  CreateSprite(#missordih, 10,10)
  StartDrawing(SpriteOutput(#missordih) )
  Box(0, 4, 10,8, RGB(0,255, 0))
  StopDrawing()
  CreateSprite(#missordihoff, 12,12)
  StartDrawing(SpriteOutput(#missordihoff) )
  Box(0, 0, 12,12, RGB(0,0,0))  :;            METTRE RGB(255,0,255)
  StopDrawing()
  
  
  CreateSprite(#missordiv, 10,10)
  StartDrawing(SpriteOutput(#missordiv) )
  Box(4,0,8,10, RGB(0,255, 0))
  StopDrawing()
  
  CreateSprite(#missordivoff, 12,12)
  StartDrawing(SpriteOutput(#missordivoff) )
  Box(0,0,12,12, RGB(0,0, 0))
  StopDrawing()
  
  CreateSprite(#test, 10,10)
  StartDrawing(SpriteOutput(#test) )
  Box(0,0,10,10, RGB(255,255, 255))
  StopDrawing()
  ;CreateSprite(#missillejoueurh, 10,10)
  ;CreateSprite(#missillejoueurv, 10,10)
  
  
  
  
  StartDrawing(SpriteOutput(#ordi) )
  Box(0, 0, 10,10 , RGB(255,0, 0))
  StopDrawing()
  StartDrawing(SpriteOutput(#joueur) )
  Box(0, 0, 10, 10 , RGB(0,0, 255))
  StopDrawing()
  
  debut:
  rouge=50
  vert=50
  bleu=50
  score$="HUMAN="+Str(scorehuman)+" TRON ="+Str(scoretron)
  SetWindowTitle(1, score$)
  
  ; dessin du cadre exterieur
  StartDrawing(ScreenOutput())
  Box(0, 0, 800,600 , RGB(255,255,0))
  StopDrawing()
  StartDrawing(ScreenOutput())
  Box(10, 10, 780,580 , RGB(0,0,0))
  FrontColor(RGB(255,255, 0))
  BackColor(RGB(0,0,0))
  DrawingFont(FontID)
  

  DrawText(350,-5,"<------------")
  DrawText(350,585,"<------------")  
  DrawText(4,280,"|") 
  DrawText(4,290,"|") 
  DrawText(4,300,"|") 
  DrawText(4,310,"|")
  DrawText(3,320,"v")  
  DrawText(790,280,"^") 
  DrawText(792,290,"|") 
  DrawText(792,300,"|") 
  DrawText(792,310,"|")
  DrawText(792,320,"|") 
  StopDrawing()
  Couleurjoueur=0
  xordi=450:; placement du sprite reserve a l'ordi
  yordi=290 :; pareil en y
  xjoueur=400 :; placement du sprite reserve au joueur
  yjoueur=300 :; pareil en y
  de=Random(1000):; ceci va determiner un depart aleatoire,vers le haut,le bas,a droite,a gauche)
  RandomSeed(de)
  pos=Random(3)+1
  de=Random(1000)
  RandomSeed(de)
  sens=Random(3)+1 :; pareil mais pour l'ordi
  ;sens=4
  Repeat
    Delay(50)
    Event=WindowEvent()
    ExamineKeyboard() 
    If  pos=1:; monte
      yjoueur-vitessejoueur
      StartDrawing( ScreenOutput())
      Couleurjoueur = Point(xjoueur, yjoueur)
      Couleurjoueurg = Point(xjoueur-4, yjoueur)
      Couleurjoueurd = Point(xjoueur+14, yjoueur)
      
      StopDrawing()
      touche=test_coul(Couleurjoueur)
      If touche=2
        Goto su
      EndIf
    EndIf
    If pos=2:;droite
      xjoueur+vitessejoueur
      StartDrawing( ScreenOutput())
      Couleurjoueur = Point(xjoueur, yjoueur)
      Couleurjoueurg = Point(xjoueur, yjoueur-4)
      Couleurjoueurd = Point(xjoueur, yjoueur+14)
      StopDrawing()
      touche=test_coul(Couleurjoueur)
      If touche=2
        Goto su
      EndIf
    EndIf
    If pos=3:;bas
      yjoueur+vitessejoueur
      StartDrawing( ScreenOutput())
      Couleurjoueur = Point(xjoueur, yjoueur)
      Couleurjoueurg = Point(xjoueur-2, yjoueur)
      Couleurjoueurd = Point(xjoueur+14, yjoueur)
      StopDrawing()
      touche=test_coul(Couleurjoueur)
      If touche=2
        Goto su
      EndIf
    EndIf
    If  pos=4:;gauche
      xjoueur-vitessejoueur
      StartDrawing( ScreenOutput())
      Couleurjoueur = Point(xjoueur, yjoueur)
      Couleurjoueurg = Point(xjoueur, yjoueur+14)
      Couleurjoueurd = Point(xjoueur, yjoueur-4)
      StopDrawing()
      touche=test_coul(Couleurjoueur)
      If touche=2
        Goto su
      EndIf
    EndIf
    ;EndIf
    
    ;***************ASSISTANCE POUR LES PAROIS EXTERIEURs *****************
    Gosub assistance_mur
    
    ;********************************
    
    If KeyboardPushed( #PB_Key_Left  ) And kpl=#False
      touche=test_coul(Couleurjoueur)
      If touche=2
        Goto su
      EndIf
      pos-1:dob=1
      If pos<1
        pos=4
      EndIf
      kpl=#True
    EndIf
    
    If KeyboardPushed(  #PB_Key_Right  ) And kpr=#False
      touche=test_coul(Couleurjoueur)
      If touche=2
        Goto su
      EndIf
      pos+1:dob=1
      If pos>4
        pos=1
      EndIf
      kpr=#True
    EndIf
    
    If KeyboardReleased( #PB_Key_Left  ) And kpl
      kpl=#False
    EndIf
    If KeyboardReleased( #PB_Key_Right  ) And kpr
      kpr=#False
    EndIf    
   
    ; ******************** ordi avance *******************************
    ;sens=Random(4)+1
    Select sens
      Case 1 :;  il monte
        StartDrawing( ScreenOutput())
        Couleur1 = Point(xordi, yordi-4) :;test en haut
        Couleur2 = Point(xordi-4, yordi) :;test a gauche
        Couleur3 = Point(xordi+14, yordi) :;test a droite
        StopDrawing()
        ;DisplaySprite(#test, xordi, yordi-12)
        
        If Couleur1>0 And Couleur2>0 And Couleur3>0 :; tout autour c'es colore , donc c'est perdu
          toucheordi=1
          Goto su
        EndIf
        ; detection d'une couleur devant mais test si ordi peut passer a droite ou a gauche
        If Couleur1>0 :; ya une couleur devant (donc un mur)
          If Couleur3=0 And Couleur2=0 :; a droite et a gauche on peut passer
            dede=Random(2)+1:; on tire a hazard droite ou gauche
            If dede=1
              sens=4:; on part a gauche
              Goto su
            EndIf
            If dede=2
              sens=2:; on part a droite
              Goto su
            EndIf
          EndIf
          If Couleur3=0 :; il n'y a qu'a droite que c'est libre
            sens=2:; alors on y va
            Goto su
          EndIf
          If Couleur2=0:;si a gauche ya pas de couleur (c'est libre)
            sens=4 :;on va a gauche
            Goto su
          EndIf
        EndIf
        
        If  yordi>10 :; inverse la coordonee pour inverser le sens de deplacement
          yordi-vitesse
        Else
          sens=2
        EndIf
      Case 2:; il va a droite
        StartDrawing( ScreenOutput())
        Couleur1 = Point(xordi+14, yordi) :;test a droite
        Couleur2 = Point(xordi, yordi-4) :;test en haut
        Couleur3 = Point(xordi, yordi+14) :;test en bas
        StopDrawing()
        
        If Couleur1>0 And Couleur2>0 And Couleur3>0
          toucheordi=1
          Goto su
        EndIf
        If Couleur1>0
          If Couleur2=0 And Couleur3=0
            dede=Random(2)+1
            If dede=1
              sens=3
              Goto su
            EndIf
            If dede=2
              sens=1
              Goto su
            EndIf
            
          EndIf
          If Couleur2=0
            sens=1
            Goto su
          EndIf
          If Couleur3=0
            sens=3
            Goto su
          EndIf
          
        EndIf
        If xordi<=780
          xordi+vitesse
        Else
          sens=3
        EndIf
      Case 3:; il descend
        StartDrawing( ScreenOutput())
        Couleur1 = Point(xordi, yordi+14) :;test en bas
        Couleur2 = Point(xordi+14, yordi) :;test a droite
        Couleur3 = Point(xordi-4, yordi) :;test a gauche
        StopDrawing()
        If Couleur1>0 And Couleur2>0 And Couleur3>0
          toucheordi=1
          Goto su
        EndIf
        If Couleur1>0
          If Couleur3=0 And Couleur2=0
            dede=Random(2)+1
            If dede=1
              sens=2
              Goto su
            EndIf
            If dede=2
              sens=4
              Goto su
            EndIf
            
          EndIf
          If Couleur3=0
            sens=4
            Goto su
          EndIf
          If Couleur2=0
            sens=2
            Goto su
          EndIf
          
        EndIf
        
        If  yordi<580
          yordi+vitesse
        Else
          sens=4
        EndIf
      Case 4:; il va a gauche
        
        StartDrawing( ScreenOutput())
        Couleur1 = Point(xordi-4, yordi) :;test a gauche
        Couleur2 = Point(xordi, yordi-4) :;test en haut
        Couleur3 = Point(xordi, yordi+14) :;test en bas
        StopDrawing()
        
        If Couleur1>0 And Couleur2>0 And Couleur3>0
          toucheordi=1
          Goto su
        EndIf
        If Couleur1>0
          If Couleur2=0 And Couleur3=0
            dede=Random(2)+1
            If dede=1
              sens=3
              Goto su
            EndIf
            If dede=2
              sens=1
              Goto su
            EndIf
            
          EndIf
          If Couleur2=0
            sens=1
            Goto su
          EndIf
          If Couleur3=0
            sens=3
            Goto su
          EndIf
        EndIf
        If xordi>10
          xordi-vitesse
        Else
          sens=1
        EndIf
    EndSelect
    ; Couleur = Point(xordi, yordi)
    ; rouge =255
    ; bleu = 16711680
    ;vert = 65280
    su:
    Gosub message_gagne_perdu
    
    
    ;********* tir missille
    ;If yordi=yjoueur Or xordi=xjoueur
    ;sens=2
    ;If sens=2
    ;tir=1
    ;EndIf
    
    ;If cont<20
    ;   cont+1
    ; tir=0
    ;Else
    ;   cont=0
    ;  tir=1
    ; sens=4
    ;EndIf
    
    
    
    
    
    
    ; If tir=1 And sens=4
    ;   
    ;   ThreadID = CreateThread(@tir(),4)
    ;WaitThread(ThreadID)
    ;  ; tir(1)
    ;EndIf
    
    
    
    DisplaySprite(#ordi, xordi , yordi )
    DisplaySprite(#joueur, xjoueur , yjoueur )
    
    
    
    FlipBuffers():; affiche l'ecran
    ;ClearScreen(0, 0, 0) :;efface l'ecran
   
   
    
    
    rouge+1
    ;************** couleur *************
    StartDrawing(SpriteOutput(#ordi) )
    ;If Rouge>255:Bleu+1:EndIf
    ;If Bleu>255:Vert+1:EndIf
    ;If Vert>255:Rouge+1:EndIf
    rouge=Random(55)+200
    coul= RGB(rouge, 100, 50)
    Box(0, 0, 10,10 , coul)
    StopDrawing()
    StartDrawing(SpriteOutput(#joueur) )
    ;If Rouge>255:Bleu+1:EndIf
    ;If Bleu>255:Vert+1:EndIf
    ;If Vert>255:Rouge+1:EndIf
    bleu=Random(55)+200
    coul= RGB(150, 0, bleu)
    Box(0, 0, 10,10 , coul)
    StopDrawing()
    ;************************************
    
    
  Until Event=#PB_Event_CloseWindow
  End
  
  Procedure test_coul(Couleurjoueur)
    ;255=rouge
    ;16711680=bleu
    ;65280 =vert
    If Couleurjoueur>0 Or Couleurjoueur>0 Or Couleurjoueur>0
      touche=2
    Else
      touche=0
    EndIf
    ProcedureReturn touche
    
  EndProcedure
  
  
  Procedure tir(valeur)
    Shared yordi,xordi,ymissille
    If valeur=1
      While yordi-ymissille>40
        ymissille+5
        DisplaySprite(#missordiv,xordi, yordi-20-ymissille):; affiche le missile
        DisplaySprite(#missordivoff,xordi, yordi-10-ymissille):; affiche le missile
        
        
        FlipBuffers():; affiche l'ecran
      Wend
      tir=0
      DisplaySprite(#missordivoff,xordi, yordi-10-ymissille)
      FlipBuffers():; affiche l'ecran
      
    EndIf
    If valeur=3
      While yordi+ymissille<560
        ymissille+5
        DisplaySprite(#missordiv,xordi, yordi+20+ymissille):; affiche le missile
        DisplaySprite(#missordivoff,xordi, yordi+10+ymissille):; affiche le missile
        
        FlipBuffers():; affiche l'ecran
      Wend
      DisplaySprite(#missordivoff,xordi, yordi+10+ymissille)
      FlipBuffers():; affiche l'ecran
      tir=0
    EndIf
    ;
    
    If valeur=4
      copiy=yordi
      While xordi-xmissille>30
        xmissille+10
        DisplaySprite(#missordih,xordi-20-xmissille,copiy ):; affiche le missile
        DisplaySprite(#missordihoff,xordi-1-xmissille,copiy ):; efface le missile
        
        FlipBuffers():; affiche l'ecran
      Wend
      ;DisplaySprite(#missordihoff,xordi-xmissille,copiy )
      ;DisplaySprite(#missordihoff,xordi-xmissille-10,copiy )
      DisplaySprite(#missordihoff,xordi-xmissille-20,copiy )
      FlipBuffers():; affiche l'ecran
      tir=0
    EndIf
    
    
    If valeur=2
      copiy=yordi
      While xordi+xmissille<760
        xmissille+10
        DisplaySprite(#missordih,xordi+20+xmissille,copiy ):; affiche le missile
        DisplaySprite(#missordihoff,xordi+1+xmissille,copiy ):; efface le missile
        
        FlipBuffers():; affiche l'ecran
      Wend
      ;DisplaySprite(#missordihoff,xordi+xmissille,copiy )
      ; DisplaySprite(#missordihoff,xordi+xmissille+10,copiy )
      DisplaySprite(#missordihoff,xordi+xmissille+20,copiy )
      FlipBuffers():; affiche l'ecran
      tir=0
    EndIf
  EndProcedure
  
  ;{message_gagne_perdu
  message_gagne_perdu:
  If toucheordi=1
    toucheordi=0
    
    MessageRequester("Tron", "Tron a perdu", #PB_MessageRequester_Ok )
    ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
    scorehuman+1
    Goto debut
  EndIf
  If touche=2
    touche=0
    MessageRequester("Tron", "Tron a Gagné", #PB_MessageRequester_Ok )
    ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
    scoretron+1
    Goto debut
  EndIf
  Return
  ;}
  
  ;{ assistance_mur :
  assistance_mur :
  If xjoueur-vitessejoueur<10 And Couleurjoueurg=0 And pos=4
    pos=3
  EndIf
  If xjoueur-vitessejoueur<10 And Couleurjoueurd=0 And pos=4
    pos=1
  EndIf
  If xjoueur-vitessejoueur>760 And Couleurjoueurg=0 And pos=2
    pos=1
  EndIf
  If xjoueur-vitessejoueur>760 And Couleurjoueurd=0 And pos=2
    pos=3
  EndIf
  ;
  If yjoueur-vitessejoueur<10 And Couleurjoueurg=0 And pos=1
    pos=4
  EndIf
  If yjoueur-vitessejoueur<10 And Couleurjoueurd=0 And pos=1
    pos=2
  EndIf
  If yjoueur-vitessejoueur>560 And Couleurjoueurg=0 And pos=3
    pos=4
  EndIf
  If yjoueur-vitessejoueur>560 And Couleurjoueurd=0 And pos=3
    pos=2
  EndIf
  Return
  ;}

Publié : ven. 14/oct./2005 17:35
par Oliv
Sympatique :D
Mais il y a une erreur d'accès mémoire quand on sort avec la V3.94

Publié : ven. 14/oct./2005 18:20
par Backup
il suffisait de mettre un "end" apres le "until event" :D

rien de bien mechant :D Merci ..

Publié : dim. 11/juin/2006 11:22
par Fortix
En tous cas j'ai apris beaucoup de chose en examinant ton code *TRON*

Publié : dim. 11/juin/2006 14:19
par Backup
Fortix a écrit :En tous cas j'ai apris beaucoup de chose en examinant ton code *TRON*
c'etait le but, donc Merci a toi ! :D

Publié : dim. 11/juin/2006 15:28
par djes
Tu ne pourrais pas faire une version 4.0? Je suis trop fainéant pour me taper tous les locate() :D

Sur amiga, j'avais fait un tron purement système (c'est à dire en mode fenêtré redimensionnable) qui intégrait un mode 8 directions (à deux joueurs évidemment), et la possibilité de "sauter" au dessus des obstacles. C'était très fun!!! (non, non, je n'essaye pas de t'influencer!!! Pas du tout! Absolument pas! Enfin si tu le fais ça ne me déplairait pas! Mais ne te sens pas obligé, hein!!!)

Publié : dim. 11/juin/2006 18:26
par Backup
djes a écrit :Tu ne pourrais pas faire une version 4.0? Je suis trop fainéant pour me taper tous les locate() :D
voila c'est fait ! :D

pas evident de se remetre d'une sieste de plusieurs mois en matiere de Purebasic :lol:

Publié : dim. 11/juin/2006 18:44
par djes
Merci :D

J'ai corrigé ta routine clavier comme suit :

Code : Tout sélectionner

    If KeyboardPushed( #PB_Key_Left  ) And kpl=#False
      touche=test_coul(Couleurjoueur)
      If touche=2
        Goto su
      EndIf
      pos-1:dob=1
      If pos<1
        pos=4
      EndIf
      kpl=#True
    EndIf

    If KeyboardPushed(  #PB_Key_Right  ) And kpr=#False
      touche=test_coul(Couleurjoueur)
      If touche=2
        Goto su
      EndIf
      pos+1:dob=1
      If pos>4
        pos=1
      EndIf
			kpr=#True
    EndIf
    
    If KeyboardReleased( #PB_Key_Left  ) And kpl
	    kpl=#False
    EndIf
    If KeyboardReleased( #PB_Key_Right  ) And kpr
	    kpr=#False
    EndIf   
J'aime pas trop le delay au début de la boucle, j'ai essayé de réduire le frame rate, mais on n'arrive pas à tourner pile poil comme on voudrait, faudrait peut-être gérer le clavier dans un thread pour être sûr de pas louper d'événement :)

Publié : dim. 11/juin/2006 18:55
par Backup
j'ai mis tes modif dans le premier listing !!
Merci, j'avais un problem avec les pushed (ça allais trop vite !!)

a ce propos je trouve qu'il manque une option qui regle de delay
de detection des touches du clavier ,
car elle sont toujours pris en compte en "Auto-repetition", il faudrai pouvoir a l'aide d'un flag, mettre que l'on veux recuperer 1 seul appuis !!
cela eviterai l'astuce que tu utilise !! :D

Publié : dim. 11/juin/2006 20:01
par djes
Oui, peut-être; moi j'ai toujours fait comme ça, alors...