All files Jogo.ts

100% Statements 37/37
96% Branches 24/25
100% Functions 5/5
100% Lines 37/37

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78          40x     40x 40x   40x 40x       261x   261x 253x 253x   253x 253x     253x 147x 147x         1x       261x 261x   261x 4x 4x     257x 1x 1x     256x 3x 3x     253x       253x 253x   253x   253x 107x 107x     253x 59x 59x     253x      
import { Frame } from './Frame'
 
export class Jogo {
  score: number
  frame_atual: number
  frames: Frame[] = []
 
  constructor() {
    this.score = 0
    this.frame_atual = 0
 
    const frame: Frame = new Frame(0)
    this.frames.push(frame)
  }
 
  arremessar(pinos: number): void {
    const frame = this.frames[this.frame_atual]
 
    Eif (this.validarArremesso(pinos)) {
      frame.adicionarBonus(pinos)
      frame.gravarArremesso(pinos)
 
      const bonus = this.obterBonus()
      this.score += pinos * bonus
    }
 
    if (frame.permitirEncerrarFrame()) {
      this.frame_atual += 1
      this.frames.push(frame.gerarProximoFrame())
    }
  }
 
  pontuacao(): number {
    return this.score
  }
 
  private validarArremesso(pinos: number): boolean {
    const frame = this.frames[this.frame_atual]
    let validacao = true
 
    if (pinos > 10 || pinos < 0 || !Number.isInteger(pinos)) {
      validacao = false
      throw new Error(`Valor de arremesso inválido: ${pinos}`)
    }
 
    if (frame.numero != 9 && pinos > frame.pinos_em_pe) {
      validacao = false
      throw new Error(`Valor total dos arremessos (${pinos}) superior a 10`)
    }
 
    if (frame.numero === 9 && frame.arremessos === 3) {
      validacao = false
      throw new Error('O jogo já foi encerrado')
    }
 
    return validacao
  }
 
  private obterBonus(): number {
    const ultimo = this.frames[this.frame_atual - 1]
    const penultimo = this.frames[this.frame_atual - 2]
 
    let bonus = 1
 
    if (this.frame_atual > 0 && ultimo.bonus > 0) {
      ultimo.bonus -= 1
      bonus += 1
    }
 
    if (this.frame_atual > 1 && penultimo.bonus > 0) {
      penultimo.bonus -= 1
      bonus += 1
    }
 
    return bonus
  }
}