using GameModel.Exceptions; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Numerics; using System.Reflection.Metadata.Ecma335; using System.Text; using System.Threading.Tasks; namespace GameModel { public record PinPicture(PinState PinState1, PinState PinState2, PinState PinState3, PinState PinState4, PinState PinState5, PinState PinState6, PinState PinState7, PinState PinState8, PinState PinState9) : IEnumerable, IEnumerable { public static PinPicture Create(PinState pinState1, PinState pinState2, PinState pinState3, PinState pinState4, PinState pinState5, PinState pinState6, PinState pinState7, PinState pinState8, PinState pinState9) { return new PinPicture(pinState1, pinState2, pinState3, pinState4, pinState5, pinState6, pinState7, pinState8, pinState9); } public static PinPicture Create() { return PinPicture.Create(PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up); //pins.Add(PinState1); //pins.Add(pinState2); //pins.Add(pinState3); //pins.Add(pinState4); //pins.Add(pinState5); //pins.Add(pinState6); //pins.Add(pinState7); //pins.Add(pinState8); //pins.Add(pinState9); //ValidatePinPicture(pins); } //private PinPicture(IEnumerable pins) //{ // this.pins = pins.Select(_ => _).ToList(); // ValidatePinPicture(this.pins); //} //private void ValidatePinPicture(IEnumerable pins) //{ //if (pins.Count() != 9) //{ // throw new InvalidPinPictureException(); //} //if (pins.All(_ => _ == PinState.Down)) //{ // throw new InvalidPinPictureException(); //} //if (pins.Count(_ => _ == PinState.Up) == 0) //{ // throw new InvalidPinPictureException(); //} //if (ThrowCounter >= ThrowsPerRound) //{ // throw new InvalidPinPictureException(); //} //} private List pins { get { return new List(new[] { PinState1, PinState2, PinState3, PinState4, PinState5, PinState6, PinState7, PinState8, PinState9 }); } } public PinState this[int index] { get { if (index < 1 || index > 9) { throw new InvalidPinIndexException(); } return pins[index - 1]; } //set //{ // if (index < 1 || index > 9) // { // throw new InvalidPinIndexException(); // } // pins[index - 1] = value; //} } //public PinState PinState1 { get; init; } //public PinState PinState2 { get; init; } //public PinState PinState3 { get; init; } //public PinState PinState4 { get; init; } //public PinState PinState5 { get; init; } //public PinState PinState6 { get; init; } //public PinState PinState7 { get; init; } //public PinState PinState8 { get; init; } //public PinState PinState9 { get; init; } ////public PinState PinState1 { get { return this[1]; } set { this[1] = value; } } //public PinState PinState2 { get { return this[2]; } set { this[2] = value; } } //public PinState PinState3 { get { return this[3]; } set { this[3] = value; } } //public PinState PinState4 { get { return this[4]; } set { this[4] = value; } } //public PinState PinState5 { get { return this[5]; } set { this[5] = value; } } //public PinState PinState6 { get { return this[6]; } set { this[6] = value; } } //public PinState PinState7 { get { return this[7]; } set { this[7] = value; } } //public PinState PinState8 { get { return this[8]; } set { this[8] = value; } } //public PinState PinState9 { get { return this[9]; } set { this[9] = value; } } public int UpCount { get { return pins.Count(_ => _ == PinState.Up); } } public int DownCount { get { return pins.Count(_ => _ == PinState.Down); } } public bool AllUp { get { return DownCount == 0; } } public static PinPicture operator +(PinPicture pic, PinThrow pinThrow) { if (pinThrow.IsSink) return pic with { }; //if (pic.PinState1 == PinState.Down && pinThrow.PicPicture.PinState1 == PinState.Down) //{ // throw new InvalidPinCalcExcetion(); //} return pic with { PinState1 = pinThrow.PicPicture.PinState1 == PinState.Down ? PinState.Down : pic.PinState1, PinState2 = pinThrow.PicPicture.PinState2 == PinState.Down ? PinState.Down : pic.PinState2, PinState3 = pinThrow.PicPicture.PinState3 == PinState.Down ? PinState.Down : pic.PinState3, PinState4 = pinThrow.PicPicture.PinState4 == PinState.Down ? PinState.Down : pic.PinState4, PinState5 = pinThrow.PicPicture.PinState5 == PinState.Down ? PinState.Down : pic.PinState5, PinState6 = pinThrow.PicPicture.PinState6 == PinState.Down ? PinState.Down : pic.PinState6, PinState7 = pinThrow.PicPicture.PinState7 == PinState.Down ? PinState.Down : pic.PinState7, PinState8 = pinThrow.PicPicture.PinState8 == PinState.Down ? PinState.Down : pic.PinState8, PinState9 = pinThrow.PicPicture.PinState9 == PinState.Down ? PinState.Down : pic.PinState9 }; } public IEnumerator GetEnumerator() { foreach (var pin in pins) { yield return pin; } } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } public static PinPicture Create(int pinNumber, PinState pinState) { var states = new List(new[] { PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up }).ToArray(); states[pinNumber - 1] = pinState; return PinPicture.Create(states); } private static PinPicture Create(PinState[] states) { return PinPicture.Create(states[0], states[1], states[2], states[3], states[4], states[5], states[6], states[7], states[8]); } public static PinPicture CreateAllPins() { var states = new List(new[] { PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down }).ToArray(); return PinPicture.Create(states); } public static PinPicture CreateCircle() { var states = new List(new[] { PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Up, PinState.Down, PinState.Down, PinState.Down, PinState.Down }).ToArray(); return PinPicture.Create(states); } } }