JeuWeb - Crée ton jeu par navigateur
Positionnement de vilages sur une carte... - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Positionnement de vilages sur une carte... (/showthread.php?tid=3523)

Pages : 1 2


Positionnement de vilages sur une carte... - horexas - 11-01-2009

Bonjour je voudrais dans mon jeu de gestion de villages, positionner les villages des joueurs lors de l'inscription sur ma carte composées de 4 zones (+;+ +;- -;- -;+). Le joueur choisirait entre une de ces 4 zones et son villages serait positionné de telle sorte que l'ensemble des villages de tout les joueurs forment un 'rond' donc le centre serait environ les coordonnées 0;0.
J'ai conçus un script mais je ne suis pas sur qu'il fonctionne comme je l'attend. Que dois-je rajouter?(ps: j'ai fait ca juste pour la zone +;+)
Code PHP :
<?php 
$sql
=mysql_query("select posx, posy From village limit 0,5 order by id desc") //je recherche les derniers villages inscrits
while($data=mysql_fletch_assoc($sql))
{
$moyennexdesvillages .= $data['x'] / 5; //je fais la moyenne de la position des villages en additionnant les x de tout les villages divisé par le nombre de village
$moyenneydesvillages .= $data['y'] / 5; //idem pour les y
}
$positionnementfini = FALSE;
FOR(
$positionnementfini = FALSE)
{
$posxdemonvillage = $moyennexdesvillages + rand(-5,5); //je détermine la position de mon village en x avec la moyenne des autres villages + une variable aléatoire
$posydemonvillage = $moyenneydesvillages + rand(-5,5); // idem en y
$sql = mysql_query( "Select posx, posy FROM village Where pox=$posxdemonvillage and posy=$posydemonvillage" );
$req = mysql_fletch_array($sql);
if(empty(
$req['x']) OR empty($req['y'])) //si la place n'est pas déja occupée
{
mysql_query( "Insert into village Values( '', '$posxdemonvillage', '$posydemonvillage', '$monnom'"); //j'udapte la table (avec id auto increment)
$positionnementfini = TRUE;
}
else
{
$positionnementfini = FALSE;
}
}



RE: Positionnement de vilages sur une carte... - Yopnico - 11-01-2009

Je n'ai pas saisi combien de villages peuvent être créé en tout??

Seulement 4?

Lors de l'inscription, le joueur choisi une zone, et sa place son village automatiquement??

Est ce que la position des villages change à chaque inscription??


RE: Positionnement de vilages sur une carte... - horexas - 11-01-2009

Quand on s'inscrit un village est crée pour un joueur et son village se place automatiquement dans la zone choisie et oui la position de villages change pour chaques inscriptions


RE: Positionnement de vilages sur une carte... - Yopnico - 11-01-2009

Je ne pense pas que ton code marche!!

Pour placer un point sur un cercle, tu ne peux pas faire la moyenne des points de ce cercle, car la moyenne des points sera zero!!

Il te faut le rayon du cercle, et definir sa position selon la fonction du cercle!!

Si mes souvenirs sont bons, la fonction d'un cercle peut s'écrire :

y=racine(rayon²-x²) >>> demi cercle avec y>0
y=-racine(rayon²-x²) >>> demi cercle avec y<0

A mon avis, tu dois placer tes coordonnées x et y avec cette fonction!!


RE: Positionnement de vilages sur une carte... - horexas - 11-01-2009

Pour ta premiere afirmation je fais la moyenne des points d'une partie du cercle(ex: +;+) et non tout les points et pour la formule du cercle c'est rayon²=(x-a)²+(y-b)² ou a et b sont les coordonnées du centre du cercle. Je trouve que ta proposition est bien mais comment je pourrais faire pour l'appliquer sur mon script?.


RE: Positionnement de vilages sur une carte... - wild-D - 11-01-2009

je crois que quand horexas parle de cercle; il pense plutot à une surface (donc un disque).

ça n'empêche que l'algo me semble totalement bancale.

>>J'ai conçus un script mais je ne suis pas sur qu'il fonctionne comme je l'attend.

la réponse est clairement: non il ne fait pas du tout ce que tu veux !

-> gné c'est quoi cette histoire de calculer la moyenne; et en plus en utilisant .= (ça chez moi c'est l'opérateur de d'assignation combiné avec concaténation de chaine)
- c'est ridicule de faire la moyenne (edit: que ce passe-t-il si tu n'as pas de village ?!, et si tu en as qu'un seul); vu que ça signifie que si tu as tout à coup une valeur aberrante, tu aura un déaclage sur ta moyenne et que tu va te servir de ça comme point de repère Oo'. c'est toi qui fixe le point d'encrage (ce qui en plus allègera ton algo de ces calculs inutiles)

-> FOR($positionnementfini = FALSE)
{...

je sais pas ce que cette boucle est sensée faire dans ton esprit; mais je doute que ça fasse ce que tu souhaite

enfin je me demande si tu as remarqué ou pas que rand(-5,5) donne une répartition uniforme; donc dans 2 directions ce que tu obtiens ce sera une répartition uniforme sur une surface carrée ^^ (donc c'est pas exactement un cercle Tongue enfin bon c'est pas automatiquement la mort)


>> Que dois-je rajouter?
du bon sens (ou alors réviser les bases du PHP)... parce que là; je vais être méchant; mais on se demande si t'as vraiment "réfléchi" à ton algo; ou si t'as pas été au petit bonheur en croisant les doigts.


RE: Positionnement de vilages sur une carte... - Zamentur - 11-01-2009

Déjà il faut savoir si c'est un cercle ou un disque.
Sauf que là on manque de régle précise vis à vis de ton problème!

On pourrait par exemple placer les village cote à cote jusqu'à ce que çà fasse le tour du cercle, mais je suis pas sur que ce soit ce que tu veux.

Je vais tenté donc d'imaginer ce que tu souhaites en faisant les hypothése suivante:
- Placer les villages dans un disque de rayon R constant
- Placer ces villages de façon aléatoire sur le disque
- Garder une distance minimum Dmin entre chaque village
- Avoir des coordonée appartenant à R² et non à Z²... (c'est l'hypothése dont j'ai le plus de doute, mais vu ton trucs avec la moyenne ce doit etre Réel...)

Bref donc là rien de complexe
On se place en coordonée polaire
Code PHP :
<?php 
function pol_aleatoire($R,$alpha=360){
$precision=1000;

$coo_r=mt_rand(0,$precision)/$precision*$R;
$coo_alpha=mt_rand(0,$precision)/$precision*$alpha;


}
Ce script génére des positions alétaoires sur le disque de centre 0,0 et de rayon $R en coordonée polaire

Pour obtenir le tout en coordonée cartésienne:
Code PHP :
<?php 
$coo_x
=$coo_r*sin($coo_alpha);
$coo_alpha=mt_rand(0,360); //alpha étant en degrée

test je regarde si çà marche car là j'ai un gros problème

EDIT:Bon j'ai eu un probhlème en écrivant ce message, qui m'a emépché de l'éditer alors que je ne l'avais pas fini! Comme d'autre ont répondu entre temps je laisse çà comme çà. Le script proposé n'était pas du tout fini! Notament il faut encore vérifier que les villages étaient assez distant les uns des autres...


RE: Positionnement de vilages sur une carte... - horexas - 11-01-2009

Merci Zamentur je voudrai juste placer les joueurs de plus en plus loin du centre mais que en tout cela face un disque qui s'agrandit en fonction du nombre de joueurs et que les vieux joueurs soient plus proches du centre que les nouveaux qui seront en périphéries...(avec le chois de la zone +;+ +;- ...).
Sinon merci énormément de ton aide... Je crois que devrais juste pour que cela fonctionne d'avoir un rayon $R qui augmente en fonction du nombre de joueurs et un angle $alpha qui augmente dans une zone de 90degrés ( +;+ =>0degrés a 90degrés +;- => 90degré a 180degrés ... choisie par le joueur) par rapport aux derniers joueurs de la zone ( ex : lorsque le joueurs choisit la zone +;+ on récupere l'angle alpha de ce joueur et on ajoute entre -2 et +5 degres (par exemple) et des que l'ange vaut 90degres(fin de la zone) on augment le rayon $R et on remet l'angle a zero) .

Est ce une bonne méthode ?


RE: Positionnement de vilages sur une carte... - Yopnico - 11-01-2009

Donc si je résume le problème :

[Image: 090111072612245057.jpg]

Le joueur choisi sa zone voir dessin
Et la position de ce village doit se trouver dans un disque de rayon x!

C'est avant tout un problème de géométrie!!

Ce que je te propose, c'est d'abord de commencer par un cercle minimum de rayon R=2 par exemple!

La circonférence du cercle sera donc de : 2*PI*R = 12,56

Hypothèse : tu place 1 joueur par unité de longueur
Donc tu pourras placer 12 joueurs sur ce premier cercle

Un joueur tous les 360°/12
C'est à dire un joueur tous les 30°

Une fois que tu as atteints 12 joueurs, tu fais un cercle de rayon R=4

Donc maintenant la circonférence du cercle sera donc de : 2*PI*R = 25,12

Tu pourras donc placer 25 joueurs

Ce qui te fais 1 joueur tous les 360°/25
C'est à dire un joueur tous les 14,4°

etc...


Voila un bout de code, je reviens plus tard!!

Code PHP :
<?php
//nombre de joueurs
$player;

//Fonction qui te donne le nombre de joueur que peut contenir un cercle de rayon R
function Taille($R)
{
$pi = 3.141592654858;
$taille = variant_int(2*$pi*$R);
return
$taille;
}
//Fin fonction

//Si le nombre de joueur est égal au nombre max de joueur sur ce cercle, on augmente le rayon du cercle de 2
if ($player = 360/Taille($R))
{
$R = $R + 2;
}
else
{

}
?>



RE: Positionnement de vilages sur une carte... - horexas - 11-01-2009

c tout et j'ai mon script???? juste que je devrai sauvegarder $R mais sinon c tout???