home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games World (Happy Day Edition)
/
HAPPYDAY.ISO
/
happyday
/
bgpro
/
rand2.pas
< prev
Wrap
Pascal/Delphi Source File
|
1994-04-18
|
4KB
|
141 lines
{***************************************************************************}
{* RAND2.PAS *}
{* Externer Zufallsgenerator für PC-Backgammon Pro *}
{* Programmiersprache: Turbo-Pascal, Autor: Michael Schellong *}
{* *}
{* Dieses Beispiel-Programm soll Ihnen demonstrieren, wie Sie in Pascal *}
{* eigene Zufallsgeneratoren für PC-Backgammon Pro V2.0 schreiben können. *}
{* Der externe Zufallsgenerator wird von PC-Backgammon Pro zur Ermittlung *}
{* der Würfelaugen aufgerufen. Als Parameter wird dem Generator ein Zeiger *}
{* auf einen 32 Byte langen Speicherbereich übergeben, den er für seine ei-*}
{* genen Zwecke frei verwenden kann. Beispielsweise können hier Variablen- *}
{* Inhalte gespeichert werden, die beim nächsten Aufruf wieder benötigt *}
{* werden. Beim ersten Aufruf des Generators haben sämtliche Bytes des *}
{* Speicherbereichs einen Wert von 0xFF. *}
{* Als Programmbeendigungs-Code muss die ermittelte Zufallszahl (im Bereich*}
{* von 1 bis 6) zurückgeliefert werden. *}
{***************************************************************************}
Program Rand2;
Uses Dos;
Type
LongPtr=^LongInt;
Var
W: LongInt;
CubeVal:Integer;
PoolPtr: Pointer;
{******************************************}
{* Initialisierung des Zufallsgenerators *}
{******************************************}
Procedure InitMyRand;
Var
Year, Month, Day, Dummy: Word;
Hour, Minute, Second: Word;
Begin
{ Aktuelles Datum und Uhrzeit ermitteln }
GetDate(Year, Month, Day, Dummy);
GetTime(Hour, Minute, Second, Dummy);
{ Ungefähr die Sekunden seit dem 1.1.1980 berechnen
und Zufallsgenerator damit initialisieren }
W:=(Year-1980)*31557600+
(Month-1)*2592000+
(Day-1)*86400;
W:=W+Hour*3600+Minute*60+Second;
W:=W mod 716397;
End;
{****************************************************}
{* Ermittelt eine Zufallszahl im Bereich 0..Range-1 *}
{****************************************************}
Function MyRand(Range: Integer): Integer;
Begin
W:=(W*431+1237) mod 716397;
MyRand:=Trunc(Range*(W/716397));
End;
{****************************************************}
{* Ermittelt den als Aufrufparameter übergebenen *}
{* Zeiger. *}
{* Für die etwas kompliziertere Vorgehensweise kann *}
{* ich leider nichts. Die Ursache liegt in dem spär-*}
{* lichen Angebot von Pascal an Stringkonvertie- *}
{* rungs-Funktionen. *}
{****************************************************}
Function GetParamPtr:Pointer;
Var
S:String;
{****************************************************}
{* Diese lokale Funktion wandelt eine ASCII-Hex-Zif-*}
{* fer in ihren binären Wert um. *}
{****************************************************}
Function _HexDigitAsc2Bin(C:Char):Byte;
Begin
C:=UpCase(C);
If (C>='A') And (C<='F') Then
_HexDigitAsc2Bin:=Ord(C)-Ord('A')+$0A
Else
if (C>='0') And (C<='9') Then
_HexDigitAsc2Bin:=Ord(C)-Ord('0')
else _HexDigitAsc2Bin:=0;
End;
{****************************************************}
{* Diese lokale Funktion wandelt ein 4 Zeichen *}
{* langes ASCII-Hex-Wort in seinen binären Wert um. *}
{****************************************************}
Function _HexWordAsc2Bin(S: String):Word;
Var
W:Word;
I:Integer;
Begin
W:=0;
For I:=1 To 4 Do
W:=W*$10+_HexDigitAsc2Bin(S[I]);
_HexWordAsc2Bin:=W;
End;
Begin
{1. Aufrufparameter holen (Format XXXX:YYYY)}
S:=ParamStr(1);
{Segment und Offset konvertieren und in
Pointer umwandeln}
GetParamPtr:=Ptr(_HexWordAsc2Bin(S),
_HexWordAsc2Bin(Copy(S,6,4)));
End;
Begin
If ParamCount<1 Then
halt(0);
{Pointer auf Pool ermitteln}
PoolPtr:=GetParamPtr;
if LongPtr(PoolPtr)^=-1 Then
{Beim 1. Aufruf Zufallsgenerator initialisieren}
InitMyRand
Else
{Zwischengespeicherte Variable W holen}
W:=LongPtr(PoolPtr)^;
{Würfelwert ermitteln}
CubeVal:=MyRand(6)+1;
{Variable W für den nächsten Aufruf im Pool speichern}
LongPtr(PoolPtr)^:=W;
Halt(CubeVal);
End.