📄 liurenyuansu.pas
字号:
unit LiuRenYuanSu;
interface
uses Classes,MetaphysicsBasic,Math;
type
TTianJiangShunXu=(tjNull, tjGuiRen, tjTengShe, tjZhuQue, tjLiuHe, tjGouChen, tjQingLong, tjTianKong, tjBaiHu, tjTaiChang, tjXuanWu, tjTaiYin, tjTianHou);
//天将元素
TTianJiang=class
private
vOrder:TTianJiangShunXu;//顺序
vCaption:string;//名称
vDiZhi:TDiZhiShunXu;//所属地支
public
property Order:TTianJiangShunXu read vOrder write vOrder;//顺序
property Caption:string read vCaption write vCaption;//名称
property DiZhi:TDiZhiShunXu read vDiZhi write vDiZhi;//所属地支
end;
//天将链
TATJYS=Array[tjGuiRen..tjTianHou] of TTianJiang;//天将元素数组
TTianJiangLian=class
private
vItems:TATJYS;//天将元素数组
vFinger:TTianJiangShunXu;//索引
function GetItem(TheFinger: TTianJiangShunXu):TTianJiang;//获取元素
function GetCurrentItem: TTianJiang;//索引的元素
public
constructor Create;//创建
destructor Destroy;override;//销毁
procedure Step(StepLen:Integer);//步进 正负均可
procedure StepNext;//步进到下一单元
property Finger:TTianJiangShunXu read vFinger write vFinger;//当前元素索引
property Items[TheFinger: TTianJiangShunXu]:TTianJiang read GetItem;//元素
property CurrItem:TTianJiang read GetCurrentItem;//当前索引的元素
end;
// TDiPanDanYuan=array[dzZi..dzHai] of TDiZhiShunXu;
TDiPan=class
private
function GetItem(TheFinger:TDiZhiShunXu):TDiZhiShunXu;
// function GetCurrItem: TDiZhiShunXu;
public
Finger:TDiZhiShunXu;//指针
procedure Step(StepLen:Integer);
procedure StepNext;
constructor Create;//创建
property Items[TheFinger:TDiZhiShunXu]:TDiZhiShunXu read GetItem;
// property CurrItem:TDiZhiShunXu read GetCurrItem;
end;
//天盘单元
{
TTianPanDanYuan=class
private
vDiZhi:TDiZhi;
vTianJiang:TTianJiang;
public
DiZhi:TDiZhi;
TianJiang:TTianJiang;
end;
}
//天盘单元数组
TATPDY=array[dzZi..dzHai] of TDiZhiShunXu;
//天盘
TTianPan=class
private
vItems:TATPDY;//盘格元素数组
vFinger:TDiZhiShunXu;//索引
function GetItem(TheFinger: TDiZhiShunXu):TDiZhiShunXu;//获取元素
function GetCurrentItem: TDiZhiShunXu;//索引的元素
public
constructor Create;//创建
procedure Step(StepLen:Integer);//步进 正负均可
procedure StepNext;//步进到下一单元
procedure PianYi(AbsOffset:Integer);//绝对偏移
procedure Rotate(RelaOffset:Integer);//相对转动
procedure ZiDong(YueJiang{月将},ZhanShi{占时}:TDiZhiShunXu);//自动,按月将和占时
property Finger:TDiZhiShunXu read vFinger write vFinger;//当前元素索引
property Items[TheFinger: TDiZhiShunXu]:TDiZhiShunXu read GetItem;//元素
property CurrItem:TDiZhiShunXu read GetCurrentItem;//当前索引的元素
end;
//将盘单元数组
TATJDY=array[dzZi..dzHai] of TTianJiangShunXu;
//将盘
TJiangPan=class
private
vItems:TATJDY;//盘格元素数组
vFinger:TDiZhiShunXu;//索引
function GetItem(TheFinger: TDiZhiShunXu):TTianJiangShunXu;//获取元素
function GetCurrentItem: TTianJiangShunXu;//索引的元素
procedure SetCurrentItem(TJ:TTianJiangShunXu);
// function
public
constructor Create;//创建
procedure Step(StepLen:Integer);//步进 正负均可
procedure StepNext;//步进到下一单元
procedure PianYi(AbsOffset:Integer);//绝对偏移
procedure Rotate(RelaOffset:Integer);//相对转动
property Finger:TDiZhiShunXu read vFinger write vFinger;//当前元素索引
property Items[TheFinger: TDiZhiShunXu]:TTianJiangShunXu read GetItem;//元素
property CurrItem:TTianJiangShunXu read GetCurrentItem write SetCurrentItem;//当前索引的元素
end;
//四课
TGanKe=class//干课,四课中的第一课,下神为天干,上神为地支
Jiang:TTianJiangShunXu;//所乘天将
ShangShen:TDiZhiShunXu;//上神
XiaShen:TTianGanShunXu;//下神
end;
TZhiKe=class//支课,四课中的其余三课,下神和上神均为地支
Jiang:TTianJiangShunXu;//所乘天将
ShangShen:TDiZhiShunXu;//上神
XiaShen:TDiZhiShunXu;//下神
end;
TSiKe=class//四课
public
RiKe1:TGanKe;//日上两课
RiKe2:TZhiKe;
ChenKe1:TZhiKe;//辰上两课
ChenKe2:TZhiKe;
constructor Create;
destructor Destroy;override;
end;
TAnKe=class//暗课,用于方便处理的课结构
Shen:TDiZhiShunXu;//课的上神
GuanXi:TWuXingGuanXi;//和下神的关系
Bi:Boolean;//和日干相比否
SheHai:Integer;//涉害次数
HuoLi:THuoLi;//所临的地神的活力
Zhun:Boolean;//准备发用
end;
TSiAnKe=array[1..4] of TAnKe;//四暗课,四课的暗课
//三传
TChuan=class//一传
Jiang:TTianJiangShunXu;//所乘天将
DunGan:TTianGanShunXu;//循干
DiZhi:TDiZhiShunXu;//支神
GuanXi:TWuXingGuanXi;//和占时的日干关系
end;
TSanChuan=class//三传
public
ChuChuan:TChuan;//初
ZhongChuan:TChuan;//中
MoChuan:TChuan;//末
constructor Create;
constructor Destory;//override;
end;
var
_TJL:TTianJiangLian;//天将链
function TianJiangMingCheng(TJ:TTianJiangShunXu):string;//天将名称
const
RiGanGuiRen:array[1..20] of TDiZhiShunXu=(dzWei,dzChou,dzShen,dzZi,dzYou,dzHai,dzHai,dzYou,dzChou,dzWei,dzZi,dzShen,dzChou,dzWei,dzYin,dzWu,dzMao,dzSi,dzSi,dzMao);
implementation
{ TTianJiang }
constructor TTianJiangLian.Create;
begin
vItems[tjGuiRen]:=TTianJiang.Create;
vItems[tjGuiRen].Order:=tjGuiRen;
vItems[tjGuiRen].Caption:='贵';//贵人
vItems[tjGuiRen].DiZhi:=dzChou;
vItems[tjTengShe]:=TTianJiang.Create;
vItems[tjTengShe].Order:=tjTengShe;
vItems[tjTengShe].Caption:='蛇';//腾蛇
vItems[tjTengShe].DiZhi:=dzSi;
vItems[tjZhuQue]:=TTianJiang.Create;
vItems[tjZhuQue].Order:=tjZhuQue;
vItems[tjZhuQue].Caption:='雀';//朱雀
vItems[tjZhuQue].DiZhi:=dzWu;
vItems[tjLiuHe]:=TTianJiang.Create;
vItems[tjLiuHe].Order:=tjLiuHe;
vItems[tjLiuHe].Caption:='合';//六合
vItems[tjLiuHe].DiZhi:=dzMao;
vItems[tjGouChen]:=TTianJiang.Create;
vItems[tjGouChen].Order:=tjGouChen;
vItems[tjGouChen].Caption:='陈';//勾陈
vItems[tjGouChen].DiZhi:=dzChen;
vItems[tjQingLong]:=TTianJiang.Create;
vItems[tjQingLong].Order:=tjQingLong;
vItems[tjQingLong].Caption:='龙';//青龙
vItems[tjQingLong].DiZhi:=dzYin;
vItems[tjTianKong]:=TTianJiang.Create;
vItems[tjTianKong].Order:=tjTianKong;
vItems[tjTianKong].Caption:='空';//天空
vItems[tjTianKong].DiZhi:=dzXu;
vItems[tjBaiHu]:=TTianJiang.Create;
vItems[tjBaiHu].Order:=tjBaiHu;
vItems[tjBaiHu].Caption:='虎';//白虎
vItems[tjBaiHu].DiZhi:=dzShen;
vItems[tjTaiChang]:=TTianJiang.Create;
vItems[tjTaiChang].Order:=tjTaiChang;
vItems[tjTaiChang].Caption:='常';//太常
vItems[tjTaiChang].DiZhi:=dzWei;
vItems[tjXuanWu]:=TTianJiang.Create;
vItems[tjXuanWu].Order:=tjXuanWu;
vItems[tjXuanWu].Caption:='武';//玄武
vItems[tjXuanWu].DiZhi:=dzHai;
vItems[tjTaiYin]:=TTianJiang.Create;
vItems[tjTaiYin].Order:=tjTaiYin;
vItems[tjTaiYin].Caption:='阴';//太阴
vItems[tjTaiYin].DiZhi:=dzYou;
vItems[tjTianHou]:=TTianJiang.Create;
vItems[tjTianHou].Order:=tjTianHou;
vItems[tjTianHou].Caption:='后';//天后
vItems[tjTianHou].DiZhi:=dzZi;
vFinger:=tjGuiRen;
end;
destructor TTianJiangLian.Destroy;
var
tjI:TTianJiangShunXu;
begin
for tjI:=tjGuiRen to tjTianHou do//逐个释放天将元素
begin
vItems[tjI].Free;
end;
inherited;
end;
function TTianJiangLian.GetCurrentItem: TTianJiang;
begin
Result:=vItems[vFinger];
end;
function TTianJiangLian.GetItem(TheFinger: TTianJiangShunXu): TTianJiang;
begin
vFinger:=TheFinger;
Result:=vItems[vFinger];
end;
procedure TTianJiangLian.Step(StepLen: Integer);
var
I:Integer;
begin
I:=StepLen mod 12;//变远偏移称为内偏移
if I <0 then Inc(I,12);//变负偏移为正偏移
I:=(Integer(vFinger)+I) mod 13;
if I=0 then Inc(I);//跳过 tjNull
vFinger:=TTianJiangShunXu(I);
// Result:=vFinger;
end;
procedure TTianJiangLian.StepNext;
begin
if vFinger = tjTianHou then vFinger := tjGuiRen else Inc(vFinger);
end;
{ TDiPan }
constructor TDiPan.Create;
begin
Finger:=dzZi;
end;
function TDiPan.GetItem(TheFinger: TDiZhiShunXu): TDiZhiShunXu;
begin
Result:=TheFinger;
end;
procedure TDiPan.Step(StepLen: Integer);
begin
StepLen := StepLen mod 12;//变远偏移称为内偏移
if StepLen < 0 then Inc(StepLen,12);//变负偏移为正偏移
StepLen := (Integer(Finger) + StepLen) mod 13;
if StepLen = 0 then Inc(StepLen);//跳过 dzNull
Finger := TDiZhiShunXu(StepLen);
end;
procedure TDiPan.StepNext;
begin
if Finger=dzHai then Finger:=dzZi else Inc(Finger);
end;
{ TTianPan }
constructor TTianPan.Create;
var
dzI:TDiZhiShunXu;
begin
for dzI := dzZi to dzHai do vItems[dzI]:=dzI;//初始化变量和指针
vFinger:=dzZi;
end;
function TTianPan.GetCurrentItem: TDiZhiShunXu;
begin
Result:=vItems[vFinger];
end;
function TTianPan.GetItem(TheFinger: TDiZhiShunXu): TDiZhiShunXu;
begin
vFinger:=TheFinger;
Result:=vItems[vFinger];
end;
procedure TTianPan.PianYi(AbsOffset: Integer);//设置子神与子宫相的差
var
dzI:TDiZhiShunXu;
begin
vFinger:=dzZi;
Step(AbsOffset);
for dzI := dzZi to dzHai do
begin
vItems[vFinger] := dzI;
StepNext;
end;
end;
procedure TTianPan.Rotate(RelaOffset: Integer);
begin
PianYi(RelaOffset + 12 - Ord(vItems[dzZi]));//交给“绝对偏移”处理
end;
procedure TTianPan.Step(StepLen: Integer);
begin
StepLen := StepLen mod 12;//变远偏移称为内偏移
if StepLen < 0 then Inc(StepLen,12);//变负偏移为正偏移
StepLen := (Integer(vFinger) + StepLen) mod 13;
if StepLen = 0 then Inc(StepLen);//跳过 tgNull
vFinger := TDiZhiShunXu(StepLen);
end;
procedure TTianPan.StepNext;
begin
if vFinger = dzHai then vFinger := dzZi else Inc(vFinger);
end;
procedure TTianPan.ZiDong(YueJiang, ZhanShi: TDiZhiShunXu);
begin
PianYi(Integer(YueJiang) - Integer(ZhanShi));
end;
{ TJiangPan }
constructor TJiangPan.Create;
var
dzI:TDiZhiShunXu;
tjI:TTianJiangShunXu;
begin
tjI:=tjNull;
dzI:=dzNull;
repeat
Inc(tjI);
Inc(dzI);
vItems[dzI]:=tjI;
until dzI=dzHai;
vFinger := dzZi;
end;
function TJiangPan.GetCurrentItem: TTianJiangShunXu;
begin
Result:=vItems[vFinger];
end;
function TJiangPan.GetItem(TheFinger: TDiZhiShunXu): TTianJiangShunXu;
begin
vFinger:=TheFinger;
Result:=vItems[vFinger];
end;
procedure TJiangPan.PianYi(AbsOffset: Integer);
var
tjI:TTianJiangShunXu;
begin
vFinger:=dzZi;
Step(AbsOffset);
vItems[vFinger]:=tjGuiRen;
if (vFinger>dzChen) and (vFinger<dzHai) then//逆布
begin
for tjI := tjTianHou downto tjTengShe do
begin
StepNext;
vItems[vFinger] := tjI;
end;
end
else
begin//顺布
for tjI := tjTengShe to tjTianHou do
begin
StepNext;
vItems[vFinger] := tjI;
end;
end;
end;
procedure TJiangPan.Rotate(RelaOffset: Integer);
begin
PianYi(RelaOffset + 12 - Ord(vItems[dzZi]));//交给“绝对偏移”处理
end;
procedure TJiangPan.SetCurrentItem(TJ: TTianJiangShunXu);
begin
vItems[vFinger] := TJ;
end;
procedure TJiangPan.Step(StepLen: Integer);
begin
StepLen := StepLen mod 12;//变远偏移称为内偏移
if StepLen < 0 then Inc(StepLen,12);//变负偏移为正偏移
StepLen := (Integer(vFinger) + StepLen) mod 13;
if StepLen = 0 then Inc(StepLen);//跳过 tgNull
vFinger := TDiZhiShunXu(StepLen);
end;
procedure TJiangPan.StepNext;
begin
if vFinger = dzHai then vFinger := dzZi else Inc(vFinger);
end;
{ TSiKe }
constructor TSiKe.Create;
begin
RiKe1:=TGanKe.Create;//日上两课
RiKe2:=TZhiKe.Create;
ChenKe1:=TZhiKe.Create;//辰上两课
ChenKe2:=TZhiKe.Create;
end;
destructor TSiKe.Destroy;
begin
RiKe1.Free;//日上两课
RiKe2.Free;
ChenKe1.Free;//辰上两课
ChenKe2.Free;
inherited;
end;
{ TSanChuan }
constructor TSanChuan.Create;
begin
ChuChuan:=TChuan.Create;
ZhongChuan:=TChuan.Create;
MoChuan:=TChuan.Create;
end;
constructor TSanChuan.Destory;
begin
ChuChuan.Free;
ZhongChuan.Free;
MoChuan.Free;
end;
function TianJiangMingCheng(TJ:TTianJiangShunXu):string;//天将名称
begin
Result:=_TJL.Items[TJ].Caption;
end;
initialization
_TJL:=TTianJiangLian.Create;
finalization
_TJL.Free;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -