JeuWeb - Crée ton jeu par navigateur
Script d'attaque - 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 : Script d'attaque (/showthread.php?tid=1042)

Pages : 1 2


RE: Script d'attaque - zneman - 06-04-2007

oui =)
En revanche, si a chaque fois que l'on perd le joueur perd la moitier de ces hommes, je crois pas qu'il va aimer :/


RE: Script d'attaque - Mighty - 07-04-2007

zneman a écrit :oui =)
En revanche, si a chaque fois que l'on perd le joueur perd la moitier de ces hommes, je crois pas qu'il va aimer :/


Quand tu perds, tu perds toutes tes troupes Cool

Sinon, personne n'aurait une idée ? :pleure2:

PS : Désolé si je parait un peu préssant, mais c'est le dernier script qu'il me manque avant de pouvoir finir mon site :heuuu:


RE: Script d'attaque - naholyr - 07-04-2007

En fait ton problème c'est de savoir quelles unités vont décéder chez le "vainqueur".
Ton système manque un peu de précision, il amalgame un peu tout. Quand on résout un combat, il n'y a que deux valeurs qui importent pour chaque camp : Les dégats infligés, et la vie perdue. Le "système de combat" finalement ce n'est que le calcul qui mène à ses deux valeurs. En général ces calculs ne sont pas simplissimes ni directement calculables par les belligérants (part d'aléatoire, part d'inconnue sur l'adversaire, plusieurs stratégies d'attaque ou de défense possible, etc...).
Dans ton cas :
- dégats infligés par l'attaquant = attaque
- dégats reçus par l'attaquant = défense de l'adversaire
Et c'est symétrique pour le défenseur.
C'est un système un peu trop «direct» pour qu'il soit vraiment intéressant a priori, mais bon pourquoi pas, refléchissons tout de même dessus Wink

Le cas du perdant est réglé, il perd forcément tout.

Ton problème c'est quoi ? De déterminer le détails des troupes perdues par ton vainqueur ? Et bien c'est facile : tu tues les plus faibles en premier, et tu continues ainsi de suite jusqu'à atteindre ou dépasser le total des dégats infligés par le perdant. Ou alors tu les sélectionnes au hasard de la même façon.
Bref aucun problème, la seule question que tu dois te poser c'est que faire de la dernière unité ?

Par exemple mettons que le vainqueur avec 5 unités à 1, 3 unités à 2, et 3 unités à 5 (total 26) et qu'il reçoive 17 dégats. Il perd ses 1+1+1+1+1 (les 5 premières unités à 1 sont mortes, reste 12) + 2+2+2 (les 3 unités à 2 sont mortes, reste 6) + 5 (reste 1). Là il reste une inconnue : que faire de la dernière unité ? Tu as trois choix :
- soit tu la tues (il aura alors perdu 21 PV en réalité)
- soit tu la laisses indemne (il aura alors perdu 16 PV en réalité)
- soit tu lui laisses affaiblie avec une attaque (si le vainqueur était attaquant) ou une défense (si le vainqueur était le défenseur) réduite de 1.
La dernière option ne me paraîssant pas faisable dans ton système (sinon tu y aurais pensé avant). Il faut choisir entre la tuer et la laisser en vie. Si tu choisis toujours l'un ou toujours l'autre, le système sera forcément injuste. Donc je te propose de la tuer si et seulement si les dégats restants sont égaux ou supérieurs à la moitié de sa défense.

L'algo serait donc celui-là : on distribue les dégats aux unités les plus faibles jusqu'à ce que tout le monde soit mort
Code :
DégatsÀDistribuer = ....
Tant que DégatsÀDistribuer > 0 :
    Si pas d'unités Alors :
        # Plus d'unités, donc plus de dégats à distribuer
        DégatsÀDistribuer = 0
    Sinon :
        # On sélectionne une unité qui va absorber les dégats
        # Ici on prend la plus faible, on pourrait aussi bien prendre au hasard
        Unité = Unité la plus faible.
        # L'unité meurt si on lui inflige plus de la moitié de sa vie
        Si DégatsÀDistribuer >= (PV de Unité / 2) Alors :
            # L'unité a absorbé autant de dégats que sa vie, le reste est toujours à distribuer
            DégatsÀDistribuer = DégatsÀDistribuer - PV de Unité.
            # Elle meurt
            Tuer Unité.
        Sinon :
            # L'unité réussit à absorber les dégats restants tout en survivant, la distribution est terminée
            DégatsÀDistribuer = 0
        FinSi.
    FinSi.
FinTant.
C'est dans le choix de l'unité à chaque tour de boucle qu'on peut introduire beaucoup de stratégie de la part du joueur. Il pourrait par exemple décider de placer certaines unités en «première ligne» (ce sont eux qui prendront les dégats en premier), «milieu» ou «renforts arrière». Cet avantage de choisir quelles unités vont mourir de la part du joueur pourrait être contrebalancée par un calcul différent des dégats : l'attaque/défense des «première ligne» est complète, ceux de derrière réduite de 20%, puis les derniers de 50%. Ce n'est qu'un exemple d'une manière d'enrichir un peu ce système.

J'attire cependant ton attention sur plusieurs déséquilibres :
- L'absence d'aléatoire dans le jeu, et le calcul simpliste (un seul paramètre compte) rend le jeu extrèmement avantageux pour l'attaquant. Puisque c'est lui qui a le pouvoir de décision (le défenseur ne fait que subir la décision), il va pouvoir sélectionner sa cible en connaissant avec exactitude l'issue du combat.
- Des unités très déséquilibrés n'ont pas le comportement que la logique nous indiquerait. Par exemple une unité avec une attaque de 1 et une défense de 10 va pouvoir tuer 10 unités en contre-attaque ? Etrange pour une unité qui vu son profil ressemble plus à un mur qu'à un berserk.

J'affinerais à ta place Wink


RE: Script d'attaque - Mighty - 07-04-2007

naholyr a écrit :- L'absence d'aléatoire dans le jeu, et le calcul simpliste (un seul paramètre compte) rend le jeu extrèmement avantageux pour l'attaquant. Puisque c'est lui qui a le pouvoir de décision (le défenseur ne fait que subir la décision), il va pouvoir sélectionner sa cible en connaissant avec exactitude l'issue du combat.

Oui, il séléctione sa cible en connaissant l'issue "théorique" du combat, mais en général les grandes puissances attaquent toujours les plus faibles et l'attaquant ne connait théoriquement pas les forces du défenseur.

naholyr a écrit :- Des unités très déséquilibrés n'ont pas le comportement que la logique nous indiquerait. Par exemple une unité avec une attaque de 1 et une défense de 10 va pouvoir tuer 10 unités en contre-attaque ? Etrange pour une unité qui vu son profil ressemble plus à un mur qu'à un berserk.

J'affinerais à ta place Wink
Non, si elle attaque elle va pouvoir tuer une unité avec une défense de 1 et si elle défend, elle va pouvoir en tuer une avec une défense de 10 ( ou 2*5...)


Je ne vois pas quel système est ce que je pourrait mettre à la place


RE: Script d'attaque - naholyr - 07-04-2007

Non justement, dans le système que tu nous as décris quand elle défend elle tuera une unité avec une défense de 1. Puisqu'en défense les unités attaque avec leurs points de défense, et en attaque ils se défendent avec leurs points d'attaque. C'est ça que je trouve bancal Wink

Mais j'ai sans doute mal compris alors (tu n'as pas parlé de la défense des attaquants, ni de l'attaque des défenseurs, juste de leur «force» qui est la somme des attaques pour l'attaquant, et la somme des défenses pour le défenseur). Cela ne remet cependant pas en question l'algo que je t'ai donné et qui peut convenir je pense.


RE: Script d'attaque - Mighty - 07-04-2007

Je me suis lancé :heuuu:
Le script n'est pas vraiement optimisé, mais plus important, sa ne marche pas :pleure2:
Code PHP :
<?php
if (!isset($_SESSION['login'])) {
echo
"<script language='javascript'>document.location='index.php?page=6'</script>";
exit();
}
$login = $_SESSION['login'];
$id=stripslashes(htmlentities(trim($_POST['id'])));

include(
"sql.php");
$reponse1 = mysql_query("SELECT * FROM membre WHERE `login`='$login' "); // Requête SQL
while ($donnees1 = mysql_fetch_array($reponse1))
{
$attaque1=round($donnees1['attaque']);
$id1=$donnees1['id'];

if ((
ereg("[^0-9]", $id )) or ($id == "") or ($attaque1 == 0) or ($id1 == $id))
{
echo
"<script language='javascript'>document.location='index.php?page=82'</script>";
}
else
{
$reponse2 = mysql_query("SELECT * FROM membre WHERE `id`='$id' ");
// Requête SQL
while ($donnees2 = mysql_fetch_array($reponse2))
{
$attaque3=round($donnees2['attaque']);
if (
$attaque2==0)
{ echo
"Vous avez gagnés"; } //c"est moche mais c'est provisoire
elseif($attaque2==$attaque1)
{ echo
"Math nul, la défense gagne"; } //pas fini
elseif($attaque2 < $attaque1) // l'ataque gagne
{
$volontaire1=$donnees1['volontaire'];$hoplite1=$donnees1['hoplite'];
$hoplitee1=$donnees1['hoplitee'];$frondeur1=$donnees1['frondeur'];
$arccourt1=$donnees1['arccourt'];$arclong1=$donnees1['arclong'];
$hippeis1=$donnees1['hippeis'];$archetcheval1=$donnees1['archetcheval'];
$hoplitecheval1=$donnees1['hoplitecheval'];$hopliteecheval1=$donnees1['hopliteecheval'];
$centaure1=$donnees1['centaure'];$amazone1=$donnees1['amazone'];
$spartiate1=$donnees1['spartiate'];$myrmidon1=$donnees1['myrmidon'];
$automate1=$donnees1['automate'];$ame1=$donnees1['ame'];

if(
$volontaire1*1 < $attaque3)
{
$attaque3=$attaque3*1;
$volontaire1=0;
$volontaire3=$volontaire2;
}
else
{
$volontaire3=round($attaque3/1);
$volontaire1=$volontaire1-$volontaire3;
$attaque3=0;
}
if(
$automate1*2 < $attaque3)
{
$attaque3=$attaque3-$automate1*2;
$automate1=0;
}
else
{
$automate3=round($attaque3/2);
$automate1=$automate1-$automate3;
$attaque3=0;
}

if(
$arccourt1*6 < $attaque3)
{
$attaque3=$attaque3-$arccourt1*6;
$arccourt1=0;
}
else
{
$arccourt3=round($attaque3/6);
$arccourt1=$arccourt1-$arccourt3;
$attaque3=0;
}

if(
$frondeur1*9 < $attaque3)
{
$attaque3=$attaque3-$frondeur1*9;
$frondeur1=0;
}
else
{
$frondeur3=round($attaque3/9);
$frondeur1=$frondeur1-$frondeur3;
$attaque3=0;
}


if(
$ame1*10 < $attaque3)
{
$attaque3=$attaque3-$ame1*10;
$ame1=0;
}
else
{
$ame3=round($attaque3/10);
$ame1=$ame1-$ame3;
$attaque3=0;
}


if(
$hoplite1*11 < $attaque3)
{
$attaque3=$attaque3-$hoplite1*11;
$hoplite1=0;
}
else
{
$hoplite3=round($attaque3/11);
$hoplite1=$hoplite1-$hoplite3;
$attaque3=0;
}



if(
$arclong1*14 < $attaque3)
{
$attaque3=$attaque3-$arclong1*14;
$arclong1=0;
}
else
{
$arclong3=round($attaque3/14);
$arclong1=$arclong1-$arclong3;
$attaque3=0;
}


if(
$amazone1*18 < $attaque3)
{
$attaque3=$attaque3-$amazone1*18;
$amazone1=0;
}
else
{
$amazone3=round($attaque3/18);
$amazone1=$amazone1-$amazone3;
$attaque3=0;
}

if(
$hippeis1*20 < $attaque3)
{
$attaque3=$attaque3-$hippeis1*20;
$hippeis1=0;
}
else
{
$hippeis3=round($attaque3/20);
$hippeis1=$hippeis1-$hippeis3;
$attaque3=0;
}

if(
$archetcheval1*24 < $attaque3)
{
$attaque3=$attaque3-$archetcheval1*24;
$archetcheval1=0;
}
else
{
$archetcheval3=round($attaque3/24);
$archetcheval1=$archetcheval1-$archetcheval3;
$attaque3=0;
}
if(
$centaure1*25 < $attaque3)
{
$attaque3=$attaque3-$centaure1*25;
$centaure1=0;
}
else
{
$centaure3=round($attaque3/25);
$centaure1=$centaure1-$centaure3;
$attaque3=0;
}
if(
$hoplitecheval1*26 < $attaque3)
{
$attaque3=$attaque3-$hoplitecheval1*26;
$hoplitecheval1=0;
}
else
{
$hoplitecheval3=round($attaque3/26);
$hoplitecheval1=$hoplitecheval1-$hoplitecheval3;
$attaque3=0;
}

if(
$hoplitee1*32 < $attaque3)
{
$attaque3=$attaque3-$hoplitee1*32;
$hoplitee1=0;
}
else
{
$hoplitee3=round($attaque3/32);
$hoplitee1=$hoplitee1-$hoplitee3;
$attaque3=0;
}
if(
$hopliteecheval1*40 < $attaque3)
{
$attaque3=$attaque3-$hopliteecheval1*40;
$hopliteecheval1=0;
}
else
{
$hopliteecheval3=round($attaque3/40);
$hopliteecheval1=$hopliteecheval1-$hopliteecheval3;
$attaque3=0;
}

if(
$spartiate1*45 < $attaque3)
{
$attaque3=$attaque3-$spartiate1*45;
$spartiate1=0;
}
else
{
$spartiate3=round($attaque3/45);
$spartiate1=$spartiate1-$spartiate3;
$attaque3=0;
}

if(
$myrmidon1*65 < $attaque3)
{
$attaque3=$attaque3-$myrmidon1*65;
$myrmidon1=0;
}
else
{
$myrmidon3=round($attaque3/65);
$myrmidon1=$myrmidon1-$myrmidon3;
$attaque3=0;
}
echo
"<h2>Victoire !</h2><br>La bataille a été rude mais vous l'avez emporté grâce au courage sans faille de vos hommes.";

//Il faut que je finisse le reste du raport

}
elseif(
$attaque2 > $attaque1)
{

// faut que je finisse

} else { echo "<script language='javascript'>document.location='index.php?page=82'</script>";
}}}}
?>


Edit : Sa marche Big Grin