Bug fonction, mysql_fetch_array et rand(x,y)

Résolu
monoski Messages postés 132 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 13 mai 2013 - 29 déc. 2010 à 17:41
monoski Messages postés 132 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 13 mai 2013 - 29 déc. 2010 à 21:37
Bonjour tout le monde !

Je développe un mini jeu de rôle.
Voici une esquisse de fonction permettant de voir si au cours d'un déplacement, un de mes personnages tombe sur un objet :


<? session_start();
include 'include/bdd.php';
mysql_query("SET NAMES UTF8");
function loot()
{
$pseudo = $_SESSION['username'];
$chance_not_to_loot = 0;// 5% de chance de looter par déplacement ! On peut éventuellement rajouter une boucle pour donner une chance de looter plusieurs objets mais bon, j'ai pas envie !
$chance_the_loot_is_conso = 1;// 10% de chance pour que ce soit un objet et // 90% de chance pour que ce soit un consommable
$lootable = rand(1,100);
if ($lootable > $chance_not_to_loot) 
{
$prerequis $recup mysql_query("SELECT xp FROM elfik_user WHERE username='$pseudo'") or die('Erreur SQL !'.$sql.'
'.mysql_error());
$fetch = mysql_fetch_array($prerequis); 		
$user_xp = $fetch['xp'];
$item_type = rand(1,100);
if ($item_type > $chance_the_loot_is_conso) 
{
$consommable=1;
$quality_rand= rand(1,1000);
if ($quality_rand <= 800)
{
$quality = "uncommon";
$backup = "It is ".$quality."... Maybe you should keep it, a vendor will certainly buy it...";
}
elseif ($quality_rand > 800 AND $quality_rand<= 950)
{
$quality = "rare";
$backup = "It is ".$quality." ! It looks great !!!!";
}
elseif ($quality_rand > 950 AND $quality_rand<= 995)
{
$quality = "epic";
$backup = "It is ".$quality." ! Hell yeahhh !";
}
elseif ($quality_rand > 995)
{
$quality = "legendary";
$backup = "It is legen wait for it ... dary, LEGENDARY ! Motha fucka !!!!!!";

}
$items_lootable = mysql_query("SELECT name FROM T_items WHERE quality='$quality' AND (item_lvl > ('$user_xp' - 300) AND item_lvl <= ('$user_xp' + 300))") or die('Erreur SQL !'.$sql.'
'.mysql_error());
}
else
{
$consommable=1;
$backup = "It looks disgusting!";
$items_lootable = mysql_query("SELECT name FROM T_items WHERE item_lvl > ('$user_xp' - 300) AND item_lvl <= ('$user_xp' + 300) AND consommable='$consommable'") or die('Erreur SQL !'.$sql.'
'.mysql_error());
}//seuil de tolérance entre xp requis de l'objet et xp du joueur de 300XP (300 de moins et 300 de plus) !


$total = mysql_num_rows($items_lootable);
$item_looted_rand = rand(0,$total - 1);
while ($afficher = mysql_fetch_array($items_lootable))
{
$item_name = $afficher[$item_looted_rand];
}
//Faire un array avec les objets potentiels et faire un rand à partir de ces objets
$compte_rendu = "You found " .$item_name. ". ".$backup." Do you want to keep it ?"; // Le joueur veut-il garder l'objet ?

}
else
{
$compte_rendu = "What a beautiful day today, isn't it ?"; // Pas de loot
}
echo $compte_rendu; // On renvoit le compte rendu !
return $item_name; //On renvoit le nom de l'objet looté
}
loot();
?>



Bon alors tout se passe à peu près comme je veux, d'ailleurs si vous avez des critiques ou un moyen d'optimiser ça, je suis un gros noob en programmation :p, seul problème je pensais utiliser "$afficher = mysql_fetch_array($items_lootable)" un peu comme un array numéroté de php, et faire un random pour définir in fine, le nom de l'objet trouvé en affichant par exemple $afficher[1] (le 1 correspondant au résultat du random, seulement parfois cela fonctionne parfois non... Est-ce que vous voyez une erreur quelque part ?

L'erreur provient-elle de ma bdd ou bien le mysql_fetch_array ne fonctionne pas comme un array numéroté ?


PS : Les pourcentage établis au début ne correspondent pas avec les commentaires, c'est pour tester la fonction plus en détail !

Bonne journée à tous =)

2 réponses

monoski Messages postés 132 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 13 mai 2013 1
29 déc. 2010 à 21:37
<? session_start();?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<title>test</title>
</head>

<? 
include 'include/bdd.php';
mysql_query("SET NAMES UTF8");
function loot()
{
$pseudo = $_SESSION['username'];
$chance_not_to_loot = 95;// 5% de chance de looter par déplacement ! On peut éventuellement rajouter une boucle pour donner une chance de looter plusieurs objets mais bon, j'ai pas envie !
$chance_the_loot_is_conso = 80;// 10% de chance pour que ce soit un objet et // 90% de chance pour que ce soit un consommable
$lootable = rand(1,100);
if ($lootable > $chance_not_to_loot) 
{
$prerequis $recup mysql_query("SELECT xp FROM elfik_user WHERE username='$pseudo'") or die('Erreur SQL !'.$sql.'
'.mysql_error());
$fetch = mysql_fetch_array($prerequis); 		
$user_xp = $fetch['xp'];
$item_type = rand(1,100);
if ($item_type > $chance_the_loot_is_conso) 
{
$consommable=0;
$quality_rand= rand(1,1000);
if ($quality_rand <= 800)
{
$quality = "uncommon";
$backup = "It is ".$quality."... Maybe you should keep it, a vendor will certainly buy it...";
}
elseif ($quality_rand > 800 AND $quality_rand<= 950)
{
$quality = "rare";
$backup = "It is ".$quality." ! It looks great !!!!";
}
elseif ($quality_rand > 950 AND $quality_rand<= 995)
{
$quality = "epic";
$backup = "It is ".$quality." ! Bloody Hell yeaaaah !";
}
elseif ($quality_rand > 995)
{
$quality = "legendary";
$backup = "It is legen wait for it ... dary, LEGENDARY ! Motha fucka !!!!!!";

}
$items_lootable = mysql_query("SELECT name FROM T_items WHERE quality='$quality' AND (item_lvl > ('$user_xp' - 300) AND item_lvl <= ('$user_xp' + 300)) AND consommable='$consommable' ORDER BY RAND() LIMIT 1") or die('Erreur SQL !'.$sql.'
'.mysql_error());
}
else
{
$consommable=1;
$backup = "It looks disgusting!";
$items_lootable = mysql_query("SELECT name FROM T_items WHERE item_lvl > ('$user_xp' - 300) AND item_lvl <= ('$user_xp' + 300) AND consommable='$consommable' ORDER BY RAND() LIMIT 1") or die('Erreur SQL !'.$sql.'
'.mysql_error());
}
$afficher = mysql_fetch_array($items_lootable);
$item_name = $afficher['name'];
//Faire un array avec les objets potentiels et faire un rand à partir de ces objets
//seuil de tolérance de 300XP (300 de moins et 300 de plus) !
$compte_rendu = "You found " .$item_name. ". ".$backup." Do you want to keep it ?"; // Le joueur veut-il garder l'objet ?
}
else
{
$compte_rendu = "What a beautiful day today, isn't it ?"; // Pas de loot
}
echo $compte_rendu;
return $item_name; // On renvoit le compte rendu !
}
loot();
?>

</html>


Voici la version final, j'ai lâché le principe de l'array et je suis passé par une requête qui renvoie un résultat aléatoire grâce à ORDER BY RAND() LIMIT 1 !
Voilà, j'espère que ça servira à d'autres :-)
3
monoski Messages postés 132 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 13 mai 2013 1
29 déc. 2010 à 21:25
Pour résoudre mon problème j'ai besoin de savoir comment prendre au hasard le résultat d'une requête.

Admettons ma requête me renvoie 13 lignes je veux en prendre une au hasard sur les 13 comment dois-je m'y prendre ?
0
Rejoignez-nous