260 lines
10 KiB
C#
260 lines
10 KiB
C#
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.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<PinState>(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<PinState>(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<PinState>(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 record PinPictureEnum : PinPicture, IEnumerable<PinState>, 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<PinState> pins)
|
|
//{
|
|
// this.pins = pins.Select(_ => _).ToList();
|
|
// ValidatePinPicture(this.pins);
|
|
//}
|
|
|
|
//private void ValidatePinPicture(IEnumerable<PinState> 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<PinState> pins
|
|
{
|
|
get
|
|
{
|
|
return new List<PinState>(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<PinState> GetEnumerator()
|
|
{
|
|
foreach (var pin in pins)
|
|
{
|
|
yield return pin;
|
|
}
|
|
}
|
|
|
|
IEnumerator IEnumerable.GetEnumerator()
|
|
{
|
|
return this.GetEnumerator();
|
|
}
|
|
|
|
|
|
}
|
|
}
|