class ShenShaUtils: """ 纳音与神煞计算工具类 参考《三命通会》、《渊海子平》 """ # 60甲子纳音映射 NAYIN_MAP = { "甲子": "海中金", "乙丑": "海中金", "丙寅": "炉中火", "丁卯": "炉中火", "戊辰": "大林木", "己巳": "大林木", "庚午": "路旁土", "辛未": "路旁土", "壬申": "剑锋金", "癸酉": "剑锋金", "甲戌": "山头火", "乙亥": "山头火", "丙子": "涧下水", "丁丑": "涧下水", "戊寅": "城头土", "己卯": "城头土", "庚辰": "白蜡金", "辛巳": "白蜡金", "壬午": "杨柳木", "癸未": "杨柳木", "甲申": "泉中水", "乙酉": "泉中水", "丙戌": "屋上土", "丁亥": "屋上土", "戊子": "霹雳火", "己丑": "霹雳火", "庚寅": "松柏木", "辛卯": "松柏木", "壬辰": "长流水", "癸巳": "长流水", "甲午": "沙中金", "乙未": "沙中金", "丙申": "山下火", "丁酉": "山下火", "戊戌": "平地木", "己亥": "平地木", "庚子": "壁上土", "辛丑": "壁上土", "壬寅": "金箔金", "癸卯": "金箔金", "甲辰": "佛灯火", "乙巳": "佛灯火", "丙午": "天河水", "丁未": "天河水", "戊申": "大驿土", "己酉": "大驿土", "庚戌": "钗钏金", "辛亥": "钗钏金", "壬子": "桑柘木", "癸丑": "桑柘木", "甲寅": "大溪水", "乙卯": "大溪水", "丙辰": "沙中土", "丁巳": "沙中土", "戊午": "天上火", "己未": "天上火", "庚申": "石榴木", "辛酉": "石榴木", "壬戌": "大海水", "癸亥": "大海水" } # 神煞规则定义 @staticmethod def get_nayin(pillar): return ShenShaUtils.NAYIN_MAP.get(pillar, "未知") @staticmethod def get_all_shensha(pillars): """ 计算四柱中的所有神煞 :param pillars: ['年柱', '月柱', '日柱', '时柱'] 每柱为 "干支" 字符串 :return: list of dicts {pillar_idx, name} """ year_gz, month_gz, day_gz, hour_gz = pillars day_master = day_gz[0] year_branch = year_gz[1] day_branch = day_gz[1] results = [[], [], [], []] # 对应年、月、日、时 # 1. 天乙贵人 (甲戊庚牛羊, 乙己鼠猴乡, 丙丁猪鸡位, 壬癸兔蛇藏, 六辛逢马虎) tian_yi_map = { '甲': ['丑', '未'], '戊': ['丑', '未'], '庚': ['丑', '未'], '乙': ['子', '申'], '己': ['子', '申'], '丙': ['亥', '酉'], '丁': ['亥', '酉'], '壬': ['卯', '巳'], '癸': ['卯', '巳'], '辛': ['午', '寅'] } gui_ren_branches = tian_yi_map.get(day_master, []) for i, p in enumerate(pillars): if p[1] in gui_ren_branches: results[i].append("天乙贵人") # 2. 禄神 (甲禄在寅, 乙禄在卯...) lu_map = {'甲': '寅', '乙': '卯', '丙': '巳', '丁': '午', '戊': '巳', '己': '午', '庚': '申', '辛': '酉', '壬': '亥', '癸': '子'} lu_branch = lu_map.get(day_master) for i, p in enumerate(pillars): if p[1] == lu_branch: results[i].append("禄神") # 3. 羊刃 (甲见卯, 乙见辰(其实乙见寅/辰有争议,通常取帝旺下一位)... 简单实现主气) yang_ren_map = {'甲': '卯', '丙': '午', '戊': '午', '庚': '酉', '壬': '子'} yr_branch = yang_ren_map.get(day_master) if yr_branch: for i, p in enumerate(pillars): if p[1] == yr_branch: results[i].append("羊刃") # 4. 驿马 (申子辰马在寅, 寅午戌马在申, 巳酉丑马在亥, 亥卯未马在巳) yima_rules = { ('申', '子', '辰'): '寅', ('寅', '午', '戌'): '申', ('巳', '酉', '丑'): '亥', ('亥', '卯', '未'): '巳' } def get_yima(branch): for k, v in yima_rules.items(): if branch in k: return v return None # 以年支或日支查 target_yimas = [get_yima(year_branch), get_yima(day_branch)] for i, p in enumerate(pillars): if p[1] in target_yimas: results[i].append("驿马") # 5. 桃花 (咸池) (申子辰在酉, 寅午戌在卯, 巳酉丑在午, 亥卯未在子) taohua_rules = { ('申', '子', '辰'): '酉', ('寅', '午', '戌'): '卯', ('巳', '酉', '丑'): '午', ('亥', '卯', '未'): '子' } def get_taohua(branch): for k, v in taohua_rules.items(): if branch in k: return v return None target_taohuas = [get_taohua(year_branch), get_taohua(day_branch)] for i, p in enumerate(pillars): if p[1] in target_taohuas: results[i].append("桃花") # 6. 将星 (申子辰在子, 寅午戌在午, 巳酉丑在酉, 亥卯未在卯) # 7. 华盖 (申子辰在辰, 寅午戌在戌, 巳酉丑在丑, 亥卯未在未) # 8. 空亡 (六甲旬空) branches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'] stems = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'] def get_kong_wang(gz): s_idx = stems.index(gz[0]) b_idx = branches.index(gz[1]) kw_start_idx = (b_idx - s_idx) % 12 return [branches[(kw_start_idx - 2) % 12], branches[(kw_start_idx - 1) % 12]] day_kw = get_kong_wang(day_gz) for i, p in enumerate(pillars): if p[1] in day_kw: results[i].append("空亡") return results