Les terres de Mystras


 
AccueilRechercherS'enregistrerConnexion
anipassion.com
Partagez
 

 Symtrass ! the come back

Aller en bas 
Aller à la page : Précédent  1, 2, 3
AuteurMessage
Drambam
Impudent Personnage
Drambam

Nombre de messages : 289
Date d'inscription : 04/07/2005

Feuille de personnage
XP:
Symtrass ! the come back - Page 3 Left_bar_bleue216/2000Symtrass ! the come back - Page 3 Empty_bar_bleue  (216/2000)
XP du 1er Compagnon:
Symtrass ! the come back - Page 3 Left_bar_bleue550/1000Symtrass ! the come back - Page 3 Empty_bar_bleue  (550/1000)
Xp du 2nd Compagnon:
Symtrass ! the come back - Page 3 Left_bar_bleue1027/2000Symtrass ! the come back - Page 3 Empty_bar_bleue  (1027/2000)

Symtrass ! the come back - Page 3 Empty
MessageSujet: Re: Symtrass ! the come back   Symtrass ! the come back - Page 3 Icon_minitimeDim 20 Mar - 16:20

Ça va t'as pas attendu trop longtemps pour obtenir 1000 000 simulations?

c'est pas trop mal. Je dirais peut être que la différence en probabilité de faire un CC / ne pas faire un EC n'est pas si énorme entre les deux mais j'avoue que j'ai pas regardé sir leurs caracts divergent tellement (Enfin tu me diras c'est pas super marrant de lire un code sans coloration dans un carré de 300px de hauteur.)

Faudra que tu développes un peu sur la rage aussi! C'est plutôt nouveau comme concept.
Sinon GG RubyStyle, vu de loin on dirait que t'as pas perdu la main, vieux!
Revenir en haut Aller en bas
Maître de Mystras
Grand Maître
Maître de Mystras

Nombre de messages : 528
Age : 30
Date d'inscription : 03/07/2005

Symtrass ! the come back - Page 3 Empty
MessageSujet: Re: Symtrass ! the come back   Symtrass ! the come back - Page 3 Icon_minitimeDim 20 Mar - 17:14

C'est un petit code rapide, y'en a pour 3-4 minutes si je le fais tourner un million de fois.

Et donc je t'ai mis le code pour que tu puisse le copier coller dans un éditeur de scripts, j'avoue que là on voit rien mais bon ça c'est forumactif.

Bon et ça merde sérieux. En fait j'avais réussi à équilibrer une série de caract, quand j'ai changé ça m'a bien pouaqué les yeux. 94%/6% de victoires pour un total de caract identiques.

Donc j'ai changé des choses. J'ai transformé les multiplications dans les types d'attaque en additions et comme dirait l'autre avant ça faisait "des loopings" mais maintenant ça a l'air stabilisé.
J'ai testé E50 V50 A50 pour chacun, c'est ma référence (c'est ce qu'il y avait avant).
Là ça me donne ça :

Bob :
Victoires : 59.52%
Degats moyens :
105 par combat (4 degats critiques)
22 par coup
Nombres de critiques moyens : 0.11 par combat
Chances de critique : 1.23%
Echecs critiques : 0.42 par combat
Chances d'echec critique : 4.90%
Chances de toucher : 54.48%
Nombre de rages par combat : 0.57
Duree moyenne de la rage : 5.51 tours
Nombre de rages ecourtees par combat : 0.32

Stan :
Victoires : 40.48%
Degats moyens :
93 par combat (15 degats critiques)
19 par coup
Nombres de critiques moyens : 0.24 par combat
Chances de critique : 2.85%
Echecs critiques : 0.43 par combat
Chances d'echec critique : 5.01%
Chances de toucher : 55.23%
Nombre de rages par combat : 0.57
Duree moyenne de la rage : 5.03 tours
Nombre de rages ecourtees par combat : 0.38

Duree moyenne du combat : 8.66 tours


Code:

#definition des classes

class Arme
   attr_accessor :degat, :categorie
   def initialize(degat, categorie)
      @degat = degat
      @categorie = categorie
   end
end

class Armure
   attr_accessor :armure, :cat
   def initialize(armure, cat)
      @armure = armure
      @cat = cat
   end
end

def d(n, p = 1)
   r =0
   p.times {r += rand(n) +1 }
   return r
end



class Attaque
   attr_accessor :toucher, :caract, :degat, :critique, :parade
   #les arguments indiquent les ratio de modificateurs de caractéristiques utilisés
   #sauf le critique : on crit sur 20 - ratio crit, et on remplace le ratio de dégats par le ratio de critique dans le calcul des dégats
   def initialize(t, ca,  d, cr, p)
      @toucher = t
      @caract = ca
      @degat =  d
      @critique = cr
      @parade = p
   end
end


class Perso
   attr_accessor :e, :v, :a, :armure, :arme, :parade, :nom, :pv, :dgt, :crit, :dgt_crit, :ec
   attr_accessor :hit, :init, :nb_rage, :duree_rage, :fins_rage
   def initialize(e, v, a, l, m, c, cc, p, d, nom)
      @e = e
      @v = v
      @a = a
      @l = l
      @m = m
      @c = c
      @cc = cc
      @p = p
      @d = d
      @pv = 100
      @pe = 100
      @pf = 100
      @parade = (@a/10*0.5).to_i #valeur par défaut au début du combat
      @arme = Arme.new(4, 'Mains nues')
      @armure = Armure.new(0, 'Sans armure')
      @nom = nom
      @init = 0
      @rage = 0
      @rage_cd = 0
      @malus = 0
      @debut_rage = 0
      
      #compteurs stat
      @dgt = 0
      @nb_rage = 0
      @duree_rage = 0
      @fins_rage = 0
      @crit = 0
      @dgt_crit = 0
      @ec = 0
      @hit = 0
   end
   def equiper(arme, armure)
      @arme = arme
      @armure = armure
   end
   def attaquer(cible, type)
      case type.caract
         when 'v'
            caract = @v
         when 'a'
            caract = @a
      end
      # @nom + " attaque " + cible.nom + "."
      # "Defense de " + cible.nom + " : " + cible.defense.to_s
      base_jdt = 1*d(20)
      jdt = base_jdt + (type.toucher + caract/10).to_i + @malus
      # "Jet de toucher : " + base_jdt.to_s + " + " + type.toucher.to_s + "*" + caract.to_s + " = " + jdt.to_s
      if (jdt >= cible.defense or base_jdt == 20) and base_jdt !=1
         #print cible.nom + " est touche"
         if base_jdt == 1
            fact_crit = 0
         elsif (base_jdt > (20 -type.critique)) and (d(20) > 20 - @a/10)
            # " de maniere critique."
            fact_crit = type.critique + 1
            @crit += 1
            @hit += 1
            base_degats = d(@arme.degat)
            degats = base_degats + @v/5 + @malus + type.degat
            degats *= fact_crit
            degats = degats.to_i
            @dgt_crit += degats
            @dgt += degats
         else
            # "."
            fact_crit = 1
            @hit += 1
            base_degats = d(@arme.degat)
            degats = base_degats + @v/5 + type.degat + @malus
            degats *= fact_crit
            degats = degats.to_i
            @dgt += degats
         end
         
         # "Degats : (" + base_degats.to_s + "*" + @v.to_s + "/10*" + type.degat.to_s + ") *" + fact_crit.to_s + " = " + degats.to_s
         cible.pv -= degats
         # cible.nom + ", PV : " + cible.pv.to_s
      else
         # "Coup manque !"
      end
      if base_jdt == 1 and d(20) < 30-@a/10
         # "Echec critique"
         @ec +=1
         @parade = 0
      else
         @parade = (@a/10 + type.parade).to_i
      end
   end
   def attaquer_ia(cible, preference, secours)
      if @pv < 25 and @rage == 0
         attaquer(cible, secours)
      else
         attaquer(cible, preference)
      end
   end
   def defense
      return @parade + 10 + @armure.armure + @malus
   end
   def etat
      if @pv != 100 and @rage == 0 and @rage_cd == 0
         @debut_rage = @pv
         @rage = d(4) + @e/10 #choix de faire durer plus ou moins en fonction de l'endurance
         @rage_cd = 2*@rage #le "temps de recharge" vaut autant que la durée de rage
         @nb_rage +=1
         @duree_rage += @rage
      end
      if @debut_rage - @pv > @v and @rage != 0 #fin de rage prématurée pour cause de trop de dégats
         @duree_rage -= @rage
         @rage = 0
         @fins_rage += 1
      end
      if @rage != 0
         if @pv < 25
            @malus = -8
         elsif @pv < 50
            @malus = -4
         elsif @pv < 75
            @malus = -2
         else
            @malus = 0
         end
      else
         @malus = 0
      end
      if @rage != 0
         @rage -= 1
      end
      if @rage_cd != 0
         @rage_cd -= 1
      end
   end
   def mort
      if @pv <= 0 and @rage <= 0
         return true
      else
         return false
      end
   end
end

#Definition des objets

epee = Arme.new(8, "Epee")
cuir = Armure.new(5, "Cotte de mailles")
bob = Perso.new(50, 50, 50, 0, 0, 0, 0, 0, 0, "Bob")
bob.equiper(epee, cuir)
stan = Perso.new(50, 50, 50, 0, 0, 0, 0, 0, 0, "Stan")
stan.equiper(epee, cuir)
att_brutale = Attaque.new(15, 'v', 10, 1, 2)
att_finesse = Attaque.new(12, 'a', 5, 3, 5)
defensive = Attaque.new(0, 'v', 0, 1, 17)

vict_bob = 0
vict_stan = 0
tours_blancs_bob = 0
tours_blancs_stan = 0
x = 10000
tour = 0

## Partie du combat

x.times do
   bob.pv = 100
   stan.pv = 100
   crit_bob_act = bob.crit
   crit_stan_act = stan.crit
   tour_act = tour
   bob.init = d(20) + bob.v/10
   stan.init = d(20) +stan.v/10
   until bob.init != stan.init
      bob.init = d(20) + bob.v/10
      stan.init = d(20) +stan.v/10
   end
   until bob.mort or stan.mort
      tour +=1
      if bob.init > stan.init
         bob.attaquer_ia(stan, att_brutale, defensive)
         if stan.mort == false
            stan.attaquer_ia(bob, att_finesse, defensive)
         else
            tours_blancs_stan += 1
         end
      else
         stan.attaquer_ia(bob, att_finesse, defensive)
         if bob.mort == false
            bob.attaquer_ia(stan, att_brutale, defensive)
         else
            tours_blancs_bob += 1
         end
      end
      bob.etat
      stan.etat
   end
   if bob.mort and stan.mort
   elsif stan.mort
      vict_bob +=1
   elsif  bob.mort
      vict_stan +=1
   end
end


x = vict_bob + vict_stan #je ne sais pas pourquoi mais le nombre de victoires totales n'est pas tout à fait le x défini avant. Quelques nuls, je renormalise donc
tours_bob = tour - tours_blancs_bob #tours où bob a effectivement attaqué
tours_stan = tour - tours_blancs_stan

puts "Bob : "
puts "Victoires : " + sprintf("%.2f", vict_bob/(x.to_f) *100.0).to_s + "\%"
puts "Degats moyens : "
puts (bob.dgt/x).to_s + " par combat (" + (bob.dgt_crit/x).to_s + " degats critiques)"
puts (bob.dgt/bob.hit).to_s + " par coup"
puts "Nombres de critiques moyens : " + sprintf("%.2f", bob.crit/x.to_f).to_s + " par combat"
puts "Chances de critique : " + sprintf("%.2f", bob.crit*100.0/tours_bob.to_f) + "\%"
puts "Echecs critiques : " + sprintf("%.2f", bob.ec/x.to_f).to_s + " par combat"
puts "Chances d'echec critique : " + sprintf("%.2f", bob.ec/tours_bob.to_f*100.0).to_s + "\%"
puts "Chances de toucher : " + sprintf("%.2f", bob.hit/tours_bob.to_f*100.0).to_s + "\%"
puts "Nombre de rages par combat : " + sprintf("%.2f", bob.nb_rage/x.to_f)
puts "Duree moyenne de la rage : " + sprintf("%.2f", bob.duree_rage/bob.nb_rage.to_f) + " tours"
puts "Nombre de rages ecourtees par combat : " + sprintf("%.2f", bob.fins_rage/x.to_f)
puts ""
puts "Stan : "
puts "Victoires : " + sprintf("%.2f", vict_stan/(x.to_f) *100.0).to_s + "\%"
puts "Degats moyens : "
puts (stan.dgt/x).to_s + " par combat (" + (stan.dgt_crit/x).to_s + " degats critiques)"
puts (stan.dgt/stan.hit).to_s + " par coup"
puts "Nombres de critiques moyens : " + sprintf("%.2f", stan.crit/x.to_f).to_s + " par combat"
puts "Chances de critique : " + sprintf("%.2f", stan.crit/tours_stan.to_f*100.0).to_s + "\%"
puts "Echecs critiques : " + sprintf("%.2f", stan.ec/x.to_f).to_s + " par combat"
puts "Chances d'echec critique : " + sprintf("%.2f", stan.ec/tours_stan.to_f*100.0).to_s + "\%"
puts "Chances de toucher : " + sprintf("%.2f", stan.hit/tours_stan.to_f*100.0).to_s + "\%"
puts "Nombre de rages par combat : " + sprintf("%.2f", stan.nb_rage/x.to_f)
puts "Duree moyenne de la rage : " + sprintf("%.2f", stan.duree_rage/stan.nb_rage.to_f) + " tours"
puts "Nombre de rages ecourtees par combat : " + sprintf("%.2f", stan.fins_rage/x.to_f)
puts ""
puts "Duree moyenne du combat : " + sprintf("%.2f", tour/x.to_f).to_s + " tours"


J'ai testé Bob : E100, V100, A100 et Stan E100, V100, A100
Bob E100, V100, A50 et Stan E100, V50, A100
Bob E100, V100, A25 et Stan E50, V25, A150
Bob E20, V20, A20 et Stan E20, V20, A20

Tout marche en restant dans la foruchette 70%/30% de victoires, souvent en faveur de bob (le cas le plus déséquilibré concerne le lot de caractéristiques très basses, et montant ça s'équilibre mieux).
Le seul truc qui me gêne un peu c'est la durée du combat. J'aimerais que typiquement, ça dure entre 3 et 6 tours. Peut-être relever les chances de toucher. C'est chiant quand y'a du raté partout. Là on est souvent entre 45 et 65% de chance de toucher (souvent proches de 50).

Alors ce que j'ai appelé "rage" c'est quand tu ignores les malus et la fatigue grâce à ta vivacité pendant quelques rounds. Le coup du héros avec 8 flèches dans le dos et un bras en moins qui bastonne encore quelques frappes avant de tomber, souviens-toi.
Revenir en haut Aller en bas
Maître de Mystras
Grand Maître
Maître de Mystras

Nombre de messages : 528
Age : 30
Date d'inscription : 03/07/2005

Symtrass ! the come back - Page 3 Empty
MessageSujet: Re: Symtrass ! the come back   Symtrass ! the come back - Page 3 Icon_minitimeDim 20 Mar - 21:29

Pouuuuh ! Plus j'essaie d'équilibrer et plus c'est difficile de savoir ce qu'il faut faire. Si vous avez des idées de système qui peuvent utiliser les caractéristiques qu'on veut (pour l'instant, on peut se contenter de Endurance, Vivacité et Agilité), avec la fatigue, la dernière attaque et la gravité des blessures qui jouent un rôle je veux bien tout refaire !
Revenir en haut Aller en bas
Drambam
Impudent Personnage
Drambam

Nombre de messages : 289
Date d'inscription : 04/07/2005

Feuille de personnage
XP:
Symtrass ! the come back - Page 3 Left_bar_bleue216/2000Symtrass ! the come back - Page 3 Empty_bar_bleue  (216/2000)
XP du 1er Compagnon:
Symtrass ! the come back - Page 3 Left_bar_bleue550/1000Symtrass ! the come back - Page 3 Empty_bar_bleue  (550/1000)
Xp du 2nd Compagnon:
Symtrass ! the come back - Page 3 Left_bar_bleue1027/2000Symtrass ! the come back - Page 3 Empty_bar_bleue  (1027/2000)

Symtrass ! the come back - Page 3 Empty
MessageSujet: Re: Symtrass ! the come back   Symtrass ! the come back - Page 3 Icon_minitimeLun 21 Mar - 0:01

Ouais dans un éditeur tout de suite c'est mieux. D'ailleurs même si j'en ai vu passer d'autres des langages de prog, ça fait longtemps que j'ai pas ouvert ou écrit un .rb ! Ceci dit y'a pas eu de soucis pour comprendre sauf peut être que je ne suis pas habitué aux nouvelles stats. (Par exemple il m'a fallu quelques secondes pour réaliser que E = endurance V = vivacité, etc...)

Je sais pas vraiment comment aider là, tout de suite rien ne me vient à l'esprit. J'approuve pour augmenter les chances de toucher car des combats avec beaucoup de tours c'est très long et ennuyeux (surtout quand ça se passe sur un forum!). Autre chose qui je trouve devient vite emmerdant, c'est les jets d'init' à chaque tour. Pourquoi pas en faire un seul pour tout le combat? Remarque là c'est plutôt l'inverse: sur forum c'est gérable mais pour prendre l'exemple d'un D&D sur papier ça force à faire des jets supplémentaires; Les joueurs se rappellent plus de leur jets s'ils sont pas un minimum attentifs et on sait plus vraiment dans quel sens on tourne.
Avant on se basait uniquement sur l'agilité et c'était un peu statique, mais comme ça on pioche un peu dans les deux façons et je trouve ça bien.
Revenir en haut Aller en bas
Maître de Mystras
Grand Maître
Maître de Mystras

Nombre de messages : 528
Age : 30
Date d'inscription : 03/07/2005

Symtrass ! the come back - Page 3 Empty
MessageSujet: Re: Symtrass ! the come back   Symtrass ! the come back - Page 3 Icon_minitimeLun 21 Mar - 7:18

Je suis d'accord avec toi pour l'initiative. D'ailleurs c'est ce que j'ai fait dans le programme. J'en refais un au début de chaque combat, et j'ai juste fait en sorte de ne pas biaiser les stats en empêchant qu'il aient la même init. Dans le jeu les joueurs commencent toujours en cas d'égalité.
Revenir en haut Aller en bas
Contenu sponsorisé




Symtrass ! the come back - Page 3 Empty
MessageSujet: Re: Symtrass ! the come back   Symtrass ! the come back - Page 3 Icon_minitime

Revenir en haut Aller en bas
 
Symtrass ! the come back
Revenir en haut 
Page 3 sur 3Aller à la page : Précédent  1, 2, 3

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Les terres de Mystras :: Terres de Mystras :: La taverne du Boulon Déglingué-
Sauter vers: