一步步完善代码
八宫卦次图
得到三枚铜钱算法
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);
}
}
结果: