Несколько таймеров работают, когда две задачи таймера запланированы во время игры с участием человека и процессора - PullRequest
0 голосов
/ 13 марта 2019

еще раз. Я продолжаю получать IllegalStateException, когда пытаюсь выполнить задачу после одного хода. В частности, упоминание о том, что задача уже запланирована или отменена. Вы знаете, как это исправить? Вот некоторый соответствующий код.

public class Human_Agent implements GipfPlayable {

    String[] edgeSpots;
    String[] columns;
    Random rng;
    GipfGame mg;
    //int turn = 0;
    String str;
    Timer t;
    Integer val;
    Integer myDir;
    public Human_Agent(GipfGame g) {
        this.edgeSpots = g.getEdgeSpots();
        this.columns = g.getColumns();
        rng = new Random(37);
        //turn = 0;
    }
    TimerTask task1 = new TimerTask()
    {
        public void run()
        {

            if (str.equals(""))
            {
                System.out.println("You did not input a valid location.");
                System.exit(0);
            }

        }
    };
    TimerTask task2 = new TimerTask()
    {
        public void run()
        {

            if (val == null)
            {
                System.out.println("You did not input a valid direction.");
                System.exit(0);
            }
        }
    };

    public String getUserInput() throws Exception
    {
        t = new Timer();
        t.schedule(task1, 5*1000);
        Scanner scan = new Scanner(System.in);
        System.out.print("Please provide a starting location: ");
        String startLocation = "";
        String x = scan.nextLine();
        str = x;
        int dirE = 0;
        //t.cancel();
       // Timer t2 = new Timer();
        if (isItValidLocation(x))
        {
        startLocation = x;
        t.cancel();
        t = new Timer();
        t.schedule(task2, 10*1000);
        //t.scheduleAtFixedRate(task2, 5000, 5*1000);
        System.out.print("\n Now, provide a number to move the piece");
         dirE = scan.nextInt();
         t.cancel();
        }
        else
        {
            System.out.println("Invalid Start location.");
            t.cancel();
        }
       // scan.close();
       // t.cancel();
         return str + " " + Integer.toString(dirE);
    }
    @Override
    public String makeGipfMove() {
        String s;
        try
        {
            s = getUserInput();
        }
        catch(Exception e)
        {
        String startLocation = edgeSpots[rng.nextInt(edgeSpots.length)];
        Integer dir = rng.nextInt(6);
        s = startLocation + " " + Integer.toString(dir);
        e.printStackTrace();
        }

//        if ((mg.makeMove(x, dirE)) == false)
//        {
//            System.out.println("Can't move here.");
//        }
        //mg.makeMove(x, dirE);
       // Integer dir = rng.nextInt(6);
        //System.out.println("GIPHS REMAINING: " + )

       return s;
    }
    public boolean isItValidLocation(String a)
    {
        boolean v = false;
        System.out.println("YOU ENTERED: " + a);
        for (int i = 0; i < edgeSpots.length; i++)
        {
            System.out.println(edgeSpots[i]);
            if ((edgeSpots[i].equals(a)) && (v != true))
            {
                 v = true;
            }

        }
        System.out.println(v);
        return v;
    }

}

Этот код выполняет игру Gipf с человеком-агентом.

Похоже, ваш пост в основном кодовый; пожалуйста, добавьте еще некоторые детали. (Netbeans должен избавиться от этого, если вы добавили подробности о своем коде!)

1 Ответ

0 голосов
/ 13 марта 2019

Так же, как вы не можете повторно использовать Timer после отмены, вы не можете повторно использовать TimerTask.

Вы можете создавать классы, расширяющие TimerTask, и создавать их экземпляры всякий раз, когда вам нужно запланировать это.

...