我正在开发一个随机名称生成器,用于我正在开发的游戏中,问题是不同的物种具有不同的命名风格,我想要一个名称生成器来处理所有这些。我已经对这个问题的第一部分进行了排序 - 名称生成器使用一系列模板,每个种类的玩家/NPC 一组。
我遇到的主要问题是一些元音需要有一个随机选择的重音标记。我已经搜索和搜索,但我找不到随机选择一个字符然后对其应用重音符号的方法。那么,通过选择字母然后对其应用重音标记来组成重音字母的方法有哪些?
我正在开发一个随机名称生成器,用于我正在开发的游戏中,问题是不同的物种具有不同的命名风格,我想要一个名称生成器来处理所有这些。我已经对这个问题的第一部分进行了排序 - 名称生成器使用一系列模板,每个种类的玩家/NPC 一组。
我遇到的主要问题是一些元音需要有一个随机选择的重音标记。我已经搜索和搜索,但我找不到随机选择一个字符然后对其应用重音符号的方法。那么,通过选择字母然后对其应用重音标记来组成重音字母的方法有哪些?
Unicode 具有代表大多数类型的重音的“组合”字符。从您创建的组合字符数组中随机选择一个组合字符非常容易。然后,您可以将任何口音放在您喜欢的任何字符上。
http://en.wikipedia.org/wiki/Combining_character
由于这些由代码点表示,因此您可以将它们单独视为一个字符:
String s = "a" + "\u0300"; // latin lowercase letter a + combining grave accent
char combining_grave_accent = '\u0300';
嗯,也许使用二维数组并创建一个转换表,该表将有 2 列和多少行(有多少重音字符),现在在第一列存储每个重音值,在第二列存储值 un-重音即a,e,i,o,u,当您为名称生成元音时,您可以随机选择是否重音,如果您选择重音,您将遍历二维数组获取所有重音值使用'a'或其他任何东西,并通过获取和检查数组第二列中的值(以便选择所有重音a),然后随机选择一个来使用......
那是很长的路要走,我知道java中没有为此的捷径。
编辑:这是一些符合我建议的代码:
import java.util.ArrayList;
/**
*
* @author David
*/
public class JavaApplication145 {
static char[][] chars = new char[6][6];
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
createConversionTable();
char c = 'u';
ArrayList<String> charsList = getAccentedChar(c);
for (int i = 0; i < charsList.size(); i++) {
System.out.println(charsList.get(i));
}
}
private static void createConversionTable() {
chars[0] = new char[]{'ù', 'ü', 'é', 'ê', 'ä', 'à'};
chars[1] = new char[]{'u', 'u', 'e', 'e', 'a', 'a'};
}
private static ArrayList getAccentedChar(char c) {
ArrayList<String> charsList = new ArrayList<>();
for (int i = 0; i < chars[0].length; i++) {
for (int x = 0; x < chars[1].length; x++) {
if (chars[i][x] == c) {
charsList.add(chars[i - 1][x] + "");
}
}
}
return charsList;
}
}
需要同样的东西,所以我最终做了这个:
/**
* Given a letter and an accent, return the char with the accent included.
*
* @param accentCode: The accent char; i.e '~', '´';
* @param letter: Letter to put accent in it.
* @return: Char with {@code letter} with accent if it was a valid letter.
*/
public static int getAccent(char accentChar, int letter) {
int index = 0;
boolean upperCase = false;
for (char vogal : vogalList) {
if (letter == vogal) {
if (index >= 5) {
index -= 5;
upperCase = true;
}
for (int accentType = 0; accentType < convertTable.length; accentType++) {
if (convertTable[accentType][0] == accentChar) {
char converted = convertTable[accentType][index + 1];
if (converted != '-') {
if (upperCase)
converted = Character.toUpperCase(converted);
return converted;
}
}
}
}
index++;
}
return letter;
}
/**
* Verify if {@code charID} is an accent character;
*
* @param charID: Character code id to be verified.
* @return: true in case {@code charID} is an accent character id.
*/
public static boolean isAccent(int charID) {
for (int i = 0; i < convertTable.length; i++) {
if (convertTable[i][0] == charID)
return true;
}
return false;
}
private static final char[] vogalList = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
private static final char[][] convertTable = { { '´', 'á', 'é', 'í', 'ó', 'ú' }, { '`', 'à', 'è', 'ì', 'ò', 'ù' }, { '^', 'â', 'ê', 'î', 'ô', 'û' }, { '~', 'ã', '-', '-', 'õ', '-' }, { '¨', 'ä', 'ë', 'ï', 'ö', 'ü' } };