0

Java でハングマンの簡単なゲームを作ろうとしています。英語辞書の 120,000 語を含む、dictionary.txt という名前のテキスト ファイルがあります。ユーザーに単語の長さを要求し、その特定の長さの単語数を表示しようとすると、問題が発生します。

ここでかなりの時間を費やしてグーグルで検索した後、ここまでたどり着きましたが、今は立ち往生しています:

import java.util.Scanner;
import java.io.*;
import java.io.IOException;



public class Hangman 

{


public static void main(String[] args) throws IOException
{
    // declaring variables
    int wordLength;
    int guessNumber;


    // initiate the scanner
    Scanner keyboard = new Scanner( System.in );

    // read the dictionary file 

    File file = new File("dictionary.txt");
    StringBuilder contents = new StringBuilder();
    BufferedReader reader = null;



    // prompt the user for word length

    System.out.println("Welcome to Hangman. Let's play! ");
    System.out.println("Please enter the desired word length: ");
    wordLength = keyboard.nextInt();

    while(wordLength < 0 || wordLength > 26)
    {
        System.out.println("This is not a valid word length. ");
        System.out.println("Please enter the desired word length: ");
        wordLength = keyboard.nextInt();
    }

    // prompt the user for number of guesses 

    System.out.println("How many guesses do you want to have? ");
    guessNumber = keyboard.nextInt();

    while(guessNumber < 0)
    {
        System.out.println("Number of guesses has to be a postive integer. ");
        System.out.println("Please enter the desired number of guesses: ");
        guessNumber = keyboard.nextInt();
    }




    }

}

私の目標は、ユーザーに単語の長さを要求することです。目的の単語の長さが Dictionary.txt ファイルに存在しない場合は、有効な応答が返されるまで尋ね続けます。

また、指定された単語の長さを持つ単語の数を出力できるようにしたいと考えています (たとえば、ユーザーが「10」と入力すると、dictionary.txt 内の単語の長さが 10 文字であることが表示されます。

コードの次の部分は、txt ファイルを読み取り、その後動作するコードに置き換えたいと考えている部分です。

while(wordLength < 0 || wordLength > 26)
{
    System.out.println("This is not a valid word length. ");
    System.out.println("Please enter the desired word length: ");
    wordLength = keyboard.nextInt();
}

私が間違ったアプローチを取っている可能性があるので、すべてのフィードバックは大歓迎です!

4

2 に答える 2

1

このコードを使用して、各語長の語数を確立できます。

// map where the key is the length of a word and
// the value is the number of words of that length
Map<Integer, Integer> numberOfWordsOfLength = new HashMap<>();

Scanner dictionaryScanner = new Scanner(file);

while (dictionaryScanner.hasNext())
{
   String word = dictionaryScanner.next();
   int wordLength = word.length();
   numberOfWordsOfLength.put(wordLength, 1 +
      numberOfWordsOfLength.containsKey(wordLength) ?
      numberOfWordsOfLength.get(wordLength) :
      0);
}

次に、ある長さの単語が存在するかどうかを知りたい場合は、これを使用できます。

numberOfWordsOfLength.containsKey(length)

指定された長さの辞書内の単語数を取得する場合は、これを使用できます。

numberOfWordsOfLength.get(length)

後で、特定の長さの単語をランダムに選択したい場合は、次のようにすることができます。

int wordIndex = new Random().nextInt(numberOfWordsOfLength.get(length));
Scanner dictionaryScanner = new Scanner(file);
String word;
while (dictionaryScanner.hasNext())
{
   String candidateWord = dictionaryScanner.next();
   if (candidateWord.length() != length) continue;
   if (wordIndex == 0)
   {
      word = candidateWord;
      break;
   }
   --wordIndex;
}
于 2013-03-12T05:39:55.667 に答える
0

これを試して:

try
{
    Scanner input = new Scanner(file);
    boolean flag = true;
    while(flag)
    {
        ArrayList<String> words = new ArrayList<String>(120000);
        while(input.hasNextLine())
        {
            String s = in.nextLine();
            if(s.length() == wordLength)
            {
                words.add(s);
            }
        }
        if(words.isEmpty())
        {
            System.err.print("Invalid word length, please try again\n>");
            wordLength = keyboard.nextInt();
        }
        else
        {
            flag = false;
            System.out.println("There were " + words.size() + " such words");
        }
    }
}
catch(Exception e)
{
    e.printStackTrace();
}

それは機能しますか?

于 2013-03-12T05:47:29.453 に答える