package edu.caltech.cs2.project02.choosers; import com.sun.source.util.Trees; import edu.caltech.cs2.project02.interfaces.IHangmanChooser; import java.io.File; import java.io.FileNotFoundException; import java.util.*; public class EvilHangmanChooser implements IHangmanChooser { private static String FILENAME = "data/scrabble.txt"; private int maxGuesses; private int wordLength; private SortedSet guessed = new TreeSet<>(); private SortedSet wordsSet = new TreeSet<>(); public EvilHangmanChooser(int wordLength, int maxGuesses) throws FileNotFoundException { this.wordLength = wordLength; if (this.wordLength < 1 || maxGuesses < 1) { throw new IllegalArgumentException(); } Scanner s = new Scanner(new File(FILENAME)); while (s.hasNext()) { String next = s.next(); if (next.length() == wordLength) { this.wordsSet.add(next); } } if (this.wordsSet.isEmpty()) { throw new IllegalStateException(); } this.maxGuesses = maxGuesses; } @Override public int makeGuess(char letter) { TreeMap> familyPatterns = new TreeMap<>(); boolean correctGuess = false; if (this.maxGuesses < 1) { throw new IllegalStateException(); } if (Character.toLowerCase(letter) != letter || !Character.isAlphabetic(letter)) { throw new IllegalArgumentException(); } if (guessed.contains(letter)) { throw new IllegalArgumentException(); } guessed.add(letter); int count = 0; for (String word : this.wordsSet) { String patternMatch = ""; for (Character character : word.toCharArray()) { if (guessed.contains(character)) { patternMatch += character; } else { patternMatch += "-"; } } TreeSet updatedSet = new TreeSet<>(); if (familyPatterns.containsKey(patternMatch)) { updatedSet = familyPatterns.get(patternMatch); } updatedSet.add(word); familyPatterns.put(patternMatch, updatedSet); } int biggestSize = 0; for (String key: familyPatterns.keySet()) { if (familyPatterns.get(key).size() > biggestSize) { biggestSize = familyPatterns.get(key).size(); this.wordsSet = familyPatterns.get(key); } } for (char character : this.wordsSet.first().toCharArray()) { if (character == letter) { count += 1; correctGuess = true; } } if (!correctGuess) { this.maxGuesses --; } return count; } @Override public boolean isGameOver() { if (maxGuesses <= 0) { return true; } for (char letter : this.getPattern().toCharArray()) { if (letter == '-') { return false; } } return true; } @Override public String getPattern() { String patternMatch = ""; for (Character character : wordsSet.first().toCharArray()) { if (guessed.contains(character)) { patternMatch += character; } else { patternMatch += "-"; } } return patternMatch; } @Override public SortedSet getGuesses() { return guessed; } @Override public int getGuessesRemaining() { return maxGuesses; } @Override public String getWord() { maxGuesses = 0; return null; } }