易经:用代码实现六爻算卦法

一步步完善代码

八宫卦次图

在这里插入图片描述

得到三枚铜钱算法

package com.yyl.study;

import java.util.Random;

public class CoinTossDivination {

    private static final Random random = new Random();

    // 模拟抛掷三个铜钱,输出每个铜钱的结果
    public static String[] tossCoins() {
        String[] coins = new String[3];
        for (int i = 0; i < 3; i++) {
            coins[i] = random.nextBoolean() ? "正" : "反"; // 正:true;反:false
        }
        return coins;
    }

    public static void main(String[] args) {
        String[] coinsResult = tossCoins();
        System.out.println("三个铜钱的结果是:");
        for (String result : coinsResult) {
            System.out.print(result + " ");
        }
    }
}

三个铜板摇六次生成卦象逻辑:

package com.yyl.study.gua;

import java.util.Random;

/**
 * 使用三个铜板摇六次,生成六爻卦象
 */
public class CoinTossDivination {

    private static final Random random = new Random();

    // 模拟抛掷三个铜钱,返回每次的结果(正或反)
    public static String[] tossCoins() {
        String[] coins = new String[3];
        for (int i = 0; i < 3; i++) {
            coins[i] = random.nextBoolean() ? "正" : "反"; // 正:true;反:false
        }
        return coins;
    }

    // 根据三个铜板的结果生成一个爻(阳爻或阴爻)
    public static String getYao(String[] tossResult) {
        int positiveCount = 0;
        for (String result : tossResult) {
            if (result.equals("正")) {
                positiveCount++;
            }
        }

        // 根据正面铜板的数量决定爻的类型
        if (positiveCount == 3) {
            return "—————"; // 老阳(阳爻,动爻)
        } else if (positiveCount == 2) {
            return "—— ——"; // 少阴(阴爻)
        } else if (positiveCount == 1) {
            return "—————"; // 少阳(阳爻)
        } else {
            return "—— ——"; // 老阴(阴爻,动爻)
        }
    }

    // 摇六次铜板,得出卦象
    public static String[] generateHexagram() {
        String[] hexagram = new String[6];
        for (int i = 5; i >= 0; i--) { // 从上爻(5)到下爻(0)生成
            String[] tossResult = tossCoins();
            hexagram[i] = getYao(tossResult);
        }
        return hexagram;
    }

    public static void main(String[] args) {
        System.out.println("开始摇铜钱...");

        String[] hexagram = generateHexagram();
        System.out.println("生成的六爻卦象:");
        for (int i = 0; i < 6; i++) { // 输出时从上往下显示
            System.out.println(hexagram[i]);
        }
    }
}

摇六次并得出卦

package com.yyl.study.gua;

import java.util.Random;

/**
 * 使用三个铜板摇六次,生成六爻卦象并得到卦名,标注动爻并生成变卦
 */
public class CoinTossDivination2 {

    private static final Random random = new Random();

    // 八卦的表示,用于组合生成六十四卦
    private static final String[] TRIGRAMS = {
            "坤", "艮", "坎", "巽", "震", "离", "兑", "乾"
    };

    // 六十四卦的表示(二维数组表示上卦和下卦组合)
    private static final String[][] HEXAGRAMS = {
            {"坤为地", "山地剥", "水地比", "风地观", "雷地豫", "火地晋", "泽地萃", "天地否"},
            {"地山谦", "艮为山", "水山蹇", "风山渐", "雷山小过", "火山旅", "泽山咸", "天山遯"},
            {"地水师", "山水蒙", "坎为水", "风水涣", "雷水解", "火水未济", "泽水困", "天水讼"},
            {"地风升", "山风蛊", "水风井", "巽为风", "雷风恒", "火风鼎", "泽风大过", "天风姤"},
            {"地雷复", "山雷颐", "水雷屯", "风雷益", "震为雷", "火雷噬嗑", "泽雷随", "天雷无妄"},
            {"地火明夷", "山火贲", "水火既济", "风火家人", "雷火丰", "离为火", "泽火革", "天火同人"},
            {"地泽临", "山泽损", "水泽节", "风泽中孚", "雷泽归妹", "火泽睽", "兑为泽", "天泽履"},
            {"地天泰", "山天大畜", "水天需", "风天小畜", "雷天大壮", "火天大有", "泽天夬", "乾为天"}
    };

    // 模拟抛掷三个铜钱,返回每次的结果(正或反)
    public static String[] tossCoins() {
        String[] coins = new String[3];
        for (int i = 0; i < 3; i++) {
            coins[i] = random.nextBoolean() ? "正" : "反"; // 正:true;反:false
        }
        return coins;
    }

    // 根据三个铜板的结果生成一个爻(阳爻或阴爻),标注动爻
    public static String getYao(String[] tossResult) {
        int positiveCount = 0;
        for (String result : tossResult) {
            if (result.equals("正")) {
                positiveCount++;
            }
        }

        // 根据正面铜板的数量决定爻的类型,并标注动爻
        if (positiveCount == 3) {
            return "————— 老阳"; // 老阳(阳爻,动爻)
        } else if (positiveCount == 2) {
            return "—— —— 少阴"; // 少阴(阴爻)
        } else if (positiveCount == 1) {
            return "————— 少阳"; // 少阳(阳爻)
        } else {
            return "—— —— 老阴"; // 老阴(阴爻,动爻)
        }
    }

    // 生成变卦:老阳(阳爻,动爻)变为阴爻,老阴(阴爻,动爻)变为阳爻
    public static String[] generateChangingHexagram(String[] hexagram) {
        String[] changingHexagram = new String[6];
        boolean hasChangingLines = false;

        for (int i = 0; i < 6; i++) {
            if (hexagram[i].contains("老阳")) {
                changingHexagram[i] = "—— ——"; // 阳爻变阴爻
                hasChangingLines = true;
            } else if (hexagram[i].contains("老阴")) {
                changingHexagram[i] = "—————"; // 阴爻变阳爻
                hasChangingLines = true;
            } else if (hexagram[i].contains("少阴")) {
                changingHexagram[i] = "—— ——"; // 少阳、少阴不变
            } else {
                changingHexagram[i] = "—————"; // 少阳、少阴不变
            }
        }


        if (!hasChangingLines) {
            // 如果没有动爻,说明卦象不发生变化
            System.out.println("没有动爻,卦象不变。");
        }

        return changingHexagram;
    }

    // 将爻的组合转化为卦象
    public static String interpretHexagram(String[] hexagram) {
        int upperTrigram = 0;  // 上卦
        int lowerTrigram = 0;  // 下卦

        // 计算上卦 (前三爻, hexagram[0] 到 hexagram[2])
        for (int i = 0; i < 3; i++) {
            if (hexagram[i].startsWith("—————")) {
                upperTrigram += Math.pow(2, i);
            }
        }

        // 计算下卦 (后三爻, hexagram[3] 到 hexagram[5])
        for (int i = 0; i < 3; i++) {
            if (hexagram[i + 3].startsWith("—————")) {
                lowerTrigram += Math.pow(2, i);
            }
        }

        // 根据上卦和下卦的组合获取六十四卦的名称
        return HEXAGRAMS[lowerTrigram][upperTrigram];
    }

    public static void main(String[] args) {
        System.out.println("开始摇铜钱...");

        // 生成本卦
        String[] hexagram = new String[6];
        for (int i = 5; i >= 0; i--) { // 从上爻(5)到下爻(0)生成
            String[] tossResult = tossCoins();
            hexagram[i] = getYao(tossResult);
        }

        System.out.println("生成的六爻卦象:");
        for (int i = 0; i < 6; i++) { // 输出时从上往下显示
            System.out.println(hexagram[i]);
        }

        // 解释并输出本卦卦名
        String hexagramName = interpretHexagram(hexagram);
        System.out.println("本卦卦名是:" + hexagramName);

        // 生成变卦
        String[] changingHexagram = generateChangingHexagram(hexagram);
        System.out.println("生成的变卦:");
        for (int i = 0; i < 6; i++) { // 输出时从上往下显示
            System.out.println(changingHexagram[i]);
        }

        // 解释并输出变卦卦名
        String changingHexagramName = interpretHexagram(changingHexagram);
        System.out.println("变卦卦名是:" + changingHexagramName);
    }
}


结果还可以

在这里插入图片描述

得出卦名与卦的顺序

package com.yyl.study.gua;

import java.util.Random;

/**
 * 使用三个铜板摇六次,生成六爻卦象并得到卦名,标注动爻并生成变卦
 */


/**
 * 使用三个铜板摇六次,生成六爻卦象并得到卦名,标注动爻并生成变卦
 */
public class CoinTossDivination1 {

    private static final Random random = new Random();

    // 八卦的表示,用于组合生成六十四卦
    private static final String[] TRIGRAMS = {
            "坤", "艮", "坎", "巽", "震", "离", "兑", "乾"
    };

    //

    /**
     * 六十四卦的表示(二维数组表示上卦和下卦组合)
     *
     * 此处用后天八卦的排列方式,便于判定方位
     */
    private static final String[][] HEXAGRAMS = {
            {"坤为地", "山地剥", "水地比", "风地观", "雷地豫", "火地晋", "泽地萃", "天地否"},
            {"地山谦", "艮为山", "水山蹇", "风山渐", "雷山小过", "火山旅", "泽山咸", "天山遯"},
            {"地水师", "山水蒙", "坎为水", "风水涣", "雷水解", "火水未济", "泽水困", "天水讼"},
            {"地风升", "山风蛊", "水风井", "巽为风", "雷风恒", "火风鼎", "泽风大过", "天风姤"},
            {"地雷复", "山雷颐", "水雷屯", "风雷益", "震为雷", "火雷噬嗑", "泽雷随", "天雷无妄"},
            {"地火明夷", "山火贲", "水火既济", "风火家人", "雷火丰", "离为火", "泽火革", "天火同人"},
            {"地泽临", "山泽损", "水泽节", "风泽中孚", "雷泽归妹", "火泽睽", "兑为泽", "天泽履"},
            {"地天泰", "山天大畜", "水天需", "风天小畜", "雷天大壮", "火天大有", "泽天夬", "乾为天"}
    };

    // 根据卦名获取卦的顺序编号
    private static final String[] HEXAGRAM_NAMES = {
            "乾", "坤", "屯", "蒙", "需", "讼", "师", "比", "小畜", "履", "泰", "否", "同人", "大有", "谦", "豫",
            "随", "蛊", "临", "观", "噬嗑", "贲", "剥", "复", "无妄", "大畜", "颐", "大过", "坎", "离", "咸", "恒",
            "遁", "大壮", "晋", "明夷", "家人", "睽", "蹇", "解", "损", "益", "夬", "姤", "萃", "升", "困", "井",
            "革", "鼎", "震", "艮", "渐", "归妹", "丰", "旅", "巽", "兑", "涣", "节", "中孚", "小过", "既济", "未济"
    };

    // 模拟抛掷三个铜钱,返回每次的结果(正或反)
    public static String[] tossCoins() {
        String[] coins = new String[3];
        for (int i = 0; i < 3; i++) {
            coins[i] = random.nextBoolean() ? "正" : "反"; // 正:true;反:false
        }
        return coins;
    }

    // 根据三个铜板的结果生成一个爻(阳爻或阴爻),标注动爻
    public static String getYao(String[] tossResult) {
        int positiveCount = 0;
        for (String result : tossResult) {
            if (result.equals("正")) {
                positiveCount++;
            }
        }

        // 根据正面铜板的数量决定爻的类型,并标注动爻
        if (positiveCount == 3) {
            return "————— 老阳"; // 老阳(阳爻,动爻)
        } else if (positiveCount == 2) {
            return "—— —— 少阴"; // 少阴(阴爻)
        } else if (positiveCount == 1) {
            return "————— 少阳"; // 少阳(阳爻)
        } else {
            return "—— —— 老阴"; // 老阴(阴爻,动爻)
        }
    }

    // 生成变卦:老阳(阳爻,动爻)变为阴爻,老阴(阴爻,动爻)变为阳爻
    public static String[] generateChangingHexagram(String[] hexagram) {
        String[] changingHexagram = new String[6];
        boolean hasChangingLines = false;

        for (int i = 0; i < 6; i++) {
            if (hexagram[i].contains("老阳")) {
                changingHexagram[i] = "—— ——"; // 阳爻变阴爻
                hasChangingLines = true;
            } else if (hexagram[i].contains("老阴")) {
                changingHexagram[i] = "—————"; // 阴爻变阳爻
                hasChangingLines = true;
            } else if (hexagram[i].contains("少阴")) {
                changingHexagram[i] = "—— ——"; // 少阳、少阴不变
            } else {
                changingHexagram[i] = "—————"; // 少阳、少阴不变
            }
        }

        if (!hasChangingLines) {
            // 如果没有动爻,说明卦象不发生变化
            System.out.println("没有动爻,卦象不变。");
        }

        return changingHexagram;
    }

    // 将爻的组合转化为卦象,并获取卦的编号
    public static String interpretHexagram(String[] hexagram) {
        int upperTrigram = 0;  // 上卦
        int lowerTrigram = 0;  // 下卦

        // 计算上卦 (前三爻, hexagram[0] 到 hexagram[2])
        for (int i = 0; i < 3; i++) {
            if (hexagram[i].startsWith("—————")) {
                upperTrigram += Math.pow(2, i);
            }
        }

        // 计算下卦 (后三爻, hexagram[3] 到 hexagram[5])
        for (int i = 0; i < 3; i++) {
            if (hexagram[i + 3].startsWith("—————")) {
                lowerTrigram += Math.pow(2, i);
            }
        }

        // 根据上卦和下卦的组合获取六十四卦的名称
        String hexagramName = HEXAGRAMS[lowerTrigram][upperTrigram];
        int hexagramNumber = getHexagramNumber(hexagramName);

        return "卦名:" + hexagramName + ",第" + hexagramNumber + "卦";
    }

    // 根据卦名获取卦的编号
    public static int getHexagramNumber(String hexagramName) {
        for (int i = 0; i < HEXAGRAM_NAMES.length; i++) {
            if (hexagramName.contains(HEXAGRAM_NAMES[i])){
                return i + 1;
            }

            // if (HEXAGRAM_NAMES[i].equals(hexagramName.replaceAll("[^\\u4e00-\\u9fa5]", ""))) {
            //     return i + 1;
            // }
        }
        return -1; // 如果未找到,返回-1(不应该发生)
    }

    public static void main(String[] args) {
        System.out.println("开始摇铜钱...");

        // 生成本卦
        String[] hexagram = new String[6];
        for (int i = 5; i >= 0; i--) { // 从上爻(5)到下爻(0)生成
            String[] tossResult = tossCoins();
            hexagram[i] = getYao(tossResult);
        }

        System.out.println("生成的六爻卦象:");
        for (int i = 0; i < 6; i++) { // 输出时从上往下显示
            System.out.println(hexagram[i]);
        }

        // 解释并输出本卦卦名和编号
        String hexagramInfo = interpretHexagram(hexagram);
        System.out.println("本卦信息:" + hexagramInfo);

        // 生成变卦
        String[] changingHexagram = generateChangingHexagram(hexagram);
        System.out.println("生成的变卦:");
        for (int i = 0; i < 6; i++) { // 输出时从上往下显示
            System.out.println(changingHexagram[i]);
        }

        // 解释并输出变卦卦名和编号
        String changingHexagramInfo = interpretHexagram(changingHexagram);
        System.out.println("变卦信息:" + changingHexagramInfo);
    }
}

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我心向阳iu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值