奇門排盤.net實現代碼(C#)<原創>

// ****************************************************************** css

// 文件名: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 微信

參考資料:
一、奇門遁甲排盤心法祕訣,從此排盤只用心!(完整版)--新安釣叟
二、高俊波奇門排盤
三、張誌春老師也在《神奇之門》
app

相關文章
相關標籤/搜索