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

Titre: Créer un Ratio de kills/morts
Posté 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:

Code: (pawn) [Sélectionner]
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).

++
Titre: Re : Créer un Ratio de kills/morts
Posté par: chneubeul le 09 Février 2013, 15:35:37
Salut, quand le joueur meurs serait la meilleur solution non ?
Titre: Re : Créer un Ratio de kills/morts
Posté par: Infu le 09 Février 2013, 17:18:17
Oui mais quoi qu'il en soit, il faut calculer le ratio et ça je sais pas comment m'y prendre... :/
Titre: Re : Créer un Ratio de kills/morts
Posté par: Gzsume le 09 Février 2013, 23:36:13
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

Code: (pawn) [Sélectionner]
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 :

Code: (pawn) [Sélectionner]
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,

Code: (pawn) [Sélectionner]
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

Code: (pawn) [Sélectionner]
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.

Code: (pawn) [Sélectionner]
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).

;)
Titre: Re : Créer un Ratio de kills/morts
Posté par: Xartrick le 11 Février 2013, 18:15:05
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;
}
Titre: Re : Créer un Ratio de kills/morts
Posté par: Ssk le 11 Février 2013, 18:39:58
Faut faire attention à la division par 0 les amis ;)
Titre: Re : Créer un Ratio de kills/morts
Posté par: S!m le 13 Février 2013, 03:37:35
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++
Titre: Re : Créer un Ratio de kills/morts
Posté par: Infu le 13 Février 2013, 12:34:59
Merci je vais regarder à ça ce soir
Titre: Re : Créer un Ratio de kills/morts
Posté par: Xartrick le 13 Février 2013, 13:06:20
Le nombre de mort est un entier, on ne peut pas mourir 1.333..3 fois ?
Titre: Re : Créer un Ratio de kills/morts
Posté par: Infu le 13 Février 2013, 13:58:30
C'est le ratio qui est comme ça.

3 kills divisé par 2 morts, c'est un chiffre décimal.

:)
Titre: Re : Créer un Ratio de kills/morts
Posté par: S!m le 14 Février 2013, 02:44:40
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++
Titre: Re : Créer un Ratio de kills/morts
Posté par: Ssk le 14 Février 2013, 08:41:01
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)
Titre: Re : Re : Créer un Ratio de kills/morts
Posté par: Infu le 14 Février 2013, 15:54:51
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.

Code: (pawn) [Sélectionner]
INI_Int("Ratio",PlayerInfo[playerid][pRatio]);
Titre: Re : Re : Re : Créer un Ratio de kills/morts
Posté par: Xartrick le 14 Février 2013, 19:54:57
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.

Code: (pawn) [Sélectionner]
INI_Int("Ratio",PlayerInfo[playerid][pRatio]);

Tu utilise INI_Int à la place de INI_Float !
Titre: Re : Créer un Ratio de kills/morts
Posté par: Infu le 14 Février 2013, 22:14:32
Ah d'accords, je connaissais pas...