java纵横字谜

vuv7lop3  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(358)

所以我在做一个程序,它应该会产生一个随机的纵横字谜。我有一个方法读入一个txt文件,这个文件有大约3000个单词的列表,将它存储到数组列表中并返回数组列表。我有一个驱动程序的方法,它要求用户的行和列的数量,他们想要的纵横字谜,并从那里它应该产生一个随机的难题。我用一个二维数组来构建整个拼图,但我不知道如何在拼图中添加单词。这就是我到目前为止对填填纵横字谜的方法所做的(randomnumber方法只是一个返回随机索引的方法,用于访问列表中的随机字)

public static void buildCrossword(ArrayList<String> words, int rows, int columns)      
{
    String[][] board = new String[rows][columns];
    //Picks a random number from the arrayList using a random index from the randomNumber method
    int randomNumber = randomNumber();
    String randomWord = words.get(randomNumber);

    //we remove it right after it is selected to ensure that it doesn't get used again in the puzzle
    words.remove(randomNumber);

    char[] temp = randomWord.toCharArray();
    char[][] word = new char[temp.length][temp.length];
    word[0] = temp;

    System.out.println("*----".repeat(rows) + "*");
    for(int i = 0; i < columns; i++)
    {
        System.out.println("|    ".repeat(rows) + "|");
        System.out.println(word[0][i]);
        System.out.println("*----" .repeat(rows) + "*");
    }
}

你知道,填字游戏中也有未使用的方块,我需要用“*”来表示未使用的方块。任何帮助都将不胜感激。

nbysray5

nbysray51#

你应该把你的“显示纵横字谜”逻辑和你的“填写纵横字谜”逻辑分开。通常,您会构建一个 Crossword 类中包含字符的二维数组(您有字符串的二维数组-但我相信字符更好),并将提供 toString() 方法做“显示纵横字谜”。你也可以有一个 addWord(String word) 方法将一个单词添加到纵横填字游戏中--当前缺少的代码部分。
制作填字游戏需要:
创建一个空的, new Crossword(rows, cols) 在一个循环中,选择要添加的单词,直到它已满;对于每个单词,加上:

boolean full = false;
while ( ! full) {
   // choose a word
   int randomNumber = randomNumber();
   String randomWord = words.get(randomNumber);
   words.remove(randomNumber);

   // try to add it
   if ( ! crossword.addWord(randomWord)) {
      full = true;
   }
}

添加一个单词需要搜索一个可以放置它的空白区域,但是为了节省空间并获得一个纵横填字游戏,实际上您至少需要与纵横填字游戏中现有的单词共享一个字母——除了放置的第一个单词,它不能共享任何内容。如果填字游戏看起来像这样,那么更容易知道它是否为空:

public class Crossword {
     private Char[][] letters;
     private int rows, cols;
     private int totalWords; // incremented by 1 after each successful addWord

     public boolean addWord(String word) { /* your implementation here */}   
     public String toString() { /* your printing code here */ }
  }

毫无疑问,最难的部分是“找到适合一个新词的地方”的逻辑 addWord . 您可以使用一些助手方法使其更简单:

// inside Crossword class

     // returns true if word fits vertically with 1st letter at letters[col][row]
     private boolean fitsVertical(int row, int col, String word);

     // returns true if word fits horizontally with 1st letter at letters[col][row]
     private boolean fitsHorizontal(int row, int col, String word);

相关问题