Le plus éloigné d'un certain nombre de point
Le plus éloigné d'un certain nombre de point
Pour mon jeu j'essaye de simuler la fuite ! (lollll non pas la fuite d'eau.... mais la fuite devant le danger)
J'ai un certain nombre de point qui sont les mechants définit part peur coordonée X, et Y. Ce sont les dangers (on peut dire des mechants)
Et j'ai un autre point (on peut dire le gentil) qui veut s'eloigner un maximum des mechants.
Exemple 1:si les mechants sont en cercle et lui est au milieu alors il se dirige vers le centre.
Exemple 2:Si tout les mechants sont a gauche et que lui est a leur droite , il continue d'avancer a droite...
etc..
Bref j'avais eu l'idée d'additionner les vecteurs entre chaque mechant et le gentil. Pensant que La resultante de ce vecteur me donnera la direction vers ou je dois me dirigier mais mais bon ça ne marche pas terrible
quelqu'un aurait une idée?
J'ai un certain nombre de point qui sont les mechants définit part peur coordonée X, et Y. Ce sont les dangers (on peut dire des mechants)
Et j'ai un autre point (on peut dire le gentil) qui veut s'eloigner un maximum des mechants.
Exemple 1:si les mechants sont en cercle et lui est au milieu alors il se dirige vers le centre.
Exemple 2:Si tout les mechants sont a gauche et que lui est a leur droite , il continue d'avancer a droite...
etc..
Bref j'avais eu l'idée d'additionner les vecteurs entre chaque mechant et le gentil. Pensant que La resultante de ce vecteur me donnera la direction vers ou je dois me dirigier mais mais bon ça ne marche pas terrible
quelqu'un aurait une idée?
Suivant comme tu as implémenté ton jeu, tu peux utiliser un dérivé du min-max :
- Tu testes le déplacement dans toutes les directions, et à chaque "scène" qui en résulte, tu attribues une note correspondant à la somme des distances qui le sépare des ennemis.
- Tu choisis la solution qui a la meilleure note.
- Tu testes le déplacement dans toutes les directions, et à chaque "scène" qui en résulte, tu attribues une note correspondant à la somme des distances qui le sépare des ennemis.
- Tu choisis la solution qui a la meilleure note.
Ton idée était la bonne 
ça marche tres bien voici un prog vite fait pour simuler la fuite.
Imaginons un lapin dans un champs avec plein de chasseur (Gniark ! Gniark !)
Le lapin c'est le point Rouge ! Les chasseurs les point Vert, et le point Bleu le chasseur selectioné
Les commandes :
[Espace] Le lapin avance d'une case
[Clic Droit] tu retire un obstacle
[Clic Gauche] tu rajoute un obstacle
[TAB] on change de chasseur
[UP] fait monter le chasseur selectionné
[DOWN] fait descendre le chasseur selectionné
[LEFT] le Chasseur va a gauche
[RIGHT] le chasseur va a droite
[ESC] pour Quitter !!
Le code peut être améliorer et optimisé, mais ce n'était pas mon but premier. J'ai essayé de commenté un maximum pour que tout le monde comprenne !
Voilà ! Merci a ceux qui m'on lu et merci a ATHOW pour cette idée que j'aurais du avoir avant lui ! hi hi !

ça marche tres bien voici un prog vite fait pour simuler la fuite.
Imaginons un lapin dans un champs avec plein de chasseur (Gniark ! Gniark !)
Le lapin c'est le point Rouge ! Les chasseurs les point Vert, et le point Bleu le chasseur selectioné
Les commandes :
[Espace] Le lapin avance d'une case
[Clic Droit] tu retire un obstacle
[Clic Gauche] tu rajoute un obstacle
[TAB] on change de chasseur
[UP] fait monter le chasseur selectionné
[DOWN] fait descendre le chasseur selectionné
[LEFT] le Chasseur va a gauche
[RIGHT] le chasseur va a droite
[ESC] pour Quitter !!
Code : Tout sélectionner
InitSprite()
InitMouse()
InitKeyboard()
#MW=20
#Taille=25
Global Dim Map(#MW,#MW)
Structure p
x.l
y.l
point.f
EndStructure
Global Dim Perso.p(10) ;Les être vivant s
Global Dim Cases.p(4) ;Les cases a testé au tout du lapin
Global Nbp.l ;
Nbp=5 ; Nombre d'être vivant
;Le N°1 c'est le lapin et tout les autres les chasseurs
Perso(1)\x=#MW>>1 ; Lapin au Milieu du champ
Perso(1)\y=#MW>>1
;Je place les chasseurs
For t=2 To Nbp
Perso(t)\x=Random(#MW-2)+1
Perso(t)\y=Random(#MW-2)+1
Next
Pselect=2 ;Chasseur selectionné par defaut
Nbpaff=Nbp ;Nombre de perso affiché (pour faire des test avec + ou - de chasseur
;Si on arrive a ouvrir la fenêtre (sinon c'est pas la peine de continuer..:P)
If OpenWindow(0, 0, 0, 800, 600, "La Chasse au Lapin", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0,800, 600, 0, 0, 0)
Repeat
WEvent = WaitWindowEvent() ; Un Evenement ?!
If WEvent = #PB_Event_CloseWindow
Quit = #True
EndIf
ExamineMouse()
ExamineKeyboard()
;Chouette on va faire du dessin
StartDrawing(ScreenOutput())
;On dessine le cadrillage
For t=0 To #MW+1
Line(0,t*#Taille,(#MW+1)*#Taille,0,RGB(255,255,255))
Line(t*#Taille,0,0,(#MW+1)*#Taille,RGB(255,255,255))
Next
;On dessine les obstacle si il y en a
For zx=0 To #MW
For zy=0 To #MW
If map(zx,zy)=1
Box(zx*#Taille+1,zy*#Taille+1,#Taille-2,#Taille-2,RGB(255,255,255))
EndIf
Next zy
Next zx
;Un petit mode pour que le fond du texte sois transparent
DrawingMode(#PB_2DDrawing_Transparent)
;Je dessine tout les perso a l'ecran
For t=1 To Nbpaff;Nbp
If t=1:col=#Red:Else:col=#Green:EndIf
If t=Pselect:col=#Blue:EndIf
Circle(Perso(t)\x*#Taille+#Taille>>1,Perso(t)\y*#Taille+#Taille>>1,#Taille>>1,col)
Next
;Allez on test les cases au tour du lapin
For pf=1 To 4
Select pf
Case 1 ; La case a droite
Cases(pf)\x=Perso(1)\x+1
Cases(pf)\y=Perso(1)\y
Cases(pf)\point=0
Case 2 ; La case en bas
Cases(pf)\x=Perso(1)\x
Cases(pf)\y=Perso(1)\y+1
Cases(pf)\point=0
Case 3 ; La case a gauche
Cases(pf)\x=Perso(1)\x-1
Cases(pf)\y=Perso(1)\y
Cases(pf)\point=0
Case 4 ; la case en haut
Cases(pf)\x=Perso(1)\x
Cases(pf)\y=Perso(1)\y-1
Cases(pf)\point=0
EndSelect
;Un petit test pour être sur que le lapin ne sort pas du champ ..
If Cases(pf)\x<0 Or Cases(pf)\x>#MW Or Cases(pf)\y<0 Or Cases(pf)\y>#MW
Cases(pf)\x=Perso(1)\x
Cases(pf)\y=Perso(1)\y
EndIf
;Si il n'y a pas d'obstacle alors on calcul le coef de danger
If Map(Cases(pf)\x,Cases(pf)\y)=0
;On trace une case grise pour dire que cette case est testé
Box(Cases(pf)\x*#Taille+1,Cases(pf)\y*#Taille+1,#Taille-2,#Taille-2,RGB(60,60,60))
;On trouve le gars le plus loin
Vx=0 ;
Vy=0 ;
;On additionne le danger que represente chaque chasseur
For p=2 To Nbpaff; Nbp
Vx=(Cases(pf)\x-Perso(p)\x)
Vy=(Cases(pf)\y-Perso(p)\y)
TV=Sqr(Vx*Vx+Vy*Vy)
If TV<Cases(pf)\point Or Cases(pf)\point=0
Cases(pf)\point=TV
EndIf
Next
;On affiche le coef de la case
DrawText(Cases(pf)\x*#Taille+5,Cases(pf)\y*#Taille+5,Str(Cases(pf)\point),RGB(255,255,255))
EndIf
Next pf
;Le lapin passe a la case suivante
If KeyboardPushed(#PB_Key_Space) And ElapsedMilliseconds()>waitkey
;On selectionne la case qui a le Coef le moins elevé
Point=-1
n=0
For pf=1 To 4
tp=Cases(pf)\point
If tp>Point Or Point=-1
Point=tp
n=pf
ElseIf tp=Point And pf=Memn ;Random(1)=1
n=pf
EndIf
Next
Memn=n
;si on a bien une case alors le lapin vas sur cette case
If n>0
Perso(1)\x=Cases(n)\x
Perso(1)\y=Cases(n)\y
EndIf
waitkey= ElapsedMilliseconds()+500
EndIf
;Pour diminuer le nombre de chasseur
If KeyboardPushed(#PB_Key_Subtract) And ElapsedMilliseconds()>waitkey
Nbpaff-1
If Nbpaff<2:Nbpaff=2:EndIf
waitkey= ElapsedMilliseconds()+500
EndIf
;POur augmenter le nombre de chasseur
If KeyboardPushed(#PB_Key_Add) And ElapsedMilliseconds()>waitkey
Nbpaff+1
If Nbpaff>Nbp:Nbpaff=Nbp:EndIf
waitkey= ElapsedMilliseconds()+500
EndIf
;POur selectionner le chasseur suivant
If KeyboardPushed(#PB_Key_Tab) And ElapsedMilliseconds()>waitkey
Pselect+1
If Pselect>Nbp:Pselect=2:EndIf
waitkey= ElapsedMilliseconds()+500
EndIf
;Le chasseur selectioné monte
If KeyboardPushed(#PB_Key_Up) And ElapsedMilliseconds()>waitkey
Perso(Pselect)\y-1
waitkey= ElapsedMilliseconds()+500
EndIf
;Le chasseur selectionné descent
If KeyboardPushed(#PB_Key_Down) And ElapsedMilliseconds()>waitkey
Perso(Pselect)\y+1
waitkey= ElapsedMilliseconds()+500
EndIf
;Le chasseur selectionné va a gauche
If KeyboardPushed(#PB_Key_Left) And ElapsedMilliseconds()>waitkey
Perso(Pselect)\x-1
waitkey= ElapsedMilliseconds()+500
EndIf
;Le chasseur va a droite
If KeyboardPushed(#PB_Key_Right) And ElapsedMilliseconds()>waitkey
Perso(Pselect)\x+1
waitkey= ElapsedMilliseconds()+500
EndIf
;On efface un obstacle
If MouseButton(#PB_MouseButton_Right) And MouseX()<#MW*#Taille And MouseY()<#MW*#Taille
Map(Int(MouseX()/#Taille),Int(MouseY()/#Taille))=0
EndIf
;On rajoute un obstacle
If MouseButton(#PB_MouseButton_Left) And MouseX()<#MW*#Taille And MouseY()<#MW*#Taille
Map(Int(MouseX()/#Taille),Int(MouseY()/#Taille))=1
EndIf
;Un petit curseur pour la souris ... :P
Line(MouseX(),MouseY(),16,0,#Red)
Line(MouseX(),MouseY(),0,16,#Red)
;On affiche le text
DrawText(#MW*#Taille+#Taille,20,"[Espace] Le lapin avance d'une case",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,40,"[Clic Droit] tu retire un obstacle",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,60,"[Clic Gauche] tu rajoute un obstacle",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,80,"[TAB] on change de chasseur",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,100,"[UP] fait monter le chasseur selectionné",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,120,"[DOWN] fait descendre le chasseur selectionné",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,140,"[LEFT] le Chasseur va a gauche",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,160,"[RIGHT] le chasseur va a droite",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,180,"[ESC] pour Quitter !!",RGB(255,200,200))
StopDrawing() ;On a finit de dessiner
FlipBuffers() ;On affiche l'image
ClearScreen(0) ; Et on efface le buffer pour travailler sur une page toute prore :oP
Delay(10);On laisse un peu de temps libre pour les autres
Until Quit = #True Or KeyboardPushed(#PB_Key_Escape)
;On quitte alors on fait ça bien on verme la fenêtre
CloseWindow(0)
EndIf
Voilà ! Merci a ceux qui m'on lu et merci a ATHOW pour cette idée que j'aurais du avoir avant lui ! hi hi !

Dernière modification par Thyphoon le jeu. 29/mars/2007 17:27, modifié 2 fois.
c'est parceque tu as la version démo (encore).
ces constantes sont des constantes Win32 - donc bloqué par la version démo.
donc remplace les #Red, #Blue, ... par leur équivalent.
une composante couleur étant représentée par $BBGGRR
#Red = $0000FF
#Green = $00FF00
#Blue = $FF0000
ou avec la fonction RGB(r, g, b)
Red = RGB(255, 0, 0)
Green = RGB(0, 255, 0)
Blue = RGB(0, 0, 255)
ces constantes sont des constantes Win32 - donc bloqué par la version démo.
donc remplace les #Red, #Blue, ... par leur équivalent.
une composante couleur étant représentée par $BBGGRR
#Red = $0000FF
#Green = $00FF00
#Blue = $FF0000
ou avec la fonction RGB(r, g, b)
Red = RGB(255, 0, 0)
Green = RGB(0, 255, 0)
Blue = RGB(0, 0, 255)
non, sous nunux :pFlype a écrit :c'est parceque tu as la version démo (encore).
ces constantes sont des constantes Win32 - donc bloqué par la version démo.
#Red = RGB(255, 0, 0) marche pasFlype a écrit :ou avec la fonction RGB(r, g, b)
avec la valeur héxa çà marche mais çà fait planter mon PC (freeze)
Voilà c'est corrigé ! donc _Slide_ si tu trouves un autre bug n'hesite pas !!!
)

Code : Tout sélectionner
InitSprite()
InitMouse()
InitKeyboard()
#MW=20
#Taille=25
Global Dim Map(#MW,#MW)
Structure p
x.l
y.l
point.f
EndStructure
Global Dim Perso.p(10) ;Les être vivant s
Global Dim Cases.p(4) ;Les cases a testé au tout du lapin
Global Nbp.l ;
Nbp=5 ; Nombre d'être vivant
;Le N°1 c'est le lapin et tout les autres les chasseurs
Perso(1)\x=#MW>>1 ; Lapin au Milieu du champ
Perso(1)\y=#MW>>1
;Je place les chasseurs
For t=2 To Nbp
Perso(t)\x=Random(#MW-2)+1
Perso(t)\y=Random(#MW-2)+1
Next
Pselect=2 ;Chasseur selectionné par defaut
Nbpaff=Nbp ;Nombre de perso affiché (pour faire des test avec + ou - de chasseur
;Si on arrive a ouvrir la fenêtre (sinon c'est pas la peine de continuer..:P)
If OpenWindow(0, 0, 0, 800, 600, "La Chasse au Lapin", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0,800, 600, 0, 0, 0)
Repeat
WEvent = WaitWindowEvent() ; Un Evenement ?!
If WEvent = #PB_Event_CloseWindow
Quit = #True
EndIf
ExamineMouse()
ExamineKeyboard()
;Chouette on va faire du dessin
StartDrawing(ScreenOutput())
;On dessine le cadrillage
For t=0 To #MW+1
Line(0,t*#Taille,(#MW+1)*#Taille,0,RGB(255,255,255))
Line(t*#Taille,0,0,(#MW+1)*#Taille,RGB(255,255,255))
Next
;On dessine les obstacle si il y en a
For zx=0 To #MW
For zy=0 To #MW
If map(zx,zy)=1
Box(zx*#Taille+1,zy*#Taille+1,#Taille-2,#Taille-2,RGB(255,255,255))
EndIf
Next zy
Next zx
;Un petit mode pour que le fond du texte sois transparent
DrawingMode(#PB_2DDrawing_Transparent)
;Je dessine tout les perso a l'ecran
For t=1 To Nbpaff;Nbp
If t=1:col=#Red:Else:col=#Green:EndIf
If t=Pselect:col=#Blue:EndIf
Circle(Perso(t)\x*#Taille+#Taille>>1,Perso(t)\y*#Taille+#Taille>>1,#Taille>>1,col)
Next
;Allez on test les cases au tour du lapin
For pf=1 To 4
Select pf
Case 1 ; La case a droite
Cases(pf)\x=Perso(1)\x+1
Cases(pf)\y=Perso(1)\y
Case 2 ; La case en bas
Cases(pf)\x=Perso(1)\x
Cases(pf)\y=Perso(1)\y+1
Case 3 ; La case a gauche
Cases(pf)\x=Perso(1)\x-1
Cases(pf)\y=Perso(1)\y
Case 4 ; la case en haut
Cases(pf)\x=Perso(1)\x
Cases(pf)\y=Perso(1)\y-1
EndSelect
Cases(pf)\point=-1
;Un petit test pour être sur que le lapin ne sort pas du champ ..
If Cases(pf)\x<0 Or Cases(pf)\x>#MW Or Cases(pf)\y<0 Or Cases(pf)\y>#MW
Cases(pf)\x=Perso(1)\x
Cases(pf)\y=Perso(1)\y
EndIf
;Si il n'y a pas d'obstacle alors on calcul le coef de danger
If Map(Cases(pf)\x,Cases(pf)\y)=0
;On trace une case grise pour dire que cette case est testé
Box(Cases(pf)\x*#Taille+1,Cases(pf)\y*#Taille+1,#Taille-2,#Taille-2,RGB(60,60,60))
;On trouve le gars le plus loin
Vx=0 ;
Vy=0 ;
;On trouve le le perso le plus dangereux !
For p=2 To Nbpaff; Nbp
Vx=(Cases(pf)\x-Perso(p)\x)
Vy=(Cases(pf)\y-Perso(p)\y)
TV=Sqr(Vx*Vx+Vy*Vy)
If TV<Cases(pf)\point Or Cases(pf)\point=-1
Cases(pf)\point=TV
EndIf
Next
;On affiche le coef de la case
DrawText(Cases(pf)\x*#Taille+5,Cases(pf)\y*#Taille+5,Str(Cases(pf)\point),RGB(255,255,255))
EndIf
Next pf
;Le lapin passe a la case suivante
If KeyboardPushed(#PB_Key_Space) And ElapsedMilliseconds()>waitkey
;On selectionne la case qui a le Coef le moins elevé
Point=-1
n=0
For pf=1 To 4
tp=Cases(pf)\point
If tp>Point Or Point=-1
Point=tp
n=pf
ElseIf tp=Point And pf=Memn ;Random(1)=1
n=pf
EndIf
Next
Memn=n
;si on a bien une case alors le lapin vas sur cette case
If n>0
Perso(1)\x=Cases(n)\x
Perso(1)\y=Cases(n)\y
EndIf
waitkey= ElapsedMilliseconds()+500
EndIf
;Pour diminuer le nombre de chasseur
If KeyboardPushed(#PB_Key_Subtract) And ElapsedMilliseconds()>waitkey
Nbpaff-1
If Nbpaff<2:Nbpaff=2:EndIf
waitkey= ElapsedMilliseconds()+500
EndIf
;POur augmenter le nombre de chasseur
If KeyboardPushed(#PB_Key_Add) And ElapsedMilliseconds()>waitkey
Nbpaff+1
If Nbpaff>Nbp:Nbpaff=Nbp:EndIf
waitkey= ElapsedMilliseconds()+500
EndIf
;POur selectionner le chasseur suivant
If KeyboardPushed(#PB_Key_Tab) And ElapsedMilliseconds()>waitkey
Pselect+1
If Pselect>Nbp:Pselect=2:EndIf
waitkey= ElapsedMilliseconds()+500
EndIf
;Le chasseur selectioné monte
If KeyboardPushed(#PB_Key_Up) And ElapsedMilliseconds()>waitkey
Perso(Pselect)\y-1
waitkey= ElapsedMilliseconds()+500
EndIf
;Le chasseur selectionné descent
If KeyboardPushed(#PB_Key_Down) And ElapsedMilliseconds()>waitkey
Perso(Pselect)\y+1
waitkey= ElapsedMilliseconds()+500
EndIf
;Le chasseur selectionné va a gauche
If KeyboardPushed(#PB_Key_Left) And ElapsedMilliseconds()>waitkey
Perso(Pselect)\x-1
waitkey= ElapsedMilliseconds()+500
EndIf
;Le chasseur va a droite
If KeyboardPushed(#PB_Key_Right) And ElapsedMilliseconds()>waitkey
Perso(Pselect)\x+1
waitkey= ElapsedMilliseconds()+500
EndIf
;On efface un obstacle
If MouseButton(#PB_MouseButton_Right) And MouseX()<#MW*#Taille And MouseY()<#MW*#Taille
Map(Int(MouseX()/#Taille),Int(MouseY()/#Taille))=0
EndIf
;On rajoute un obstacle
If MouseButton(#PB_MouseButton_Left) And MouseX()<#MW*#Taille And MouseY()<#MW*#Taille
Map(Int(MouseX()/#Taille),Int(MouseY()/#Taille))=1
EndIf
;Un petit curseur pour la souris ... :P
Line(MouseX(),MouseY(),16,0,#Red)
Line(MouseX(),MouseY(),0,16,#Red)
;On affiche le text
DrawText(#MW*#Taille+#Taille,20,"[Espace] Le lapin avance d'une case",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,40,"[Clic Droit] tu retire un obstacle",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,60,"[Clic Gauche] tu rajoute un obstacle",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,80,"[TAB] on change de chasseur",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,100,"[UP] fait monter le chasseur selectionné",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,120,"[DOWN] fait descendre le chasseur selectionné",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,140,"[LEFT] le Chasseur va a gauche",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,160,"[RIGHT] le chasseur va a droite",RGB(255,200,200))
DrawText(#MW*#Taille+#Taille,180,"[ESC] pour Quitter !!",RGB(255,200,200))
StopDrawing() ;On a finit de dessiner
FlipBuffers() ;On affiche l'image
ClearScreen(0) ; Et on efface le buffer pour travailler sur une page toute prore :oP
Delay(10);On laisse un peu de temps libre pour les autres
Until Quit = #True Or KeyboardPushed(#PB_Key_Escape)
;On quitte alors on fait ça bien on verme la fenêtre
CloseWindow(0)
EndIf