简体   繁体   中英

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.

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.

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. 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:

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):

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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