Lotto.cs 6.22 KB
Newer Older
M1888's avatar
M1888 committed
1 2 3
using Custom.Collections; // ObservableCollectionEx
using System;
using System.Collections.Concurrent;
M1888's avatar
M1888 committed
4
using System.Collections.Generic;
M1888's avatar
M1888 committed
5 6
using System.Collections.ObjectModel;
using System.ComponentModel;
M1888's avatar
M1888 committed
7
using System.Linq;
M1888's avatar
M1888 committed
8
using System.Runtime.CompilerServices;
M1888's avatar
M1888 committed
9 10 11
using System.Text;
using System.Threading.Tasks;

M1888's avatar
M1888 committed
12

M1888's avatar
M1888 committed
13 14
namespace Lottokone.Model
{
M1888's avatar
M1888 committed
15
    public class Lotto : INotifyPropertyChanged
M1888's avatar
M1888 committed
16
    {
M1888's avatar
M1888 committed
17 18
        private bool kaynnissa = false;

M1888's avatar
M1888 committed
19 20 21 22 23 24 25
        private short viikko;
        public short Viikko
        {
            get
            {
                return viikko;
            }
M1888's avatar
M1888 committed
26 27 28 29 30 31 32 33 34 35
            set
            {
                viikko = value;
                if(viikko > 52)
                {
                    viikko = 1;
                    Vuosi++;
                }
                RaisePropertyChanged();
            }
M1888's avatar
M1888 committed
36 37 38 39 40 41 42 43 44
        }

        private short vuosi;
        public short Vuosi
        {
            get
            {
                return vuosi;
            }
M1888's avatar
M1888 committed
45 46 47 48 49
            set
            {
                vuosi = value;
                RaisePropertyChanged();
            }
M1888's avatar
M1888 committed
50 51
        }

M1888's avatar
M1888 committed
52 53 54 55 56 57 58 59 60 61 62
        public ConcurrentBag<Pelaaja> Pelaajat { get; set; }

        // neljä listaa eri voittotasoille:
        // 4 oikein, 5 oikein, 6 oikein ja 7 oikein
        // nämä olisi voinut periaatteessa asettaa listaan, ja 
        // käyttää indeksin kautta (oikein[5] olisi lista viisi oikein -tuloksista jne.)
        // mutta se aiheuttaisi threadingin kanssa ongelmia.
        public ConcurrentBag<Pelaaja> Oikein4 { get; set; }
        public ConcurrentBag<Pelaaja> Oikein5 { get; set; }
        public ConcurrentBag<Pelaaja> Oikein6 { get; set; }
        public ConcurrentBag<Pelaaja> Oikein7 { get; set; }
M1888's avatar
M1888 committed
63 64 65 66 67 68 69 70

        private long potti;
        public long Potti
        {
            get
            {
                return potti;
            }
M1888's avatar
M1888 committed
71 72 73 74 75
            set
            {
                potti = value;
                RaisePropertyChanged();
            }
M1888's avatar
M1888 committed
76 77
        }

M1888's avatar
M1888 committed
78 79

        public event PropertyChangedEventHandler PropertyChanged;
M1888's avatar
M1888 committed
80 81 82 83 84 85 86
        private Voittorivi voittorivi;
        public Voittorivi Voittorivi
        {
            get
            {
                return voittorivi;
            }
M1888's avatar
M1888 committed
87 88 89 90 91 92 93
            set
            {
                voittorivi = value;
                RaisePropertyChanged();
            }
        }

M1888's avatar
M1888 committed
94
        public ObservableCollectionEx<string> StatusHistory;
M1888's avatar
M1888 committed
95 96 97 98
        public string Status
        {
            get
            {
M1888's avatar
M1888 committed
99
                return StatusHistory.FirstOrDefault();
M1888's avatar
M1888 committed
100 101 102
            }
            set
            {
M1888's avatar
M1888 committed
103
                StatusHistory.Insert(0, value);
M1888's avatar
M1888 committed
104 105 106 107 108 109 110 111 112
                RaisePropertyChanged();
            }
        }

        // Konstruktori lottokoneen pääluokalle
        public Lotto()
        {
            viikko = 0;
            vuosi = 1;
M1888's avatar
M1888 committed
113 114 115
            Pelaajat = new ConcurrentBag<Pelaaja>();
            Voittorivi = new Voittorivi();
            StatusHistory = new ObservableCollectionEx<string>(new List<String>());
M1888's avatar
M1888 committed
116
            Status = "Alustetaan pelaajia...";
M1888's avatar
M1888 committed
117 118


M1888's avatar
M1888 committed
119
            for (int i = 0; i < Properties.Settings.Default.Pelaajia; i++)
M1888's avatar
M1888 committed
120 121 122 123 124 125 126 127 128 129 130 131 132
            {
                Pelaaja p = new Pelaaja();
                for (int j = 0; j < 5; j++)
                {
                    Lottorivi l = new Lottorivi();
                    l.ArvoRivi();
                    p.Rivit.Add(l);
                    Potti++;
                }
                Pelaajat.Add(p);
            }
        }

M1888's avatar
M1888 committed
133
        public void LisaaPelaajia(int pelaajia, int riveja)
M1888's avatar
M1888 committed
134
        {
M1888's avatar
M1888 committed
135
            for(int i = 0; i < pelaajia; i++)
M1888's avatar
M1888 committed
136
            {
M1888's avatar
M1888 committed
137 138 139 140
                for (int j = 0; j < riveja; j++)
                {
                    Pelaajat.Add(new Pelaaja());
                }
M1888's avatar
M1888 committed
141
            }
M1888's avatar
M1888 committed
142 143 144 145 146 147 148 149 150 151 152 153 154 155
        }

        public void Start()
        {
            // TODO
        }

        public void Stop()
        {
            // TODO
        }

        public void Tick()
        {
M1888's avatar
M1888 committed
156
            Viikko++;
M1888's avatar
M1888 committed
157 158 159 160
            Oikein4 = new ConcurrentBag<Pelaaja>();
            Oikein5 = new ConcurrentBag<Pelaaja>();
            Oikein6 = new ConcurrentBag<Pelaaja>();
            Oikein7 = new ConcurrentBag<Pelaaja>();
M1888's avatar
M1888 committed
161 162
            Voittorivi = new Voittorivi();
            Voittorivi.ArvoRivi();
M1888's avatar
M1888 committed
163 164 165 166 167 168 169 170 171 172 173 174 175
            EtsiVoittajat();
            Status = $"-Viikko {Viikko}-";

            if (!Oikein4.IsEmpty)
                Status = $"4 oikein: {Oikein4.Count()}";
            if (!Oikein5.IsEmpty)
                Status = $"5 oikein: {Oikein5.Count()}";
            if (!Oikein6.IsEmpty)
                Status = $"6 oikein: {Oikein6.Count()}";
            if (!Oikein7.IsEmpty)
                Status = $"7 oikein: {Oikein7.Count()}";

            JaaVoitot();
M1888's avatar
M1888 committed
176 177
        }

M1888's avatar
M1888 committed
178
        private void EtsiVoittajat()
M1888's avatar
M1888 committed
179
        {
M1888's avatar
M1888 committed
180
            Parallel.ForEach(Pelaajat, (p) =>
M1888's avatar
M1888 committed
181
            {
M1888's avatar
M1888 committed
182
                foreach (Rivi r in p.Rivit)
M1888's avatar
M1888 committed
183
                {
M1888's avatar
M1888 committed
184 185
                    int oikein = r.Oikein(Voittorivi);
                    switch(oikein)
M1888's avatar
M1888 committed
186
                    {
M1888's avatar
M1888 committed
187 188 189 190 191 192 193 194 195 196 197 198 199 200
                        case 4:
                            Oikein4.Add(p);
                            break;
                        case 5:
                            Oikein5.Add(p);
                            break;
                        case 6:
                            Oikein6.Add(p);
                            break;
                        case 7:
                            Oikein7.Add(p);
                            break;
                        default:
                            break;
M1888's avatar
M1888 committed
201 202
                    }
                }
M1888's avatar
M1888 committed
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
            });
        }

        // https://fi.wikipedia.org/wiki/Lotto_(Veikkaus)#Voittoluokat_ja_voiton_todenn%C3%A4k%C3%B6isyys
        // 4 oikein: 10 e
        // 5 oikein: 3% potista voittajien kesken
        // 6 oikein: 2,5% potista voittajien kesken
        // 6+1: 3,8% potista voittajien kesken
        // 7: päävoitto
        private void JaaVoitot()
        {
            Task neljat = Task.Run(() =>
            {
                Pelaaja p;
                while(Oikein4.TryTake(out p) != false)
                {

                }
            });
M1888's avatar
M1888 committed
222 223 224 225 226 227
        }

        protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            if(PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
M1888's avatar
M1888 committed
228 229 230
        }
    }
}