MainWindow.xaml.cs 9.55 KB
Newer Older
M1888's avatar
M1888 committed
1 2
using System;
using System.Collections.Generic;
M1888's avatar
M1888 committed
3
using System.Collections.ObjectModel;
M1888's avatar
10.4.  
M1888 committed
4
using System.Collections.Specialized;
M1888's avatar
M1888 committed
5
using System.Globalization;
M1888's avatar
M1888 committed
6 7
using System.Linq;
using System.Text;
M1888's avatar
M1888 committed
8
using System.Threading;
M1888's avatar
M1888 committed
9 10 11 12 13 14
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
M1888's avatar
M1888 committed
15
using System.Windows.Markup;
M1888's avatar
M1888 committed
16 17 18 19
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
M1888's avatar
10.4.  
M1888 committed
20
using Lottokone.Model;
M1888's avatar
M1888 committed
21 22 23 24 25 26 27 28

namespace Lottokone
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
M1888's avatar
16.4.  
M1888 committed
29
        // Lottokoneen pääolio
M1888's avatar
10.4.  
M1888 committed
30
        private Lotto kone;
M1888's avatar
16.4.  
M1888 committed
31

M1888's avatar
M1888 committed
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
        // Meidän pelaaja
        private Pelaaja pelaaja;
        // Meidän voitot, ja lukko-objekti jotta voidaan käyttää sitä threadeista
        private ObservableCollection<string> voitot;
        private object voittolukko;

        // Tämä ajaa meidän pelilooppia kun starttia painetaan
        private Thread runner;
        private bool kaynnissa = false;

        // Tässä kyseinen pelilooppi
        // Tämä olisi ollut ehkä järkevä toteuttaa muualla kuin täällä MainWindow.xaml.cs:ssä,
        // mutta tällä nyt mennään....
        private void GameLoop()
        {
            do
            {
                kone.Tick();
                // meidän pitää tarkistaa täällä käsin pelaajamme voitot uudestaan, jotta
                // saadaan niistä tieto myös toiseen listaikkunaan.
                foreach (Lottorivi r in pelaaja.Rivit)
                {
                    string s = "";
                    switch (r.Oikein(kone.Voittorivi))
                    {
                        case 3:
                            if (r.Numerot.Contains(kone.Voittorivi.Lisanumero))
                            {
M1888's avatar
M1888 committed
60 61

                                s = $"Kierros {kone.Kierros}: 3+1 oikein ({kone.Voitot[5]:C0})";
M1888's avatar
M1888 committed
62 63 64
                            }
                            break;
                        case 4:
M1888's avatar
M1888 committed
65
                            s = $"Kierros {kone.Kierros}: 4 oikein ({kone.Voitot[4]:C0})";
M1888's avatar
M1888 committed
66 67
                            break;
                        case 5:
M1888's avatar
M1888 committed
68
                            s = $"Kierros {kone.Kierros}: 5 oikein ({kone.Voitot[3]:C0})";
M1888's avatar
M1888 committed
69 70
                            break;
                        case 6:
M1888's avatar
M1888 committed
71 72 73 74 75
                            this.Dispatcher.Invoke(() =>
                            {
                                this.Background = Brushes.Pink;
                                imgLotto.Source = new BitmapImage(new Uri(@"Resources/lotto1.png", UriKind.Relative));
                            });
M1888's avatar
M1888 committed
76 77 78
                            s = $"Kierros {kone.Kierros}: ";
                            // taas lisänumeron tarkistus
                            if (r.Numerot.Contains(kone.Voittorivi.Lisanumero))
M1888's avatar
M1888 committed
79
                                s += $"6+1 oikein!!! {kone.Voitot[1]:C0} - Melkein jo kannattaa?!";
M1888's avatar
M1888 committed
80
                            else
M1888's avatar
M1888 committed
81
                                s += $"6 oikein! ({kone.Voitot[2]:C0})";
M1888's avatar
M1888 committed
82 83 84
                            break;
                        case 7:
                            // Päävoitto jos osuu, niin pelin voinee pysäyttää.
M1888's avatar
M1888 committed
85
                            s = $"Kierros {kone.Kierros}: PÄÄVOITTO!!!! ({kone.Voitot[0]:C0}) JUMANTSUIKKA! Kannattaa ehkä lotota oikeastikin?! " +
M1888's avatar
M1888 committed
86 87 88 89 90 91
                                "Ellet käyttänyt kaikkea onneasi tähän....";
                            kaynnissa = false;
                            break;
                        default:
                            break;
                    }
M1888's avatar
M1888 committed
92
                    if (s.Length > 0)
M1888's avatar
M1888 committed
93
                    {
M1888's avatar
M1888 committed
94
                        lock (voittolukko)
M1888's avatar
M1888 committed
95 96 97 98 99 100 101 102
                        {
                            voitot.Insert(0, s);
                        }
                    }
                }
            } while (kaynnissa);
        }

M1888's avatar
M1888 committed
103 104 105
        public MainWindow()
        {
            InitializeComponent();
M1888's avatar
16.4.  
M1888 committed
106

M1888's avatar
M1888 committed
107 108 109 110 111 112 113 114 115 116 117
            // tällä saadaan käyttöliittymässä luvut ja rahamäärät näkymään oikein.
            // https://stackoverflow.com/questions/7454024/setting-culture-en-in-globally-in-wpf-app
            var culture = new CultureInfo("fi-FI");
            CultureInfo.DefaultThreadCurrentCulture = culture;
            CultureInfo.DefaultThreadCurrentUICulture = culture;
            FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new
                FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));


            // luodaan lottokone ja sidotaan se stackpanelin datacontekstiksi
            kone = new Lotto();
M1888's avatar
10.4.  
M1888 committed
118
            spLotto.DataContext = kone;
M1888's avatar
16.4.  
M1888 committed
119

M1888's avatar
M1888 committed
120 121 122 123 124 125 126 127 128
            // luodaan meidän pelaaja, ja lisätään se lottoon.
            pelaaja = new Pelaaja(Properties.Settings.Default.Nimi);
            pelaaja.Riveja = Properties.Settings.Default.Arparivit + Properties.Settings.Default.Vakiorivit;
            pelaaja.RivitVoimassa = Properties.Settings.Default.ArparivitVoimassa;
            kone.Pelaajat.Add(pelaaja);

            // sidotaan meidät pelaajan tietoikkunaan
            spPlayer.DataContext = pelaaja;

M1888's avatar
16.4.  
M1888 committed
129
            // status-ikkunaan skrollaava historia eventeistä
M1888's avatar
M1888 committed
130 131 132
            // EnableCollectionSynchronization() mahdollistaa listan käyttämisen muista 
            // threadeista, ja UI-thread saa siitä silti CollectionUpdated eventin.
            BindingOperations.EnableCollectionSynchronization(kone.StatusHistory, kone.StatusLock);
M1888's avatar
10.4.  
M1888 committed
133
            lstStatus.ItemsSource = kone.StatusHistory;
M1888's avatar
M1888 committed
134 135 136 137 138 139 140 141

            // voitoille samat kun ylempi
            voitot = new ObservableCollection<string>();
            voittolukko = new object();
            BindingOperations.EnableCollectionSynchronization(voitot, voittolukko);
            lstVoitot.ItemsSource = voitot;

            btnStop.IsEnabled = false;
M1888's avatar
10.4.  
M1888 committed
142 143 144 145
        }

        private void btnNext_Click(object sender, RoutedEventArgs e)
        {
M1888's avatar
M1888 committed
146 147
            btnStart.IsEnabled = false;
            btnNext.IsEnabled = false;
M1888's avatar
10.4.  
M1888 committed
148

M1888's avatar
M1888 committed
149 150
            // ajetaan looppi kerran. kun kaynnissa = false, niin se palautuu heti.
            GameLoop();
M1888's avatar
16.4.  
M1888 committed
151

M1888's avatar
M1888 committed
152 153
            btnNext.IsEnabled = true;
            btnStart.IsEnabled = true;
M1888's avatar
10.4.  
M1888 committed
154 155
        }

M1888's avatar
16.4.  
M1888 committed
156 157
        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
M1888's avatar
M1888 committed
158 159 160 161 162 163 164 165 166
            btnStop.IsEnabled = true;
            btnStart.IsEnabled = false;
            btnNext.IsEnabled = false;
            btnSettings.IsEnabled = false;

            kaynnissa = true;
            runner = new Thread(GameLoop);
            runner.IsBackground = true;
            runner.Start();
M1888's avatar
16.4.  
M1888 committed
167 168 169 170
        }

        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
M1888's avatar
M1888 committed
171 172 173 174 175 176 177 178
            kaynnissa = false;
            // odotetaan max 2sek
            runner.Join(2000);

            btnNext.IsEnabled = true;
            btnStart.IsEnabled = true;
            btnStop.IsEnabled = false;
            btnSettings.IsEnabled = true;
M1888's avatar
16.4.  
M1888 committed
179 180 181 182
        }

        private void btnSettings_Click(object sender, RoutedEventArgs e)
        {
M1888's avatar
M1888 committed
183 184
            var a = new Asetukset();
            a.ShowDialog();
M1888's avatar
M1888 committed
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
            
            // kun asetuksista palataan, voidaan ottaa uudet asetukset käyttöön.

            

            int curr = kone.Pelaajat.Count();
            // + 1 koska pelaajissa on myös meidän pelaajaolio
            int uusi = Properties.Settings.Default.Pelaajia + 1;
            if (curr < uusi)
            {
                kone.LisaaPelaajia(uusi - curr, Properties.Settings.Default.Riveja);
                kone.Status = $"Lisätty {uusi - curr} pelaajaa.";
            }
            else if (curr > uusi)
            {
                kone.PoistaPelaajia(curr - uusi);
                kone.Status = $"Poistettu {curr - uusi} pelaajaa.";
            }

            Pelaaja tmp = kone.Pelaajat.Last();
            if (tmp.RivitVoimassa != Properties.Settings.Default.Voimassa)
            {
                kone.Status = $"Rivit voimassa {tmp.RivitVoimassa} -> {Properties.Settings.Default.Voimassa} viikkoa";
                foreach (Pelaaja p in kone.Pelaajat)
                {
                    p.RivitVoimassa = Properties.Settings.Default.Voimassa;
                }
            }
            if(tmp.Riveja != Properties.Settings.Default.Riveja)
            {
                kone.Status = $"Simuloitujen pelaajien rivejä {tmp.Riveja} -> {Properties.Settings.Default.Riveja}";
                foreach(Pelaaja p in kone.Pelaajat)
                {
                    p.Riveja = Properties.Settings.Default.Riveja;
                }
            }

            // saatettiin poistaa pelaajia, niin varmistetaan, että meidän pelaaja on
            // yhä lotossa mukana...
            if (!kone.Pelaajat.Contains(pelaaja))
            {
                kone.Status = "Lisätty oma pelaaja takaisin listoille";
                kone.Pelaajat.Add(pelaaja);
            }

            if (pelaaja.Nimi != Properties.Settings.Default.Nimi)
                pelaaja.Nimi = Properties.Settings.Default.Nimi;

            if (pelaaja.Riveja != Properties.Settings.Default.Arparivit + Properties.Settings.Default.Vakiorivit)
            {
                kone.Status = $"Omat rivit {pelaaja.Riveja} -> {Properties.Settings.Default.Arparivit + Properties.Settings.Default.Vakiorivit}";
                pelaaja.Riveja = Properties.Settings.Default.Arparivit + Properties.Settings.Default.Vakiorivit;
            }

            if (pelaaja.RivitVoimassa != Properties.Settings.Default.ArparivitVoimassa)
                pelaaja.RivitVoimassa = Properties.Settings.Default.ArparivitVoimassa;

            
M1888's avatar
16.4.  
M1888 committed
243
        }
M1888's avatar
M1888 committed
244 245
    }
}