artmonchrie2
Messages postés3Date d'inscriptiondimanche 4 novembre 2007StatutMembreDernière intervention15 mai 2008
-
14 mai 2008 à 17:44
artmonchrie2
Messages postés3Date d'inscriptiondimanche 4 novembre 2007StatutMembreDernière intervention15 mai 2008
-
15 mai 2008 à 18:47
Bonjour à tous,
Je crée un générateur de jeu de role et dans celui-ci je suis souvent amené à faire des jets de dé. Le jeu demandant différents types de dés j'ai créé la procédure suivante
function DE(nombre : integer):integer;
var
Nb : integer;
begin
randomize;
if nombre = 100
then
Nb := random(100) //On considère que le dé 100 va de 00 à 99
else
Nb := random(nombre)+1;
DE := Nb;
end;
En plus du générateur j'ai voulu créer une petite fonction qui permet juste de lancé des dés. Sur une fiche je lis le nombre de dés et les types à lancer et j'appelle "n" fois la précédure de lancer de dé.
ça compile, mais lorsque je demande de lancer 3 dés 3 (par exemple) le score des dés est toujours le même... Pourtant je ne fait pas 3 DE(3), j'appelle bien 3 fois de suite ma procédure. Ce serait plutôt DE(3) + DE(3) + DE(3)
Et pourtant il semblerait que le résultat affiché soit à chaque fois le meme. (2+ 2+ 2 ou 1+ 1+1 etc...)
Fait encore plus étrange, quand j'utilise le mode pas à pas, je n'ai plus ce soucis. a croire qu'avec le mode pas à pas, il "n'oublie" pas de refaire des jets aléatoires.
Voila la procédure qui lance les dés
procedure JETER_DES(nbDes : string; numero : integer; var score : integer; var LBResultat : TListBox);
var
cpt , defaut: integer;
scoreint : integer; //Score intermédiaire
ligne : string; //contient les résultats intermédiaires
begin
if StrtointDef(nbDes, defaut) >= 1
then
begin
for cpt := 1 to strtoInt(nbDes) do
begin
scoreint := DE(numero);
score := score + scoreint;
AFFICHE_RESULT(scoreint, ligne);
end;
LBResultat.items.add(ligne);
end;
end;
Est ce qu'il y aurait une faille dans le code que je ne vois pas ? Ou peut -être une feinte ?
Merci d'avance
function RandRange(const AFrom, ATo: Integer): Integer;
begin
if AFrom > ATo then
Result := Random(AFrom - ATo + 1) + ATo
else
Result := Random(ATo - AFrom + 1) + AFrom;
end;
function LaunchDe(const DT : TDesType; const ND: byte = 1): integer;
begin
result := RandRange(DesDatas[DT].min*ND,
DesDatas[DT].max*ND);
end;
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 14 mai 2008 à 22:21
Excellent foxi :) Mais [auteur/ARTMONCHRIE2/1195172.aspx artmonchrie2] (sans vouloir être vexant) a t-il le niveau pour comprendre sans explications ?
Art:
Tu peux modifier ça :
function DE(nombre : integer):integer;
var
Nb : integer;
begin
randomize;
if nombre = 100
then
Nb := random(100) //On considère que le dé 100 va de 00 à 99
else
Nb := random(nombre)+1;
DE := Nb;
end;
en ça :
Function De(const Nombre: integer): integer;
begin
if Nombre=100 then Result := Random(100) else
Result := Random(Nombre)+1;
end;
Pour la deuxième fonction, efface là et recommence là depuis 0 :p ... ou utiliser les dés de foxi =)
artmonchrie2
Messages postés3Date d'inscriptiondimanche 4 novembre 2007StatutMembreDernière intervention15 mai 2008 15 mai 2008 à 18:37
Merci pour ton code Foxi, mais ça ne réponds pas vraiment à ma question. Je vois que ton générateur de dé est plus puissant (déjà il lance plusieurs dés à la fois ^^) mais le mien marche quand même. En plus je m'en sers déjà bcp dans le reste du générateur et il marche trés bien! Donc si je pouvais éviter de tout reprendre !
J'ai fait quelques nouveaux tests dont voici les résultats :
si je rajoute pas mal d'opérations entres les différents appels de dé (ex rendre visible puis invisible moultes fois un composant) y a de l'amélioration, le D3 n'a plus toujours la même valeur, par contre il n'en prends que deux différentes à chaque fois... (j'ai jamais eu de 1, 2 et 3 ... etc en un tirage...) louche..
et par contre si aprés chaque résultat j'affiche le résultat avec un showmessage, ça passe impec... trés louche j'ai a chaque fois un résultat qui semble vraiment aléatoire.
D'où ça peut venir ?
Ptite question en plus, ça sert à quoi de mettre "const" dans l'entete de la fonction avant "Nombre : integer"
artmonchrie2
Messages postés3Date d'inscriptiondimanche 4 novembre 2007StatutMembreDernière intervention15 mai 2008 15 mai 2008 à 18:47
J'ai trouvé...
Trop pourrie la solution,
j'ai changé le randomize de place, je l'ai appelé une seule fois dans le programme principal et plus du tout dans la fonction DE. Je ne sais pas pourquoi, mais depuis ça marche, même sans intercaller la moindre action intermédiaire..