JeuWeb - Crée ton jeu par navigateur
phrase comme si on était bourré - 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 : phrase comme si on était bourré (/showthread.php?tid=4245)

Pages : 1 2


phrase comme si on était bourré - keke - 31-07-2009

Coucou,

Je cherchais un truc tout fait sur le net sans en avoir trouvé. Bilan, j'ai refais ça en quelques minutes, et je me dis que ça peut être un jour utile à quelqu'un (c'est aussi le principe de mon jeu.)

Bref, une simple fonction qui transforme une phrase en texte normal en une autre contenant des "hips" et des "burps".
Mon objectif étant de faire quelque chose de simple et clair.

Ca découpe les phrases par mot. Entre chaque mot ça calcule la chance d'avoir un petit rajout de hips et de burp selon l'array : $liste_mot_bourre
Cet array se compose d'un mot puis d'une probabilité de chance de voir le mot apparaitre. Plus la valeur est grande, plus le mot à des chances d'apparaitre dans la phrase. Dans mon code, c'est le "Hic !" qui apparaitra le plus souvent.

Code :
// Transforme un texte comme si on était bourré !
function text_bourre ($texte)
{
//    return $texte;
    $moyenne_mot_bourre = 8;
    
    $liste_mot_bourre = array ('**Hips !**' => '300','**Hic !**' => '500', '**burps**' => '400', '**beuuurrrk**' => '100');
    foreach ($liste_mot_bourre as $mot_bourre => $key)
    {
        $nb_valeur_bourre += $key;
    }


    $tab_mot = preg_split ("/\s+/", $texte);
    $nb_mot = count ($tab_mot);
    
    $valeur_alea = rand (0, $moyenne_mot_bourre*$nb_valeur_bourre); // 8 c'est un ratio suffisant.
    
//    echo '<br>valeur alea : '.$valeur_alea.'';
    for ($i = 0; $i < $nb_mot; $i ++ )
    {
//        echo '<br> mot : '. $i . ' valeur alea = '.$valeur_alea.'';
        // si on ne se trouve pas dans une balise
        foreach ($liste_mot_bourre as $mot_bourre => $key)
        {
//            echo '<br> mot_bourre : '. $mot_bourre . ' key = '.$key.'';
            $valeur_alea -= $key;
            if ($valeur_alea < 0 )
            {
                $valeur_alea = rand (0, $moyenne_mot_bourre*$nb_valeur_bourre);
                $tab_mot[$i] .= $mot_bourre;
                next ;
            }
        }
    }

    $texte = implode (' ', $tab_mot);
    return $texte;
}

$phrase = "Jeuweb.org permet à Magdales d'exprimer tout son soutient aux projets amateurs dans le domaine du jeu vidéo";

echo text_bourre ($phrase);
// affichera par exemple :
// Jeuweb.org permet à**burps** Magdales d'exprimer tout**Hic !** son soutient aux projets amateurs**Hic !** dans le**burps** domaine du jeu vidéo
// OU
// Jeuweb.org permet**burps** à Magdales d'exprimer tout**Hic !** son soutient aux projets amateurs dans**burps** le domaine du jeu vidéo

Bon, c'est pas le meilleur code au monde, mais ça à l'avantage d'avoir beaucoup amusé mes joueurs hier ^^.

Que cela ne vous empêche d'améliorer le code à votre guise (et de le re-suggérer hein ^^).

Bonne journée à vous tous !

kéké peu présent ces temps-ci.


RE: phrase comme si on était bourré - Sakura - 31-07-2009

J'ai connu un jeu ou on pouvait chatter dans une taverne et aussi boire quelque alcool. Le programmeur avait fait en sorte qu'en fonction du taux d'alcoolémie, plus ou moins de lettre soit remplacer dans les mots. ( des "ou" qui deviennet "u" ou des "t" qui deviennent des "d" par exemple). Il devenait alors bien compliquer de comprendre un alcoolique mais c'était assez marrant je trouve :p.

Si je me souviens bien il y avait aussi des "hic" et autre son du genre rajouter en fin de phrases.


RE: phrase comme si on était bourré - Argorate - 31-07-2009

Moi je trouve ça marrant! J'avoue que je n'y avait pas pensé! Smile

Bien que je préfére laissé en général la liberté de laisser écrire les RP des joueurs tel qu'ils le souhaitent...


RE: phrase comme si on était bourré - Anthor - 31-07-2009

Code PHP :
<?php 
$liste_mot_bourre
= array ('**Hips !**' => '300','**Hic !**' => '500', '**burps**' => '400', '**beuuurrrk**' => '100');
foreach (
$liste_mot_bourre as $mot_bourre => $key)
{
$nb_valeur_bourre += $key;
}

Bon je sais que tu as prévenu, mais inverser les clés et les valeurs pour en faire des string, c'est poussé... Big Grin

Code PHP :
<?php 
$liste_mot_bourre
= array (
300 => '**Hips !**',
400 => '**Hic !**',
500 => '**burps**',
100 => '**beuuurrrk**'
);

$nb_valeur_bourre = 0;
foreach (
$liste_mot_bourre as $key => $mot_bourre)
$nb_valeur_bourre += $key;

A la limite ça se conçoit si tu avais utiliser array_sum au lieu de boucler sur le tableau.

Pourquoi utiliser preg_split au lieu de explode alors que tu implode bien à la fin ?
Et pourquoi avoir rajouter un next qui semble implicite ? Smile

Sinon c'est plutôt sympa, même si j'aurais eu tendance à remettre un espace au début de la jonction des mots.
Je me souviens d'avoir vu ce genre de fonctions dans pas mal de jeux de rôles, parfois sous cette forme, parfois en mélangeant les lettres des mots.


RE: phrase comme si on était bourré - keke - 31-07-2009

(31-07-2009, 04:24 PM)Anthor a écrit : Bon je sais que tu as prévenu, mais inverser les clés et les valeurs pour en faire des string, c'est poussé... Big Grin
Je pense qu'il s'agit d'une erreur d'interprétation de mon code.
Les chiffres ne sont pas les "clés" de mon array, ce sont des probabilités de chance d'apparition.

J'aurais pu mettre à équi-probabilité, de la manière suivante :

$liste_mot_bourre = array ('**Hips !**' => '100','**Hic !**' => '100', '**burps**' => '100', '**beuuurrrk**' => '100');

Corrige moi si je me trompe. je n'utilise que très rarement des tableaux associatifs de cette manière, préférant en générale cette notation :
$liste_mot_bourre['** Hic **'] = 100 ;
$liste_mot_bourre['** Hips **'] = 100 ;

--------------
array_sum ()
connait pas, je me renseigne et je modifie mon code si c'est plus rapide.
Ok, rajouté.

-------------

preg_split au lieu de explode ?
Car si un joueur tape plusieurs espace, je voudrais eviter d'y glisser plusieurs onomatopées.

Implode ne me pose par contre aucun problème de ce type.

-------------
next ==> break ;
Autant pour moi, je voulais faire un break en fait. Une seule onomatopée entre 2 mots.
Mea Culpa.

--------------

J'ai bien fait de suggérer. Je reposte mon code une fois corrigé et testé ^^.
ben voilà en fait, je viens de faire le test :
Code :
// Transforme un texte comme si on était bourré !
function text_bourre ($texte)
{
//    return $texte;
    $moyenne_mot_bourre = 8;
    
    $liste_mot_bourre = array ('**Hips !**' => '300','**Hups !**' => '300','**Hic !**' => '500', '**burps**' => '400', '**Héhéhé !**' => '150', '**beuuurrrk**' => '100');

    $nb_valeur_bourre = array_sum ($liste_mot_bourre);

    $tab_mot = preg_split ("/\s+/", $texte);
    $nb_mot = count ($tab_mot);
    
    $valeur_alea = rand (0, $moyenne_mot_bourre*$nb_valeur_bourre); // 8 c'est un ratio suffisant.
    
    for ($i = 0; $i < $nb_mot; $i ++ )
    {
//        echo '<br> mot : '. $i . ' valeur alea = '.$valeur_alea.'';
        // si on ne se trouve pas dans une balise
        foreach ($liste_mot_bourre as $mot_bourre => $key)
        {
//            echo '<br> mot_bourre : '. $mot_bourre . ' key = '.$key.'';
            $valeur_alea -= $key;
            if ($valeur_alea < 0 )
            {
                $valeur_alea = rand (0, $moyenne_mot_bourre*$nb_valeur_bourre);
                $tab_mot[$i] .= $mot_bourre;
                break ;
            }
        }
    }

    $texte = implode (' ', $tab_mot);
    return $texte;
}

Merci pour toutes vos remarques ! N'hésitez pas à en faire d'autres. Au pire ça donnera des idées aux autres.

Citation :Bien que je préfére laissé en général la liberté de laisser écrire les RP des joueurs tel qu'ils le souhaitent...
Argorate > Soit assuré que ça n'affecte pas la partie Rp de mes joueurs. Ces plus une petite option pour s'amuser que autre chose. De manière perso, ça me permet aussi de tester un nouveau fonctionnement dans Magdales à peu de frais. Les joueurs buvant de grande quantité de Whisky ^^

Kéké


RE: phrase comme si on était bourré - Anthor - 31-07-2009

Et t'as bien raison ! J'avais adoré dans chaque jeu de rôle, je me souviens toujours de barres de rire et d'ouverture de bière ensuite Big Grin

Et non keke ce n'est pas une erreur d'interprétation, tu met bien un string a la place de tes int, et tu as bien appelé ca key dans ta boucle Smile


RE: phrase comme si on était bourré - keke - 01-08-2009

(31-07-2009, 11:32 PM)Anthor a écrit : Et non keke ce n'est pas une erreur d'interprétation, tu met bien un string a la place de tes int, et tu as bien appelé ca key dans ta boucle Smile

Vi, mais ça correspond bien à mes clés. Php tolère ce type d'usage (et c'est une bonne idée). C'est juste que je pige pas l'imbroglio. Tu aurais fais comment ?

Bon WE à tous !

Kéké


RE: phrase comme si on était bourré - NicoMSEvent - 01-08-2009

@keke : ça fait combien de semaines que Apolline à 10 jours? ^^
@Anthor:ta solution nous intéresse Smile

moi j'aurais fait comme ça (c'est mon algorithme de rencontre avec des monstres aléatoires => suffit de remplacer les monstres par des **burps** ^^)
Code :
        //rencontre avec un monstre--------------------------------------------
        $req_rencontre='SELECT   r.type_pnj
                ,r.chance /* entre 0(jamais) et 100(toujours) */
                ,tp.pv
                ,tp.image
                ,tp.nom
            FROM rencontre r
            LEFT JOIN type_pnj tp ON r.type_pnj=tp.id
            WHERE r.type_case=\''.$res_moi['id_type_case'].'\' ORDER BY rand();';
        $db_rencontre=RequestDB($req_rencontre,'req_rencontre');
        $monstre=0;
        while( $res_rencontre=GetLineDB($db_rencontre) ){
            $de100=LanceDe(1,100); //lance un dé 100 et me retourne le résultat
            if($res_rencontre['chance']>=$de100){
                $monstre=$res_rencontre['type_pnj'];
                $monstre_nom=$res_rencontre['nom'];
                $monstre_pv=$res_rencontre['pv'];
            }
        }
//dans $monstre, j'ai l'ID du premier monstre qui a assez de probabilité pour apparaitre



RE: phrase comme si on était bourré - Anthor - 01-08-2009

(01-08-2009, 03:13 PM)NicoMSEvent a écrit : @Anthor:ta solution nous intéresse Smile

La solution qui consiste à échanger les lettres des mots ?

(01-08-2009, 03:13 PM)NicoMSEvent a écrit :
Code :
        //rencontre avec un monstre--------------------------------------------
        $req_rencontre='SELECT   r.type_pnj
                ,r.chance /* entre 0(jamais) et 100(toujours) */
                ,tp.pv
                ,tp.image
                ,tp.nom
            FROM rencontre r
            LEFT JOIN type_pnj tp ON r.type_pnj=tp.id
            WHERE r.type_case=\''.$res_moi['id_type_case'].'\' ORDER BY rand();';
        $db_rencontre=RequestDB($req_rencontre,'req_rencontre');
        $monstre=0;
        while( $res_rencontre=GetLineDB($db_rencontre) ){
            $de100=LanceDe(1,100); //lance un dé 100 et me retourne le résultat
            if($res_rencontre['chance']>=$de100){
                $monstre=$res_rencontre['type_pnj'];
                $monstre_nom=$res_rencontre['nom'];
                $monstre_pv=$res_rencontre['pv'];
            }
        }
//dans $monstre, j'ai l'ID du premier monstre qui a assez de probabilité pour apparaitre

En fait en lisant ton code tu ne retourne pas l'ID du premier monstre, mais du dernier, et tu boucles sur un grand nombre de monstre à chaque fois du coup ^^ Tu dois utiliser un break à la fin de ta condition pour effectivement quitter la boucle.

Par ailleurs tu pourrais le faire autrement, et de façon bien plus optimisé comme ceci :
Code PHP :
<?php 
$req
= 'SELECT
r.type_pnj,
r.chance,
tp.pv,
tp.image,
tp.nom
FROM rencontre AS r
LEFT JOIN type_pnj AS tp
ON r.type_pnj = tp.id
WHERE r.type_case="'
.$res_moi['id_type_case'].'"
AND r.chance >= ROUND(RAND()*100)
ORDER BY RAND()
LIMIT 1'
;
Testé en local Wink


RE: phrase comme si on était bourré - NicoMSEvent - 02-08-2009

mwarf, exellent Smile (j'ai jamais pris la peine de l'optimiser, dans mes bench, c'est pas cette requete qui prends le plus de temps ^^)

Citation :La solution qui consiste à échanger les lettres des mots ?
J'aurai dit la manière dont tu aurais codé qqch de similaire a keke, mais si tu veux poster ta fonction pour mélanger les lettres des mots, je suis preneur (histoire de voir comment tu as géré ça Smile )
Si tu aimes bien les beaux algorithmes, j'ai toujours celui du labyrinthe qui traine Wink (y a aussi les sources un peu plus bas dans le post Big Grin )