Поиграем?

  • 9
  • Недоступна
Три человека играют в игру. Каждый игрок(Gamer) характеризуется двумя параметрами: фамилией(name) и количеством действий в секунду (rating). Нужно вывести в консоль ход игры и определить победителя и проигравших. Итак... 1. Разберись, что делает программа. 1.1. List<String> steps хранит последовател
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (234)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Marica16 уровень
вчера, 15:31
зачем нужна переменная rating узнаешь из рекомендаций валидатора )
Vit16 уровень, Москва
вчера, 06:10
просто кабзда... решил задачу за 5минут, боролся с валидатором час. В итоге в задаче не поменялось ничего существенного, но валидатор схавал.
Dr Evil17 уровень, Киев
15 апреля, 15:44
Делал так: 1) Создаем в методе run() один большой блок try-catch. 2) В try создаем цикл for each с параметрами (String item : OnlineGame.steps). 3) Первым делом, в цикле пишем Thread.sleep(1000 / rating); 4) Затем пишем System.out.println(getName() + ":" + item); и закрываем цикл. 5) Все еще в блоке try добавляем уже не раз озвученный в комментах if, но добавляем к нему else, в котором преднамеренно создаем ошибку:
if (!OnlineGame.isWinnerFound) {
    OnlineGame.isWinnerFound = true;
    System.out.println(getName() + ":победитель!");
} else throw new InterruptedException();
6) В блоке catch ловим ошибку из else и выводим в консоль: System.out.println(getName() + ":проиграл");
Михаил Чирков22 уровень, Москва
14 апреля, 13:54
Кто-то может подсказать почему если проверяешь внтури метода run метод isInterrupted то он всегда false?
Lein23 уровень, Москва
30 марта, 14:27
4 попытки, и сплошная битва с валидатором - главное выводится все верно, но например у меня была лишняя проверка в блоке catch потому и не пропускало
NewBuy19 уровень, Санкт-Петербург
26 марта, 17:16
Либо я чего-то не понимаю, либо дизайн задачи капец какой кривой. Я вообще не понимаю, зачем здесь проверка ифом флага isWinnerFound. В данном коде, теоретически, поток может заснуть сразу после проверки условия, а другой поток в это время изменит флаг, и выведет фразу о победителе, после чего проснется первый поток (проверять заново условие isWinnerFound он уже не должен, он уже это сделал до спячки) и повторно установит isWinnerFound в true, после чего повторно выведет фразу о том что победитель найден. Итого два победителя. Более того, не теоретически, когда найден победитель программа продолжается и игроки могут продолжить делать свои ходы.
Андрей18 уровень, Новосибирск
4 апреля, 05:53
Зачем после проверки условия засыпать? Цикл по степам, слип в цикле, проверка после цикла.
NewBuy19 уровень, Санкт-Петербург
4 апреля, 17:21
А вы потестите этот код, ради интереса. А потом попробуйте договориться с планировщиком потоков, когда и как ему работать ;)
Андрей18 уровень, Новосибирск
4 апреля, 17:51
Зачем после проверки условия засыпать?
NewBuy19 уровень, Санкт-Петербург
4 апреля, 18:19
Хорошо, скажу яснее, планировщик потоков сам решает, когда какому потоку засыпать, и делает это не предсказуемо.
NewBuy19 уровень, Санкт-Петербург
5 апреля, 05:41
Почитайте про планировщик потоков. Он переводит поток из работающего в работоспособный без ведома программиста и без участия команды Thread.sleep(), при этом дает другому потоку время поработать. Это происходит не предсказуемо. (вернее мало предсказуемо)
NewBuy19 уровень, Санкт-Петербург
25 марта, 18:36
Почему нельзя использовать просто sleep(1000/rating); ??? Обязательно нужен Thread.sleep(1000/rating);
Семён20 уровень, Екатеринбург
10 апреля, 03:03
Спасибо тебе, добрый человек, у меня из за этого не принимало, я долго не мог понять. Прошу объяснить опытных людей отличие в этом случае Thread.sleep от просто sleep
Tony G19 уровень, Самара
16 апреля, 10:42
В данном конкретном случае отличия никакого нет. Метод sleep() статический и прописан в классе Thread. Соответственно, при вызове этого метода, мы должны указать класс, которому он принадлежит. НО, так как наш класс наследуется от Thread, он уже знает о существовании этого метода, поэтому Thread писать не нужно. Это имело бы смысл, если бы в нашем классе существовал переопределённый метод sleep(). Тогда, если бы мы хотели вызвать реализацию sleep() , прописанную в Thread, мы бы написали: super.sleep().
Vladislav Polekha25 уровень, Penza
19 марта, 12:58
лучше чем 72%. я гений что ли?
katfald18 уровень, Киев
31 марта, 08:21
я тоже))) но на самом деле нет - просто хорошо составленное задание, что здесь редкость
Sergey Pedchenko19 уровень, Москва
18 марта, 09:57
Решил с проверкой:
if (!OnlineGame.isWinnerFound){
    OnlineGame.isWinnerFound = true;
    System.out.println(String.format("%s:победитель!", getName()));
}
Но даже это не спасает, если у игроков одинаковая скорость, периодически при прогоне получается такой вывод: Petrov:Начало игры Sidorov:Начало игры Ivanov:Начало игры Sidorov:Сбор ресурсов Petrov:Сбор ресурсов Ivanov:Сбор ресурсов Sidorov:Рост экономики Petrov:Рост экономики Ivanov:Рост экономики Petrov:Убийство врагов Sidorov:Убийство врагов Ivanov:Убийство врагов Petrov:победитель! Sidorov:победитель! Ivanov:проиграл Но валидатор всё принял. Интересно, как сделать так, чтобы при трёх параллельных потоках, работающих с одинаковой скоростью, был только один правильный вывод?
NewBuy19 уровень, Санкт-Петербург
25 марта, 18:38
подозреваю что нужно заключить весь ваш блок if в synchronized (this) {}
NewBuy19 уровень, Санкт-Петербург
26 марта, 16:43
Наверное нет. По идее для этого надо не наследовать поток, классом геймер, а создать задачу для потока (таск) реализовав интерфейс Runnuble, и в нем уже целиком синхронизировать метод run(), после чего один созданный объект этого интерфейса передавать каждому потоку (игроку).
Андрей18 уровень, Новосибирск
4 апреля, 23:54
Воу-воу-воу, тут ещё не положено знать про синхронизацию)))
Denis Filokhin19 уровень
16 марта, 08:23
Вывод информации о проигравших и остановку цикла по ним нужно обязательно пихать в catch . Иначе валидатор не принимает :(
Volodymyr Kotyk18 уровень, Киев
24 марта, 19:35
8 попыток, не могу понять какой catch, если я закрываю тред руками, спустя 30 минут увидел interrupt и main методе =((
Viktor 17 уровень
12 апреля, 22:59
спасибо! валидатор бука еще та..