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; }
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; }
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); } }
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; }
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; }
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; }
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; }