Поиграем?

  • 9
  • Недоступна
Три человека играют в игру. Каждый игрок(Gamer) характеризуется двумя параметрами: фамилией(name) и количеством действий в секунду (rating). Нужно вывести в консоль ход игры и определить победителя и проигравших. Итак... 1. Разберись, что делает программа. 1.1. List steps хранит последовател
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (202)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Viktor Kalyniuk17 уровень, Киев
вчера, 11:24
То чувство когда сделал идеально правильно с первого раза все работает как надо и так приятно на душе, такое ощущение что понимаешь и все такое. А ВАЛИДАТОР ТАК НЕ ДУМАЕТ ЕМУ НЕ НРАВИТСЯ КУРЕНТРЕДЫ, ЕМУ НЕ НРАВИТСЯ ТЕКСТ, ЕМУ НЕ НРАВИТСЯ НИЧЕГО !!!! Вспомнил как наш дружбан нас сначала обнадежил а потом обозвал щенками))
Влад Иванов22 уровень, Нижний Новгород
3 февраля, 22:35
Если у вас ругается на вывод шагов и условия вывода победителя. Если у вас стоит
System.out.println(Thread.currentThread().getName() + ":" + steps.get(i));
Уберите Thread... оставьте просто getName(). Минус 3 мои попытки из-за этой фигни)
S3R3N1TY22 уровень, Санкт-Петербург
26 января, 14:58
Зачем валидатору нужно обязательная проверка условия
if(!OnlineGame.isWinnerFound){
                System.out.println(getName() + ":победитель!");
                OnlineGame.isWinnerFound = true; }
Ведь если мы уже здесь значит поток вышел из цикла, а остальные потоки выкинули исключения после interrupt, которое мы перехватили и вывели что они програли.
catch (InterruptedException e) {
                    System.out.println(getName()+":проиграл");
                    return;
                }
return выходит из метода. Без if результат такой же в таком случае. Ваше мнение
Leo18 уровень, Москва
27 января, 17:48
плюсую. тоже не понятно в чем прикол
shteynu17 уровень
10 февраля, 10:55
я вот если честно чето туплю а как он заходит вот сюда? - if(!OnlineGame.isWinnerFound), он же фолс изначально
S3R3N1TY22 уровень, Санкт-Петербург
10 февраля, 20:13
В это условие if(!OnlineGame.isWinnerFound) попадает только тот поток, который выиграл. Изначально переменная isWinnerFound=false, а в условии стоит проверка "Если не==true", то есть первый закончивший свое исполнение поток заходит в это условие и пишет, что победил, затем меняет значение volatile isWinnerFound на true и завершает свою работу; Соответственно дальше в методе main завершается цикл и всем троим потокам кидается interrupt, те кто живы еще, отвечают на это "проиграл". Попробуй через дебаггер поставить точки остановки в режиме Thread и проследить жизнь каждого потока. Если не писать условие if(!OnlineGame.isWinnerFound){...} то все завершится также, ни у кого же не было ситуации когда два потока писали что они оба победили? Потому что всегда кто-то первым приходит и меняет значение переменной на true и тут же кидаются интеррапты другим, они уже не могут доползти до проверки этого условия, так как пишут Проиграл и выходят.
shteynu17 уровень
10 февраля, 20:26
насчет потоков у меня нет проблем. По мне так условие if(!OnlineGame.isWinnerFound) это по буквам - "если не фолс", то есть зайдет в том случае если тру, а как он зайдет если изначально переменная фолс?
S3R3N1TY22 уровень, Санкт-Петербург
10 февраля, 20:39
Переменная да изначально false, но условие читается как Если не ==true то заходим внутрь условия. Выше неверно написал, не Пока , а . Если не
Руслан18 уровень, Москва
12 февраля, 18:56
Дело наверное в этом пункте - 2. Когда все игровые шаги будут выполнены, а победитель еще не найден
Artur28 уровень
26 января, 10:59
Побольше бы таких задач, интересно и помогает глубже понять многопоточность
Voyager22 уровень, Киев
22 января, 12:45
Интересная задача, валидатор принял когда sleep переместил в начало while и добавил break() в catch.
Андрей Г20 уровень
19 января, 12:14
Так нифига я и не понял, почему при прерывании нифига не прерывается.. В результате в наглую в catch прописал this.stop. Как ни странно, валидатор был удовлетворен)
Voyager22 уровень, Киев
22 января, 12:46
Видимо оно выполняло код после catch.
Дмитрий Ковтонюк19 уровень, Киев
14 января, 20:31
Вы решили задачу лучше, чем 1% учеников. Вам удалось ее решить с 19 попытки. жесть!
Constantine22 уровень
12 января, 00:26
9 попыток на - if (OnlineGame.isWinnerFound) { System.out.println(getName() + ":проиграл");} Валику хорошо, когда без выдрюкиваний, просто - "System.out.println(getName() + ":проиграл");"
Kirill Serebryansky22 уровень, Харьков
11 января, 11:53
А для чего нужен пустой цикл?
Artur28 уровень
26 января, 10:57
Пустой цикл нужен, чтобы дождаться, когда isWinnerFound примет значение true, иначе говоря дождаться выяснения победителя, чтобы потом уже завершать игру прерывая потоки(сразу после этого цикла для всех потоков вызывается метод interrupt)
Maksim29 уровень, Санкт-Петербург
10 января, 14:23
16 попыток... В консоль вылетало: Ivanov:Начало игры Sidorov:Начало игры Petrov:Начало игры Sidorov:Сбор ресурсов Ivanov:Сбор ресурсов Sidorov:Рост экономики Sidorov:Убийство врагов Sidorov:победитель! Sidorov:проиграл Ivanov:проиграл Petrov:проиграл Не мог понять, что за фигня... Пробовал делал разные варианты, но безрезультатно. Пробовал OnlineGame.sleep(1000/rating), пробовал и sleep(1000/rating). Вообще не думал, что проблема именно в этой строке. Но в итоге валидатор принял Thread.sleep(1000/rating), несмотря на то, что вывод в консоль не изменился и Сидоров сначала победил, потом сразу проиграл...