public class Solution { public static void main(String[] args) throws InterruptedException { OnlineGame onlineGame = new OnlineGame(); onlineGame.start(); }

public static class OnlineGame extends Thread {
    public static volatile boolean isWinnerFound = false;

    public static List<String> steps = new ArrayList<String>();

    static {
        steps.add("Начало игры");
        steps.add("Сбор ресурсов");
        steps.add("Рост экономики");
        steps.add("Убийство врагов");
    }

    protected Gamer gamer1 = new Gamer("Ivanov", 3);
    protected Gamer gamer2 = new Gamer("Petrov", 1);
    protected Gamer gamer3 = new Gamer("Sidorov", 5);

    public void run() {
        gamer1.start();
        gamer2.start();
        gamer3.start();

        while (!isWinnerFound) {
        }
        gamer1.interrupt();
        gamer2.interrupt();
        gamer3.interrupt();
    }
}

public static class Gamer extends Thread {
    private int rating;

    public Gamer(String name, int rating) {
        super(name);
        this.rating = rating;
    }

    @Override
    public void run() {
        try {
            for (int i = 0; i < OnlineGame.steps.size(); i++)
            {
                if(OnlineGame.isWinnerFound == true){break;}
                System.out.println(getName() + ":" + OnlineGame.steps.get(i));
                if(i == OnlineGame.steps.size()-1){
                    {System.out.println(getName() + ":победитель!"); OnlineGame.isWinnerFound = true; break;}
                }
                Thread.sleep(1000/rating); //Add your code here - добавь код тут
            }

        } catch (InterruptedException e) {
            System.out.println(getName() + ":проиграл");
            }
        }
    }

Уже как только не пробовал пишет: Метод run класса Gamer через равные интервалы времени (1000ms / rating) должен выводить в консоль фамилию игрока (метод getName()), потом двоеточие, а затем текст из OnlineGame.steps. Пример: [Ivanov:Начало игры].

задан 20 Мар, 16:00

Nubiboto's gravatar image

Nubiboto
132
одобрено: 50%


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

Ivanov:Начало игры Petrov:Начало игры Sidorov:Начало игры Sidorov:Сбор ресурсов Ivanov:Сбор ресурсов Sidorov:Рост экономики Sidorov:Убийство врагов Ivanov:Рост экономики Sidorov:победитель! Ivanov:проиграл Ivanov:Убийство врагов Petrov:проиграл Petrov:Сбор ресурсов Petrov:Рост экономики Petrov:Убийство врагов

Process finished with exit code 0

ссылка

опубликован 21 Мар, 10:53

Nubiboto's gravatar image

Nubiboto
132
одобрено: 50%

Во первых метод сначала должен засыпать, а только потом выводить, потому, что игра начинается, как только запустился метод ран и игроки имеют изначально разную скорость, а у тебя получается, что они сначала стартуют, а потом двигаются со своей скоростью. Так же никаких проверок в цикле быть не должно, как только кончается цикл, нить переходит к выводу сообщения "Победитель" и присваивает значение переменной isWinner - true, чтобы у других игроков (нитей) которые еще не закончили цикл выскакивал эксепшн со словом "проиграл".

ссылка

опубликован 20 Мар, 16:51

BargystVelp's gravatar image

BargystVelp
693
одобрено: 50%

А перед выводом пробовал проверять не является ли переменная isWinner тру или фолс? Скинь код который у тебя имеется на данный момент. Я вынес проверку после цикла и у меня прошла, но еще у меня try непосредственно перед слипом была, а не за циклом как у тебя. Так, я спать. Экспериментируй, у тебя все получится!

(20 Мар, 17:03) BargystVelp

итак и так делал: если выносишь проверку из цикла, то выдает ошибку валидатор : Если игрок стал победителем, его метод run должен вывести надпись [getName() + :победитель!]. Например: [Sidorov:победитель!].

а засыпание в начале ничего не дает, валидатор не реагирует

(20 Мар, 16:55) Nubiboto

public void run() {

            for (String steps : OnlineGame.steps)
            {
                if (OnlineGame.isWinnerFound) break;
                System.out.println(getName() + ":" + steps);
                try
                {
                    Thread.sleep(1000 / rating);
                }
                catch(InterruptedException e)
                {
                    System.out.println(getName() + ":проиграл");
                }

            }

            System.out.println(getName() + ":победитель!"); OnlineGame.isWinnerFound = true;

        }
такой вариант валидатору вообще не нравиться по пунктам сна и вывода победителя
ссылка

опубликован 21 Мар, 10:30

Nubiboto's gravatar image

Nubiboto
132
одобрено: 50%

Ваш ответ
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×9
×1

Задан: 20 Мар, 16:00

Просмотров: 73 раз

Отредактирован: 21 Мар, 10:53