如何扰乱从文本文件中随机挑选的单词

时间:2022-08-25 15:58:02

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. 在屏幕上打印出来之前,先将字词弄乱,然后

  3. How to get the user to be able to loop through swapping 2 indexes at a time until the word is unscrambled.
  4. 如何让用户能够循环一次交换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;

    }
}

2 个解决方案

#1


1  

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. 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. Here's the program:

我对您的代码进行了一些非常重要的修改,包括添加了一个加扰器方法。该程序几乎是完美的,它只是你的文件“words.txt”不能容纳重复字母的单词。例如,黄色,绿色和紫色不会正确解读,但白色,灰色,蓝色,橙色或红色将正常工作。除此之外,该计划运作良好。它选择一个随机单词,然后当它被解决时,选择一个不同的单词,将最后一个单词改为null,这样就不会再被选中。这是程序:

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.

这些显然不是唯一可以进入的单词,您可以添加任意数量的单词,只要它们没有相同字母的2次出现即可。

#2


1  

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

#1


1  

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. 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. Here's the program:

我对您的代码进行了一些非常重要的修改,包括添加了一个加扰器方法。该程序几乎是完美的,它只是你的文件“words.txt”不能容纳重复字母的单词。例如,黄色,绿色和紫色不会正确解读,但白色,灰色,蓝色,橙色或红色将正常工作。除此之外,该计划运作良好。它选择一个随机单词,然后当它被解决时,选择一个不同的单词,将最后一个单词改为null,这样就不会再被选中。这是程序:

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.

这些显然不是唯一可以进入的单词,您可以添加任意数量的单词,只要它们没有相同字母的2次出现即可。

#2


1  

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