Loading...
galinyotsev123 avatar galinyotsev123 1 Точки

04. Darts Задача 4. Дартс Programming Basics Java

Здравейте колеги,

Някой може ли да ми помогне с тази задача?

https://judge.softuni.bg/Contests/Practice/Index/1538#7

https://softuni.bg/downloads/svn/programming-basics-v4/course-directories/may-2019/2019-01/Exam/04.%20Darts.pdf

Дава ми 70/100....

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String command = scanner.nextLine();
        String name = "";
        double score = 301;
        double successfulShots = 0;
        double unsuccessfulShots = 0;

        while (!(command.equalsIgnoreCase("Retire"))) {
             name = command;
            String type = scanner.nextLine();
            int points = Integer.parseInt(scanner.nextLine());

            if (type.equalsIgnoreCase("Single")) {
                score -= points;
                if (score >= 0) {
                    successfulShots++;
                } else {
                    unsuccessfulShots++;
                    score += points;
                }
            } else if (type.equalsIgnoreCase("Double")) {
                score -= points * 2;
                if (score >= 0) {
                    successfulShots++;
                } else {
                    unsuccessfulShots++;
                    score += points * 2;
                }
            } else if (type.equalsIgnoreCase("Triple")) {
                score -= points * 3;
                if (score >= 0) {
                    successfulShots++;
                } else {
                    unsuccessfulShots++;
                    score += points * 3;
                }
            }

            if (score == 0) {
                System.out.printf("%s won the leg with %.0f shots.", name, successfulShots);
                break;
            }
            name = command;


        }

        if ((command.equalsIgnoreCase("Retire"))) {
            System.out.printf("%s retired after %.0f unsuccessful shots.",name,unsuccessfulShots);
        }
    }
}

 

Изпит по "Основи на програмирането" – 9 и 10 Март 2019

Задача 4. Дартс

Вашата задача е да напишете програма, която да изчислява, дали даден играч е успял да спечели лег. (Лег се нарича единична игра на дартс)

Първоначално играчът започва с 301 точки. Играчът хвърля стрелата върху таблото, като за всяко улучено поле, той получава определен брой точки. Всяко поле има по три сектора: единичен (Single) сектор от който се взимат броят точки от полето. Двоен (Double), от него се взимат удвоените точки от полето и троен (Triple) сектор, точките от който са умножени по 3.

Получените точки от всеки изстрел се изваждат от началните точки, до достигане на 0.

Забележка: При изстрел, даващ повече точки от наличните, той се зачита за неуспешен и играчът трябва да хвърля отново, докато не уцели точки равни на оставащите или по-малки, такъв удар се счита за успешен.

Пример: При налични точки 100, удар даващ повече от 100 точки, неуспешен

При налични точки 100, удар даващ по-малко или равни на 100 точки, успешен

Вход

Първоначално се чете един ред:

  • Името на играча - текст

След това до получаване на команда "Retire" се четат многократно по два реда:

  1. Поле – текст ("Single", "Double" или "Triple")
  2. Точки – цяло число в интервала [0… 100]

Изход

Играта приключва при въвеждане на команда "Retire" или при изравняване на началните 301 точки към 0. На конзолата трябва да се напечата един ред:

  • Ако играчът е спечелил лега:
    • "{името на играча} won the leg with {успешните изстрели} shots."
  • Ако играчът се е отказал от играта:
    • "{името на играча} retired after {неуспешни изстрели} unsuccessful shots."

Примерен вход и изход

Вход

Изход

Обяснения

Michael van Gerwen

Triple

20

Triple

19

Double

10

Single

3

Single

1

Triple

20

Triple

20

Double

20

Michael van Gerwen won the leg with 8 shots.

Започваме със 301 точки

Първият удар е тройно 20 -> 60 <= 301

301 – 60 = 241; успешни изстрели = 1

Втори удар е тройно 19 -> 57 <= 241

241 – 57 = 184; успешни изстрели = 2

Трети удар е двойно 10 -> 20 <=184

184 – 20 = 164; успешни изстрели = 3

Четвърти удар е единично 3 -> 3 <= 164

164 – 3 = 161; успешни изстрели = 4

Пети удар е единично 1 -> 1 <= 161

161 – 1 = 160; успешни изстрели = 5

Шести удар е тройно 20 -> 60 <= 160

160 – 60 = 100; успешни изстрели  = 6

Седми удар е тройно 20 -> 60 <= 100

100 – 60 = 40; успешни изстрели = 7

Осми удар е двойно 20 -> 40 <=40

40 – 40 = 0; успешни изстрели = 8

Stephen Bunting

Triple

20

Triple

20

Triple

20

Triple

20

Triple

20

Triple

20

Double

7

Single

12

Double

1

Single

1

Stephen Bunting won the leg with 6 shots.

Започваме със 301 точки

Първият удар е тройно 20 -> 60 <= 301

301 – 60 = 241; успешни изстрели = 1

.

.

.

Петият удар е тройно 20 -> 60 <= 61

61 – 60 = 1; успешни изстрели = 5

Шестият удар е тройно 20 -> 60 > 1

Неуспешни изстрели = 1

Седмият удар е двойно 7 -> 14 > 1

Неуспешни изстрели = 2

Осмият удар е единично 12 -> 12 > 1

Неуспешни изстрели = 3

Деветият удар е двойно 1 -> 2 > 1

Неуспешни изстрели = 4

Десетият удар е единично 1 -> 1 <= 1

1 – 1 = 0; успешни изстрели = 6

Rob Cross

Triple

20

Triple

20

Triple

20

Triple

20

Double

20

Triple

20

Double

5

Triple

10

Double

6

Retire

Rob Cross retired after 3 unsuccessful shots.

Започваме със 301 точки

Първият удар е тройно 20 -> 60 <= 301

301 – 60 = 241; успешни изстрели = 1

Пети удар е двойно 20 -> 40 <= 61

61 – 40 = 21; успешни изстрели = 5

Шести удар е тройно 20 -> 60 > 21

Неуспешни изстрели 1

Седми удар е двойно 5 -> 10 <= 21

21 – 10 = 11; успешни изстрели 6

Осми удар е тройно 10 -> 30 > 11

Неуспешни изстрели 2

Девети удар е двойно 6 -> 12 > 11

Неуспешни изстрели 3

Retire -> играча се отказва, след 3 неуспешни изстрела

 

0
Programming Basics with Java
abetterman avatar abetterman 21 Точки
Best Answer

дава ти грешка при 3ти нулев тест - точно тогава когато подават Retire от конзолата и това е защото ти го запаметяваш в този ред  String type = scanner.nextLine(); и веднага на следващия се опитваш да прочетеш int points = Integer.parseInt(scanner.nextLine()); но няма нищо за четене и там спира курсора и чака. И затова judje ти дава червени звездички = time error ( time тук означава колкото и чакаш няма да тръгне програмата ). За целта трябва прочетеш данните преди while и на последния му ред трябва да прочетеш един ред само. Проверяш в while дали е Retire и ако не е чак тогава четеш останалите редове от конзолата. Също така имаш излишни редове:

String command = scanner.nextLine();
String name = ""; 
name = command;  

които могат да се опростят до 

String name = scanner.nextLine();

Поправил съм твоя код и съм ти го качил тук https://pastebin.com/NBBdGWKm

Препоръчвам ти да използваш debug режим, ако не го правиш. Успех!

0
17/09/2019 22:41:38
alesandra_mar avatar alesandra_mar 0 Точки

Здравейте,

И аз имам проблем с тази задача, когато прочете "Retire", ми изпринтва изречението, но , когато няма "Retire", не печата нищо ... Пуснах дебъгера няколко пъти, спира да работи на последния въведен input :

 

import java.util.Scanner;
public class darts {
    public static void main(String[] args) {
        Scanner user_input = new Scanner(System.in);

        String namePlayer = user_input.nextLine();

        int beginningPoints = 301;
        int countOk = 0;
        int countNot = 0;

        String input = user_input.nextLine();

        while(!input.equals("Retire")){
            int points = Integer.parseInt(user_input.nextLine());
            if(input.equals("Single")){
                if(points <= beginningPoints){
                    beginningPoints = beginningPoints - points;
                    countOk++;
                }else{
                    countNot++;
                }

            }else if(input.equals("Double")){
                points = points * 2;
                if(points <= beginningPoints) {
                    beginningPoints = beginningPoints - points;
                    countOk++;
                }else{
                    countNot++;
                }

            }else if(input.equals("Triple")){
                points = points * 3;
                if(points <= beginningPoints) {
                    beginningPoints = beginningPoints - points;
                    countOk++;
                }else {
                    countNot++;
                }

            }
            if(beginningPoints == 0){
                System.out.printf("%s won the leg with %d shots.", namePlayer, countOk);
                break;
            }

            input = user_input.nextLine();

        }

        if (input.equals("Retire")){
            System.out.printf("%s retired after %d unsuccessful shots.", namePlayer, countNot);
        }
    }
}

 

 

 

0
mark79 avatar mark79 639 Точки

Здравей,

като изключим няколкото дублирани проверки - кода ти би трябвало да си работи без проблем.

Поздрави :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.