Drambam Impudent Personnage
Nombre de messages : 289 Date d'inscription : 04/07/2005
Feuille de personnage XP: (216/2000) XP du 1er Compagnon: (550/1000) Xp du 2nd Compagnon: (1027/2000)
| Sujet: Re: Symtrass ! the come back Dim 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! | |
|
Maître de Mystras Grand Maître
Nombre de messages : 528 Age : 34 Date d'inscription : 03/07/2005
| Sujet: Re: Symtrass ! the come back Dim 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. | |
|
Maître de Mystras Grand Maître
Nombre de messages : 528 Age : 34 Date d'inscription : 03/07/2005
| Sujet: Re: Symtrass ! the come back Dim 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 ! | |
|
Drambam Impudent Personnage
Nombre de messages : 289 Date d'inscription : 04/07/2005
Feuille de personnage XP: (216/2000) XP du 1er Compagnon: (550/1000) Xp du 2nd Compagnon: (1027/2000)
| Sujet: Re: Symtrass ! the come back Lun 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. | |
|
Maître de Mystras Grand Maître
Nombre de messages : 528 Age : 34 Date d'inscription : 03/07/2005
| Sujet: Re: Symtrass ! the come back Lun 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é. | |
|