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

📄 liuren.pas

📁 大六壬
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit LiuRen; //六壬类

interface

uses Classes,MetaphysicsBasic,Math,LiuRenYuanSu;

type
  //六壬课盘
  TLiuRen=class
  private
    vWuXing:TWuXing;//五行
    vTianGanLian:TTianGanLian;//天干
    vDiZhiLian:TDiZhiLian;//地支
    vDiPan:TDiPan;//地盘
    vTianPan:TTianPan;//天盘
    vJiangPan:TJiangPan;//将盘
    vSiKe:TSiKe;//四课
    vKongWang1, vKongWang2:TDiZhiShunXu;//空亡1、2
    vSanChuan:TSanChuan;//三传
    vZhanShiSiZhu:TSiZhu;//占时四柱
    vShiZhuSiZhu:TSiZhu;//事主四柱
    vShiZhuXingNian:TZhu;//事主行年
    vYueJiang:TDiZhiShunXu;//月将
    vSuoZhanShiWu:TStringList;//所占事物
    vLunDuan:TStringList;//论断
    vYan:TStringList;//验
    vZhuShi:TStringList;//注释
  public
    constructor Create;
    destructor Destroy;override;
    property DiPan:TDiPan read vDiPan;
    property TianPan:TTianPan read vTianPan;
    property JiangPan:TJiangPan read vJiangPan;
    property SiKe:TSiKe read vSiKe;
    property SanChuan:TSanChuan read vSanChuan;
    property KongWang1:TDiZhiShunXu read vKongWang1;
    property KongWang2:TDiZhiShunXu read vKongWang2;
    //以下为课盘所要保存的数据
    property ZhanShiSiZhu:TSiZhu read vZhanShiSiZhu write vZhanShiSiZhu;
    property ShiZhuSiZhu:TSiZhu read vShiZhuSiZhu write vShiZhuSiZhu;
    property ShiZhuXingNian:TZhu read vShiZhuXingNian write vShiZhuXingNian;
    property YueJiang:TDiZhiShunXu read vYueJiang write vYueJiang;
    property SuoZhanShiWu:TStringList read vSuoZhanShiWu write vSuoZhanShiWu;//所占事物
    property LunDuan:TStringList read vLunDuan write vLunDuan;//论断
    property Yan:TStringList read vYan write vYan;//验
    property ZhuShi:TStringList read vZhuShi write vZhuShi;//注释
    procedure Refresh;//刷新
    procedure Refresh_TianPan;//刷新 天盘
    procedure Refresh_JiangPan;//刷新 将盘
    procedure Refresh_SiKe;//刷新 四课
    procedure Refresh_SanChuan;//刷新 三传
  end;

implementation

{ TLiuRen }//六壬课盘

constructor TLiuRen.Create;
begin
  //创建变量实例
  vWuXing:=TWuXing.Create;
  vTianGanLian:=TTianGanLian.Create;
  vDiZhiLian:=TDiZhiLian.Create;
  vDiPan:=TDiPan.Create;
  vTianPan:=TTianPan.Create;
  vJiangPan:=TJiangPan.Create;
  vSiKe:=TSiKe.Create;
  vSanChuan:=TSanChuan.Create;
  vZhanShiSiZhu:=TSiZhu.Create;//占时四柱
  vShiZhuSiZhu:=TSiZhu.Create;//事主四柱
  vShiZhuXingNian:=TZhu.Create;//事主行年
  vSuoZhanShiWu:=TStringList.Create;//所占事物
  vLunDuan:=TStringList.Create;//论断
  vYan:=TStringList.Create;//验
  vZhuShi:=TStringList.Create;//注释
end;

destructor TLiuRen.Destroy;
begin
  vWuXing.Free;
  vTianGanLian.Free;
  vDiZhiLian.Free;
  vDiPan.Free;
  vTianPan.Free;
  vJiangPan.Free;
  vSiKe.Free;
  vSanChuan.Free;
  vZhanShiSiZhu.Free;
  vShiZhuSiZhu.Free;
  vShiZhuXingNian.Free;
  vSuoZhanShiWu.Free;
  vLunDuan.Free;
  vYan.Free;
  vZhuShi.Free;
  inherited;
end;

procedure TLiuRen.Refresh;//课盘刷新
begin
  Refresh_TianPan;//刷新 天盘
  Refresh_JiangPan;//刷新 将盘
  Refresh_SiKe;//刷新 四课
  Refresh_SanChuan;//刷新 三传
end;

procedure TLiuRen.Refresh_TianPan;
begin
  vTianPan.ZiDong(vYueJiang,ZhanShiSiZhu.ShiZhu.Zhi);
end;

procedure TLiuRen.Refresh_JiangPan;
var
  YinGui,Direct:Integer;
  dzI,GuiRenDiZhi:TDiZhiShunXu;
  tjI:TTianJiangShunXu;
begin

  YinGui:=1;//假设为阴贵

  if (ZhanShiSiZhu.ShiZhu.Zhi>dzYin) and (ZhanShiSiZhu.ShiZhu.Zhi<dzYou) then YinGui:=0;// 卯<=时辰<酉,阳贵

  GuiRenDiZhi:=RiGanGuiRen[Integer(ZhanShiSiZhu.RiZhu.Gan)*2-1+YinGui];//贵人所在地支名称

  for dzI := dzZi to dzHai do //贵人所在确切的天盘单元
  begin
    if vTianPan.Items[dzI] = GuiRenDiZhi then Break;
  end;

  vJiangPan.Finger := dzI;
  if (dzI > dzMao) and (dzI < dzXu) then Direct := -1 else Direct := 1;//顺布还是逆布?

  for tjI := tjGuiRen to tjTianHou do //重新赋值
  begin
    vJiangPan.CurrItem := tjI;
    vJiangPan.Step(Direct);
  end;

end;

procedure TLiuRen.Refresh_SiKe;
begin
  With vSiKe do
  begin
    //日课1
    RiKe1.XiaShen:=vZhanShiSiZhu.RiZhu.Gan;
    RiKe1.ShangShen:=vTianPan.Items[vTianGanLian.Items[RiKe1.XiaShen].DiGong];
    RiKe1.Jiang:=vJiangPan.Items[vTianGanLian.Items[RiKe1.XiaShen].DiGong];

    //日课2
    RiKe2.XiaShen:=RiKe1.ShangShen;
    RiKe2.ShangShen:=vTianPan.Items[RiKe2.XiaShen];
    RiKe2.Jiang:=vJiangPan.Items[RiKe1.ShangShen];

    //辰课1
    ChenKe1.XiaShen:=vZhanShiSiZhu.RiZhu.Zhi;
    ChenKe1.ShangShen:=vTianPan.Items[ChenKe1.XiaShen];
    ChenKe1.Jiang:=vJiangPan.Items[vZhanShiSiZhu.RiZhu.Zhi];

    //辰课2
    ChenKe2.XiaShen:=ChenKe1.ShangShen;
    ChenKe2.ShangShen:=vTianPan.Items[ChenKe2.XiaShen];
    ChenKe2.Jiang:=vJiangPan.Items[ChenKe1.ShangShen];
  end;
end;

procedure TLiuRen.Refresh_SanChuan;//三传,重点和难点
var
  SAK:TSiAnKe;//四暗课
  KL:TWuXingGuanXi;//课类,贼或克
  K,Z:Integer;//贼克关系数量
  MaxV:array[1..4] of Integer;//设害计数
  I,II,P:Integer;
  Processed:Boolean;//能否定三传?
  dzI:TDiZhiShunXu;
  RGWX:TWuXingShunXu;//日干所属五行
  
  label ZhaoDunGan;//找遁干

  procedure ZhongMoChuan;//经典中、末传
  begin
    vSanChuan.ZhongChuan.DiZhi:=vTianPan.Items[vSanChuan.ChuChuan.DiZhi];
    vSanChuan.MoChuan.DiZhi:=vTianPan.Items[vSanChuan.ZhongChuan.DiZhi];
  end;//procedure

  procedure GanZhiFaYong;//干支发用
  begin
    if vTianGanLian.Items[vSiKe.RiKe1.XiaShen].YinYang=yyYang then
      vSanChuan.ChuChuan.DiZhi:=SAK[1].Shen//阳日,干上神发用
    else
      vSanChuan.ChuChuan.DiZhi:=SAK[3].Shen;//阴日,支上神发用
    ZhongMoChuan;//经典中、末传
  end;//procedure

  procedure GanShangShenLiangChuan;//干上神两传
  begin
    vSanChuan.ZhongChuan.DiZhi:=SAK[1].Shen;//日干上神为中传
    vSanChuan.MoChuan.DiZhi:=SAK[1].Shen;//日干上神为末传
  end;

  procedure KeZeiDiYi;//克贼第一
  var
    I:Integer;
  begin;
    if Z=1 then KL:=Zei else KL:=Ke;;//有贼,为始入课 否则为元首克//if 始入课  and K<>0 then is 重审课
    for I:=1 to 4 do if (SAK[I].GuanXi=KL) then Break;//确定发用课
    vSanChuan.ChuChuan.DiZhi:=SAK[I].Shen;
    ZhongMoChuan;//经典中、末传
  end;//procedure

  procedure BiYongDiEr;//比用第二
  var
    I:Integer;
  begin
    //判断四课上神与日干相比否
    SAK[1].Bi:=(vDiZhiLian.Items[vSiKe.RiKe2.ShangShen].YinYang=vTianGanLian.Items[vZhanShiSiZhu.RiZhu.Gan].YinYang);
    SAK[2].Bi:=(vDiZhiLian.Items[vSiKe.RiKe2.ShangShen].YinYang=vTianGanLian.Items[vZhanShiSiZhu.RiZhu.Gan].YinYang);
    SAK[3].Bi:=(vDiZhiLian.Items[vSiKe.ChenKe1.ShangShen].YinYang=vTianGanLian.Items[vZhanShiSiZhu.RiZhu.Gan].YinYang);
    SAK[4].Bi:=(vDiZhiLian.Items[vSiKe.ChenKe2.ShangShen].YinYang=vTianGanLian.Items[vZhanShiSiZhu.RiZhu.Gan].YinYang);

    P:=0;//相比的课数
    if Z>1 then KL:=Zei else KL:=Ke;//贼或克
    for I:=1 to 4 do if (SAK[I].GuanXi=KL) and SAK[I].Bi then Inc(P);//增加匹配计数
    if P<>1 then//俱比俱不比 为涉害第三
      Exit
    else//只有一课匹配,找它出来
    begin
      for I:=1 to 4 do if (SAK[I].GuanXi=KL) and SAK[I].Bi then Break;
      vSanChuan.ChuChuan.DiZhi:=SAK[I].Shen;
      ZhongMoChuan;//经典中、末传
      Processed:=True;
    end;
  end;//procedure

  procedure SheHaiDiSan;//涉害第三
  var
    I,ZDZ:Integer;
    dzI:TDiZhiShunXu;
  begin
    if Z>1 then
      KL:=Zei
    else
      KL:=Ke;//处理的类型,贼或克

    for I:=1 to 4 do//判断哪几课要处理
    begin
      SAK[I].SheHai:=0;//初始计数
      if (SAK[I].GuanXi=KL) then//这是要处理的课
      begin
        for dzI:=dzZi to dzHai do//定位课神在天盘上的宫位
          if vTianPan.Items[dzI]=SAK[I].Shen then Break;
        vDiPan.Finger:=dzI;
        //统计课神的涉害次数
        while vDiPan.Finger<>SAK[I].Shen do//末到本家
        begin
          if WuXingGuanXi(DiZhiWuXing(SAK[I].Shen),DiZhiWuXing(vDiPan.Finger))=KL then
            Inc(SAK[I].SheHai);
          vDiPan.StepNext;
        end;//while
      end;//if (SAK[I].GuanXi=KL)
    end;//for I:=1 to 4 do//判断哪几课要处理

    for I:=1 to 4 do MaxV[I]:=SAK[I].SheHai;//涉害数组

    ZDZ:=MaxIntValue(MaxV);//涉害的最大值

    P:=0;
    for I:=1 to 4 do//哪几个涉害的值最大?
      if SAK[I].SheHai=ZDZ then Inc(P);

    if P=1 then//还好,只有一个老大
    begin
      for I:=1 to 4 do
      begin
        if SAK[I].SheHai=ZDZ then vSanChuan.ChuChuan.DiZhi:=SAK[I].Shen;
        ZhongMoChuan;//经典中、末传
      end;
    end
    else//麻烦了,不止一个老大,要看孟、仲、季
    begin
      P:=0;
      for I:=1 to 4 do//准备孟神
      begin
        if (SAK[I].SheHai=ZDZ) and (DiZhiHuoLi(SAK[I].Shen)=hlMeng) then
        begin
         SAK[I].Zhun:=True;
         Inc(P);
        end
        else
          SAK[I].Zhun:=False;//不准备
      end;

      if P=1 then //只有一个孟神,见机课
      begin
        for I:=1 to 4 do//找出来定三传
        begin
          if SAK[I].Zhun then
          begin//定三传
            vSanChuan.ChuChuan.DiZhi:=SAK[I].Shen;
            ZhongMoChuan;//经典中、末传
            Exit;
          end;
        end;
      end;

      if P>1 then//孟神太多,另外发用
      begin
        GanZhiFaYong;//干支发用
        Exit;
      end;

      //没有落在孟神上,找仲神
      P:=0;
      for I:=1 to 4 do//准备仲神
      begin
        if (SAK[I].SheHai=II) and (DiZhiHuoLi(SAK[I].Shen)=hlZhong) then
        begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -