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

时间:2017-05-14 20:20:32

标签: java arrays character

我正在尝试编写一个程序,从文本文件中选取一个随机单词,对其进行加密,并允许用户通过一次交换2个索引位置来解密它。

我有一个程序,它从文本文件中抓取一个随机单词并打印出来,上面有索引号。

我无法弄清楚如何:

  1. 在屏幕上打印出来之前将字词弄乱,然后
  2. 如何让用户能够循环遍历2个索引,直到单词被解密为止。
  3. 我可以编写一个可以执行这些操作的方法吗?

    到目前为止,这是我的代码。

    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 个答案:

答案 0 :(得分:1)

您正在错误地阅读该文件。做

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)

我对你的代码进行了一些非常重大的修改,包括添加一个加扰器方法。该程序几乎是完美的,它只是你的文件&#34; words.txt&#34;不能用重复的字母来保存单词。例如,黄色,绿色和紫色不能正确解读,但白色,灰色,蓝色,橙色或红色可以正常工作。除此之外,该计划运作良好。它选择一个随机单词,然后当它被解决时,选择一个不同的单词,将最后一个单词改为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;
        }
}

这里是文件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

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