Files
2020-12-09 22:10:02 +01:00

208 lines
6.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using WindowsFormsCore.Domain;
namespace WindowsFormsCore
{
public class Lotto
{
private List<LottoNum> numberBack;
private List<Connect> numberDraw;
#region Constants
const decimal l00 = 0M;
const decimal l01 = 10.286M;
const decimal l02 = 20.572M;
const decimal l03 = 30.858M;
const decimal l04 = 41.144M;
const decimal l05 = 51.430M;
const decimal l06 = 61.716M;
const decimal l07 = 72.002M;
const decimal l08 = 82.288M;
const decimal l09 = 92.574M;
const decimal l10 = 102.860M;
const decimal l11 = 113.146M;
const decimal l12 = 123.432M;
const decimal l13 = 133.718M;
const decimal l14 = 144.004M;
const decimal l15 = 154.290M;
const decimal l16 = 164.576M;
const decimal l17 = 174.862M;
const decimal l18 = 185.148M;
const decimal l19 = 195.434M;
const decimal l20 = 205.720M;
const decimal l21 = 216.006M;
const decimal l22 = 226.292M;
const decimal l23 = 236.578M;
const decimal l24 = 246.864M;
const decimal l25 = 257.150M;
const decimal l26 = 267.436M;
const decimal l27 = 277.722M;
const decimal l28 = 288.008M;
const decimal l29 = 298.294M;
const decimal l30 = 308.580M;
const decimal l31 = 318.866M;
const decimal l32 = 329.152M;
const decimal l33 = 339.432M;
const decimal l34 = 349.721M;
const decimal l35 = 360.000M;
#endregion
public Lotto(Random rnd)
{
InitLottoTables();
Rnd = rnd;
}
private Random Rnd;
public string[] RandomRad()
{
if (numberDraw.Count < numberBack.Count)
{
InitLottoTables();
}
var numberTable = new string[7];
for (int i = 0; i < 7; i++)
{
numberTable[i] = DrawNewNumber();
}
return numberTable;
}
private string DrawNewNumber()
{
var number = RndFix(numberDraw.Min(x => x.PrimeNr), numberDraw.Max(x => x.PrimeNr));
var drawn = numberDraw.Find(n => n.PrimeNr == number).ActLottoNr;
numberBack.Find(b => b.ChoseNumber == drawn).Valid = false;
var remobj = numberDraw.Find(n => n.PrimeNr == number);
numberDraw.Remove(remobj);
var newNr = 1;
for (int x = 0; x < numberDraw.Count; x++)
{
numberDraw[x].PrimeNr = newNr++;
}
return drawn.ToString();
}
private int RndFix(int min, int max)
{
return Rnd.Next(min, max);
}
private void InitLottoTables()
{
numberBack = GenerateBaseTable();
numberDraw = GenerateDrawTable();
}
private List<LottoNum> GenerateBaseTable()
{
var lottos = new List<LottoNum>();
for (int i = 0; i < 35; i++)
{
lottos.Add(new LottoNum { ChoseNumber = i + 1, Valid = true });
}
return lottos;
}
private List<Connect> GenerateDrawTable()
{
var lottos = new List<Connect>();
for (int i = 0; i < 35; i++)
{
lottos.Add(new Connect { PrimeNr = i + 1, ActLottoNr = i + 1 });
}
return lottos;
}
public int AntiCircularValue( int actValue)
{
var output = 0;
decimal angleValue = GetNumberAngle(actValue);
output = GetNumberByAngle(angleValue + 180M);
return output;
}
public int GetNumberByAngle(decimal angle)
{
var result = 0;
decimal lAngle = angle;
while (result <= 0 || result == 99)
{
result = lAngle switch
{
< l00 => -1,
>= l00 and <= l01 => 1,
> l01 and <= l02 => 2,
> l02 and <= l03 => 3,
> l03 and <= l04 => 4,
> l04 and <= l05 => 5,
> l05 and <= l06 => 6,
> l06 and <= l07 => 7,
> l07 and <= l08 => 8,
> l08 and <= l09 => 9,
> l09 and <= l10 => 10,
> l10 and <= l11 => 11,
> l11 and <= l12 => 12,
> l12 and <= l13 => 13,
> l13 and <= l14 => 14,
> l14 and <= l15 => 15,
> l15 and <= l16 => 16,
> l16 and <= l17 => 17,
> l17 and <= l18 => 18,
> l18 and <= l19 => 19,
> l19 and <= l20 => 20,
> l20 and <= l21 => 21,
> l21 and <= l22 => 22,
> l22 and <= l23 => 23,
> l23 and <= l24 => 24,
> l24 and <= l25 => 25,
> l25 and <= l26 => 26,
> l26 and <= l27 => 27,
> l27 and <= l28 => 28,
> l28 and <= l29 => 29,
> l29 and <= l30 => 30,
> l30 and <= l31 => 31,
> l31 and <= l32 => 32,
> l32 and <= l33 => 33,
> l33 and <= l34 => 34,
> l34 and <= l35 => 35,
_ => 99
};
if (result == -1) lAngle += 360;
if (result == 99) lAngle -= 360;
};
return result;
}
public decimal GetNumberAngle(int LtNumber)
{
decimal res = 0;
double nrSect = 360d / 35d;
double angle = 2 + (LtNumber - 1) * nrSect;
res = (decimal)angle;
return res;
}
}
}