voici mon code
le resultat s'affiche de la sorte :
"3[x],2,2,0,2,2"
les chiffres symbolise la hauteur de chaque tour (il y en a 6 )
le [x] indique l'endroit ou se trouve le joueur
il y aura suivant les cas, plusieur lignes d'affilé , qui montreront les etapes du deplacement du joueur
dans le cas fourni par defaut , la progression sera la suivante
on commence sur la tour 0 qui fait 3 de haut
donc le joueur va sauter sur la tour 3 qui fait 0 de haut puisqu'elle se trouve a 3 de distance
seulement c'est un piege ! si le joueur saute là , c'est terminé
l'algo va donc rechercher a sauter a la position precedente , la tour numero 2 qui fait 2 de haut
puis continu son bonhomme de chemin de la tour 2 a la tour 4 , puis en dehors, c'est fini
cela va donc afficher les etapes suivantes :
3[x],2,2,0,2,2
3,2,2[x],0,2,2
3,2,2,0,2[x],2
3,2,2,0,2,2[x]
Arrivée FINI !!!
***********************************************
Le code indiquera si il y a un cas d'imposibilité
par exemple une tour trop haute dans le parcours ....
ou bien si le joueur tombe dans un trou , ou sur une tour plus petite que la suivante , et qui le bloque
Recusif Power
le code :
Code : Tout sélectionner
;***********************************************
;Titre :*probleme_google_4
;Auteur : Zorro
;Date :08/04/2018
;Heure :15:26:18
;Version Purebasic : PureBasic 5.62 (Windows - x86)
;Version de l'editeur :EPB V2.68
; Libairies necessaire : Aucune
;***********************************************
Declare affichage (Position_joueur)
Declare recherche(position_joueur)
Global Dim D(13),Carte.s,Carte_ori.s
; pour tests ....
D(0)=2 ; <<<<<<<<<<<<<<<<<<<<<<<<<<< va sauter en D(3)
Carte.s=Carte.s+str(D(0))+","
D(1)=2
Carte.s=Carte.s+str(D(1))+","
D(2)=0
Carte.s=Carte.s+str(D(2))+","
D(3)=0 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<< ici j'ai mis volontairement un piege, qui force l'algo a reculer d'un pas pour repartir sur la colonne 2 precedente :o)
Carte.s=Carte.s+str(D(3))+","
D(4)=2
Carte.s=Carte.s+str(D(4))+","
D(5)=1
Carte.s=Carte.s+str(D(5))+","
#Max=5
; *****Laisser ceci c'est le bornage ******
; au dela du tableau je remplis de "88"
; comme ça je sais si je suis sorti du tableau ... ;o)
For i=6 to 13
D(i)=88
Next i
; ************************************
Carte.s=Left(Carte.s,Len(Carte.s)-1)
Carte_ori.s=Carte.s
Position_joueur=0
; resultat
;affichage (Position_joueur)
; *****************************************
Position_joueur=recherche(Position_joueur)
Debug " ***********************************************"
Debug ""
Carte_ori.s=""
Carte.s=""
;- ********************* Zone Procedures *****************************************************
; *******************************************************************************************
Procedure affichage (Position_joueur)
; *** juste pour gestion affichage du joueur *** par un '[x]'
Carte.s=Carte_ori.s ; efface
pre_Carte.s=mid(Carte.s,0,((Position_joueur+1)*2)-1)+"[x]"
Post_carte.s=mid(Carte.s,((Position_joueur+1)*2))
Carte.s=pre_Carte.s+Post_carte.s
Debug Carte.s
; *****************************************
EndProcedure
Procedure recherche(Position_joueur)
; By Zorro (pas du tout optimisé !! )
; Recursif Power
Static Flag
Flag=Flag+1
If Flag>#Max
Debug "Pas de solutions FINI !!! "
ProcedureReturn -1
Endif
If Position_joueur>=ArraySize(D())
ProcedureReturn -1
Endif
affichage (Position_joueur)
For z=Position_joueur to #Max
If D(z)>D(Position_joueur)
Debug "Pas de solutions FINI !!! "
ProcedureReturn -1
Endif
Next z
; calldebugger
nombre_tour=D(Position_joueur)
If nombre_tour=88
affichage (#Max)
Debug "Arrivée FINI !!! "
Position_joueur=ArraySize(D())
ProcedureReturn -1
Endif
Arrive_possible=D(nombre_tour+Position_joueur)
If Arrive_possible=88 or D(0)=#Max or (Position_joueur+nombre_tour>=#Max)
affichage (#Max)
Debug "Arrivée FINI !!! "
Position_joueur=ArraySize(D())
ProcedureReturn -1
Endif
If Arrive_possible=0 ; ce cas si l'arrivée prevu est un trou
nombre_tour=nombre_tour-1
Arrive_possible=D(nombre_tour+Position_joueur)
If nombre_tour<1
Position_joueur=Position_joueur-1
If Position_joueur<1
Debug "Pas de solutions FINI !!! "
ProcedureReturn -1
Endif
Endif
Position_joueur=nombre_tour
recherche(Position_joueur)
goto suite
Endif
Position_joueur=nombre_tour+Position_joueur
If Position_joueur>=ArraySize(D())
ProcedureReturn -1
Else
recherche(Position_joueur)
Endif
suite:
EndProcedure
; Epb