JavaRush
AI Academy
new
Акция
Университет
Java FullStack
Python FullStack
AI Native Developer
new
Web FullStack
Обучение
Курсы
Задачи
Опросы
Игры
Помощь
График пинков
Стажировка
Сообщество
Пользователи
Форум
Чат
Статьи
Истории успеха
Активности
Отзывы
Подписки
Светлая тема
Вопрос
  • Отзывы
  • О нас
  • CS50
Начать
Начать обучение
Начать обучение
  • Все вопросы
JavaRush/Помощь по Java задачам/Игрок не должен выводить сообщение о победе, если перемен...
Анна Ивашенцева
24 уровень
  • 16.01.2020
  • 654просмотров
  • 23комментариев

Игрок не должен выводить сообщение о победе, если переменная isWinnerFound уже установлена в true (победитель уже найден). не понимаю , что сделано не так

Вопрос по задаче Поиграем?
Java Core,  6 уровень,  13 лекция
Решен


Три человека играют в игру. Каждый игрок(Gamer) характеризуется двумя параметрами: фамилией(name) и количеством действий в секунду (rating).
Нужно вывести в консоль ход игры и определить победителя и проигравших.
Итак...
1. Разберись, что делает программа.
1.1. List<String> steps хранит последовательность действий, которое каждый игрок выполняет от 0 до последнего.
1.2. isWinnerFound показывает, найден победитель или нет.
1.3. Метод sleep выбрасывает InterruptedException и принимает параметр типа long.
1.4. Игроки играют независимо друг от друга.
2. Реализуй логику метода run так, чтобы для каждого игрока:
2.1. Через равные интервалы времени (1000ms / rating) выводились в консоль действия, описанные в steps.
2.2. Любой текст должен начинаться с фамилии игрока (метод getName()), потом следовать двоеточие, а затем сам текст.

Пример:
Ivanov:Начало игры

2.3. Когда игрок выполнит все действия из steps, то он считается победителем. Выведи getName() + ":победитель!"
2.4. Когда найден победитель, то игра останавливается, и остальные игроки считаются побежденными. Выведи для них getName() + ":проиграл"

Требования:
  • Метод run класса Gamer через равные интервалы времени (1000ms / rating) должен выводить в консоль фамилию игрока (метод getName()), потом двоеточие, а затем текст из OnlineGame.steps. Пример: Ivanov:Начало игры
  • Когда все игровые шаги будут выполнены, а победитель еще не найден, метод run должен установить флаг OnlineGame.isWinnerFound в true (сообщить остальным, что он победитель).
  • Если игрок стал победителем, его метод run должен вывести надпись getName() + ":победитель!". Например: Sidorov:победитель!
  • Методы run всех игроков которые не стали победителями (были прерваны), должны вывести надписи getName() + ":проиграл". Например: Petrov:проиграл
  • Метод run не должен кидать исключение при прерывании.
....
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() { try { for(int i = 0; i < OnlineGame.steps.size(); i++) { Thread.sleep(1000/rating); System.out.println(super.getName() + ":" + OnlineGame.steps.get(i)); } } catch (Exception e) { System.out.println(super.getName() + ":проиграл"); } System.out.println(super.getName() + ":победитель!"); OnlineGame.isWinnerFound = true; } } }
0
Комментарии (23)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
IceBerg
Уровень 41
Master
16 января 2020, 08:59
Нужно добавить проверку "если переменная isWinnerFound уже установлена в true"
0
Анна Ивашенцева
Уровень 24
16 января 2020, 10:18
if(OnlineGame.isWinnerFound = true) { System.out.println(super.getName() + ":победитель!"); } добавила, но ошибка та же
0
IceBerg
Уровень 41
Master
16 января 2020, 10:40
Что это?
if(OnlineGame.isWinnerFound = true)
0
Анна Ивашенцева
Уровень 24
16 января 2020, 10:42
первоначально isWinnerFound установлен false , делаю условие "если isWinnerFound true", то пишем победителя
0
IceBerg
Уровень 41
Master
16 января 2020, 10:45
"если isWinnerFound true" - не, здесь не это написано.
0
Анна Ивашенцева
Уровень 24
16 января 2020, 10:52
тогда я точно не понимаю ((
0
IceBerg
Уровень 41
Master
16 января 2020, 10:56
Как написать условие "если А равно В"? значения int в А,В (или boolean)
0
Анна Ивашенцева
Уровень 24
16 января 2020, 11:05
if(A ==B) { {
0
IceBerg
Уровень 41
Master
16 января 2020, 11:06
А теперь сравните с вашим условием.
0
Анна Ивашенцева
Уровень 24
16 января 2020, 11:11
вот если я делаю if(OnlineGame.isWinnerFound == true) тоже не пропускает (((
0
Анна Ивашенцева
Уровень 24
16 января 2020, 11:12
причем по двум условиям не пропускает ((
0
IceBerg
Уровень 41
Master
16 января 2020, 11:14
Потому что это одна ошибка из двух) У вас написано "если isWinnerFound установлено true, выводить сообщение "победитель"", разве так и нужно? И зачем boolean значения сравнивать, если их можно просто написать?
0
Анна Ивашенцева
Уровень 24
16 января 2020, 11:27
так, а зачем мне тогда проверка ? я же писала: OnlineGame.isWinnerFound = true; System.out.println(super.getName() + ":победитель!");
0
IceBerg
Уровень 41
Master
16 января 2020, 11:36
"а зачем мне тогда проверка ?" - а зачем вообще любая проверка нужна? Затем, чтобы не выводить ":победитель!" всегда. Даже не знаю как очевиднее ответить) под "их можно просто написать" я имел в виду, что нет смысла писать так
if(OnlineGame.isWinnerFound == true)
Если можно написать так
if(OnlineGame.isWinnerFound)
Если я вас попрошу не выводить сообщение "Ура", если А не равно true, как вы это сделаете?
0
Анна Ивашенцева
Уровень 24
16 января 2020, 11:53
как вы написали он тоже не пропускает
0
IceBerg
Уровень 41
Master
16 января 2020, 11:59
И не должен, я написал как сократить вашу запись, а не как создать правильную.
0
Анна Ивашенцева
Уровень 24
16 января 2020, 12:12
я сначала писала так if(!OnlineGame.isWinnerFound) то вывести запись о победителе , это неправильная логика ?
0
IceBerg
Уровень 41
Master
16 января 2020, 12:24
Это как раз правильная. Как весь метод выглядит?
0
Анна Ивашенцева
Уровень 24
16 января 2020, 12:34
public void run() { try { for(int i = 0; i < OnlineGame.steps.size(); i++) { Thread.sleep(1000/rating); System.out.println(super.getName() + ":" + OnlineGame.steps.get(i)); } } catch (Exception e) { System.out.println(super.getName() + ":проиграл"); } if(!OnlineGame.isWinnerFound) { System.out.println(super.getName() + ":победитель!"); } }
0
IceBerg
Уровень 41
Master
16 января 2020, 12:37
А с переменной isWinnerFound теперь что происходит, она где-то изменяется?
0
Анна Ивашенцева
Уровень 24
16 января 2020, 12:52
так она же сверху обьявлена как false ? а по условию "Когда все игровые шаги будут выполнены, а победитель еще не найден, метод run должен установить флаг OnlineGame.isWinnerFound в true (сообщить остальным, что он победитель)." потом я делаю условие на проверку переменной
0
IceBerg
Уровень 41
Master
16 января 2020, 12:55решение
"метод run должен установить флаг OnlineGame.isWinnerFound в true " Где???
+4
Анна Ивашенцева
Уровень 24
16 января 2020, 13:02
все, дошло , спасибо что вы меня вытерпели)
0
Обучение
  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
Сообщество
  • Пользователи
  • Статьи
  • Форум
  • Чат
  • Истории успеха
  • Активности
Компания
  • О нас
  • Контакты
  • Отзывы
  • FAQ
  • Поддержка
JavaRushJavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
Русский
English Українська
"Программистами не рождаются" © 2026 JavaRush
MastercardVisa
"Программистами не рождаются" © 2026 JavaRush