Einzelnen Beitrag anzeigen

Sorakun

Registriert seit: 12. Aug 2010
2 Beiträge
 
Delphi 2 Desktop
 
#1

Problem mit Würfelsimulation

  Alt 12. Aug 2010, 23:31
Ich versuche gerade einen Würfelsimulator/Wahrscheinlichkeitsrechner für das P&P-RPG Double Cross The 3rd Edition zu schreiben und bin mit der Würfelsimulation eigentlich schon fertig, allerdings will es nicht ganz funktionieren...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Roll(StrToInt(DP.text),StrToInt(CT.text)));
end;

function TForm1.Roll(dipo, crth: integer) : string;
var t, c, i, j: integer;
    a: array of integer;
    m: string;
begin
  i:=0;
  t:=0;
  repeat
     c:=Dice(dipo);
     i:= i+1;
     SetLength(a,i);
     a[i-1]:= c;
     t:= t+c;
  until c < crth;
  m:= 'Result: ' + IntToStr(a[0]); //Exception 1
  j:=1;
  while j < i do
  begin
     m:= m + '+' + IntToStr(a[j]);
     j:= j+1;
  end;
  m:= m + ' = ' + IntToStr(t);
  result:= m;
end;

function TForm1.Dice(dipo: integer) : integer;
var a:array of integer;
    x,i:integer;
begin
  SetLength(a,dipo); //Exception 2
  for i:=1 to dipo do begin
      x:= Random(10)+1;
      a[i]:=x;
  end;
  for i:=2 to dipo do begin
      if a[i]>a[1] then
         a[1]:=a[i];
  end;
  Result := a[1]; //Exception 3+4
end;
Die Idee dabei ist, dass man einen bestimmten Dice Pool, also eine bestimmte Anzahl von 10-seitigen Würfeln hat, mit denen man würfelt, wobei das Ergebnis der höchste Wurf ist. Ist dieser höchste Wurf gleich oder über dem vorher festgelegten Critical Threshold, so würfelt man noch mal und addiert dieses Ergebnis hinzu. Das geht so lange weiter, bis ein Wurf unter dem CT liegt.
Ich kann zwar keinen Fehler im Code entdecken, aber ich bekomme jedes Mal eine von diesen Exceptions, nach denen das Programm nicht weiter läuft. (Test mit DP: 1 und CT: 10)

Nach m:= 'Result: ' + IntToStr(a[0]);
Project Project1.exe raised exception class C0000005 with message 'access violation at 0x00401c70: write of address 0x0000000a'. Process stopped. Use Step or Run to continue.

Nach SetLength(a,dipo); (2. Aufruf)
Project Project1.exe raised exception class C0000005 with message 'access violation at 0x00401c70: write of address 0x0000000e'. Process stopped. Use Step or Run to continue.

Nach Result := a[1];
Project Project1.exe raised exception class C0000005 with message 'access violation at 0x00401c70: write of address 0x0000000c'. Process stopped. Use Step or Run to continue. (address immer unterschiedlich)
oder
Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped. Use Step or Run to continue.


Kann bitte jemand sagen, wo der Fehler liegt?
Vielen Dank im Voraus.
  Mit Zitat antworten Zitat