
本教程将深入探讨如何在Java中实现一个健壮的随机单词选择器。我们将学习如何从预设词汇池中,高效地抽取指定数量(最多12个)的独特单词,并包含必要的输入验证机制。文章通过详细的步骤和示例代码,指导开发者为如“找词游戏”等2D游戏板准备这些随机选取的单词,确保每次游戏体验都充满新意。
在开发基于文本的游戏,例如“找词游戏”或“填字游戏”时,一个核心需求是从一个预定义的词汇列表中随机选择一定数量的单词。更进一步,这些选定的单词通常需要是唯一的,并且其数量可能由用户指定。本教程将详细介绍如何在Java中实现这一功能,并为将这些单词集成到2D游戏板中做好准备。
在构建随机单词选择器时,我们将主要依赖以下Java核心组件:
我们将通过一个 readWords 方法来组织整个单词选择流程。
立即学习“Java免费学习笔记(深入)”;
首先,我们定义一个简单的 Word 类来封装单词字符串。
class Word {
    String text;
    public Word(String text) {
        this.text = text;
    }
    public String getText() {
        return text;
    }
    @Override
    public String toString() {
        return text; // 方便打印
    }
}将预定义的单词字符串数组转换为 ArrayList<Word> 类型的词汇池。这样做的好处是 ArrayList 提供了方便的 remove 方法,有助于实现单词去重。
public static void readWords() {
    // 假设 WordSearch 类已存在并可实例化
    WordSearch search = new WordSearch(); 
    List<Word> poolWords = new ArrayList<>();
    String[] wordsArray = {
        "play", "dream", "personal", "advice", "steal",
        "suspicious", "borrow", "image", "repeat", "enemy", 
        "break", "selfish", "protester", "charity", "encounter",
        "discreetly", "effectively", "react", "respect", "depression",
        "couch", "counsellor", "snatch", "judge", "appearance",
        "quiet", "ridiculous", "overjoyed", "antidote", "parademic",
        "employment", "balance", "overwhelm", "relax", "flextime",
        "task", "daily", "realistic", "essential", "stressful",
        "fixed", "key", "reward", "salary", "loan", "promotion",
        "value", "database", "schedule", "priority"
    };
    // 将字符串数组中的单词添加到词汇池
    for (String word : wordsArray) {
        poolWords.add(new Word(word));
    }
    // ... 后续代码
}使用 Scanner 获取用户希望生成的单词数量。为了确保游戏的合理性,我们需要对用户输入进行验证,限制其在有效范围内(例如1到12个单词)。do-while 循环是实现此验证的理想选择。
// ... 前面初始化词汇池的代码
    Random rand = new Random();
    Scanner input = new Scanner(System.in);
    int maxWords;
    do {
      System.out.print("请问您需要生成多少个单词?(最多12个): ");  
      // 捕获可能的非整数输入异常
      try {
          maxWords = input.nextInt();
      } catch (java.util.InputMismatchException e) {
          System.out.println("输入无效,请输入一个整数。");
          input.next(); // 清除无效输入
          maxWords = 0; // 重置为0,确保循环继续
      }
    } while (maxWords < 1 || maxWords > 12);
    // ... 后续代码这是核心逻辑部分。我们通过循环 maxWords 次来选择单词。每次循环:
// ... 前面获取并验证用户输入的代码
    List<Word> selectedWords = new ArrayList<>(); // 存储已选单词
    for (int i = 0; i < maxWords; i++) {
        int randomIndex = rand.nextInt(poolWords.size()); // 获取随机索引
        Word randomWord = poolWords.get(randomIndex);     // 获取随机单词
        poolWords.remove(randomIndex);                    // 从池中移除,确保不重复
        selectedWords.add(randomWord); // 将选定的单词添加到新列表中
        // ... 将选定的单词传递给 WordSearch 实例
        // search.addWord(randomWord); // 假设 WordSearch 有一个 addWord 方法
    }   
    System.out.println("已选定的单词:");
    for (Word word : selectedWords) {
        System.out.println("- " + word.getText());
    }
    input.close(); // 关闭Scanner
}选定单词后,下一步就是将它们传递给 WordSearch 实例。WordSearch 类应该包含一个方法(例如 addWord(Word word))来接收这些单词,并负责将其放置到2D游戏板的适当位置。本教程的重点在于单词选择,因此 WordSearch 的具体放置逻辑将作为后续开发任务。
// 假设 WordSearch 类有一个简单的 addWord 方法
class WordSearch {
    // ... 其他成员变量和构造函数
    public boolean addWord(Word word) {
        System.out.println("尝试将单词 '" + word.getText() + "' 添加到游戏板。");
        // 实际的游戏板放置逻辑将在此处实现,例如:
        // 1. 寻找合适的起始坐标和方向
        // 2. 检查是否有冲突
        // 3. 将单词的字符填充到二维数组中
        return true; // 示例中假设总是成功
    }
}下面是包含上述所有步骤的完整 readWords 方法,以及一个简单的 Word 类定义和 WordSearch 类的示意性实现:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
// Word 类定义
class Word {
    String text;
    public Word(String text) {
        this.text = text;
    }
    public String getText() {
        return text;
    }
    @Override
    public String toString() {
        return text;
    }
}
// WordSearch 类的示意性实现
class WordSearch {
    // 实际的游戏板可能是一个 char[][] 或其他数据结构
    // private char[][] board; 
    public WordSearch() {
        // 构造函数可以初始化游戏板
        System.out.println("WordSearch 游戏板已初始化。");
    }
    // 接收单词并处理放置逻辑的方法(此处仅为示意)
    public boolean addWord(Word word) {
        System.out.println("尝试将单词 '" + word.getText() + "' 添加到游戏板。");
        // 实际的游戏板放置逻辑将在此处实现,例如:
        // 1. 寻找合适的起始坐标和方向
        // 2. 检查是否有冲突
        // 3. 将单词的字符填充到二维数组中
        return true; // 示例中假设总是成功
    }
}
public class WordSelector {
    public static void readWords() {
        WordSearch search = new WordSearch(); // 实例化游戏板
        List<Word> poolWords = new ArrayList<>();
        String[] wordsArray = {
            "play", "dream", "personal", "advice", "steal",
            "suspicious", "borrow", "image", "repeat", "enemy", 
            "break", "selfish", "protester", "charity", "encounter",
            "discreetly", "effectively", "react", "respect", "depression",
            "couch", "counsellor", "snatch", "judge", "appearance",
            "quiet", "ridiculous", "overjoyed", "antidote", "parademic",
            "employment", "balance", "overwhelm", "relax", "flextime",
            "task", "daily", "realistic", "essential", "stressful",
            "fixed", "key", "reward", "salary", "loan", "promotion",
            "value", "database", "schedule", "priority"
        };
        // 将字符串数组中的单词添加到词汇池
        for (String wordText : wordsArray) {
            poolWords.add(new Word(wordText));
        }
        Random rand = new Random();
        Scanner input = new Scanner(System.in);
        int maxWords;
        do {
          System.out.print("请问您需要生成多少个单词?(最多12个): ");  
          try {
              maxWords = input.nextInt();
          } catch (java.util.InputMismatchException e) {
              System.out.println("输入无效,请输入一个整数。");
              input.next(); // 清除无效输入
              maxWords = 0; // 重置为0,确保循环继续
          }
        } while (maxWords < 1 || maxWords > 12);
        List<Word> selectedWords = new ArrayList<>(); // 存储已选单词
        for (int i = 0; i < maxWords; i++) {
            // 确保词汇池中仍有单词可供选择
            if (poolWords.isEmpty()) {
                System.out.println("词汇池已空,无法选择更多单词。");
                break;
            }
            int randomIndex = rand.nextInt(poolWords.size()); // 获取随机索引
            Word randomWord = poolWords.get(randomIndex);     // 获取随机单词
            poolWords.remove(randomIndex);                    // 从池中移除,确保不重复
            selectedWords.add(randomWord); // 将选定的单词添加到新列表中
            // 将选定的单词传递给 WordSearch 实例
            search.addWord(randomWord); 
        }   
        System.out.println("\n--- 最终选定的单词列表 ---");
        for (Word word : selectedWords) {
            System.out.println("- " + word.getText());
        }
        input.close(); // 关闭Scanner
    }
    public static void main(String[] args) {
        readWords();
    }
}以上就是Java:构建随机不重复单词选择器及其在游戏中的应用准备的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号