奇门排盘.net实现代码(C#)<原创>

// ******************************************************************

// 文件名: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、張誌春老師也在《神奇之門》

转载于:https://my.oschina.net/u/915439/blog/150303

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值