Скажите, пожалуста, почему не принимает такой вариант решения (валидатор говорит, что не соблюдены эти условия, хотя в консоль все выводится)
Метод run класса Gamer через равные интервалы времени (1000ms / rating) должен выводить в консоль фамилию игрока (метод getName()), потом двоеточие, а затем текст из OnlineGame.steps. Пример: Ivanov:Начало игры
Если игрок стал победителем, его метод run должен вывести надпись getName() + ":победитель!". Например: Sidorov:победитель!
package com.javarush.task.task16.task1627;
import java.util.ArrayList;
import java.util.List;
/*
Поиграем?
*/
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() {
Thread current = Thread.currentThread();
int count = 0;
while (!OnlineGame.isWinnerFound) {
try {
for (String str : OnlineGame.steps) {
System.out.println(current.getName() + ":" + str);
count++;
Thread.sleep(1000 / rating);
if (count == OnlineGame.steps.size()) {
OnlineGame.isWinnerFound = true;
System.out.println(current.getName() + ":победитель!");
}//Add your code here - добавь код тут
}
} catch (InterruptedException e) {
current.interrupt();
System.out.println(current.getName() + ":проиграл");
}
}
//Add your code here - добавь код тут
}
}
}
Если убрать строку Thread current = Thread.currentThread() из метода run и, соответсвенно, все что с ней связанно, то валидатор принимает решение. Спасибо!
Anonymous #2812035
35 уровень
Помогите разобраться
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Aleksei_T
19 ноября 2022, 07:23
У вас ошибка в логике задачи в этом цикле:
Идея такая, что если не происходит остановки нити (успешно выполняются все 4 шага игры(итерации цикла)), то ПОСЛЕ окончания цикла нить проверяет что победитель еще не установлен (переменная isWinnerFound), устанавливает ее в True и печатает свое имя как победителя. После всем нитям отправляется сигнал на прерывание, те нити которые еще не закончили цикл генерируют исключение в Thread.Sleep() и проверка на победителя не происходит (этот кусок кода в нитях-лузерах пропускается).
Сейчас у вас происходит проверка на победителя в любом случае после выполнения 4х шагов цикла, что не верно.
0
ГоффMaster
14 ноября 2022, 07:52
Эту задачу полезно тестировать с одинаковыми игроками. Если ты задашь одинаковые параметры для трёх игроков (например, 100) и погоняешь несколько раз, то увидишь, что время от времени у тебя будет два победителя, а то и три.
0
Anonymous #2812035
18 ноября 2022, 06:03
Спасибо
А как на это влияет наличие строки в коде Thread current = Thread.currentThread()?
0
ГоффMaster
18 ноября 2022, 11:20
Не за что ))
Не понял, на что "это" влияет? На то, что несколько победителей? Тогда никак.
0