TransWikia.com

Не знаю как реализовать отсчёт секунд в моём случае Java

Stack Overflow на русском Asked by Samvise on November 5, 2021

Я сделал программу, которая создаёт случайные примеры, и ты должен на них ответить. После её написания программы я решил сделать ограничение по времени, но столкнулся с тем, что программа не продолжается, пока я не напишу ответ. Как можно это реализовать?

import java.io.*;

public class Sum 
{
   public static void main (String[] args) throws IOException
   {
       String operands[] = {"+", "-", "/", "*"};
       int first, second, op, score = 0;
       double res;
       System.out.println("Если вы хотите закончить, то введите слово "stop"." );
       
       do
       {       
          System.out.print("Решите следующий пример:  ");
          one: for (;;) 
          {    
             first = (int) (Math.random() * 100);
             second = (int) (Math.random() * 100);
             op = (int)Math.floor(Math.random() * operands.length);
             if (op == 2 & (first % second != 0 | second == 0))
             {
                 for (;;)
                 {
                    first = (int) (Math.random() * 100);
                    second = (int) (Math.random() * 100);
                    if (second != 0 && first % second == 0 && first >= second) 
                    {
                        System.out.print(first + " " +  operands[op] + " " +  second + " = ");
                        break one;
                    }
                 }
             }
             else
             {  
                System.out.print(first + " " +  operands[op] + " " +  second + " = ");
                break;
             }
             
             
          }
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          String str =  br.readLine();
          System.out.print("Оставшееся время: 15");
          for (int sec = 0; sec < 15; sec++)
          {
              System.out.print("bb" + sec);
              try 
              {
                Thread.sleep(1000);
              }
              catch (InterruptedException e) 
              {
                e.printStackTrace();
              }
              
          }
          int c;
          if ( str.equals("stop")) 
          {
              System.out.println("Вы уверены?");
              String answer =  br.readLine();
              switch (answer)
              {
                case "Да": System.out.println("Подсчёт очков: " + score + ".");
                break;
                case "Нет": continue;
              }
              break;
          }   
          else
          {
             try
             {
               c = Integer.parseInt(str);;
             }
             catch (NumberFormatException exp)
             {
                 System.out.println("Неверный формат!");
                 continue;
             }
          } 
          switch (op)
          {
             case 0: 
                if (first + second == c) 
                {
                    System.out.println("Всё верно!");
                    score++;
                    continue;
                }
                else 
                {
                    System.out.println("Неверно!");
                    continue;
                }
             case 1: 
                 if (first - second == c) 
                 {
                     System.out.println("Всё верно!");
                     score++;
                     continue;
                 }
                 else 
                 {
                     System.out.println("Неверно!");
                     continue;
                 }
             case 2: 
                 if (first / second == c) 
                 {
                     System.out.println("Всё верно!");
                     score++;
                     continue;
                 }
                 else 
                 {
                     System.out.println("Неверно!");
                     continue;
                 }
             case 3: 
                 if (first * second == c)
                 {
                     System.out.println("Всё верно!");
                     score++;
                     continue;
                 }
                 else
                 {
                     System.out.println("Неверно!");
                     continue;
                 }
          }
       } while(first != 1024);
   }
}

One Answer

Вот пример. Он конечно базовый, и многого не учитывает, но идею даст.

Сперва реализуем интерфейс Callable. Это задача, которая может исполняться параллельно и возвращает какой-то результат.

package click.webelement.so;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.concurrent.Callable;

public class Question implements Callable<Boolean> {

    String question;
    int correctAnswer;

    public Question(String question, int correctAnswer){
        this.question = question;
        this.correctAnswer = correctAnswer;
    }

    @Override
    public Boolean call() throws Exception {
        System.out.println(question);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        while (!bufferedReader.ready()){
            Thread.sleep(100);
        }
        if(Integer.parseInt(bufferedReader.readLine()) == correctAnswer){
            return true;
        }
        return false;
    }
}

В основном методе мы показываем вопрос и считываем вариант ответа.

Далее в главном потоке мы раз в секунду проверяем результат:

package click.webelement.so;

import click.webelement.so.Question;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TimeLimitTask {

    public static void main(String[] args) {
        int totalScore = 0;
        totalScore += askQuestion(new Question("Test question 1", 1));
        totalScore += askQuestion(new Question("Test question 2", 2));
        if (totalScore > 1){
            System.out.println("Test passed");
        }else{
            System.out.println("Test failed");
        }
    }

    public static int askQuestion(Question question) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        Future<Boolean> questionFuture = executorService.submit(question);
        int secondsPassed = 0;
        try {
            while (secondsPassed < 5) {
                if (questionFuture.isDone()) {
                    if (questionFuture.get()) {
                        System.out.println("Correct answer!");
                        return 1;
                    } else {
                        System.out.println("Incorrect answer!");
                        return 0;
                    }
                }
                Thread.sleep(1000);
                secondsPassed++;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        } finally {
            executorService.shutdownNow();
        }
        System.out.println("No answer received in time..");
        return 0;
    }

}

Тут есть ряд моментов, которые можно и нужно улучшать, но в целом, идею этот вариант обрисовывает.

Answered by Alexey R. on November 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP