Eternaltwin

Simulateur de commerces

  1. Ps: je ne fait que reposter pour vous permettre de simuler votre commerces

    cordialement, Luminors


    Lien direct du Pour retrouver directement le createur et le post pour ce programme :
    https://twinoid.com/g/ipk#simulateur-de-commerce

    Créer un nouveau document texte.
    Le renommer "kingdom.html" (attention à ce que le fichier ne soit pas "kingdom.html.txt" ).
    L'éditer avec un éditeur de texte.
    Coller le code ci-dessous et sauver. (Merci basicbrute pour ce code que j'ai (simoons) légèrement modifié pour afficher le compteur :D).
    Ouvrir kingdom.html dans votre navigateur préféré (chrome, mozilla, etc).
    <html>
    <head>
    <style>
    #RESULT tableborder-collapse:collapse
    #RESULT thwidth:100px;overflow:hidden
    #RESULT tdwidth:5px;padding:0px;margin:0px;vertical-align:bottom;overflow:hidden
    #RESULT td.headwidth:60px;
    #RESULT divwidth:5px;background:green;display:inline-block
    tdvertical-align:top;
    input width:44px;
    a.plusmoins text-decoration:none;border:1px outset #CCC;background:#CCC;display:inline-block;width:19px;height:19px;text-align:center;verticale-align:middle;color:black;font-weight:bold
    #MORE adisplay:none
    </style>
    </head>
    <body>
    <table style="position:fixed;width:100%;height:100%">
    <tr>
    <td style="white-space: nowrap;">
    <form id="FORM">
    <div id="TEMPLATE">
    Commerce <input name="commerce" value="0" type="number">
    Garnison <input type="number" name="garnison" value="10" min="0">
    <a class="plusmoins" href="javascript:plus()" tabindex="2">+</a>
    <a class="plusmoins" href="javascript:moins(this)" tabindex="2">-</a>
    </div>
    <div id="MORE"></div>
    <button type="submit">Calcul</button>
    </form>
    </td>
    <td>
    <div id="RESULT" style="overflow:auto;height:100%;"></div>
    </td>
    </tr>
    </table>
    </body>
    </html>
    <script>
    function Terre(commerce,soldat)
    this.commerce = commerce;
    this.soldat = soldat;
    this.compteur = commerce*(Math.abs(commerce)+1)*5;
    this.gain = 0;

    Terre.prototype.image = function()
    return commerce:this.commerce, soldat:this.soldat, gain:this.gain, compteur:this.compteur;

    Terre.prototype.next = function()
    //mouais... dans ce cas on connait pas la formule
    if(this.commerce<=0 && this.soldat===0)
    this.commerce = this.compteur = undefined;
    return;

    var diffsoldat = this.commerce>0 ? Math.floor(this.soldat-this.commerce/2) : this.soldat;
    if(diffsoldat<0)
    //pas assez de soldat, la perte est le carré de la différence
    this.compteur -= diffsoldat*diffsoldat;
    else if(diffsoldat>0)
    //le compteur augmente tranquillou
    this.compteur += diffsoldat;
    else
    //ben le delta compteur est à 0 on n'arrete pas pour avoir tjrs le meme nombre d'entrée, mais on pourrait ...
    //break;

    //on recalcule le commerce à partir du compteur grace à la formule magique
    if(this.compteur>0)
    this.commerce = Math.floor(Math.sqrt((this.compteur/5+0.25)) -0.5);
    else
    //doute, ce serait pas un -0.25 vu que le reste est inversé
    this.commerce = Math.floor(-Math.sqrt((-this.compteur/5+0.25)) +0.5);

    this.gain += (this.commerce - this.soldat);


    //function de calcul
    function commerce(commerce, soldat)
    var terre = new Terre(commerce, soldat);
    var result = [terre.image()];
    for(var i=0;i<192;i++)
    terre.next();
    result.push(terre.image());

    return result;

    //function d'aggregation de n commerce
    function aggregate(datas)
    var result = [];
    var data = datas[0];
    //on duplique le premier
    for(var i=0;i<data.length;i++)
    result.push(commerce:data[i].commerce, gain:data[i].gain, soldat:data[i].soldat);

    //et on ajoute les autres
    for(var d=1;d<datas.length;d++)
    data = datas[d]
    for(var i=0;i<data.length;i++)
    result[i].commerce = result[i].commerce+data[i].commerce;
    result[i].gain = result[i].gain+data[i].gain;
    result[i].soldat = result[i].soldat+data[i].soldat;


    return result;

    //function d'affichage
    function asHtml(commerces)
    //pour uniformiser la taille du graphique
    var maxcommerce = 0,mincommerce = 0;
    for(var i=0;i<commerces.length;i++)
    maxcommerce = Math.max(maxcommerce,commerces[i].commerce);
    mincommerce = Math.min(mincommerce,commerces[i].commerce);

    var coef = 300/(maxcommerce - mincommerce);
    html = ('<table>');
    html +=('<tr><th>Tour<br>Commerce<br>Soldats');
    for(var i=0;i<commerces.length;i+=12)
    html +=('<td class="head">'+i+'<br>'+commerces[i].commerce+'<br>'+commerces[i].soldat+'</td>');

    html +=('</tr></table>');
    html +=('<table style="height:300px;position:relative;top:'+(mincommerce*coef)+'px;"><tr><th>graph</th>');

    for(var i=0;i<commerces.length;i++)
    var commerce = commerces[i].commerce;
    html +=('<td title="tour '+i+' commerce '+commerce+' compteur '+(getremaindcompt(commerce, commerces[i].compteur))+' ">');
    if(commerce>0)
    html += '<div style="height:'+commerce*coef+'px"></div>';
    else
    html += '<div style="position:absolute;background-color:red;height:'+(-commerce*coef)+'px"></div>';

    html +=('</td>');


    html +=('</tr></table>');
    return html;

    function getremaindcompt(commerce, compteur)
    if (commerce < 0) return compteur + (commerce*(commerce-1))*5;
    else return compteur - (commerce*(commerce+1))*5;

    //function de l'ihm
    function plus()
    var newdiv = document.createElement('div');
    newdiv.innerHTML = document.getElementById('TEMPLATE').innerHTML;
    document.getElementById('MORE').appendChild(newdiv);

    function moins(tag)
    var more = document.getElementById('MORE');
    more.removeChild(more.lastChild);

    document.getElementById('FORM').onsubmit = function(evt)
    if(this.commerce.length === undefined)
    document.getElementById('RESULT').innerHTML = asHtml(commerce(parseInt(this.commerce.value),parseInt(this.garnison.value)));
    else
    var datas = [];
    for(var i=0;i<this.commerce.length;i++)
    datas.push(commerce(parseInt(this.commerce[i].value),parseInt(this.garnison[i].value)));

    var html = asHtml(aggregate(datas))+"<hr>";
    for(var i=0;i<datas.length;i++)
    html += asHtml(datas[i]);

    document.getElementById('RESULT').innerHTML = html;

    evt.preventDefault();

    </script>
  2. Pas complet
    Le commerce d'un joueur est la somme des commerces sur chacun de ses terrains à commerce. Les capitales n'ont jamais de commerce. Pour monter le commerce d'un terrain, il faut poser des soldats dessus et jouer des tours. Plus il y aura de soldats et plus le commerce sera proche de 0, plus il montera rapidement en terme de tours joués.

    Le commerce est empoché - ou payé si négatif - tous les tours. Si un terrain n'est pas connecté à la capitale du joueur, alors le commerce du terrain n'est perçu que s'il est dans les négatifs.

    Commerce d'un terrain
    Les capitales n'ont pas de commerce, ni positif ni négatif.
    Chaque terrain non-capitale a deux compteurs : un compteur de commerce (C) visible, et un sous-compteur (SC) invisible .
    Le compteur de commerce est initialisé à -D² lors de la capture du terrain (que ce soit la première fois ou non), D étant la longueur du plus court chemin, en nombre de terrains, entre la capitale du joueur et le terrain en question (indépendamment de tout DDP). Le sous-compteur est initialisé à 0.
    Il est toujours vrai que : -2D² =< C (pas de maximum) ; 0 =< SC < 10*MAX(|C|,C+1)
    La variation du commerce est régie selon 4 lois : montée dans les négatifs, montée dans les positifs, descente dans les positifs et descente dans les négatifs. Ces 4 lois dépendent du commerce C du terrain et du nombre S de soldats dessus.

    Montée dans les négatifs (C < 0 et S > 0) : à chaque tour joué, le sous-compteur est augmenté de S. Si le sous-compteur arrive à |C|*10 ou plus : le sous-compteur diminue de |C|*10 et le commerce augmente de 1. Cette opération est répétée autant de fois qu'il ne le faut pour que le sous-compteur redevienne plus petit que |C|*10, sauf si le commerce passe à 0, auquel cas se référer à la loi correspondante.
    Montée dans les positifs (C >= 0 et S >= MAX(1,ARRONDI.SUP(C/2))) : Il faut ARRONDI.SUP(C/2) soldats sur le terrain pour maintenir le commerce. Soit L l'excédent de soldats, c'est-à-dire L=S-ARRONDI.SUP(C/2). A chaque tour joué, le sous-compteur est augmenté de L. Si le sous-compteur arrive à (C+1)*10 ou plus : le sous-compteur diminue de (C+1)*10 et le commerce augmente de 1. Cette opération est répétée autant de fois qu'il ne le faut pour que le sous-compteur redevienne plus petit que (C+1)*10.
    Descente dans les positifs (C > 0 et S < MAX(1,ARRONDI.SUP(C/2))) : Soit L le déficit de soldats (L = ARRONDI.SUP(C/2)-S), il semblerait que le sous-compteur diminue de L² chaque tour. Si le sous-compteur passe en dessous de 0 : le sous-compteur est augmenté de C*10 et le commerce est diminué de 1. Cette opération est répétée autant de fois qu'il ne le faut pour que le sous-compteur redevienne plus grand que 0, sauf si le commerce passe à 0, auquel cas se référer à la loi correspondante.
    Descente dans les négatifs (C =< 0 et S = 0) : Inconnu. On sait juste que le minimum de commerce est -2D².
    En pseudo-code, cela peut donner ceci :
    pseudo-code
    function turnplayed(C, S, ST) :
    KeepCom <- MAX(0 , 2*C - 1) / 4
    maxST <- |10*C+5|+5
    if (S > ARRONDI.INF(KeepCom)) : (montée de commerce)
    ....ST <- ST + (S-ARRONDI.SUP(KeepCom))
    ....while (ST >= maxST) :
    ........ST <- ST - maxST
    ........C <- C+1
    ........ maxST <- |10*C+5|+5
    ....


    else : (descente de commerce)
    ....if (C > 0) :
    ........ST <- ST - (ARRONDI.SUP(KeepCom)-S)²
    ........while (ST < 0) :
    ............C <- C-1
    ............maxST <- |10*C+5|+5
    ............ST <- ST + maxST
    ........
    ....
    ....else :
    ........(unknown)
    ....


    Commerce affiché
    Le commerce exact d'un joueur est affiché sur sa page de gestion.
    Les autres joueurs peuvent aussi le voir sur sa fiche kingdom ou sur le classement de la carte, mais le nombre affiché ne correspond pas forcément au commerce exact du joueur :

    Chaque fois que le joueur joue un tour, son commerce évolue puis est mis à jour sur le classement de la carte et la fiche kingdom, il paye ses troupes, ses taxes et récolte son commerce, puis perd éventuellement un terrain par faillite.
    Chaque fois que le joueur prend un nouveau terrain, le commerce de ce nouveau terrain est ajouté à son commerce affiché.
    Et c'est tout. Ainsi, si le joueur perd un terrain (par faillite ou capture), ça ne sera pas affiché dans le commerce du classement et de la fiche.
    exemple
    Un joueur a 500 de commerce, et gagnera 3 de commerce sur un terrain au prochain tour.
    Il joue, passe donc à 503 de commerce, mais fait faillite et perd un terrain à -100.
    Sa page de gestion affichera 603 de commerce, alors que sa fiche kingdom et le classement afficheront 503.
    Il capture ensuite un terrain à -100, le perd, le recapture, le reperd, le recapture, et le reperd.
    Sa page de gestion affichera 603 de commerce, alors que sa fiche kingdom et le classement afficheront 203 (=503-3*100).