Для петли забить боулинг - PullRequest
0 голосов
/ 03 мая 2018

Я работаю над проектом для потенциальной стажировки, чтобы взять строковые данные по результатам игры в боулинг и добавить их к итоговой оценке. Мне трудно пройти одно из моих испытаний, и мне было интересно, не могли бы вы помочь мне выяснить мою ошибку.

Тест, который не работает, isininSix и дает мне результат 98 вместо. Пожалуйста, помогите!

public class Game {

    private int roll = 0;
    private int[] rolls = new int[21];
    public void rolls(String scoreCard) {
        for (int i=0; i< scoreCard.length(); i++) {
            if (scoreCard.charAt(i) == 'X') {
                rolls[roll++] = 10;
            } else if (scoreCard.charAt(i) == '/') {
                rolls[roll++] = 10;
            } else if (scoreCard.charAt(i) == '-') {
            } else {
                int x = scoreCard.charAt(i);
                rolls[roll++] = x - '0';
            }
        }
    }

    public int score() {
        int score = 0;
        int cursor = 0;
        for (int frame = 0; frame < 10; frame++) {
            if (isStrike(cursor)) { 
                score += 10 + rolls[cursor+1] + rolls[cursor+2];
                cursor ++;
            } else if (isSpare(cursor)) { 
                score += 10 + rolls[cursor+2];
                cursor += 2;
            } else {
                score += rolls[cursor] + rolls[cursor+1];
                cursor += 2;
            }
        }
        return score;
    }

    private boolean isStrike(int cursor) {
        return rolls[cursor] == 10;
    }

    private boolean isSpare(int cursor) {
        return rolls[cursor] + rolls[cursor+1] == 10;
    }

    //Print scores for each frame   
    public void printFrameScore(int[] frame) {
        for (int i = 1; i < frame.length; i++) {
            System.out.println(i + ": " + frame[i]);
        }
    }

    public void displayRolls() {
        for (int i = 0; i < rolls.length; i++) {
            System.out.print(rolls[i] + ", ");
        }
    }
}

Тесты

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;

import org.junit.Before;
import org.junit.Test;

public class GameTest {

    private Game game;

    @Before
    public void setUp(){
        game = new Game();
    }

    @Test
    public void isPerfect() {
        game.rolls("X-X-X-X-X-X-X-X-X-X-XX");
        assertThat(game.score(), is(300));
    }

    @Test
    public void isGutter() {
        game.rolls("00-00-00-00-00-00-00-00-00-00");
        assertThat(game.score(), is(0));
    }

    @Test
    public void isNinety() {
        game.rolls("45-54-36-27-09-63-81-18-90-72");
        assertThat(game.score(), is(90));
    }


    @Test
    public void isOneFifty(){
        game.rolls("5/-5/-5/-5/-5/-5/-5/-5/-5/-5/-5");
        assertThat(game.score(), is(150));
    }

    @Test
    public void isNinetySix() {
        game.rolls("45-54-36-27-09-63-81-18-90-7/-5");
        assertThat(game.score(), is(96));
    }
}

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Ваш код не работает в приведенном ниже блоке (после 9-го кадра вы набрали 81 балл). Ваш код просматривает индекс, который содержит значение 7 и /, которые вы представляете как 10, что дает вам 17, а не 10 для запасного.

        ...
        } else {
            score += rolls[cursor] + rolls[cursor+1];
            cursor += 2;
        }
        ...

Итак, если бы я делал предложения, и я не уверен, каковы ожидания от вашего проекта, я бы посоветовал вам подумать о более простых способах обхода вашей строки путем разделения, поиска и добавления. Ниже приведен краткий пример:

 public void rolls(String scorecard) {
    String [] framesets = scorecard.split("-");

    //hunt for special cases like spare and strikes

    //do work to hold your scores
}
0 голосов
/ 03 мая 2018

Проблема здесь заключается в том, что ваша функция isSpare () никогда не возвращает true, потому что вы присвоили каждому / значение 10. Результат добавления двух бросков в кадре с запасным был больше 10. Если бы я был тобой, я бы попытался очистить присвоение / на самом деле 10 - prev_role_score. Это было бы чище, чем проверка isSpare () для значений, превышающих 10. Существуют и другие способы очистки кода, вы можете попробовать реорганизовать некоторые из них, чтобы произвести впечатление на того, кому вы отправляете.

} else if (scoreCard.charAt(i) == '/') {
    int diff = 10 - rolls[roll - 1];
    rolls[roll++] = diff;
}
...