【问题标题】:Java CrossWord PuzzleJava 填字游戏
【发布时间】:2021-03-21 08:42:36
【问题描述】:

所以我正在制作一个应该生成随机填字游戏的程序。我有一个方法读取一个包含大约 3000 个单词的列表的 txt 文件,将其存储到数组列表中并返回数组列表。我有一个驱动程序方法,它询问用户他们想要填字游戏的行数和列数,并且应该从那里生成一个随机谜题。我正在使用二维数组来构建整个拼图,但我不知道如何在拼图中添加单词。 到目前为止,这就是我应该填写填字游戏的方法 (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) + "*");
    }
}

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

【问题讨论】:

    标签: java algorithm arraylist multidimensional-array


    【解决方案1】:

    您应该将“显示填字游戏”逻辑与“填写填字游戏”逻辑分开。通常,您将构建一个 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);
    

    【讨论】:

    • 非常感谢,这绝对有帮助。有时我只是很难计划出我需要的方法
    • 您应该投票和/或接受好的答案
    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多