C#奇门遁甲

    protected void Page_Load(object sender, EventArgs e)
    {
        DateTime d = DateTime.Now;

        List<LiuShiJiaZi> jiaziList = initJiaziList();
        List<Gong> gongList = initGongList();
        string dateStr = d.ToLocalTime().ToString();
        string bz = getBz(dateStr);
        string day = bz.Split(' ')[2];
        string s = dateStr.Split(' ')[0];
        s = s.Replace("/", "-");
        //排地盘干,戊放在局数宫位,阳遁顺排,阴遁逆排
        string yinyangdun = getDun(s);
        int ju = getJuNum(s, day, jiaziList);
        dpg(yinyangdun,ju,gongList);
        //排天盘干,时柱的旬首放在时干上。
        string hour = bz.Split(' ')[3];
        LiuShiJiaZi shizhu = jiaziList.Where(t => t.Name.Equals(hour)).First();
        string ft = shizhu.XunShouCangGan;
        string hg = shizhu.Name.Substring(0, 1);
        tpg(ft, hg, gongList);
        pshen(ft, yinyangdun, gongList);
        pdoor(shizhu,yinyangdun,gongList);
        gongList.Sort((a, b) => a.sort.CompareTo(b.sort));
        this.Repeater1.DataSource = gongList;
        this.Repeater1.DataBind();
        Response.Write(yinyangdun + "遁" + ju + "局<br>");
        Response.Write("时柱旬首" + shizhu.XunShou + " " + shizhu.XunShouCangGan + "<br>");
        Response.Write(bz);
    }
    //排八门
    private void pdoor(LiuShiJiaZi shizhu, string yinyangdun, List<Gong> gongList)
    {
        string xs = shizhu.XunShou;
        string ft = shizhu.XunShouCangGan;
        Gong g = gongList.Where(t => t.dpg.Equals(ft) || t.dpg.Contains(ft)).First();
        string zhishidoor = g.door;
        int a = Array.IndexOf(date, xs);
        int b = Array.IndexOf(date, shizhu.Name);
        int c = b - a;
        if (c>9)
        {
            c %= 9;
        }
        //确定指使门落宫
        if (yinyangdun.Equals("阳"))
        {
            int gid = g.id;
            gid += c;
            if (gid>9)
            {
                gid %= 9;
            }
            if (gid==5)
            {
                gongList.Where(t => t.id == 2).First().door = zhishidoor;
            }

            else
            {
                gongList.Where(t => t.id == gid).First().door = zhishidoor;
            }
            gongList.Where(t => t.id == 5).First().door = "";
        }
        else
        {
            int gid = g.id;
            gid -= c;
            if (gid < 0)
            {
                gid += 9;
            }
            if (gid == 5)
            {
                gongList.Where(t => t.id == 2).First().door = zhishidoor;
            }
            else
            {
                gongList.Where(t => t.id == gid).First().door = zhishidoor;
            }
            gongList.Where(t => t.id == 5).First().door = "";
        }
        int doorIndex = Array.IndexOf(door,zhishidoor);
        int doorgIndex = gongList.Where(t => t.door.Equals(zhishidoor)).First().id;
        for (int i = 0; i < 9; i++)
        {
            int doorIndexa = i + doorIndex;
            if (doorIndexa>=8)
            {
                doorIndexa %= 8;
            }
            int doorgIndexa = i + doorgIndex;
            if (doorgIndexa>=8)
            {
                doorgIndexa %= 8;
            }

            gongList.Where(t => t.id == shungong[doorgIndexa]).First().door = door[doorIndexa];
        }
    }

    //排八神
    private void pshen(string ft, string yinyangdun, List<Gong> gongList)
    {
        Gong g = gongList.Where(t => t.tpg.Equals(ft) || t.tpg.Contains(ft)).First();
        g.shen = "值符";
        int ar = Array.IndexOf(shungong, g.id);
        for (int i = 0; i < shen.Length; i++)
        {
            if (yinyangdun.Equals("阳"))
            {
                gongList.Where(t => t.id == shungong[ar + i >= shungong.Length ? (ar + i) % shungong.Length : (ar + i)]).First().shen = shen[i];
            }
            else
            {
                gongList.Where(t => t.id == nigong[ar + i >= nigong.Length ? (ar + i) % nigong.Length : (ar + i)]).First().shen = shen[i];
            }
        }
    }

    //排天盘干和九星
    private void tpg(string ft, string hg, List<Gong> gongList)
    {
        Gong g = null;
        if (hg.Equals("甲"))
        {
            g = gongList.Where(t => t.dpg.Equals(ft)||t.dpg.Contains(ft)).First();
        }
        else
        {
            g = gongList.Where(t => t.dpg.Equals(hg)).First();
        }
        g.tpg = ft;
        int dpGid = g.id;
        Gong g1 = gongList.Where(t => t.dpg.Equals(ft)||t.dpg.Contains(ft)).First();
        int tpGid = g1.id;
        int didIndex = Array.IndexOf(shungong, dpGid);
        int tidIndex = Array.IndexOf(shungong, tpGid);
        int gongNum = didIndex - tidIndex;
        if (gongNum < 0)
        {
            gongNum += 8;
        }
        for (int i = 0; i < shungong.Length; i++)
        {
            //找地盘干所落宫位。
            Gong dpgGong = gongList.Where(t => t.id == shungong[i]).First();
            int temp = i - gongNum;
            if (temp < 0)
            {
                temp += 8;
            }
            for (int j = 0; j < gongList.Count; j++)
            {

                if (gongList[j].id == dpgGong.id)
                {
                    gongList[j].tpg = gongList.Where(t => t.id == shungong[temp]).First().dpg;
                    gongList[j].star = start[temp];
                }
            }
        }
        for (int i = 0; i < gongList.Count; i++)
        {
            if (gongList[i].id==5)
            {
                gongList[i].tpg = "";
            }
        }
    }

    private void dpg(string yinyangdun, int ju, List<Gong> gongList)
    {
        if (yinyangdun.Equals("阳"))
        {
            int i=0;
            foreach (var item in gongList)
            {
                Gong g = gongList.Where(t => t.id == ju).First();
                g.dpg = sqly[i];
                ju++;
                i++;
                if (ju>9)
                {
                    ju = ju % 9;
                }
            }
        }
        else
        {
            int i = 0;
            foreach (var item in gongList)
            {
                Gong g = gongList.Where(t => t.id == ju).First();
                g.dpg = sqly[i];
                ju--;
                i++;
                if (ju < 1)
                {
                    ju = ju + 9;
                }
            }
        }
        string g5dpg = gongList.Where(t => t.id == 5).First().dpg;
        for (int i = 0; i < gongList.Count; i++)
        {
            if (gongList[i].id==2)
            {
                gongList[i].dpg += g5dpg;
            }
            if (gongList[i].id==5)
            {
                gongList[i].dpg = "";
            }
        }
    }

    private List<Gong> initGongList()
    {
        List<Gong> list = new List<Gong>();
        for (int i = 0; i < 9; i++)
        {
            Gong g = new Gong();
            g.id = (i + 1);
            list.Add(g);
        }
        int a = 0;
        foreach (var item in shungong)
        {
            Gong g = list.Where(t => t.id == item).ToList()[0];
            g.door = door[a];
            g.star = start[a];
            a++;
        }
        list[4].star = start[start.Length - 1];

        foreach (var item in list)
        {
            int gIndex = Array.IndexOf(gongIndex, item.id);
            item.sort = gIndex;
        }
        for (int i = 0; i < nigong.Length; i++)
        {
            list.Where(t => t.id == nigong[i]).First().shan = shan[i];
        }
        return list;
    }
    private int getJuNum(string s, string day,List<LiuShiJiaZi> jiaziList)
    {
        List<dateTimeForJq> list = getJieQiList(s);
        list = list.Where(t => Math.Abs(t.diff) <= 15 && t.diff>=0).ToList();
        if (list.Count==1)
        {
            string jieqi = list[0].jieqi;
            Response.Write(jieqi + "后" + list[0].diff + "天<br>");
            string yuan = jiaziList.Where(t => t.Name.Equals(day)).First().Yuan;
            if (yuan.Equals("上元"))
            {
                return jieQiList.Where(t => t.Name.Equals(jieqi)).First().ShangYuan;
            }
            if (yuan.Equals("中元"))
            {
                return jieQiList.Where(t => t.Name.Equals(jieqi)).First().ZhongYuan;
            }
            if (yuan.Equals("下元"))
            {
                return jieQiList.Where(t => t.Name.Equals(jieqi)).First().XiaYuan;
            }
        }
        return 0;
    }

    private string getDun(string s)
    {
        string yinyangdun = "";
        Dictionary<int, int> qjInt = new Dictionary<int, int>();
        int a1 = diff(s);
        for (int i = 0; i < 2; i++)
        {
            int a = getJq(int.Parse(s.Split('-')[0]), i * 12 + 11);
            int a2 = a1 - a;
            qjInt.Add(a, a2);
        }
        List<dateTimeForJq> list = new List<dateTimeForJq>();
        for (int i = 0; i < qjInt.Count; i++)
        {
            dateTimeForJq dateJq = new dateTimeForJq();
            dateJq.day = diffDay(qjInt.ToList()[i].Key);
            dateJq.jieqi = jieQiList[i * 12 + 11].Name;
            dateJq.jieqiNum = i * 12 + 11;
            dateJq.diff = qjInt.ToList()[i].Value;
            list.Add(dateJq);
        }
        if (list[0].diff < 0)
        {
            yinyangdun = "阳";
        }
        else if (list[1].diff < 0)
        {
            yinyangdun = "阴";
        }
        else
        {
            yinyangdun = "阳";
        }
        return yinyangdun;
    }

    private string getBz(string dateStr)
    {
        string s = dateStr.Split(' ')[0];
        s = s.Replace("/", "-");
        string time1 = dateStr.Split(' ')[1];
        string ygz = "";
        string mz = getMonthz(s);
        if (mz.Equals("丑"))
        {
            ygz = getYearJz(int.Parse(s.Split('-')[0]) - 1);
        }
        else
        {
            ygz = getYearJz(int.Parse(s.Split('-')[0]));
        }
        string mgz = getMonthg(ygz, mz);
        string dgz = getDaygz(s);
        string hz = getHourdz(time1.Split(':')[0]);
        int h = int.Parse(time1.Split(':')[0]);
        if (h == 23)
        {
            dgz = getDaygz(s);
            int dgzIndex = Array.IndexOf(dz, dgz);
            if (dgzIndex == 59)
            {
                dgz = dz[0];
            }
            else
            {
                dgzIndex++;
                dgz = dz[dgzIndex];
            }
        }
        string hgz = getHourgz(hz, dgz);

        return ygz + " " + mgz + " " + dgz + " " + hgz;
    }

    private List<LiuShiJiaZi> initJiaziList()
    {
        List<LiuShiJiaZi> jiaziList = new List<LiuShiJiaZi>();
        string xs = "";
        for (int i = 0; i < date.Length; i++)
        {
            int yuanIndex = i / 5;
            LiuShiJiaZi jiazi = new LiuShiJiaZi();
            jiazi.Name = date[i];
            if (i % 10 == 0)
            {
                xs = date[i];
            }
            jiazi.XunShou = xs;
            if (yuanIndex == 0 || yuanIndex == 3 || yuanIndex == 6 || yuanIndex == 9)
            {
                jiazi.Yuan = "上元";
            }
            else if (yuanIndex == 1 || yuanIndex == 4 || yuanIndex == 7 || yuanIndex == 10)
            {
                jiazi.Yuan = "中元";
            }
            else
            {
                jiazi.Yuan = "下元";
            }
            jiaziList.Add(jiazi);
        }
        for (int i = 0; i < jiaziList.Count; i++)
        {
            if (jiaziList[i].XunShou.Equals("甲子"))
            {
                jiaziList[i].XunShouCangGan = "戊";
                jiaziList[i].KongWang = "戌亥";
            }
            if (jiaziList[i].XunShou.Equals("甲戌"))
            {
                jiaziList[i].XunShouCangGan = "己";
                jiaziList[i].KongWang = "申酉";
            }
            if (jiaziList[i].XunShou.Equals("甲申"))
            {
                jiaziList[i].XunShouCangGan = "庚";
                jiaziList[i].KongWang = "午未";
            }
            if (jiaziList[i].XunShou.Equals("甲午"))
            {
                jiaziList[i].XunShouCangGan = "辛";
                jiaziList[i].KongWang = "辰巳";
            }
            if (jiaziList[i].XunShou.Equals("甲辰"))
            {
                jiaziList[i].XunShouCangGan = "壬";
                jiaziList[i].KongWang = "寅卯";
            }
            if (jiaziList[i].XunShou.Equals("甲寅"))
            {
                jiaziList[i].XunShouCangGan = "癸";
                jiaziList[i].KongWang = "子丑";
            }
        }
        return jiaziList;
    }
    //节气间隔计算类
    private class dateTimeForJq 
    {
        public string day { get; set; }
        public string jieqi { get; set; }
        public int jieqiNum { get; set; }
        public int diff { get; set; }
    }
    //五虎遁、五鼠遁
    private class dun 
    {
        public string gan { get; set; }
        public string month { get; set; }
        public string hour { get; set; }
        public dun(string _gan,string _month,string _hour) 
        {
            gan = _gan;
            month = _month;
            hour = _hour;
        }
    }
    //五虎遁、五鼠遁
    List<dun> dunlist = new List<dun>{
        new dun("甲","丙寅","甲子"),
        new dun("己","丙寅","甲子"),
        new dun("乙","戊寅","丙子"),
        new dun("庚","戊寅","丙子"),
        new dun("丙","庚寅","戊子"),
        new dun("辛","庚寅","戊子"),
        new dun("丁","壬寅","庚子"),
        new dun("壬","壬寅","庚子"),
        new dun("戊","甲寅","壬子"),
        new dun("癸","甲寅","壬子")};

    //二十四节气
    private class JieQi 
    {
        public string Name { get; set; }
        public int ShangYuan { get; set; }
        public int ZhongYuan { get; set; }
        public int XiaYuan { get; set; }

        public JieQi(string _name,int _shangyan,int _zhongyuan,int _xiayuan)
        {
            Name = _name;
            ShangYuan = _shangyan;
            ZhongYuan = _zhongyuan;
            XiaYuan = _xiayuan;
        }
    }
    List<JieQi> jieQiList = new List<JieQi>
    {
        new JieQi("小寒",2,8,5),
        new JieQi("大寒",3,6,9),
        new JieQi("立春",8,5,2),
        new JieQi("雨水",9,6,3),
        new JieQi("惊蛰",1,7,4),
        new JieQi("春分",3,6,9),
        new JieQi("清明",4,1,7),
        new JieQi("谷雨",5,2,8),
        new JieQi("立夏",4,1,7),
        new JieQi("小满",5,2,8),
        new JieQi("芒种",6,3,9),
        new JieQi("夏至",9,3,6),
        new JieQi("小暑",8,2,5),
        new JieQi("大暑",7,1,4),
        new JieQi("立秋",2,5,8),
        new JieQi("处暑",1,4,7),
        new JieQi("白露",9,3,6),
        new JieQi("秋分",7,1,4),
        new JieQi("寒露",6,9,3),
        new JieQi("霜降",5,8,2),
        new JieQi("立冬",6,9,3),
        new JieQi("小雪",5,8,2),
        new JieQi("大雪",4,7,1),
        new JieQi("冬至",1,7,4)
    };
    public class LiuShiJiaZi
    {
        public string Name { get; set; }
        public string KongWang { get; set; }
        public string XunShou { get; set; }
        public string XunShouCangGan { get; set; }
        public string Yuan { get; set; }
        public string ToString() {
            return Name + "--" + Yuan + "--" + XunShou + "--" + XunShouCangGan + "--" + KongWang;
        }

    }
    private class Gong 
    {
        public int id { get; set; }
        public int wx { get; set; }
        public string shen { get; set; }
        public string door { get; set; }
        public string star { get; set; }
        public string dpg { get; set; }
        public string tpg { get; set; }
        public int sort { get; set; }
        public string shan { get; set; }
    }
    //月地支排列
    private string[] dz = { "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥", "子" };
    //时地支排列
    private string[] dzh = { "亥", "子" ,"丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌"};
    //三奇六仪
    private string[] sqly = { "戊", "己", "庚", "辛", "壬", "癸", "丁", "丙", "乙"};
    private string[] door = { "休", "生", "伤", "杜", "景", "死", "惊", "开" };
    private string[] start = { "蓬", "任", "冲", "辅", "英", "芮", "柱", "心", "禽" };
    private string[] shen = { "值符", "腾蛇", "太阴", "六合", "白虎", "玄武", "九地", "九天" };
    private string[] shan = { "壬子癸", "丑艮寅", "甲卯乙", "辰巽巳", "丙午丁", "未坤申", "庚酉辛", "戌乾亥" };
    private int[] shungong = { 1, 8, 3, 4, 9, 2, 7, 6 };
    private int[] nigong = { 1, 6, 7, 2, 9, 4, 3, 8 };
    private int[] gongIndex = { 4, 9, 2, 3, 5, 7, 8, 1, 6 };
    //六十甲子表
    public static string[] date = { "甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉", 
                                    "甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛巳", "壬午", "癸未", 
                                    "甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳", 
                                    "甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸卯", 
                                    "甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑", 
                                    "甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥" };
    //得到年干支
    private string getYearJz(int year) {
        int res = (year - 3) % 60;
        res=(res!=0)?(res-1):59;
        return date[res];
    }
    //月支
    private string getMonthz(string s)
    {
        string yz = "";
        string yg = "";
        Dictionary<int, int> qjInt = new Dictionary<int, int>();
        int a1 = diff(s);
        List<dateTimeForJq> list = getJieQiList(s);
        list = list.Where(t => Math.Abs(t.diff) <= 15).ToList();
        dateTimeForJq jq1 = list[0];
        //算出当前日期所在月份
        int m = 0;
        if (jq1.jieqiNum % 2 == 0 && jq1.diff >= 0)
        {
            m = jq1.jieqiNum;
        }
        else
        {
            if (list[1].diff == 0)
            {
                m = list[1].jieqiNum;
            }
            else
            {
                m = jq1.jieqiNum - 1;
            }

        }
        if (m == -1)
        {
            yz = "丑";
        }
        else
        {
            m = m % 24 == 0 ? 12 : (m / 2);
            yz = dz[m % 12];
        }
        return yz;
    }

    private List<dateTimeForJq> getJieQiList(string s)
    {
        List<dateTimeForJq> list = new List<dateTimeForJq>();
        Dictionary<int, int> qjInt = new Dictionary<int, int>();
        int a1 = diff(s);
        //算出一年的24节气
        for (int i = 0; i < 24; i++)
        {
            int a = getJq(int.Parse(s.Split('-')[0]) - 1, i);
            int a2 = a1 - a;
            qjInt.Add(a, a2);
        }
        for (int i = 0; i < 24; i++)
        {
            int a = getJq(int.Parse(s.Split('-')[0]), i);
            int a2 = a1 - a;
            qjInt.Add(a, a2);
        }
        for (int i = 0; i < 24; i++)
        {
            int a = getJq(int.Parse(s.Split('-')[0]) + 1, i);
            int a2 = a1 - a;
            qjInt.Add(a, a2);
        }

        for (int i = 0; i < qjInt.Count; i++)
        {
            dateTimeForJq dateJq = new dateTimeForJq();
            dateJq.day = diffDay(qjInt.ToList()[i].Key);
            dateJq.jieqi = jieQiList[i % 24].Name;
            dateJq.jieqiNum = i % 24;
            dateJq.diff = qjInt.ToList()[i].Value;
            list.Add(dateJq);
        }
        return list;
    }
    //月干
    private string getMonthg(string ygz, string mz)
    {
        string yg = ygz.Substring(0, 1);
        string ymg = dunlist.Where(t => t.gan.Equals(yg)).ToList()[0].month;
        int bjs = Array.IndexOf(dz, mz);
        bjs = bjs - 1;
        if (bjs < 0)
        {
            bjs = bjs + 12;
        }
        int gzindex = Array.IndexOf(date, ymg);
        gzindex = (gzindex + bjs) % 60;
        gzindex = (gzindex != 0) ? (gzindex) : 59;
        return date[gzindex];
    }
    //日干支
    private string getDaygz(string s)
    {
        int a = diff(s);
        int b = Array.IndexOf(date, "甲戌");
        int c = (a) % 60;
        c += b;
        c %= 60;
        c = (c != 0) ? (c - 1) : 59;
        return date[c];

    }
    //时支
    private string getHourdz(string p)
    {
        int a = int.Parse(p);
        int shang = a / 2;
        int yu = a % 2;
        if (yu == 0)
        {
            shang = shang - 1;
            shang %= 12;
            return dz[shang];
        }
        else
        {
            return dz[shang];
        }
    }
    //时干支
    private string getHourgz(string hz, string dgz)
    {
        string dg = dgz.Substring(0, 1);
        string zhg = dunlist.Where(t => t.gan.Equals(dg)).ToList()[0].hour;
        int bjs = Array.IndexOf(dzh, hz);
        int cha = bjs-1;
        if (cha < 0)
        {
            cha = cha + 12;
        }
        int gzindex = Array.IndexOf(date, zhg);
        gzindex = (gzindex + cha) % 60;
        gzindex = (gzindex != 0) ? (gzindex) : 59;
        return date[gzindex];
    }
    //计算节气
    private int getJq(int year, int seq)
    {
        double l = 365.242 * (year - 1900) + 6.2 + 15.22 * seq - 1.9 * Math.Sin(0.262 * seq);
        int a = (int)Math.Floor(l);
        return a;
    }
    private int diff(string str1)
    {
        int year1 = int.Parse(str1.Split('-')[0]);
        int month1 = int.Parse(str1.Split('-')[1]);
        int day1 = int.Parse(str1.Split('-')[2]);
        DateTime date1 = new DateTime(year1, month1, day1);
        DateTime date2 = new DateTime(1899, 12, 31);
        TimeSpan diff = date1.Subtract(date2);
        return (int)diff.TotalDays;
    }
    private string diffDay(int a) 
    {
        DateTime d = new DateTime(1899, 12, 31);
        d = d.AddDays(a);
        return d.ToShortDateString();
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值