using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BowlingLib.Model { /// /// Classe Model Frame /// public class Frame:IEquatable { const int MAX_QUILLE = 10; public int Numero { get { return numero; } set { this.numero = value; } } private int numero; private readonly long id; public long Id { get { return id; } } public int QuillesRestantes { get { return quillesRestantes; } private set { this.quillesRestantes = value; } } private int quillesRestantes; public int QuillesTombees { get { return quillesTombees; } set { this.quillesTombees = value; } } private int quillesTombees; public bool IsStrike { get { return isStrike; } set { this.isStrike = value; } } private bool isStrike; public bool IsSpare { get { return isPark; } set { this.isPark = value; } } private bool isPark; public bool IsFinished { get { return isFinished; } set { this.isFinished = value; } } private bool isFinished; public Lancer Lancer1 { get { return lancer1; } set { this.lancer1 = value; } } private Lancer lancer1; public Lancer Lancer2 { get { return lancer2; } set { this.lancer2 = value; } } private Lancer lancer2; public Lancer Lancer3 { get { return lancer3; } set { this.lancer3 = value; } } private Lancer lancer3; /// /// Constructeur destiné à Initialisé un Frame /// /// public Frame(int numero) { this.Numero = numero; this.QuillesRestantes = MAX_QUILLE; this.IsFinished = false; this.IsStrike = false; this.IsSpare = false; this.QuillesTombees = 0; } /// /// Constructeur destiné à la récupération des données en base /// /// /// /// /// /// public Frame(long id, int numero, int lancer1, int lancer2, int lancer3) : this(numero) { this.id = id; Lancer1 = new Lancer(lancer1); Lancer2 = new Lancer(lancer2); Lancer3 = new Lancer(lancer3); } /// /// Lance une quille /// /// le nombre de quilles tombés /// public void Lancer(int quillesTombees) { if (quillesTombees > QuillesRestantes) { throw new ArgumentException("Le nombre de quilles tombees doit etre inferieur au nombre de quilles restantes"); } if (quillesTombees < 0) { throw new ArgumentException("Le nombre de quilles tombees doit et etre positif"); } if (this.Numero == MAX_QUILLE) { if (this.Lancer1 == null) { this.Lancer1 = new Lancer(quillesTombees); this.QuillesRestantes -= quillesTombees; this.QuillesTombees += quillesTombees; if (quillesTombees == MAX_QUILLE) { this.IsStrike = true; QuillesRestantes = MAX_QUILLE; } } else if (this.Lancer2 == null) { this.Lancer2 = new Lancer(quillesTombees); this.QuillesRestantes -= quillesTombees; this.QuillesTombees += quillesTombees; //lorsque le premier lancer est un strike if (this.IsStrike) { if (quillesTombees == MAX_QUILLE) { //lorsque le lancer actuel est un strike this.IsStrike = true; QuillesRestantes = MAX_QUILLE;//Remetre le nombre de quilles restantes à 10 pour le lancer 3 } else { this.IsStrike = false; } } else { if (quillesTombees + this.Lancer1.QuillesTombees == MAX_QUILLE) { //lorsque le lancer actuel est un spare this.IsSpare = true; QuillesRestantes = MAX_QUILLE;//Remetre le nombre de quilles restantes à 10 pour le lancer 3 } } } else if (this.Lancer3 == null) { this.Lancer3 = new Lancer(quillesTombees); this.QuillesRestantes -= quillesTombees; this.QuillesTombees += quillesTombees; if (this.IsStrike)//si le deuxième lancer etait un strike { if (quillesTombees == MAX_QUILLE) { this.IsStrike = true;//cas ou il effectue un 3eme strike } else { this.IsStrike = false; } } else if (this.IsSpare)//si le deuxième lancer etait un spare { if (quillesTombees + this.Lancer2.QuillesTombees == MAX_QUILLE) { this.IsSpare = true;//cas ou il effectue un 3eme spare } else { this.IsSpare = false; } } else { if (quillesTombees + this.Lancer2.QuillesTombees == MAX_QUILLE) { this.IsSpare = true; } } } else { throw new ArgumentException("Le nombre de lancers est deja atteint"); } } else { if (this.Lancer1 == null) { this.Lancer1 = new Lancer(quillesTombees); } else if (this.Lancer2 == null) { this.Lancer2 = new Lancer(quillesTombees); } else { throw new ArgumentException("Le nombre de lancers est deja atteint"); } this.QuillesRestantes -= quillesTombees; this.QuillesTombees += quillesTombees; if (quillesTombees == MAX_QUILLE) { this.IsStrike = true; } else if (this.QuillesRestantes == 0) { this.IsSpare = true; } } if (this.QuillesRestantes == 0 || (this.Lancer2 != null && this.Numero != MAX_QUILLE)) { this.IsFinished = true; } } public bool Equals(Frame other) { return Numero.Equals(other.Numero); } public override bool Equals(object obj) { if (ReferenceEquals(obj, null)) return false; if (ReferenceEquals(obj, this)) return true; if (GetType() != obj.GetType()) return false; return Equals(obj as Frame); } public override int GetHashCode() { return Numero.GetHashCode(); } } }