GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Infu le 09 Février 2013, 14:45:44
-
Bonjour,
C'est peut-être tout simple, mais je souhaiterai savoir comment calculer un ratio.
Voilà comment je m'y prend:
enum pInfo
{
pPass,
pCash,
pAdmin,
pKills,
pRatio,
pDeaths
}
pRatio = pKills/pDeaths; // c'est ici que ça bloque
J'aimerai savoir où inclure la ligne qui ferait le calcul ... :<
J'utilise un système de register/login avec YSI\y_ini (si ça peut aider).
++
-
Salut, quand le joueur meurs serait la meilleur solution non ?
-
Oui mais quoi qu'il en soit, il faut calculer le ratio et ça je sais pas comment m'y prendre... :/
-
Tu dois utiliser des valeurs numériques flottantes pour avoir les virgules. En informatique, la division de deux entiers donne toujours un entier. Par exemple, pour ce code
new a = 5, b = 2;
new resultat = a / b;
5 que divise 2 fait 2. Et il reste un. Pour obtenir le reste, tu utilises ce qu'on appelle le modulo. C'est pas très connu mais très simple en fait, regardes :
new var = 0;
var = 5 % 2; // 5 que divise 2 = 2, reste 1, donc var = 1
var = 10 % 3; // 10 par 3 vaut 3 reste un, donc var = 1
var = 10 % 5; // 10 par 5 vaut 2, reste zéro donc var = 0
Mais dans ton cas, le mieux est d'utiliser les valeurs flottantes comme je t'ai dit. C'est tout bête : 5.0 et 5 ce n'est pas la même chose pour le compilateur. En gros,
new Float:a = 5.0, Float:b = 2.0;
new Float:resultat = a / b;
Dans cet exemple la variable finale va valoir 2.50000. Les zéros en trop, tu t'en débarrasses lors de l'affichage avec la technique dont je t'avais parlé sur Skype, à savoir
printf("%0.2f", resultat); // % pour l'indicateur, 0.2 pour dire "deux chiffres après la virgule", et f pour afficher un Float
Voilà voilà. Dans ton cas précis donc, tu as juste à faire ça.
enum pInfo
{
pPass,
pCash,
pAdmin,
Float:pKills,
Float:pRatio,
Float:pDeaths
}
pRatio = pKills/pDeaths;
Et n'oublie pas de modifier tes initialisations et enregistrements de valeurs en conséquence (ajouter un .0 après chaque nombre).
;)
-
num pInfo {
pPass,
pCash,
pAdmin,
pKills,
Float:pRatio,
pDeaths
}
new playerInfos[MAX_PLAYERS][pInfo];
public OnPlayerDeath(playerid, killerid, reason) {
playerInfos[playerid][pDeaths]++;
playerInfos[killerid][pKills]++;
playerInfos[playerid][pRatio] = playerInfos[playerid][pKills] / playerInfos[playerid][pDeaths];
if (playerInfos[killerid][pDeaths] != 0) {
playerInfos[killerid][pRatio] = playerInfos[killerid][pKills] / playerInfos[killerid][pDeaths];
}
return 1;
}
-
Faut faire attention à la division par 0 les amis ;)
-
Salut,
pourquoi ne pas faire une fonction qui donne le ratio en sorti.
Float:CalculerRatio(playerid)
{
new Float:ratio = 0.0000;
if(playerInfos[playerid][pDeaths] > 0.1)// pour être sûr vu les approximations...
{
ratio = playerInfos[playerid][pKills]/playerInfos[playerid][pDeaths];
}
return ratio;
}
Bonne chance
++Sim++
-
Merci je vais regarder à ça ce soir
-
Le nombre de mort est un entier, on ne peut pas mourir 1.333..3 fois ?
-
C'est le ratio qui est comme ça.
3 kills divisé par 2 morts, c'est un chiffre décimal.
:)
-
Salut,
mais, si mes souvenirs sont bons, lorsque l'on divise simplement un entier par un autre entier, on obtient un entier, on perd donc de l'information. Il faut faire croire à la machine que l'on travailler avec des nombres à virgule. on peut prendre des entier que l'on converti en float avant de faire le calcul.
++Sim++
-
Au pire on peut les garder en tant qu'entiers et au moment du calcul on les convertit en float avec la fonction float() (http://wiki.sa-mp.com/wiki/Float)
-
num pInfo {
pPass,
pCash,
pAdmin,
pKills,
Float:pRatio,
pDeaths
}
new playerInfos[MAX_PLAYERS][pInfo];
public OnPlayerDeath(playerid, killerid, reason) {
playerInfos[playerid][pDeaths]++;
playerInfos[killerid][pKills]++;
playerInfos[playerid][pRatio] = playerInfos[playerid][pKills] / playerInfos[playerid][pDeaths];
if (playerInfos[killerid][pDeaths] != 0) {
playerInfos[killerid][pRatio] = playerInfos[killerid][pKills] / playerInfos[killerid][pDeaths];
}
return 1;
}
En utilisant cette solution, on me dit Tag Mismatch à cette ligne là qui permet de charger/sauvegarder les infos du joueur.
INI_Int("Ratio",PlayerInfo[playerid][pRatio]);
-
num pInfo {
pPass,
pCash,
pAdmin,
pKills,
Float:pRatio,
pDeaths
}
new playerInfos[MAX_PLAYERS][pInfo];
public OnPlayerDeath(playerid, killerid, reason) {
playerInfos[playerid][pDeaths]++;
playerInfos[killerid][pKills]++;
playerInfos[playerid][pRatio] = playerInfos[playerid][pKills] / playerInfos[playerid][pDeaths];
if (playerInfos[killerid][pDeaths] != 0) {
playerInfos[killerid][pRatio] = playerInfos[killerid][pKills] / playerInfos[killerid][pDeaths];
}
return 1;
}
En utilisant cette solution, on me dit Tag Mismatch à cette ligne là qui permet de charger/sauvegarder les infos du joueur.
INI_Int("Ratio",PlayerInfo[playerid][pRatio]);
Tu utilise INI_Int à la place de INI_Float !
-
Ah d'accords, je connaissais pas...