У меня есть игра Судоку, написанная на Java. Основной ход игры - основной метод. У меня есть цикл while, в котором у меня есть функция myClassObject.getCommandFromScanner() для чтения ввода со Сканером, поэтому пользователь может заполнить пустую позицию на плате судоку или выбрать другую опцию из меню (например, сохранить, показать решение и выйти на главную меню). Этот цикл заканчивается, только если пользователь выбирает выход в меню, потому что функция myClassObject.getCommandFromScanner() возвращает false только в этом случае. Я хочу установить указанное время игры, но не могу сделать это во время цикла (while ((System.currentTimeMillis() - nGame.timeAtStart < 10000) & & myClassObject.getCommandFromScanner())) < - впервые первый условие истинно, и цикл может ждать ввода и включения пользователя. Только если пользователь вводит что-то, условие цикла снова chceck, а затем выходит из этого цикла. Как я могу решить эту проблему? Я также пытаюсь использовать ExecutorService, и он почти работает, цикл выполняется в течение определенного времени, но затем он выходит в меню, и пользователь не может запускать новую игру. Сканер перестает работать правильно, и мое главное окно с игрой разбилось ... Я здесь новый, поэтому извините, если мой вопрос недостаточно ясен. Я надеюсь, что вы поможете мнеКак установить максимальное время выполнения для метода?
public class Sudoku
{
public static void main(String[] args) throws Exception
{
while(course != exit)
{
opt = new String(in.next());
int option;
option = Character.getNumericValue(opt.codePointAt(0));
if(course == menu)
{
//go to menu
}
else if(course == newGame)
{
//setup new game
}
if(course == game)
{
nGame.timeAtStart=System.currentTimeMillis();
myClassObject.setGame(newGame);
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<?> future = executor.submit(new Runnable() {
@Override
public void run() {
try{
while(myClassObject.getCommandFromScanner());
}
catch(Exception e) {}
}
});
executor.shutdown();
try {
future.get(8, TimeUnit.SECONDS); //
} catch (InterruptedException e) { //
System.out.println("job was interrupted");
} catch (ExecutionException e) {
System.out.println("caught exception: " + e.getCause());
} catch (TimeoutException e) {
future.cancel(true);
System.out.println("Your game timed out!");
}
course.printMessage("TIMEOUT");
course = menu;
}
}
}
}
Это оригинальная версия моего кода:
public class Sudoku
{
public static void main(String[] args) throws Exception
{
while(course != exit)
{
opt = new String(in.next());
int option;
option = Character.getNumericValue(opt.codePointAt(0));
if(course == menu)
{
//go to menu
}
else if(course == newGame)
{
//setup new game
}
if(course == game)
{
nGame.timeAtStart=System.currentTimeMillis();
myClassObject.setGame(newGame);
while(myClassObject.getCommandFromScanner()); //while user don't choose 'menu' option, read input from keyboard
course = menu; //user choose 'menu', go to menu section
}
}
}
} Я хочу, чтобы установить максимальное время для игры, то выводим сообщение: «тайм-аут» и перейдите к Главное меню
Возможный дубликат метода [Тайм-аут в java] (http://stackoverflow.com/questions/8982420/time-out-method-in-java) – brummfondel