简体   繁体   English

如何对从文本文件中随机选择的单词进行加扰

[英]How to scramble a word that is picked randomly from a text file

I am attempting to write a program that picks a random word from a text file, scrambles it, and allows the user to unscramble it by swapping 2 index locations at a time. 我正在尝试编写一个程序,该程序从文本文件中选择一个随机单词,对其进行加扰,并允许用户通过一次交换2个索引位置来对其进行加扰。

I have the program to the point where it grabs a random word from the text file and prints it out with the index numbers above it. 我将程序抓到了从文本文件中抓取一个随机单词并用它上面的索引号打印出来的程度。

I am having trouble figuring out how to: 我在弄清楚如何:

  1. Get the word scrambled before it prints out on screen, and 在屏幕上打印出来之前先弄乱单词,然后
  2. How to get the user to be able to loop through swapping 2 indexes at a time until the word is unscrambled. 如何使用户能够一次通过交换2个索引来循环直到单词未加扰。

Is there a method I can write that will perform these actions? 我可以编写一种可以执行这些操作的方法吗?

Here is my code so far. 到目前为止,这是我的代码。

import java.io.*;
import java.util.*;

public class Midterm { // class header

    public static void main(String[] args) { // Method header

        int option = 0;
        Scanner input = new Scanner(System.in);
        int scrambled;
        int counter = 0;
        int index1;
        int index2;     

        String[] words = readArray("words.txt");
        /*
         * Picks a random word from the array built from words.txt file. Prints
         * index with word beneath it.
         */
        int randWord = (int) (Math.random() * 11);

        for (int j = 0; j < words[randWord].length(); j = j + 1) {
            System.out.print(j);
        }

        System.out.print("\n");     
        char[] charArray = words[randWord].toCharArray();
        for (char c : charArray) {          
            System.out.print(c);
        }
        /*
         * Prompt the user for input to play game or quit.
         */
        System.out.println("\n");
        System.out.println("Enter 1 to swap a par of letters.");
        System.out.println("Enter 2 to show the solution and quit.");
        System.out.println("Enter 3 to quit.");     

        if (input.hasNextInt()) {
            option = input.nextInt();
            counter++;          
        }
        else {
            option = 3;
        }
        System.out.println("");

        if (option == 1) {
            System.out.println("Enter the two index locations to swap separated by a space. ");
            index1 = 0;
            index2 = 0;
            if (input.hasNextInt()) {
                index1 = input.nextInt();
                }
            else {
                System.out.println("Please enter only numbers.");
            }

            if (input.hasNextInt()) {
                index2 = input.nextInt();
                }
            else {
                System.out.println("Please enter only numbers.");
            }
        } 
        }   



    // end main

    public static String[] readArray(String file) {
        // Step 1:
        // Count how many lines are in the file
        // Step 2:
        // Create the array and copy the elements into it

        // Step 1:
        int ctr = 0;
        try {
            Scanner s1 = new Scanner(new File(file));
            while (s1.hasNextLine()) {
                ctr = ctr + 1;
                s1.nextLine();
            }
            String[] words = new String[ctr];

            // Step 2:
            Scanner s2 = new Scanner(new File(file));
            for (int i = 0; i < ctr; i = i + 1) {
                words[i] = s2.next();

            }
            return words;
        } catch (FileNotFoundException e) {

        }
        return null;

    }
}

You are reading the file incorrectly. 您正在错误地读取文件。 Do

public static String[] readArray(String file) {
    int ctr = 0;
    try {
        Scanner s1 = new Scanner(new File(file));
        while (s1.hasNext()) {
            ctr = ctr + 1;
            s1.next();
        }
        //..rest of code

I made some pretty major modifications to your code, including adding a scrambler method. 我对您的代码进行了一些相当大的修改,包括添加了加扰器方法。 The program is almost perfect, its just that your file "words.txt" can not hold words with repeat letters. 该程序几乎是完美的,只是您的文件“ words.txt”不能包含重复字母的单词。 For example, yellow, green, and purple won't unscramble correctly, but white, gray, blue, orange, or red will work fine. 例如,黄色,绿色和紫色无法正确解读,但是白色,灰色,蓝色,橙色或红色将可以正常工作。 Other than that, the program works well. 除此之外,该程序运行良好。 It chooses a random word, then when it is solved, chooses a different word, changing the last word to null, so it does not get picked again. 它选择一个随机单词,然后在求解后选择另一个单词,将最后一个单词更改为null,这样就不会再次被选中。 Here's the program: 这是程序:

import java.io.*;
import java.util.*;

public class Experiments { // class header

    private static String[] words = readArray("/Users/UserName/Desktop/words.txt"); //change to your location of the file

    public static void main(String[] args) { // Method header
        int option = 0;
        Scanner input = new Scanner(System.in);
        int counter = 0;
        String scrambledWord;
        int index1;
        int index2;     

        Random rand = new Random();
        int randWord = rand.nextInt(words.length);

        for (int j = 0; j < words[randWord].length(); j += 1) {
            System.out.print(j);
        }

        System.out.print("\n");     
        scrambledWord = scrambler(words[randWord]);
        System.out.println(scrambledWord);     

        System.out.println("\n");
        System.out.println("Enter 1 to swap a pair of letters.");
        System.out.println("Enter 2 to show the solution and quit.");
        System.out.println("Enter 3 to quit."); 
        option = input.nextInt();

        if (option == 1) {
            while (!scrambledWord.equals(words[randWord])) {
                index1 = 0;
                index2 = 0;
                boolean validOption = false;
                System.out.println("Enter the two index locations to swap separated by a space.");
                while (!validOption) {
                    if (input.hasNextInt()) {
                        index1 = input.nextInt();
                        index2 = input.nextInt();  
                        validOption = true;
                    }
                    else {
                        System.out.println("Please enter only numbers.");
                        validOption = false;
                        break;
                    }
                }
                String letter1 = scrambledWord.substring(index1, index1+1);
                String letter2 = scrambledWord.substring(index2, index2+1);
                System.out.println("replacing " + letter1 + " with " + letter2 + "...");
                if (index1 < index2) {
                    scrambledWord = scrambledWord.replaceFirst(letter2, letter1);                 
                    scrambledWord = scrambledWord.replaceFirst(letter1, letter2); 
                } else {
                    scrambledWord = scrambledWord.replaceFirst(letter1, letter2);                 
                    scrambledWord = scrambledWord.replaceFirst(letter2, letter1); 
                }
                System.out.println();
                for (int j = 0; j < words[randWord].length(); j += 1) {
                    System.out.print(j);
                }
                System.out.println("\n"+scrambledWord);
                System.out.println();
                counter++;
                if (scrambledWord.equals(words[randWord])){
                    System.out.println("You did it! The word was " + words[randWord]);
                    System.out.println("You got it with " + counter + " replacements!");
                    words[randWord] = null;
                    if (words.length == 0){
                        System.out.println("I'm all out of words. You win!");
                        System.exit(0);
                    } else {
                        main(args);
                    }
                }
            } 

        } else if (option == 2) {
            System.out.println(words[randWord]);
            System.exit(0);
        } else {
            System.exit(0);
        }
        input.close();
   }   

    //scrambles the word given to it
    private static String scrambler(String word) { 
        String scrambled = "";
        Random rand = new Random();
        int length;
        int index;
        String letter;
        String firststring;
        String secondstring;

        while (word.length()>0) {
            length = word.length();
            index = rand.nextInt(length);
            letter = word.substring(index, index+1);
            firststring = word.substring(0, index);
            secondstring = word.substring(index+1);
            word = firststring + secondstring;
            scrambled += letter;
        }
        return scrambled;
    }

    public static String[] readArray(String file) {
        int ctr = 0;
        try {
            Scanner s1 = new Scanner(new File(file));
            while (s1.hasNextLine()) {
                ctr = ctr + 1;
                s1.nextLine();
            }
            String[] words = new String[ctr];

            // Step 2:
            Scanner s2 = new Scanner(new File(file));
            for (int i = 0; i < ctr; i = i + 1) {
                words[i] = s2.next();

            }
            return words;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
        }
}

And here's the list of words in the file words.txt(I pretty much wrote down whatever popped into my head that did not have repeat letters): 这是words.txt文件中的单词列表(我几乎记下了突然出现的没有重复字母的所有内容):

orange
red
brown
black
white
blue
tiger
horse
bugs
stack
overflow
pathfinder
extra
zealous
wisdom
under
above
death
life
second
first
frost
forest

These are obviously not the only words that can go in, you can add as many as you want, as long as they do not have 2 occurrences of the same letter. 这些显然不是唯一可以输入的单词,您可以根据需要添加任意数量的单词,只要它们没有两次出现同一字母即可。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM