在 char 数组中实现随机词时遇到问题
Trouble with implementing random words in a char array
我一直在开发一个基于用户输入的单词和参数创建单词搜索的程序。基本上这个想法是创建类似于这样的东西:
输入行数
8
输入列数
7
输入文字
猫
狗
然后该程序将生成一个包含 8 行 7 列的单词搜索,其中将包括单词 cat 和 dog。该程序将在给定的约束范围内沿对角线、水平线和垂直线生成这些词。
我不想要答案或为我完成这件事,而是希望有人指出正确的方向。
下面附上最近的代码,给大家提个醒。
同样,我所要求的只是朝着正确的方向开始。
感谢所有帮助!
public void fillArray() {Scanner sc = new Scanner(System.in);
System.out.println("How many rows would you like? >");
int row = sc.nextInt();
System.out.println("How many columns would you like? >");
int col = sc.nextInt();
String word = sc.next();
String testString = word;
char[] stringToCharArray = testString.toCharArray();
System.out.println(testString.toCharArray());
int[][] arrayRC = new int[row][col];
for (int i = 0; i < row + 1; i++) {
for (int j = 0; j < col + 1; j++) {
if (j < col && i < row) {
arrayRC[i][j] = (int) ((Math.random() * 26) + 1);
char alphabet;
switch (arrayRC[i][j]) {
case 1:
alphabet = 'a';
break;
case 2:
alphabet = 'b';
break;
case 3:
alphabet = 'c';
break;
case 4:
alphabet = 'd';
break;
case 5:
alphabet = 'e';
break;
case 6:
alphabet = 'f';
break;
case 7:
alphabet = 'g';
break;
case 8:
alphabet = 'h';
break;
case 9:
alphabet = 'i';
break;
case 10:
alphabet = 'j';
break;
case 11:
alphabet = 'k';
break;
case 12:
alphabet = 'l';
break;
case 13:
alphabet = 'm';
break;
case 14:
alphabet = 'n';
break;
case 15:
alphabet = 'o';
break;
case 16:
alphabet = 'p';
break;
case 17:
alphabet = 'q';
break;
case 18:
alphabet = 'r';
break;
case 19:
alphabet = 's';
break;
case 20:
alphabet = 't';
break;
case 21:
alphabet = 'u';
break;
case 22:
alphabet = 'v';
break;
case 23:
alphabet = 'w';
break;
case 24:
alphabet = 'x';
break;
case 25:
alphabet = 'y';
break;
case 26:
alphabet = 'z';
break;
default:
alphabet = '-';
break;
}
System.out.print(alphabet);
} else {
System.out.println();
}
}
}
}
我相信下面的方法会奏效(如您所料,我还没有尝试过)。
我会使用 char
的二维数组,而不是 int
。每个字段的初始值为“\0”,我们将使用它。我会先填入单词,然后再填入随机字母。要填写一个单词,首先 select 一个随机的方向或方位(垂直、水平或对角线)。我不清楚你想要 3、5 还是 8 个方向,但只要你知道……方向对单词的开始位置设置了一些限制,例如,长度为 3 的水平单词可能从底行开始,但是从右边缘起至少 3 个位置;垂直单词不能从底部开始。从可能的方块中随机选择一个起始方块。查看是否与已填写的字母有冲突。请记住:您可以在字段中填写 'c',如果它已经包含 'c' 或 '\0',而不是如果它包含另一个字母。只有单词中没有字母冲突时,才填写所有字母。如果发生冲突,请尝试另一个起始方块。如果尝试 100 次后仍然无法填写单词,请放弃并告诉用户您无法填写所有单词。
填完所有单词后,在所有没有字母的字段中随机输入一个字母。
一个问题是,最后填写的随机字母可能会意外地在一个地方拼写,比如说,猫,所以它会在那里重复两次。决定你是否可以忍受。
编辑:要随机选择一个字母,而不是长长的 switch 语句,我会推荐类似
的东西
private static final char[] LETTERS = "abcdefghijklmnopqrstuvwxyz".toCharArray();
private static final Random RAND = new Random();
private static char getRandomLetter() {
int randomIndex = RAND.nextInt(LETTERS.length);
return LETTERS[randomIndex];
}
我一直在开发一个基于用户输入的单词和参数创建单词搜索的程序。基本上这个想法是创建类似于这样的东西:
输入行数
8
输入列数
7
输入文字
猫
狗
然后该程序将生成一个包含 8 行 7 列的单词搜索,其中将包括单词 cat 和 dog。该程序将在给定的约束范围内沿对角线、水平线和垂直线生成这些词。
我不想要答案或为我完成这件事,而是希望有人指出正确的方向。
下面附上最近的代码,给大家提个醒。
同样,我所要求的只是朝着正确的方向开始。
感谢所有帮助!
public void fillArray() {Scanner sc = new Scanner(System.in);
System.out.println("How many rows would you like? >");
int row = sc.nextInt();
System.out.println("How many columns would you like? >");
int col = sc.nextInt();
String word = sc.next();
String testString = word;
char[] stringToCharArray = testString.toCharArray();
System.out.println(testString.toCharArray());
int[][] arrayRC = new int[row][col];
for (int i = 0; i < row + 1; i++) {
for (int j = 0; j < col + 1; j++) {
if (j < col && i < row) {
arrayRC[i][j] = (int) ((Math.random() * 26) + 1);
char alphabet;
switch (arrayRC[i][j]) {
case 1:
alphabet = 'a';
break;
case 2:
alphabet = 'b';
break;
case 3:
alphabet = 'c';
break;
case 4:
alphabet = 'd';
break;
case 5:
alphabet = 'e';
break;
case 6:
alphabet = 'f';
break;
case 7:
alphabet = 'g';
break;
case 8:
alphabet = 'h';
break;
case 9:
alphabet = 'i';
break;
case 10:
alphabet = 'j';
break;
case 11:
alphabet = 'k';
break;
case 12:
alphabet = 'l';
break;
case 13:
alphabet = 'm';
break;
case 14:
alphabet = 'n';
break;
case 15:
alphabet = 'o';
break;
case 16:
alphabet = 'p';
break;
case 17:
alphabet = 'q';
break;
case 18:
alphabet = 'r';
break;
case 19:
alphabet = 's';
break;
case 20:
alphabet = 't';
break;
case 21:
alphabet = 'u';
break;
case 22:
alphabet = 'v';
break;
case 23:
alphabet = 'w';
break;
case 24:
alphabet = 'x';
break;
case 25:
alphabet = 'y';
break;
case 26:
alphabet = 'z';
break;
default:
alphabet = '-';
break;
}
System.out.print(alphabet);
} else {
System.out.println();
}
}
}
}
我相信下面的方法会奏效(如您所料,我还没有尝试过)。
我会使用 char
的二维数组,而不是 int
。每个字段的初始值为“\0”,我们将使用它。我会先填入单词,然后再填入随机字母。要填写一个单词,首先 select 一个随机的方向或方位(垂直、水平或对角线)。我不清楚你想要 3、5 还是 8 个方向,但只要你知道……方向对单词的开始位置设置了一些限制,例如,长度为 3 的水平单词可能从底行开始,但是从右边缘起至少 3 个位置;垂直单词不能从底部开始。从可能的方块中随机选择一个起始方块。查看是否与已填写的字母有冲突。请记住:您可以在字段中填写 'c',如果它已经包含 'c' 或 '\0',而不是如果它包含另一个字母。只有单词中没有字母冲突时,才填写所有字母。如果发生冲突,请尝试另一个起始方块。如果尝试 100 次后仍然无法填写单词,请放弃并告诉用户您无法填写所有单词。
填完所有单词后,在所有没有字母的字段中随机输入一个字母。
一个问题是,最后填写的随机字母可能会意外地在一个地方拼写,比如说,猫,所以它会在那里重复两次。决定你是否可以忍受。
编辑:要随机选择一个字母,而不是长长的 switch 语句,我会推荐类似
的东西private static final char[] LETTERS = "abcdefghijklmnopqrstuvwxyz".toCharArray();
private static final Random RAND = new Random();
private static char getRandomLetter() {
int randomIndex = RAND.nextInt(LETTERS.length);
return LETTERS[randomIndex];
}