Пример #1
0
static throw_score_err_s
next_throw_score(const game_state_s *const gs, char throw_char)
{
    assert(gs);

    throw_score_err_s ret = {0};

    if (is_digit(throw_char)) {
        ret.value = throw_char - '0';
        if (is_second_in_frame(gs)) {
            if (ret.value + prev_throw_score(gs) > TOTAL_PINS) {
                ret.error = err_more_than_ten_pins;
                goto fail;
            }
        }
    } else if (is_spare(throw_char)) {
        if (!is_second_in_frame(gs)) {
            ret.error = err_spare_on_second_only;
            goto fail;
        }
        ret.value = TOTAL_PINS - prev_throw_score(gs);
    } else if (is_strike(throw_char)) {
        if (is_second_in_frame(gs)) {
            ret.error = err_stike_on_first_only;
            goto fail;
        }
        ret.value = TOTAL_PINS;
    }

fail:
    return ret;
}
Пример #2
0
static throw_char_err_s
next_throw_char(const game_state_s *const gs,
                char throw_char,
                uint8_t throw_score)
{
    assert(gs);

    throw_char_err_s ret = {0};

    if (is_zero(throw_char)) {
        ret.value = '-';
    } else if (is_digit(throw_char)) {
        ret.value = throw_char;
        if (is_second_in_frame(gs)
            && throw_score + prev_throw_score(gs) == TOTAL_PINS) {
            ret.value = '/';
        }
    } else if (is_spare(throw_char)) {
        ret.value = '/';
    } else if (is_strike(throw_char)) {
        ret.value = 'X';
    } else if (is_fault(throw_char)) {
        ret.value = 'F';
    }

fail:
    return ret;
}
Пример #3
0
	int BowlingGame::score_frame(int num) const {
		if (is_strike(num)) {
			return score_strike(num);
		} else if (is_spare(num)) {
			return score_spare(num);
		} else {
			return score_normal(num);
		}
	}
Пример #4
0
int bowling_game_score(struct bowling_game *game)
{
	int score = 0;
	int frame_index = 0;
	for (int frame = 0; frame < 10; ++frame) {
		if (is_strike(game, frame_index)) {
			score += strike_score(game, frame_index);
			frame_index += 1;
		} else if (is_spare(game, frame_index)) {
			score += spare_score(game, frame_index);
			frame_index += 2;
		} else {
			score += normal_score(game, frame_index);
			frame_index += 2;
		}
	}
	return score;
}
Пример #5
0
int get_score(void) {
    int score = 0;
    int frame_index = 0;

    for (int frame = 0; frame < 10; frame++) {
        if (is_strike(frame_index)) {
            score += get_strike_score(frame_index);
			frame_index++;
        } else if (is_spare(frame_index)) {
            score += get_spare_score(frame_index);
            frame_index += 2;
        } else {
            score += get_default_score(frame_index);
            frame_index += 2;
        }
    }
    return score;
}
Пример #6
0
int bowling_game_score() {
  int score = 0;
  int frame_index = 0;
  for(int frame=0; frame < max_frames; frame++) {
    if( is_strike(frame_index) ) {
      score += strike_score(frame_index);
      frame_index++;
    }
    else if( is_spare(frame_index) ) {
      score += spare_score(frame_index);
      frame_index += 2;
    }
    else {
      score += frame_score(frame_index);
      frame_index += 2;
    }
  }
  return score;
}
Пример #7
0
	int BowlingGame::score_strike(int num) const { 
		auto strike_bonus = is_strike(num+1) 
			? 10 + get_frame(num + 2).first
			: score_normal(num + 1);
		return 10 + strike_bonus;
	}