JeuWeb - Crée ton jeu par navigateur
[Résolu][MySQL] UPDATE aléatoire des champs - 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 : [Résolu][MySQL] UPDATE aléatoire des champs (/showthread.php?tid=2251)

Pages : 1 2


[Résolu][MySQL] UPDATE aléatoire des champs - Sephi-Chan - 06-01-2008

Salut,

Pour m'entraîner sur quelques points particuliers, j'ai développé un mini-jeu inspiré du jeu de rôle Les Loups-Garous de Thiercelieux.

Je me heurte toutefois à un problème dont voici le contexte :

Chaque joueur a une classe (Loup-Garou, Voyant, Alchimiste, Villageois, Marchand de sable). Les classes sont attribuées aléatoirement, dans des proportions données en fonction du nombre total de joueurs, le résultat des pourcentages est arrondi à l'entier supérieur :
  • Loups-Garous : 30% ;
  • Voyant : 10% ;
  • Alchimiste : 10%;
  • Marchand de sable : 10%;
  • Villageois : Ce qu'il reste ;

Ensuite, nous avons une table player_game_role qui lie l'identifiant d'un joueur, celui d'une partie et celui d'une classe (dans notre cas, on va simplifier ça en donnant une chaîne de caractère à la place d'un id).

Quand une partie est prêtre à être lancée, tous les joueurs qui s'y sont inscrit sont dans cette table : il ne manque plus qu'à attribuer à chaque joueur un rôle aléatoirement et dans le respect des proportions données plus haut.
Comme données connues, nous avons la quantité de joueurs total et éventuellement le nombre de places dans chaque classe.

Je ne trouve pas de technique correcte pour faire ça... J'espère que vous pourrez m'aider car là, je n'en puis plus ! Smile Je vous en remercie d'avance,


Sephi-Chan


RE: [MySQL] UPDATE aléatoire des champs - Loetheri - 06-01-2008

Tu attribues un id de classe correspondant à aucune classe (0 par exemple).
Lorsque tu fais ton update, tu "classes" tes joueurs de façon aléatoire (ORDER BY RAND()) avec une limite (LIMIT X) et tu ne sélectionne que ceux qui ont une classe à 0 par exemple (WHERE id_classe = 0).

J'ai rien compris ?


RE: [MySQL] UPDATE aléatoire des champs - Sephi-Chan - 06-01-2008

Ça, c'est la partie que je sais faire. Mais mon problème, c'est d'attribuer le nombre de classe correct.

Par exemple :

Imaginons que la partie compte 23 joueurs. On à donc :
  • 23 * (30/100) = 6.9 donc 7 Loups-Garous (rôle d'id 1) ;
  • 23 * (10/100) = 2.3 donc 3 Voyants (rôle d'id 2) ;
  • 23 * (10/100) = 2.3 donc 3 Alchimistes (rôle d'id 3) ;
  • 23 * (10/100) = 2.3 donc 3 Marchands de sable (rôle d'id 4) ;
  • Le reste de Villageois donc 23 - (7 + 3 + 3 + 3) = 7 Villageois (rôle d'id 5) ;

Il me faut donc attribuer ces rôles à chaque personnage. C'est ce que je n'arrive pas à faire. Smile


Sephi-Chan


RE: [MySQL] UPDATE aléatoire des champs - Anthor - 06-01-2008

Avec un sélection SQL de tous les id joueurs concernés, ordonné de facon aléatoire, et une boucle pour construire la requete de mise à jour ?


RE: [MySQL] UPDATE aléatoire des champs - Loetheri - 06-01-2008

Comme l'a dit Anthor, tu récupères les id des joueurs. Tu calcules leur nombre.
Puis tu fais une "boucle" avec les updates ^^

Je ne vois pas où est le problème Confused
Limite, tu gardes le nombre de personnages déjà affectés dans une variable. Ainsi tu sais combien de villageois, tu as.


RE: [MySQL] UPDATE aléatoire des champs - Anthor - 06-01-2008

Code PHP :
<?php 
$sql
= 'SELECT id_joueur FROM player_game_role WHERE id_partie = "' . $id_partie . '" ORDER BY RAND()';
$result = mysql_query($sql);

$nbr_joueur = mysql_num_rows($result);

if (
$nbr_joueur > 0)
{
$i = 0;

$nbr_lg = ceil($nbr_joueur * (3 / 10));
$nbr_vo = ceil($nbr_joueur * (1 / 10));
$nbr_al = ceil($nbr_joueur * (1 / 10));
$nbr_ma = ceil($nbr_joueur * (1 / 10));
$nbr_vi = $nbr_joueur - ($nbr_lg + $nbr_vo + $nbr_al + $nbr_ma);

while (
$data = mysql_fetch_assoc($result))
{
if (
$i < $nbr_lg )
$my_classe = 1; // Le joueur sera un loup-garou
elseif ( $i >= $nbr_lg && $i < $nbr_vo )
$my_classe = 2; // Le joueur sera un voyant
elseif ( $i >= $nbr_vo && $i < $nbr_al )
$my_classe = 2; // Le joueur sera un alchimiste
elseif ( $i >= $nbr_al && $i < $nbr_vi )
$my_classe = 2; // Le joueur sera un villageois
else
$my_classe = NULL; // Ne devrait pas arriver ^^

if ($i > 0)
$sql_update .= ', ';
$sql_update .= 'UPDATE player_game_role SET classe = ' . $my_classe . ' WHERE id_joueur = ' . $data['id'];

$i++;
}
mysql_query($sql_update);
}

Pas testé ni optimisé mais ca devrait être ça dans l'idée.


RE: [MySQL] UPDATE aléatoire des champs - Sephi-Chan - 06-01-2008

Je me cassais les fesses à essyaer de faire ça en une requête unique (en utilisant des variables et les conditions)... Même si je n'y suis pas parvenu, je suis persuadé que c'est faisable. :p

Merci bien pour l'aide en tout cas, j'essaye dès que j'en ai l'occasion. Smile


Sephi-Chan


RE: [MySQL] UPDATE aléatoire des champs - Sephi-Chan - 06-01-2008

Quelque chose m'échappe. Je ne comprends pas le fonctionnement de la succession de if.

J'obtiens la requête finale :
Code :
UPDATE player_game_role SET role = 2 WHERE player = 4,
UPDATE player_game_role SET role = 2 WHERE player = 2,
UPDATE player_game_role SET role = 2 WHERE player = 1,
UPDATE player_game_role SET role = WHERE player = 3,
UPDATE player_game_role SET role = WHERE player = 8,
UPDATE player_game_role SET role = WHERE player = 6,
UPDATE player_game_role SET role = WHERE player = 5
On voit alors que les champs role ne sont pas affectés. De plus, il me met des 2 aux seuls endroits où il place quelque chose. Si j'enlève le else (qui n'est pas censé arriver), il me place vraiment des 2 partout. :/

Les données (j'ai changé un peu les formules, mais le compte est bon) :
Citation :7 joueurs (6 personnages spéciaux) :
* Loup-Garou => 3
* Voyant => 1
* Alchimiste => 1
* Marchand de sable => 1
* Villageois => 1

Le PHP :
Code PHP :
<?php 
$i
= 0;
$sql_update = '';
$query = 'SELECT player FROM player_game_role WHERE game = (SELECT id FROM game ORDER BY id DESC LIMIT 0, 1) ORDER BY RAND()';
$sql = mysql_query($query) or die(mysql_error());
while(
$results = mysql_fetch_assoc($sql)){

if (
$i < $this->playersByRole['Loup-Garou']){ $my_classe = 2; }
// Le joueur sera un loup-garou (id : 2)

elseif ($i >= $this->playersByRole['Loup-Garou'] && $i < $this->playersByRole['Voyant']){ $my_classe = 4; }
// Le joueur sera un alchimiste (id : 4)

elseif ($i >= $this->playersByRole['Voyant'] && $i < $this->playersByRole['Marchand de sable']){ $my_classe = 3; }
// Le joueur sera un voyant (id : 3)

elseif ($i >= $this->playersByRole['Marchand de sable'] && $i < $this->playersByRole['Alchimiste']){ $my_classe = 5; }
// Le joueur sera un marchand de sable (id : 5)

elseif ($i >= $this->playersByRole['Alchimiste'] && $i < $this->playersByRole['Villageois']){ $my_classe = 1; }
// Le joueur sera un villageois (id : 1)

else { $my_classe = NULL; } // Ne devrait pas arriver ^^

if ($i > 0){ $sql_update .= ',<br />'; }

$sql_update .= 'UPDATE player_game_role SET role = '.$my_classe.' WHERE player = '.$results['player'];

$i++;
}


Sephi-Chan, qui arrive pas à se concentrer dessus...


RE: [MySQL] UPDATE aléatoire des champs - Loetheri - 06-01-2008

En réalité, c'est plutôt
Code PHP :
<?php 
$nbr_lg
= ceil($nbr_joueur * (3 / 10));
$nbr_vo = ceil($nbr_joueur * (1 / 10)) + $nbr_lg;
$nbr_al = ceil($nbr_joueur * (1 / 10)) + $nbr_vo;
$nbr_ma = ceil($nbr_joueur * (1 / 10)) + nbr_ma;
$nbr_vi = $nbr_joueur - ($nbr_ma);
Avec le code de Anthor.

Essaye ça ^^


RE: [MySQL] UPDATE aléatoire des champs - Anthor - 06-01-2008

Correct ^^ Je me suis trompé dans le cheminement ^^