2016-12-03 3 views
0

У меня есть игра Судоку, написанная на 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 

    } 
    } 
    } 

} Я хочу, чтобы установить максимальное время для игры, то выводим сообщение: «тайм-аут» и перейдите к Главное меню

+1

Возможный дубликат метода [Тайм-аут в java] (http://stackoverflow.com/questions/8982420/time-out-method-in-java) – brummfondel

ответ

0

TimerTask может помочь:

TimerTask task = new TimerTask() 
{ 
    public void run() 
    { 
     if(str.equals("")) 
     { 
      System.out.println("TimeOut. exit..."); 
      System.exit(0); //or other operation. 
     } 
    }  
}; 
Timer timer = new Timer(); 
timer.schedule(task, 10*1000); //10 seconds 
String cmd = myClassObject.getCommandFromScanner(); 
timer.cancel(); //if not timeout ,cancle it. 
System.out.println("you have entered: "+ cmd); 

Ref: https://stackoverflow.com/a/5854048/6037575

ОБНОВЛЕНО:

Установить тайм-аут для всей игры:

static void main(){ 
... 
// ready to start the game 
TimerTask task = new TimerTask() 
{ 
    public void run() 
    { 

      System.out.println("TimeOut.Return to the mani menu."); 
      course = menu; // how to return main menu is dependent on you 

    }  
}; 

while(true){ 
// Here the user is playing the game. 
// and if he can work it out before timeout 
// you should do something else to end the game. 
} 

К сожалению, я не могу дать вам реальный код, который может работает только в зависимости от кода, который вы дали, но только некоторые псевдокод что, по-моему, может быть приемлемым решением.

+0

Прежде всего, моя функция getCommandFromScanner возвращает boolean. Он считывает ввод и возвращает true, если пользователь пишет команду, чтобы заполнить пустую позицию на борту, если выбрать приглашение, сохранить игру, но вернуть false, если пользователь хочет выйти в главное меню (где он может начать новую игру, например). И только тогда моя петля прерывается. Пользователь может вводить команду все время, но если она длится больше, чем, например, 10 секунд, я хочу остановить игру и вернуться в главное меню. – adnut

+0

Так вы не ждете, пока пользователь нажмет 'Enter'? Если он нажал, scan.reaLline() вернется. И вы можете продолжить игру. Но если прошло 10 секунд, прежде чем он нажал «Ввод», вы выйдете из своей игры. –

+0

Я не хочу выходить, просто чтобы вернуть false. Но метод run void – adnut

Смежные вопросы