Почему мне сразу выкидывает окно проигрыша?
Есть игра в слова (правила думаю всем известный), но есть в ней проблема. А именно в цикле, там слово, которое ты вводишь должно проверятся на правильность (начинается ли моё слово с буквы, на которую заканчивается слово компьютера (здесь слова берутся из текстового документа).
И в этой проверке должно вызываться окно проигрыша, но почему-то когда я ввожу первое слово, мне сразу же выкидывает это окно. Вопрос заключается в том, каким образом цикл попадает в данный блок кода:
if (!IsWordStartWith(word, getLastChar(fileWord))) {
new RussianLose();
return ("" + score);//первая буква не подходит
}
Вот полный код:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Russian extends JFrame implements ActionListener {
JFrame frame = new JFrame("Игра в слова");
JTextField myword = new JTextField();
JTextField fileword = new JTextField();
JTextField information = new JTextField();
JTextField score1 = new JTextField();
JButton button =new JButton("Ответить");
JButton button1 = new JButton("Меню");
JLabel MYWORD = new JLabel("Введите ваше слово");
JLabel SCORE = new JLabel("Счёт");
public static void main(String[] args) throws IOException {
new Russian();
}
Russian(){
frame.setLayout(null);
frame.setVisible(true);
frame.getContentPane().setBackground(new Color(145,23,193));
frame.setResizable(false);
ImageIcon image = new ImageIcon(
"icons8-ps-controller-30.png");
frame.setIconImage(image.getImage());
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
JLabel game = new JLabel("Игра в слова");
game.setBounds(570,100,500,50);
game.setFont(new Font("Verdana", Font.TYPE1_FONT, 50));
frame.add(game);
myword.setBounds(500,250,500,100);
myword.setFont(new Font("Verdana", Font.PLAIN, 50));
myword.setBackground(new Color(0xFFFFFFFF, true));
frame.add(myword);
MYWORD.setBounds(600,320,400,100);
MYWORD.setFont(new Font("Verdana", Font.PLAIN, 30));
SCORE.setBounds(1300,50,100,50);
SCORE.setFont(new Font("Verdana", Font.PLAIN, 30));
frame.add(SCORE);
frame.add(MYWORD);
fileword.setBounds(500,430,500,100);
fileword.setFont(new Font("Verdana", Font.PLAIN, 50));
fileword.setBackground(new Color(0xFFFFFFFF, true));
fileword.setEditable(false);
frame.add(fileword);
information.setBounds(500,560,500,100);
information.setFont(new Font("Verdana", Font.PLAIN, 30));
information.setBackground(new Color(0xFFFFFFFF, true));
information.setEditable(false);
frame.add(information);
score1.setBounds( 1400,50,50,50);
score1.setFont(new Font("Verdana", Font.PLAIN, 20));
score1.setEditable(false);
frame.add(score1);
button.setBounds(600,700,300,100);
button.setFont(new Font("Verdana", Font.PLAIN, 20));
button.setBackground(new Color(225, 192, 192));
button.addActionListener(this);
frame.add(button);
button1.setBounds(50,50,100,50);
button1.setBackground(new Color(225, 192, 192));
button1.setFont(new Font("Verdana", Font.PLAIN, 20));
frame.add(button1);
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setVisible(false);
new MainFrame();
}
});
}
long score = 0;
Scanner scanner = null;
Scanner in = null;
File file = new File("russian_nouns.txt");
private final Set<String> repeatedWords = new HashSet<>();
public String run(String word) throws FileNotFoundException {
String fileWord;
while (true) {
if (isInputedWordCorrect(word) && !isWordInListOfRepeat(word)) {// проверка введенного слова на корректность и повтор
score++;//после каждого введенного слова прошедшего условия добавляется +1 в счет
addToListOfRepeat(word); //добавляет введенное слово в список повторов
fileWord = getWordFromFileOnChar(getLastChar(word));//ищет слово на заданную букву в файле
if (fileWord.isEmpty()) {//если слова в списке на данную букву закончились функция вернет ""
new RussianWin();
frame.setVisible(false);
JOptionPane.showMessageDialog(frame, "Ваш счет "+score);
return ("" + score);//слова в списке на данную букву закончлись
} else {
if(IsWordStartWith(word, getLastChar(fileWord))) {
fileword.setText(fileWord);
addToListOfRepeat(fileWord);
word = inputWord(getLastChar(fileWord));//пользователь вводит слово
}
if (!IsWordStartWith(word, getLastChar(fileWord))) {
new RussianLose();
return ("" + score);//первая буква не подходит
}
}
} else {
frame.setVisible(false);
new RussianLose();
JOptionPane.showMessageDialog(frame, "Ваш счет "+score);
return ("" + score);//слово либо уже было, либо его нет в списке
}
}
}
boolean IsWordStartWith(String word, char firstChar) {//проверяет начинается ли слово с заданной буквы
return word.charAt(0) == firstChar;
}
String getWordFromFileOnChar(char firstChar) throws FileNotFoundException {//ищет в списке слово, начинающееся с заданной букввы(также отсеивает повторы)
scanner = new Scanner(file);
String word = "";
while (scanner.hasNextLine()) {
word = scanner.nextLine();
if (IsWordStartWith(word, firstChar) && !isWordInListOfRepeat(word)) {//слово которое начинает с новой буквы и не повторяется
break;
}
}
if (IsWordStartWith(word, firstChar) && !isWordInListOfRepeat(word)) {//если цикл выше не находит подходящего слова, он остановится на последнем в списке, поэтому еще одна проверка
scanner.close();
return word;
} else {
scanner.close();
return "";
}
}
boolean isWordInListOfRepeat(String word) {//есть ли слово в списке тех, которые уже были
return repeatedWords.contains(word);
}
void addToListOfRepeat(String word) {
repeatedWords.add(word);
}
char getLastChar(String word) {
return word.charAt(word.length() - 1);
}
String inputWord(char firstChar) {
information.setText("Введеите слово на букву " + firstChar);
in = new Scanner(System.in, StandardCharsets.UTF_8);
return myword.getText();
}
boolean isInputedWordCorrect(String inputedWord) throws FileNotFoundException {//проверяет есть ли слово в списке(существует ли такое слово)
scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String nextWord = scanner.nextLine();
if (nextWord.equals(inputedWord)) {
scanner.close();
return true;
}
}
scanner.close();
information.setText("Неправильное слово");
new RussianLose();
frame.setVisible(false);
return false;
}
@Override
public void actionPerformed(ActionEvent e) {
String s1 = myword.getText();
try {
score1.setText(run(s1));
myword.setText("");
} catch (FileNotFoundException ex) {
throw new RuntimeException(ex);
}
}
}