using GameModel.Exceptions; using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Numerics; using System.Reflection; using System.Reflection.Metadata.Ecma335; 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) { 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); } 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(int pinNumber, PinState pinState) { if (pinNumber < 1 || pinNumber > 9) { throw new InvalidPinPictureException(); } 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); } internal static PinPicture Create(string pindata) { if (!string.IsNullOrEmpty(pindata)) { if (!int.TryParse(pindata, out int dummy)) { throw new InvalidDataException($"{pindata} cannot be parsed as throw"); } } var states = new[] { pindata.Contains("1") ? PinState.Down : PinState.Up, pindata.Contains("2") ? PinState.Down : PinState.Up, pindata.Contains("3") ? PinState.Down : PinState.Up, pindata.Contains("4") ? PinState.Down : PinState.Up, pindata.Contains("5") ? PinState.Down : PinState.Up, pindata.Contains("6") ? PinState.Down : PinState.Up, pindata.Contains("7") ? PinState.Down : PinState.Up, pindata.Contains("8") ? PinState.Down : PinState.Up, pindata.Contains("9") ? PinState.Down : PinState.Up, }; return PinPicture.Create(states); } 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 int UpCount { get { var res = 0; res += Convert.ToInt32((PinState1 == PinState.Up)); res += Convert.ToInt32((PinState2 == PinState.Up)); res += Convert.ToInt32((PinState3 == PinState.Up)); res += Convert.ToInt32((PinState4 == PinState.Up)); res += Convert.ToInt32((PinState5 == PinState.Up)); res += Convert.ToInt32((PinState6 == PinState.Up)); res += Convert.ToInt32((PinState7 == PinState.Up)); res += Convert.ToInt32((PinState8 == PinState.Up)); res += Convert.ToInt32((PinState9 == PinState.Up)); return res; } } public int DownCount { get { var res = 0; res += Convert.ToInt32((PinState1 == PinState.Down)); res += Convert.ToInt32((PinState2 == PinState.Down)); res += Convert.ToInt32((PinState3 == PinState.Down)); res += Convert.ToInt32((PinState4 == PinState.Down)); res += Convert.ToInt32((PinState5 == PinState.Down)); res += Convert.ToInt32((PinState6 == PinState.Down)); res += Convert.ToInt32((PinState7 == PinState.Down)); res += Convert.ToInt32((PinState8 == PinState.Down)); res += Convert.ToInt32((PinState9 == PinState.Down)); return res; } } public bool AllUp { get { return DownCount == 0; } } public PinState First => PinState1; public PinState Last => PinState9; public IEnumerable Take() { return Take(9); } public IEnumerable Take(int count) { if (count <= 1 || count > 9) { throw new InvalidPinIndexException(); } var res = new List { PinState1, PinState2, PinState3, PinState4, PinState5, PinState6, PinState7, PinState8, PinState9 }; return res.Take(count); } /// /// /// /// one-based number of a pin /// public PinState Index(int index) { if (index < 1 || index > 9) { throw new InvalidPinIndexException(); } return Take(9).ToArray()[index-1]; } } public record PinPictureEnum : PinPicture, IEnumerable, IEnumerable { public PinPictureEnum(PinState PinState1, PinState PinState2, PinState PinState3, PinState PinState4, PinState PinState5, PinState PinState6, PinState PinState7, PinState PinState8, PinState PinState9) : base(PinState1, PinState2, PinState3, PinState4, PinState5, PinState6, PinState7, PinState8, PinState9) { } //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(); //} //} [JsonIgnore] private List pins { get { return new List(new[] { PinState1, PinState2, PinState3, PinState4, PinState5, PinState6, PinState7, PinState8, PinState9 }); } } [JsonIgnore] 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 IEnumerator GetEnumerator() { foreach (var pin in pins) { yield return pin; } } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } } }