JAVA 版本 《奇门遁甲》在线起盘代码

887 阅读4分钟

1. 什么是奇门遁甲?

奇门遁甲?“奇门遁甲”的含义是什么呢?就是由“奇”,“门”,“遁甲”三个概念组成。“奇”就是乙,丙,丁三奇;“门”就是休,生,伤,杜,景,死,惊,开八门;“遁”是隐藏的意思,“甲”指六甲,即甲子,甲戌,甲申,甲午,甲辰,甲寅,“遁甲”是在十干中最为尊贵,它藏而不现,隐遁于六仪之下。“六仪”就是戊,己,庚,辛,壬,癸。隐遁原则是甲子同六戊,甲戌同六己,甲申同六庚,甲午同六辛,甲辰同六壬,甲寅同六癸。另外还配合蓬,任,冲,辅,英,芮,柱,心,禽九星。奇门遁的占测主要分为天,门,地三盘,象征三才。天盘的九宫有九星,中盘的八宫(中宫寄二宫)布八门,地盘的八宫代表八个方位,静止不动,同时天盘地盘上,每宫都分配着特定的奇(乙,丙,丁)仪(戊,己,庚,辛,壬,癸六仪)。这样,根据具体时日,以六仪,三奇,八门,九星排局,以占测事物关系,性状,动向,迭择吉时吉方,就构成了中国神秘文化中一个特有的门类----奇门遁甲。

2. 奇门遁甲的作用?

奇门遁甲最早用于兵法,现代主要表现为预测领域,包含了生活中的方方面面,

哎呀 太多了 我就不说了(懒)懂得都懂,不懂得自行百度了解,直接上代码吧!!!

确认时间-(当前时间,四柱,节气)

/**
* 了解奇门的朋友 都知道奇门分阴盾阳盾局(过了夏至用阴盾 过了冬至用阳盾)
* new OneyJeiQi("确认该节气用阴盾还是阳盾","节气本身", 上元, 中元, 下元)
*/
package com.qimen.qiju.jieqi;

import java.util.ArrayList;
import java.util.List;


public class Static {

   private static List<OneyJeiQi> list=new ArrayList<OneyJeiQi>();
   
   static {
      //阳盾
      list.add(new OneyJeiQi("阳","冬至", 1, 7, 4));
      list.add(new OneyJeiQi("阳","小寒", 2, 8, 8));
      list.add(new OneyJeiQi("阳","大寒", 3, 9, 6));
      list.add(new OneyJeiQi("阳","立春", 8, 5, 2));
      list.add(new OneyJeiQi("阳","雨水", 9, 6, 3));
      list.add(new OneyJeiQi("阳","惊蛰", 1, 7, 4));
      list.add(new OneyJeiQi("阳","春分", 3, 9, 6));
      list.add(new OneyJeiQi("阳","清明", 4, 1, 7));
      list.add(new OneyJeiQi("阳","谷雨", 5, 2, 8));
      list.add(new OneyJeiQi("阳","立夏", 4, 1, 7));
      list.add(new OneyJeiQi("阳","小满", 5, 2, 8));
      list.add(new OneyJeiQi("阳","芒种", 6, 3, 9));
      
      //阴盾
      list.add(new OneyJeiQi("阴","夏至", 9, 3, 6));
      list.add(new OneyJeiQi("阴","小暑", 8, 2, 5));
      list.add(new OneyJeiQi("阴","大暑", 7, 1, 4));
      list.add(new OneyJeiQi("阴","立秋", 2, 5, 8));
      list.add(new OneyJeiQi("阴","处暑", 1, 4, 7));
      list.add(new OneyJeiQi("阴","白露", 9, 3, 6));
      list.add(new OneyJeiQi("阴","秋分", 7, 1, 4));
      list.add(new OneyJeiQi("阴","寒露", 6, 9, 3));
      list.add(new OneyJeiQi("阴","霜降", 5, 8, 2));
      list.add(new OneyJeiQi("阴","立冬", 6, 9, 3));
      list.add(new OneyJeiQi("阴","小雪", 5, 8, 2));
      list.add(new OneyJeiQi("阴","大雪", 4, 7, 1));
      
   }
   public static OneyJeiQi get(String name) {
      for (int i = 0; i < list.size(); i++) {
         if(name.equals(list.get(i).getName())) {
            return list.get(i);
         }
      }
      return null;
   }
}

根据当前时间获取该用那个节气信息

package com.qimen.qiju.jieqi;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 计算公式:[Y*D+C]-L
 * 
 * @author 
 *
 */
public class SolarTerm {
    /**
     * 节气D值
     */
    private static final double D = 0.2422;
    /**
     * 20世纪的节气C值
     */
    private static final double[] C_20 = { 6.11, 20.84, 4.6295, 19.4599, 6.3826, 21.4155, 5.59, 20.888, 6.318, 21.86,
            6.5, 22.2, 7.928, 23.65, 8.35, 23.95, 8.44, 23.822, 9.098, 24.218, 8.218, 23.08, 7.9, 22.6 };
    /**
     * 21世纪的节气C值
     */
    private static final double[] C_21 = { 5.4055, 20.12, 3.87, 18.73, 5.63, 20.646, 4.81, 20.1, 5.52, 21.04, 5.678,
            21.37, 7.108, 22.83, 7.5, 23.13, 7.646, 23.042, 8.318, 23.438, 7.438, 22.36, 7.18, 21.94 };

    /**
     * 24节气
     */
    private static final String[] TERM = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑",
            "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };

    /**
     * 节气缓存表
     */
    private static Map<Integer, Map<String, String>> termMap = new HashMap<Integer, Map<String, String>>();

    public static int getNum(int month, int date) {
       String str="";
       if(month<10) {
          str="0"+month;
       }else {
          str=month+"";
       }
       
       if(date<10) {
          str=str+"0"+date;
       }else {
          str=str+date+"";
       }
       return Integer.parseInt(str);
    }
    /**
     * 获取指定日期节气名称
     * 
     * @param year
     * @param month
     * @param date
     * @return
     */
    public static JieQI getTermName(int year, int month, int date) {
       List<JieQI> list=new ArrayList<JieQI>();
        Map<String, String> map = getYearTermMap(year);
        for (Map.Entry<String, String> entry : map.entrySet()) {
         String key= entry.getKey();
         JieQI jq=new JieQI();
         jq.setIndex(Integer.parseInt(key));
         jq.setData(year+"-"+entry.getKey().substring(0, 2)+"-"+entry.getKey().substring(2, 4)+" 00:00:00");
         jq.setName(entry.getValue());
         list.add(jq);
      }
        Collections.sort(list);
        int mynum=getNum(month, date);
        for (int i = 0; i < list.size(); i++) {
           if(mynum>=list.get(i).getIndex()) {
              return list.get(i);
           }
      }
        JieQI jq=new JieQI();
      jq.setName("冬至");
      return jq;
    }

    /**
     * 获取指定年份萨拉表
     * 
     * @param year
     * @return
     */
    public static Map<String, String> getYearTermMap(int year) {
        // 处理世纪C值
        double[] c = null;
        if (year > 1900 && year <= 2000) {
            c = C_20;
        } else if (year > 2000 && year <= 2100) {
            c = C_21;
        } else {
            throw new RuntimeException("不支持的年份:" + year + ",目前只支持1901年到2100年的时间范围");
        }
        // 从节气表中取
        Map<String, String> map = termMap.get(year);
        if (map != null) {
            return map;
        }
        // 节气表中无对应的节气数据,则计算生成
        synchronized (TERM) {
            map = termMap.get(year);
            if (map == null) {
                int y = year % 100;
                map = new HashMap<String, String>();
                for (int k = 0; k < 24; k++) {
                    // 计算节气日期,计算公式:[Y*D+C]-L
                    int date = 0;
                    if (k < 2 || k > 22) {
                        date = (int) (y * D + c[k]) - (int) ((y - 1) / 4);
                    } else {
                        date = (int) (y * D + c[k]) - (int) (y / 4);
                    }
                    // 记录计算结果
                    map.put(getTermKey(k / 2 + 1, date), TERM[k]);
                }
                // 计算结果添加到节气表
                termMap.put(year, map);
            }
        }
        return map;
    }

    /**
     * 组装节气存储key
     * 
     * @param month
     * @param date
     * @return
     */
    private static String getTermKey(int month, int date) {
        String key = String.valueOf(month);
        if (month < 10) {
            key = "0" + key;
        }
        if (date < 10) {
            key += "0";
        }
        key += date;
        return key;
    }

    public static void main(String[] args) {
        System.out.println(Static.get(getTermName(2020, 8, 3).getName()).getYinyang());
    }
}

节气确认好了 该初始化九宫信息啦

package com.qimen.qiju.jiugong;

import java.util.HashMap;
import java.util.Map;

import com.qimen.qiju.dizhi.DiZhi;
import com.qimen.qiju.jiuxing.JiuXingUtil;

public class JiuGongUtil {

   private static  String key="jiugong_index_";
   
   public static Map<String, JiuGong> getJiuGong(DiZhi month){
      //初始化九宫基本信息
      Map<String, JiuGong> map=new HashMap<String, JiuGong>();
      map.put(key+"1", new JiuGong(1, "水", "坎","北方", JiuXingUtil.get(month, "天蓬")));
      map.put(key+"2", new JiuGong(2, "土", "坤","西南方", JiuXingUtil.get(month, "天芮")));
      map.put(key+"3", new JiuGong(3, "木", "震","东方", JiuXingUtil.get(month, "天冲")));
      map.put(key+"4", new JiuGong(4, "木", "巽"," 东南方", JiuXingUtil.get(month, "天辅")));
      map.put(key+"5", new JiuGong(5, "土", "无","无", JiuXingUtil.get(month, "禽")));//奇门九宫中 中5宫为寄宫
      map.put(key+"6", new JiuGong(6, "金", "乾","西北方", JiuXingUtil.get(month, "天心")));
      map.put(key+"7", new JiuGong(7, "金", "兑","西方", JiuXingUtil.get(month, "天柱")));
      map.put(key+"8", new JiuGong(8, "土", "艮","东北方", JiuXingUtil.get(month, "天任")));
      map.put(key+"9", new JiuGong(9, "火", "离","南方", JiuXingUtil.get(month, "天英")));
      return map;
   }
   
   public static JiuGong getIndex(Map<String, JiuGong> map, int index){
      return map.get(key+index);
   }
}

八门信息

package com.qimen.qiju.bamen;

import java.util.ArrayList;
import java.util.List;

import com.qimen.qiju.Main;
import com.qimen.qiju.jiugong.JiuGongUtil;
import com.qimen.qiju.jiuxing.JiuXingUtil;

public class BaMenUtil {

   private static List<BaMen> list=new ArrayList<BaMen>();
   
   static {
      list.add(new BaMen(1, "休门", ""));
      list.add(new BaMen(2, "死门", ""));
      list.add(new BaMen(3, "伤门", ""));
      list.add(new BaMen(4, "杜门", ""));
      list.add(new BaMen(5, "无门", ""));
      list.add(new BaMen(6, "开门", ""));
      list.add(new BaMen(7, "惊门", ""));
      list.add(new BaMen(8, "生门", ""));
      list.add(new BaMen(9, "景门", ""));
   }
   
   /**
    * 根据名字获取八门信息
    * @param name
    * @return
    */
   public static BaMen getName(String name) {
      for (int i = 0; i < list.size(); i++) {
         if(name.equals(list.get(i).getName())) {
            return list.get(i);
         }
      }
      return null;
   }
   
   /**
    * 根据宫位获取八门
    * @param index
    * @return
    */
   public static BaMen  getIndex(int index) {
      for (int i = 0; i < list.size(); i++) {
         if(index==list.get(i).getIndex()) {
            return list.get(i);
         }
      }
      return null;
   }
   /**
    * 写入原始工位
    * @param main
    */
   public static void setOldBaMen(Main main) {
      for (String key: main.getJiugong().keySet()) {
         int gong= main.getJiugong().get(key).getIndex();
         main.getJiugong().get(key).setOldBaMen(getIndex(gong));
      }
   }
   
   public static void setNewBaMen(Main main) {
      //时干减1
      int gegongshu= main.getSizu().getHourGan().getIndex()-1;
      //八门原始位置
      int zhishinum=main.getZhishi().getIndex();
      //
      if(5==main.getZhifu().getIndex()) {
         zhishinum=5;
      }
      
      int zhuandong=0;
      if(main.getYinyang().equals("阴")) {
         //阴盾
         zhuandong=zhishinum;
         for (int i = 1; i <= gegongshu; i++) {
            zhuandong=zhuandong-1;
            if(zhuandong<1) {
               zhuandong=9;
            }
         }
      }else {
         //阳盾
         zhuandong=zhishinum;
         for (int i = 1; i <= gegongshu; i++) {
            zhuandong=zhuandong+1;
            if(zhuandong>=10) {
               zhuandong=1;
            }
         }
      }
      
      //判断八门是否伏吟  中五宫位为伏吟局 //原始八门宫位==转动后的宫位 为伏吟局
      if(zhuandong==zhishinum) {
         for (String key:main.getJiugong().keySet()) {
            main.getJiugong().get(key).setNewBaMen(main.getJiugong().get(key).getOldBaMen());
         }
      }else {

         if(zhuandong==5) {
            zhuandong=2;
         }
         String jgindex="18349276";
         String [] jiuxingxuhao= {"休门","生门","伤门","杜门","景门","死门","惊门","开门"};
         String[] index1=jgindex.substring(jgindex.indexOf(""+zhuandong), jgindex.length()).split("");
         String[] index2=jgindex.substring(0, jgindex.indexOf(""+zhuandong)).split("");
         
         
         int jxindex=getindexsort(jiuxingxuhao, main.getZhishi().getName());
         //如果等0 就是中五宫 为 死门
         if(jxindex==0) {
            jxindex=6;
         }
         for (int i = 0; i < index1.length; i++) {
            JiuGongUtil.getIndex(main.getJiugong(), Integer.parseInt(index1[i])).setNewBaMen(BaMenUtil.getName(jiuxingxuhao[jxindex-1]));;
            
            jxindex=jxindex+1;
            if(jxindex>8) {
               jxindex=1;
            }
         }
         for (int i = 0; i < index2.length; i++) {
            if("".equals(index2[i])||index2[i]==null) {
               continue;
            }
            JiuGongUtil.getIndex(main.getJiugong(), Integer.parseInt(index2[i])).setNewBaMen(BaMenUtil.getName(jiuxingxuhao[jxindex-1]));;
            jxindex=jxindex+1;
            if(jxindex>8) {
               jxindex=1;
            }
         }
      }
      JiuGongUtil.getIndex(main.getJiugong(), 5).setNewBaMen(getIndex(5));
      
   }
   

   public static int getindexsort(String[] strs,String name) {
      for (int i = 0; i < strs.length; i++) {
         if(strs[i].equals(name)) {
            return (i+1);
         }
      }
      return 0;
   }
   
}

//算求了 太多了 需要的话直接找我要源码吧!!!!