⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 liurenyuansu.pas

📁 大六壬
💻 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 + -