// ******************************************************************
// 文件名:QiMenData.cs// Copyright (c)2013 洪铟八字 http://hybz.org
// 作者: hybzorg
// 创建日期: 2013-8-1
// 描述: 奇门盘实体类
// ******************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FateJudge.Core.Entity
{
public class QiMenPan
{
public DateTime time//时间
{
set;
get;
}
public string bazi//八字
{
get;
set;
}
public int jieqihao//节气号
{
set;
get;
}
public string jieqi//节气名
{
set;
get;
}
public string jiaojie//交节
{
set;
get;
}
//时辰
public string shichen
{
get;
set;
}
//时辰旬首
public string shichenxunshou
{
get;
set;
}
public int yuan//局元
{
get;
set;
}
public string yuanming//元名
{
get;
set;
}
public string juyinyan//局阴阳
{
get;
set;
}
public int jushu//局数
{
get;
set;
}
public string zhifu//值符
{
set;
get;
}
public int zhifugong//值符宫
{
get;
set;
}
public string zhishi//值使
{
set;
get;
}
public int zhishigong//值使宫
{
get;
set;
}
public string shikong//时空
{
get;
set;
}
public string rikong//日空
{
get;
set;
}
}
}
// ******************************************************************
// 文件名:QiMenData.cs
// Copyright (c)2013 洪铟八字 http://hybz.org
// 作者: hybzorg
// 创建日期: 2013-8-1
// 描述: 奇门数据定义
// ******************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FateJudge.Core.QiMen
{
public class QiMenData
{
public static int[] ShunZhuan = new int[] { 1, 8, 3, 4, 9, 2, 7, 6 };
public static int[] NiZhuan = new int[] { 1,6,7,2,9,4,3,8};
public static String[] jushu=new string[]{
"174","285","396",
"852","963","174",
"396","417","528",
"417","528","639",
"936","825","714",
"258","147","936",
"714","693","582",
"693","582","471"};
public static String qiyiyuanwei="戊己庚辛壬癸丁丙乙";//三奇六仪原位
public static String[] renpanxingyuanwei = new string[] { "休", "死", "伤", "杜", "死", "开", "惊", "生", "景" };//(八)九门原位
public static String[] tianpanxingyuanwei = new string[] { "蓬","芮","冲","辅","禽","心","柱","任","英"};//9星原位
public static String[] shenpanyuanwei = new string[] { "符","蛇","阴","六","白","玄","地","天" };//8神原位
public static String[] renpanxingzhuanxu = new string[] { "休", "生", "伤", "杜", "景", "死", "惊", "开" };//8门转序
public static String[] tianpanxingzhuanxu = new string[] { "蓬", "任", "冲", "辅", "英", "芮(禽)", "柱", "心" };//9星转序
public static String[] shenpanzhuanxu = new string[] { "符", "蛇", "阴", "六", "白", "玄", "地", "天" };//8神转序
}
}
// 文件名:QiMenPaiPan.cs
// Copyright (c)2013 洪铟八字 http://hybz.org
// 作者: hybzorg
// 创建日期: 2013-8-1
// 描述: 奇门排盘
// ******************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FateJudge.Core.Entity;
namespace FateJudge.Core.QiMen
{
public class QiMenPaiPan : Singleton<QiMenPaiPan>
{
public QiMenPan getQiMenPan(DateTime time)
{
QiMenPan qimenpan = new QiMenPan();
qimenpan.time = time;//排盘时间
string bazi = JieQiYueLing.Instance().getBaZi(time);
qimenpan.bazi = bazi;//八字
qimenpan.shichen = bazi.Substring(6, 2);
string xunshou = QiMenData.qiyiyuanwei[getXunXuShu(qimenpan.shichen)].ToString();
qimenpan.shichenxunshou = xunshou;
string rikong = getKongWang(bazi[4].ToString(), bazi[5].ToString());
qimenpan.rikong = rikong;
string shikong = getKongWang(bazi[6].ToString(), bazi[7].ToString());
qimenpan.shikong = shikong;
int jieqihao = (JieQiYueLing.Instance().getJieqiHao(time) + 1) % 24;//第几个节气从0开始,小寒和夏至匹配
qimenpan.jieqihao = jieqihao;
qimenpan.jieqi = JieQiYueLing.Instance().getJieQi(time);
qimenpan.jiaojie = JieQiYueLing.Instance().getJiaoJieRiQi(time);
string yinyan = string.Empty;
if (jieqihao > 10 && jieqihao < 23)
{
yinyan = "阴";//夏至用阴遁
}
else
{
yinyan = "阳";
}
qimenpan.juyinyan = yinyan;
int yuanshu = 0;
int gzc = (12 + CommData.zhi.IndexOf(bazi[5]) - CommData.gan.IndexOf(bazi[4])) % 12;//干支差求旬首
switch (gzc)
{
case 0:
yuanshu = 0;
qimenpan.yuanming = "上元";
break;
case 10:
yuanshu = 2;
qimenpan.yuanming = "下元";
break;
case 8:
yuanshu = 1;
qimenpan.yuanming = "中元";
break;
case 6:
yuanshu = 0;
qimenpan.yuanming = "上元";
break;
case 4:
yuanshu = 2;
qimenpan.yuanming = "下元";
break;
case 2:
yuanshu = 1;
qimenpan.yuanming = "中元";
break;
}
if (CommData.gan.IndexOf(bazi[4]) > 4)//如果天干为己以下的干元数加1
{
yuanshu = (yuanshu + 1) % 3;
}
qimenpan.yuan = yuanshu;//元数
int jushu = 0;
jushu = Convert.ToInt32(QiMenData.jushu[jieqihao][yuanshu].ToString());
qimenpan.jushu = jushu;//局数
int fushixushu = 0;
if (yinyan.Equals("阳"))
{
fushixushu = (jushu + getXunXuShu(bazi.Substring(6, 2)) - 1) % 9;
}
else
{
fushixushu = (9 + jushu - getXunXuShu(bazi.Substring(6, 2)) - 1) % 9;
}
qimenpan.zhifu = QiMenData.tianpanxingyuanwei[fushixushu];//值符
qimenpan.zhishi = QiMenData.renpanxingyuanwei[fushixushu];//值使
int zhifugong = 0;//值符落宫
string gan = getTiangan(bazi);//获取时干
if (yinyan.Equals("阳"))//阳顺阴逆
{
zhifugong = (QiMenData.qiyiyuanwei.IndexOf(gan) + jushu - 1) % 9 + 1;
}
else
{
zhifugong = (9 + jushu - QiMenData.qiyiyuanwei.IndexOf(gan) - 1) % 9 + 1;
}
qimenpan.zhifugong = zhifugong;
int zhishigong = 0;//值使宫
if (yinyan.Equals("阳"))//阳顺阴逆
{
zhishigong = (fushixushu + CommData.gan.IndexOf(bazi[6])) % 9 + 1;
}
else
{
int gn = CommData.gan.IndexOf(bazi[6]);
if (gn.Equals(0))//甲
{
zhishigong = fushixushu % 9 + 1;
}
else
{
zhishigong = (fushixushu + (9 - gn)) % 9 + 1;
}
}
qimenpan.zhishigong = zhishigong;//值使落宫
return qimenpan;
}
/// <summary>
/// 获取天盘隐干
/// </summary>
/// <param name="jushu"></param>
/// <param name="zhifugong"></param>
/// <param name="zhifu"></param>
/// <param name="ren"></param>
/// <returns></returns>
public string getTianPanYinGan(int jushu, string yinyan, int zhifugong, string zhifu, string tian)
{
string ret = string.Empty;
int n = 0;// (getRenPanGong(yinyan, zhishigong, zhishi, ren) - jushu + 9) % 9;
int yg = getStringArrayIndex(QiMenData.tianpanxingyuanwei, tian) + 1;
if (yinyan.Equals("阳"))//阳盘
{
n = (yg - jushu + 9) % 9;
}
else
{
n = (jushu - yg + 9) % 9;
}
ret = QiMenData.qiyiyuanwei[n].ToString();
return ret;
}
/// <summary>
/// 获取人盘隐干
/// </summary>
/// <param name="jushu"></param>
/// <param name="zhifugong"></param>
/// <param name="zhifu"></param>
/// <param name="ren"></param>
/// <returns></returns>
public string getRenPanYinGan(int jushu, string yinyan, int zhishigong, string zhishi, string ren)
{
string ret = string.Empty;
int n = 0;// (getRenPanGong(yinyan, zhishigong, zhishi, ren) - jushu + 9) % 9;
int yg = getStringArrayIndex(QiMenData.renpanxingzhuanxu, ren) + 1;
if (yinyan.Equals("阳"))//阳盘
{
n = (yg - jushu + 9) % 9;
}
else
{
n = (jushu - yg + 9) % 9;
}
ret = QiMenData.qiyiyuanwei[n].ToString();
//QiMenData.tianpanxingzhuanxu
return ret;
}
/// <summary>
/// 获取人盘对应的原盘宫位
/// </summary>
/// <param name="jushu"></param>
/// <param name="yinyan"></param>
/// <param name="zhishigong"></param>
/// <param name="zhishi"></param>
/// <param name="ren"></param>
/// <returns></returns>
public int getRenPanGong(string yinyan, int zhishigong, string zhishi, string ren)
{
int ret = 0;
int n = getStringArrayIndex(QiMenData.renpanxingzhuanxu, ren);// - getStringArrayIndex(QiMenData.renpanxingzhuanxu, zhishi) + 8) % 8;
int n1 = 0;
n1 = (getIntArrayIndex(QiMenData.ShunZhuan, zhishigong) + n) % 8;
ret = QiMenData.ShunZhuan[n1];
return ret;
}
public int getIntArrayIndex(int[] sa, int n)
{
int ret = 0;
for (int i = 0; i < sa.Length; i++)
{
if (sa[i].Equals(n))
{
ret = i;
break;
}
}
return ret;
}
/// <summary>
/// 获取字符串数组中某字符的索引
/// </summary>
/// <param name="sa"></param>
/// <param name="str"></param>
/// <returns></returns>
public int getStringArrayIndex(string[] sa, string str)
{
int ret = 0;
for (int i = 0; i < sa.Length; i++)
{
if (sa[i].Contains(str))
{
ret = i;
break;
}
}
return ret;
}
/// <summary>
/// 求天干,如果是甲干找六仪
/// </summary>
/// <param name="bazi"></param>
/// <returns></returns>
public string getTiangan(string bazi)
{
string gan;
if (CommData.gan.IndexOf(bazi[6]).Equals(0))//如果是甲干找六仪
{
int gn = 0;
gn = (20 - CommData.zhi.IndexOf(bazi[7])) / 2;
if (gn.Equals(10))
{
gn = 4;
}
gan = CommData.gan[gn].ToString();
}
else
{
gan = bazi[6].ToString();
}
return gan;
}
/// <summary>
/// 获取干支旬序数
/// </summary>
/// <param name="gz"></param>
/// <returns></returns>
public int getXunXuShu(string gz)
{
int ret = 0;
int gzc = (12 + CommData.zhi.IndexOf(gz[1]) - CommData.gan.IndexOf(gz[0])) % 12;//干支差求旬首
if (gzc.Equals(0))
{
gzc = 12;
}
ret = 6 - (gzc / 2);
return ret;
}
/// <summary>
/// 获取指定位置天盘
/// </summary>
/// <param name="yinyan"></param>
/// <param name="zhifu"></param>
/// <param name="zhifugong"></param>
/// <param name="p"></param>
/// <returns></returns>
public string getPostTianPan(string zhifu, int zhifugong, int p)
{
string ret = string.Empty;
int n1 = (getIntArrayIndex(QiMenData.ShunZhuan, p) - getIntArrayIndex(QiMenData.ShunZhuan, zhifugong) + 8) % 8;
int n2 = getStringArrayIndex(QiMenData.tianpanxingzhuanxu, zhifu);
int n3 = (8 + n2 + n1) % 8;
ret = QiMenData.tianpanxingzhuanxu[n3];
return ret;
}
/// <summary>
/// 获取指定位置天盘
/// </summary>
/// <param name="yinyan"></param>
/// <param name="zhifu"></param>
/// <param name="zhishigong"></param>
/// <param name="p"></param>
/// <returns></returns>
public string getPostRenPan(string zhishi, int zhishigong, int p)
{
string ret = string.Empty;
int n1 = 0;
int n2 = 0;
int n3 = 0;
n1 = (getIntArrayIndex(QiMenData.ShunZhuan, p) - getIntArrayIndex(QiMenData.ShunZhuan, zhishigong) + 8) % 8;
n2 = getStringArrayIndex(QiMenData.renpanxingzhuanxu, zhishi);
n3 = (8 + n2 + n1) % 8;
ret = QiMenData.renpanxingzhuanxu[n3];
return ret;
}
/// <summary>
/// 获取指定位置神盘
/// </summary>
/// <param name="yinyan"></param>
/// <param name="zhifugong"></param>
/// <param name="p"></param>
/// <returns></returns>
public string getPostShenPan(string yinyan, int zhifugong, int p)
{
string ret = string.Empty;
int n1 = 0;
if (yinyan.Equals("阳"))
{
n1 = (getIntArrayIndex(QiMenData.ShunZhuan, p) - getIntArrayIndex(QiMenData.ShunZhuan, zhifugong) + 8) % 8;
ret = QiMenData.shenpanzhuanxu[n1];
}
else
{
n1 = (getIntArrayIndex(QiMenData.NiZhuan, p) - getIntArrayIndex(QiMenData.NiZhuan, zhifugong) + 8) % 8;
ret = QiMenData.shenpanzhuanxu[n1];
}
return ret;
}
/// <summary>
/// //获取空亡
/// </summary>
/// <param name="g">干</param>
/// <param name="z">支</param>
/// <returns></returns>
public string getKongWang(string g, string z)
{
string ret = string.Empty;
try
{
int i = CommData.gan.IndexOf(g);
int j = CommData.zhi.IndexOf(z);
if (j < i)
{
j = j + 12;
}
switch (j - i)
{
case 0:
ret = "戌亥";
break;
case 2:
ret = "子丑";
break;
case 4:
ret = "寅卯";
break;
case 6:
ret = "辰巳";
break;
case 8:
ret = "午未";
break;
case 10:
ret = "申酉";
break;
}
}
catch (Exception ex)
{
throw ex;
}
return ret;
}
/// <summary>
/// 获取指定位置地盘
/// </summary>
/// <param name="jushu"></param>
/// <param name="yinyan"></param>
/// <param name="p"></param>
/// <returns></returns>
public string getPostDiPan(int jushu, string yinyan, int p)
{
string ret = string.Empty;
int n = 0;
if (yinyan.Equals("阳"))
{ n = (p - jushu + 9) % 9; }
else
{ n = (jushu - p + 9) % 9; }
ret = QiMenData.qiyiyuanwei[n].ToString();
return ret;
}
/// <summary>
/// 获取排盘
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
public string PaiPan(DateTime time)
{
string ret = string.Empty;
StringBuilder sb = new StringBuilder();
QiMenPan pan = getQiMenPan(time);
int[] post =new int[]{4,9,2,3,5,7,8,1,6};
string shen,ren,tian, di,yingan;
for (int i = 0; i < 9; i++)
{
if (i.Equals(3)||i.Equals(6))
{
sb.Append("</tr><tr>");
}
if (i.Equals(4))
{
di=getPostDiPan(pan.jushu, pan.juyinyan, post[i]);
sb.Append(string.Format("<td class=\"tdline\"><table><tr><td></td></tr><tr><td></td></tr><tr><td>{0}</td></tr></table></td>", di));
}
else
{
shen=getPostShenPan(pan.juyinyan, pan.zhifugong, post[i]);
ren=getPostRenPan(pan.zhishi, pan.zhishigong, post[i]);
tian=getPostTianPan(pan.zhifu, pan.zhifugong, post[i]);
di=getPostDiPan(pan.jushu, pan.juyinyan, post[i]);
yingan = getTianPanYinGan(pan.jushu, pan.juyinyan, pan.zhifugong, pan.zhifu, tian[0].ToString());
sb.Append(string.Format("<td class=\"tdline\"><table><tr><td class=\"tdnoline\">{0}</td></tr><tr><td class=\"tdnoline\">{1} {4}</td></tr><tr><td>{2} {3}</td></tr></table></td>", shen, ren, tian, di, yingan));
}
}
StringBuilder sb1 = new StringBuilder();
string css = "<style type=\"text/css\">.tbline { border-width: 1px; border-spacing: 2px; border-style: outset; border-color: gray; border-collapse: separate; background-color: white;}.tdline { border-width: 1px; border-spacing: 2px; border-style: outset; border-color: gray; border-collapse: separate; background-color: white;}</style>";
sb1.Append("排盘:<a href=\"http://hybz.org\">洪铟八字</a> -http://hybz.org <br>");
sb1.Append(string.Format("时间:{0}<br>",pan.time.ToString("yyyy年MM月dd日HH时dd分")));
sb1.Append(string.Format("干支:{0}<br>",pan.bazi));
sb1.Append(string.Format("日空:{0},时空:{1}<br>",pan.rikong,pan.shikong));
sb1.Append(string.Format("交节:{0}<br>", pan.jiaojie));
sb1.Append(string.Format("{0}:{1},{2}时旬首为{3}<br>",pan.jieqi,pan.yuanming,pan.shichen,pan.shichenxunshou));
sb1.Append(string.Format("{0}遁{1}局,值符{2}落{3}宫,值使{4}门落{5}宫<br>", pan.juyinyan, pan.jushu, pan.zhifu, pan.zhifugong, pan.zhishi, pan.zhishigong));
ret = string.Format("{2}{0}<table class=\"tbline\"><tr>{1}</tr></table>", sb1.ToString(), sb.ToString(),css);
return ret;
}
}
}
此代码为洪铟八字<http://hybz.org>提供,欢迎转载,请注明出处,多作合作。
微信号:hybzorg
参考资料:
1、奇門遁甲排盤心法秘訣,從此排盤只用心!(完整版)--新安釣叟
2、高俊波奇门排盘
3、張誌春老師也在《神奇之門》