📄 liuren.pas
字号:
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 + -