示例#1
0
        // Apurutiini, muodostaa seloluvusta ja tuloksesta merkkijonon,
        // Esim. selo 1441, tulos voitto -> "+1441"
        private string MuodostaOttelu(int selo, Vakiot.OttelunTulos_enum tulos)
        {
            string ottelu;

            switch (tulos)
            {
            case Vakiot.OttelunTulos_enum.TULOS_VOITTO:
                ottelu = "+";
                break;

            case Vakiot.OttelunTulos_enum.TULOS_TASAPELI:
                ottelu = "=";
                break;

            case Vakiot.OttelunTulos_enum.TULOS_TAPPIO:
                ottelu = "-";
                break;

            case Vakiot.OttelunTulos_enum.TULOS_EI_ANNETTU:
                ottelu = "";
                break;

            default:
                ottelu = "*";      // VIRHE
                break;
            }
            ottelu += selo.ToString();
            return(ottelu);
        }
示例#2
0
        public void TarkistaOttelulistaErillisinTuloksin()
        {
            // input
            Vakiot.Miettimisaika_enum aika = Vakiot.Miettimisaika_enum.MIETTIMISAIKA_VAH_90MIN;
            string selo        = "1525";
            string pelimaara   = "";
            string vastustajat = "+1525 +1441 -1973 +1718 -1784 -1660 -1966 =1234 1555";

            Vakiot.OttelunTulos_enum tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON;


            Syotetiedot s = new Syotetiedot(aika, selo, pelimaara, vastustajat, tulos);

            //
            // Check that the input was stored correctly!
            //
            Assert.AreEqual(aika, s.Miettimisaika);
            Assert.AreEqual(selo, s.AlkuperainenSelo_str);
            Assert.AreEqual(pelimaara, s.AlkuperainenPelimaara_str);
            Assert.AreEqual(vastustajat, s.VastustajienSelot_str);
            Assert.AreEqual(tulos, s.OttelunTulos);

            //
            // parse strings into numbers, create an array of opponents
            //
            int status = so.TarkistaSyote(s);

            Assert.AreEqual(Vakiot.SYOTE_STATUS_OK, status);

            int seloInt;

            if (int.TryParse(selo, out seloInt) == false)
            {
                Assert.AreEqual("Illegal test data (number)", selo);
            }

            Assert.AreEqual(seloInt, s.AlkuperainenSelo);
            Assert.AreEqual(Vakiot.PELIMAARA_TYHJA, s.AlkuperainenPelimaara);

            //
            // Tarkista ottelulista, ensin lukumäärä
            //
            string[] vastustajatStr = vastustajat.Split(' ');
            Assert.AreEqual(vastustajatStr.Length, s.Ottelut.Lukumaara);

            // Käy sitten tallennetut ottelut läpi

            int         i     = 0;
            Ottelulista lista = s.Ottelut;

            var ottelu = lista.HaeEnsimmainen(); // vastustajanSelo, ottelunTulos

            while (ottelu.Item2 != Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON)
            {
                Assert.AreEqual(MuodostaOttelu(ottelu.Item1, ottelu.Item2), vastustajatStr[i]);
                ottelu = lista.HaeSeuraava();
                i++;
            }
        }
示例#3
0
        // pelatusta shakkiottelusta lasketaan vahvuusluku
        //
        // IN: vastustajan_selo 1000-2999
        // IN: ottelun tulos: 0 = tappio, 1 = tasapeli, 2 = voitto (oikeasti 0, 1/2 ja 1)
        //
        // Käyttää: uusiSelo ja UusiPelimaara
        // Päivittää: Odotustulos, MinSelo ja MaxSelo

        // Palauttaa: uusi vahvuusluku
        //
        private int PelaaOttelu(int vastustajanSelo, Vakiot.OttelunTulos_enum tulos, bool vaihdaVanhaksiPelaajaksi)
        {
            int odotustulos1;  // yhden ottelun Odotustulos, lisätään turnauksen odotustulokseen
            int selo;

            // Erikoistapaus
            if (tulos == Vakiot.OttelunTulos_enum.TULOS_EI_ANNETTU)
            {
                tulos = Vakiot.OttelunTulos_enum.TULOS_TASAPELI;
            }

            // Vanhan pelaajan SELOn laskennassa käytetään odotustulosta ja kerrointa
            //
            if (vaihdaVanhaksiPelaajaksi)
            {
                odotustulos1 = MaaritaOdotustulos(UusiSelo, vastustajanSelo);
            }
            else
            {
                odotustulos1 = MaaritaOdotustulos(alkuperaisetSyotteet.AlkuperainenSelo, vastustajanSelo);
            }

            Odotustulos       += odotustulos1; // monta ottelua, niin summa kunkin ottelun odotustuloksista
            TurnauksenTulos2x += (int)tulos;

            if (!vaihdaVanhaksiPelaajaksi && alkuperaisetSyotteet.UudenPelaajanLaskentaAlkupPelimaara())
            {
                //
                // Uuden pelaajan laskennassa käytetään vastustajan seloa tuloksen mukaan -200 / +0 / +200

                int[] selomuutos = { -200, 0, 200 };  // indeksinä tulos 2*(0, 1/2, 1) -> indeksi (0, 1, 2)

                // Uuden pelaajan SELO, kun pelimäärä 0-10
                // XXX: Kun ensimmäinen ottelu, niin UusiSelo ja UusiPelimaara ovat käyttäjän antamat alkuarvot omaSelo ja pelimaara
                // XXX: Laskennan edetessä niitä päivitetään

                // Jos pelimäärä on 0, niin omalla selolla (selo-kenttä) ei ole merkitystä (UusiSelo * 0 on nolla)
                selo = (int)Math.Round((UusiSelo * UusiPelimaara + (vastustajanSelo + selomuutos[(int)tulos])) / (UusiPelimaara + 1F) + 0.01);
            }
            else
            {
                // Vanhan pelaajan laskenta
                //
                // XXX: Käytetään kerrointa ja lisäkerrointa, jotka lasketaan laskennan aikaisesta vahvuusluvusta, OK?
                int   kerroin1    = MaaritaKerroin(UusiSelo);
                float lisakerroin = MaaritaLisakerroin(UusiSelo, alkuperaisetSyotteet.Miettimisaika);

                // vanhan pelaajan SELO, kun pelimäärä jätetty tyhjäksi tai on yli 10.
                selo = (int)Math.Round((UusiSelo + kerroin1 * lisakerroin * (((int)tulos / 2F) - (odotustulos1 / 100F)) + 0.1F) + 0.01);
            }

            // tallenna vaihteluväli (jos yksi ottelu, niin jäävät samoiksi)
            MinSelo = Math.Min(MinSelo, selo);
            MaxSelo = Math.Max(MaxSelo, selo);

            return(selo);
        }
示例#4
0
        // Tarkista valitun ottelun tulos -painikkeen kelvollisuus
        //
        // Painikkeesta ei voida saada väärää tulosta.
        // Mutta jos tulos oli kerrottu CSV-formaatissa, niin siellä on voinut olla virhe,
        // ks. SelvitaTulosCSV()
        //
        // Virhestatus palautetaan, jos oli TULOS_MAARITTELEMATON
        //
        // Tulos TULOS_EI_ANNETTU ei ole virhe, koska se koskee merkkijonossa annettua tulosta,
        // joka tarkoituksella on jätetty antamatta. TULOS_EI_ANNETTU lasketaan tasapelinä.
        //
        private static int TarkistaOttelunTulos(Vakiot.OttelunTulos_enum ottelunTulos)
        {
            int tulos = Vakiot.SYOTE_STATUS_OK;

            if (ottelunTulos == Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON)
            {
                tulos = Vakiot.SYOTE_VIRHE_BUTTON_TULOS;
            }
            return(tulos);
        }
示例#5
0
 // Yksittäisen ottelun tulos joko "0", "0.0", "0,0", "0.5", "0,5", "1/2", "½" (alt-171), "1", "1.0" tai "1,0"
 // Toistaiseksi CSV-formaatin tuloksissa voi käyttää vain desimaalipistettä, joten ei voida syöttää
 // tuloksia pilkun kanssa kuten "0,0", "0,5" ja "1,0". Tarkistetaan ne kuitenkin varalta.
 private Vakiot.OttelunTulos_enum SelvitaTulosCSV(string s)
 {
     Vakiot.OttelunTulos_enum tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON;
     if (s.Equals("0") || s.Equals("0.0") || s.Equals("0,0"))
     {
         tulos = Vakiot.OttelunTulos_enum.TULOS_TAPPIO;
     }
     else if (s.Equals("0.5") || s.Equals("0,5") || s.Equals("1/2") || s.Equals("½"))
     {
         tulos = Vakiot.OttelunTulos_enum.TULOS_TASAPELI;
     }
     else if (s.Equals("1") || s.Equals("1.0") || s.Equals("1,0"))
     {
         tulos = Vakiot.OttelunTulos_enum.TULOS_VOITTO;
     }
     return(tulos);
 }
示例#6
0
        // XXX: REFACTOR TarkistaVastustajanSelo()

        // ************ TARKISTA VASTUSTAJAN SELO-KENTTÄ ************
        //
        // Ottelut (selot ja tulokset) tallennetaan listaan
        //
        // Syöte voi olla annettu kolmella eri formaatilla:
        //  1)  1720   -> ja sitten tulos valintanapeilla
        //  2)  2,5 1624 1700 1685 1400    Eli aloitetaan kokonaispistemäärällä.
        //                                 SELOt ilman erillisiä tuloksia.
        //  3)  +1624 -1700 =1685 +1400    jossa  '+' voitto, '=' tasapeli ja '-' tappio.
        //                                 Tasapeli voidaan myös antaa ilman '='-merkkiä.
        //
        // Yhden ottelun tulos voidaan antaa kolmella tavalla:
        //   1)  1720      ja tulos erikseen valintanapeilla, esim. 1=voitto, 1/2=tasapeli tai 0=tappio
        //   2)  -1720  (tappio), =1720    (tasapeli) tai +1720  (voitto)
        //   3)  0 1720 (tappio), 0.5 1720 (tasapeli) tai 1 1720 (voitto)
        //
        // Kahden tai useamman ottelun tulos voidaan syöttää kahdella eri tavalla
        //   1) 2,5 1624 1700 1685 1400
        //   2) +1624 -1700 =1685 +1400  (Huom! myös -1624 +1700 +1685 1400 laskee saman vahvuusluvun)
        // HUOM! Jos tuloksessa on desimaalit väärin, esim. 2.37 tai 0,9,
        //       niin ylimääräiset desimaalit "pyöristyvät" alas -> 2,0 tai 0,5.
        //
        // Paluuarvo joko kelvollinen seloluku (vain yksi vastustaja annettu), nolla (jos ottelut ovat listassa) tai virhestatus.
        //
        // Jos syote sisältää '/' -merkin, on laskettava sitä edeltävät tulokset uuden pelaajan kaavalla
        // ja sen jälkeen normaalilla laskentakaavalla
        private int TarkistaVastustajanSelo(Ottelulista ottelut, string syote)
        {
            int vastustajanSelo = 0;   // palautettava vastustajan selo tai nolla tai virhestatus
            int virhekoodi      = 0;

            bool  onko_turnauksen_tulos = false; // oliko tulos ensimmäisenä?
            float syotetty_tulos        = 0F;    // tähän sitten sen tulos desimaalilukuna (esim. 2,5)

            // kentässä voidaan antaa alussa turnauksen tulos, esim. 0.5, 2.0, 2.5, 7.5 eli saadut pisteet
            selopelaaja.SetAnnettuTurnauksenTulos(Vakiot.TURNAUKSEN_TULOS_ANTAMATTA);  // oletus: ei annettu turnauksen tulosta

            // Ensin helpot tarkistukset:
            // 1) Kenttä ei saa olla tyhjä
            if (string.IsNullOrWhiteSpace(syote))
            {
                virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO;
            }
            else if (syote.Length == Vakiot.SELO_PITUUS)
            {
                if (int.TryParse(syote, out vastustajanSelo) == false)
                {
                    // 2) Jos on annettu neljä merkkiä (esim. 1728), niin sen on oltava numero
                    virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO;
                }
                else if (vastustajanSelo < Vakiot.MIN_SELO || vastustajanSelo > Vakiot.MAX_SELO)
                {
                    // 3) Numeron on oltava sallitulla lukualueella
                    //    Mutta jos oli OK, niin vastustajanSelo sisältää nyt sallitun vahvuusluvun eikä tulla tähän
                    virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO;
                }
                // Jos OK, yhden ottelun tulosta ei kuitenkaan vielä tallenneta listaan
                // vaan nyt palataan tästä funktiosta ja seuraavaksi selvitetään ottelun tulos
            }
            else
            {
                // Jäljellä vielä hankalammat tapaukset:
                // 4) turnauksen tulos+vahvuusluvut, esim. 2,5 1624 1700 1685 1400
                // 5) vahvuusluvut, joissa kussakin tulos  +1624 -1700 =1685 +1400
                // 6) vahvuusluvut tuloksineen ja välissä '/'-merkki +1624 -1700 / =1685 +1400
                //
                // TULOSSA:
                // 7) turnauksen_tulos turnauksen_ottelumäärä vastustajien_selokeskiarvo, esim. 12.5 18 1885.2

                // Apumuuttujat
                bool status = true;
                int  selo1;               // = Vakiot.MIN_SELO;
                bool ensimmainen = true;  // ensimmäinen syötekentän numero tai merkkijono
                bool toinen      = false; // toinen syötekenttä

                List <string> SyotteenOsat = syote.Split(' ').ToList();

                // Tutki vastustajanSelo_comboBox-kenttä välilyönnein erotettu merkkijono kerrallaan
                foreach (string vastustaja in SyotteenOsat)
                {
                    if (ensimmainen)
                    {
                        // need to use temporary variable because can't modify foreach iteration variable
                        string tempString = vastustaja;

                        // 4) Onko annettu kokonaispistemäärä? (eli useamman ottelun yhteistulos)
                        ensimmainen = false;
                        toinen      = true;

                        // Laita molemmat 1.5 ja 1,5 toimimaan, InvariantCulture
                        // Huom! Pilkkua ei voidakaan käyttää, jos halutaan
                        // että CSV-formaatti toimii - pilkulla erotetut arvot
                        if (tempString.Contains(','))  // korvaa pilkku pisteellä...
                        {
                            tempString = tempString.Replace(',', '.');
                        }

                        // Jos ottelutulon lopussa on puolikas, niin muuta se ".5":ksi, esim. 10½ -> 10.5
                        // Jos ottelutulos on ½, niin tässä se muutetaan "0.5":ksi
                        if (tempString.IndexOf('½') == tempString.Length - 1)
                        {
                            if (tempString.Length > 1)
                            {
                                tempString = tempString.Replace("½", ".5");
                            }
                            else
                            {
                                tempString = "0.5";  // muutetaan suoraan, koska oli pelkästään "½"
                            }
                        }

                        if (float.TryParse(tempString, System.Globalization.NumberStyles.AllowDecimalPoint,
                                           System.Globalization.CultureInfo.InvariantCulture, out syotetty_tulos) == true)
                        {
                            if (syotetty_tulos >= 0.0F && syotetty_tulos <= Vakiot.TURNAUKSEN_TULOS_MAX)
                            {
                                // HUOM! Jos tuloksessa on desimaalit väärin, esim. 2.37 tai 0,9,
                                //       niin ylimääräiset desimaalit "pyöristyvät" alas -> 2,0 tai 0,5.
                                onko_turnauksen_tulos = true;
                                selopelaaja.SetAnnettuTurnauksenTulos(syotetty_tulos);

                                // alussa oli annettu turnauksen lopputulos, jatka SELOjen tarkistamista
                                // Nyt selojen on oltava ilman tulosmerkintää!
                                continue;
                            }
                            // Jos ei saatu kelvollista lukua, joka käy tuloksena, niin jatketaan
                            // ja katsotaan, saadaanko vahvuusluku sen sijaan (jossa voi olla +/=/-)
                        }



                        // XXX: EI MUKANA VIELÄ
                        //}
                        //else if (toinen && onko_turnauksen_tulos && (vastustaja.Length == 1 || vastustaja.Length == 2) && !vastustaja.Equals("/") && SyotteenOsat.Count == 3)
                        //{
                        //    // Format 7) This must be number of matches N or NN, and then 3rd item should be average SELO of the opponents
                        //    string pelimaara_str = SyotteenOsat[1];
                        //    string keskiselo_str = SyotteenOsat[2];
                        //    int pelimaara;
                        //    float keskiselo;
                        //    toinen = false;
                        //    if (int.TryParse(pelimaara_str, out pelimaara) == true)
                        //    {
                        //        // pelimaara >= GetAnnettu
                        //        if (pelimaara * 2 < selopelaaja.GetAnnettuTurnauksenTulos2x())
                        //        {
                        //            virhekoodi = Vakiot.SYOTE_VIRHE_TURNAUKSEN_TULOS;
                        //            status = false;
                        //            break;
                        //        }

                        //        selopelaaja.VastustajienLkm = pelimaara;

                        //        // keskiselo yhdellä desimaalilla, piste tai pilkku
                        //        if (float.TryParse(keskiselo_str, System.Globalization.NumberStyles.AllowDecimalPoint,
                        //        System.Globalization.CultureInfo.InvariantCulture, out keskiselo))
                        //        {
                        //            if (keskiselo < Vakiot.MIN_SELO || keskiselo > Vakiot.MAX_SELO)
                        //            {
                        //                virhekoodi = Vakiot.SYOTE_VIRHE_KESKIVAHVUUS;
                        //                status = false;
                        //                break;
                        //            }
                        //            selopelaaja.TurnauksenKeskivahvuus = (int)(keskiselo + 0.5 + 0.001);
                        //            selopelaaja.TurnauksenKeskivahvuus10x = (int)(10 * keskiselo + 0.001);
                        //            vastustajanSelo = selopelaaja.TurnauksenKeskivahvuus;
                        //            // status edelleen true
                        //            break;

                        //        }
                        //        virhekoodi = Vakiot.SYOTE_VIRHE_KESKIVAHVUUS;
                        //        status = false;
                        //        break;
                        //    }
                    }
                    else if (vastustaja.Equals("/"))
                    {
                        toinen = false;
                        if (selopelaaja.UudenPelaajanPelitLKM > 0)
                        {
                            // joko oli kauttamerkki? Ei saa olla kahta!
                            virhekoodi = Vakiot.SYOTE_VIRHE_UUDEN_PELAAJAN_OTTELUT_KAKSI_KAUTTAMERKKIA;
                            status     = false;
                            break;
                        }
                        // '/' ei voi olla ensimmäisenä
                        // '/' ei saa olla, jos oli annettu turnauksen tulos
                        // täytyy olla ainakin yksi ottelutulos ja sen jälkeen pitäisi olla (ei pakko) lisää otteluita
                        //
                        // Jos alkuperäinen pelimäärä oli 0, niin on laskettava ainakin 11 peliä uuden kaavalla
                        // tarkistus kutsuvalla tasolla
                        if (onko_turnauksen_tulos || ottelut.Lukumaara < 1)
                        {
                            virhekoodi = Vakiot.SYOTE_VIRHE_UUDEN_PELAAJAN_OTTELUT_ENINT_10;
                            status     = false;
                            break;
                        }
                        selopelaaja.UudenPelaajanPelitLKM = ottelut.Lukumaara;
                        continue;
                    }

                    toinen = false;

                    // Tarkista yksittäiset vastustajien vahvuusluvut

                    // merkkijono voi alkaa merkillä '+', '=' tai '-'
                    // Mutta tasapeli voidaan antaa myös ilman '='-merkkiä
                    // Jos oli annettu turnauksen tulos, niin selot on syötettävä näin ilman tulosta
                    if (vastustaja.Length == Vakiot.SELO_PITUUS)    // numero (4 merkkiä)
                    {
                        if (int.TryParse(vastustaja, out selo1) == false)
                        {
                            virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO;  // -> virheilmoitus, ei ollut numero
                            status     = false;
                            break;
                        }
                        else if (selo1 < Vakiot.MIN_SELO || selo1 > Vakiot.MAX_SELO)
                        {
                            virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO;  // -> virheilmoitus, ei sallittu numero
                            status     = false;
                            break;
                        }

                        // Hm... miten tallennus?
                        //
                        //if (onko_turnauksen_tulos) {
                        //    Jos annettu turnauksen tulos, ei merkitystä, koska tehdään uusi laskenta, jossa käytetään turnauksen tulosta
                        //    ottelut.LisaaOttelunTulos(selo1, Vakiot.OttelunTulos_enum.TULOS_EI_ANNETTU);
                        //} else {
                        //    // Tallenna tasapeli, jos tulokset formaatissa +1624 -1700 =1685 +1400, jossa tasapeli
                        //    // on annettu ilman '='-merkkiä eli vaikkapa "+1624 -1700 1685 +1400"
                        //    ottelut.LisaaOttelunTulos(selo1, Vakiot.OttelunTulos_enum.TULOS_TASAPELI);
                        //}

                        // Jos ottelun tulosta ei annettu, niin sitä ei tallenneta
                        // Laskennassa tämä otetaan kuitenkin huomioon tasapelinä, jolloin "+1624 -1700 1685 +1400" menee oikein
                        // Ks. Selopelaaja PelaaOttelu()
                        //
                        // Näin myös yksikkötestauksessa on helpompi tarkistaa tiedot,
                        // koska syötteen "=1234" on eri tapaus kuin "1234".
                        ottelut.LisaaOttelunTulos(selo1, Vakiot.OttelunTulos_enum.TULOS_EI_ANNETTU); // OK
                    }
                    else if (onko_turnauksen_tulos == false && vastustaja.Length == Vakiot.MAX_PITUUS)
                    {
                        // 5)
                        // Erillisten tulosten antaminen hyväksytään vain, jos turnauksen
                        // lopputulosta ei oltu jo annettu (onko_turnauksen_tulos false)

                        Vakiot.OttelunTulos_enum tulos1 = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON;

                        if (vastustaja[0] >= '0' && vastustaja[0] <= '9')
                        {
                            // tarkistetaan, voidaan olla annettu viisinumeroinen luku
                            // 10000 - 99999... joten anna virheilmoitus vahvuusluvusta
                            virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO;
                            status     = false;
                        }
                        else
                        {
                            // Ensimmäinen merkki kertoo tuloksen
                            switch (vastustaja[0])
                            {
                            case '+':
                                tulos1 = Vakiot.OttelunTulos_enum.TULOS_VOITTO;
                                break;

                            case '=':
                                tulos1 = Vakiot.OttelunTulos_enum.TULOS_TASAPELI;
                                break;

                            case '-':
                                tulos1 = Vakiot.OttelunTulos_enum.TULOS_TAPPIO;
                                break;

                            default:     // ei sallittu tuloksen kertova merkki
                                virhekoodi = Vakiot.SYOTE_VIRHE_YKSITTAINEN_TULOS;
                                status     = false;
                                break;
                            }
                        }

                        // jos virhe, pois foreach-loopista
                        if (!status)
                        {
                            break;
                        }

                        // Selvitä vielä tuloksen perässä oleva numero
                        // tarkista sitten, että on sallitulla alueella
                        if (int.TryParse(vastustaja.Substring(1), out selo1) == false)
                        {
                            virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO;  // -> virheilmoitus, ei ollut numero
                            status     = false;
                        }
                        else if (selo1 < Vakiot.MIN_SELO || selo1 > Vakiot.MAX_SELO)
                        {
                            status = false;
                            break;
                        }

                        // Tallennetaan tulos: vahvuusluku ja +/-/=-merkeistä selvitetty tulos listaan
                        ottelut.LisaaOttelunTulos(selo1, tulos1);
                    }
                    else
                    {
                        // pituus ei ollut
                        //   - SELO_PITUUS (esim. 1234)
                        //   - MAX_PITUUS (esim. +1234) silloin kun tulos voidaan antaa
                        // Tähän tullaan myös, jos turnauksen kokonaistulos oli annettu ennen vahvuuslukuja,
                        // koska silloin annetaan vain pelkät vahvuusluvut ilman yksittäisiä tuloksia.
                        // Ei ole sallittu  2,5 +1624 =1700 -1685 +1400 (oikein on 2,5 1624 1700 1685 1400)
                        virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO;
                        status     = false;
                        break;
                    }

                    // Oliko asetettu virhe, mutta ei vielä poistuttu foreach-loopista?
                    if (!status)
                    {
                        break;
                    }
                } // foreach (käydään läpi syötteen numerot)

                // Lisää tarkastuksia
                // 6) Annettu turnauksen tulos ei saa olla suurempi kuin pelaajien lukumäärä
                //    Jos tulos on sama kuin pelaajien lkm, on voitettu kaikki ottelut.
                if (status && onko_turnauksen_tulos)
                {
                    if (ottelut.Lukumaara == 0)
                    {
                        // jos ei otteluita, mutta oli saatu turnauksen tulos N tai NN,
                        // niin annetaan virheilmoitus vastustajan selo virheellinen
                        virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO;
                    }
                    // Vertailu kokonaislukuina, esim. syötetty tulos 3.5 ja pelaajia 4, vertailu 7 > 8.
                    else if ((int)(2 * syotetty_tulos + 0.01F) > 2 * ottelut.Lukumaara)
                    {
                        virhekoodi = Vakiot.SYOTE_VIRHE_TURNAUKSEN_TULOS;  // tästä oma virheilmoitus
                        //status = false; // no need to clear status any more
                    }
                }
            }

            // Palauta virhekoodi tai selvitetty yksittäisen vastustajan selo (joka on 0, jos ottelut listassa)
            return(virhekoodi < 0 ? virhekoodi : vastustajanSelo);
        }
示例#7
0
        // Ottelutuloksen (vastustaja ja tulos) lisääminen listaan
        public void LisaaOttelunTulos(int vastustajanSelo, Vakiot.OttelunTulos_enum ottelunTulos)
        {
            Ottelu ottelu = new Ottelu(vastustajanSelo, ottelunTulos);

            tallennetutOttelut.Add(ottelu);
        }
示例#8
0
 public Ottelu(int selo, Vakiot.OttelunTulos_enum tulos)  // tallentaa
 {
     VastustajanSelo = selo;
     OttelunTulos    = tulos;
 }
示例#9
0
        public void TarkistaOttelulistaTurnauksenTuloksella()
        {
            // input
            Vakiot.Miettimisaika_enum aika = Vakiot.Miettimisaika_enum.MIETTIMISAIKA_VAH_90MIN;
            string selo        = "1525";
            string pelimaara   = "";
            string vastustajat = "1.5 1525 1441 1973 1718 1784 1660 1966";

            Vakiot.OttelunTulos_enum tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON;

            Syotetiedot s = new Syotetiedot(aika, selo, pelimaara, vastustajat, tulos);

            //
            // Check that the input was stored correctly!
            //
            Assert.AreEqual(aika, s.Miettimisaika);
            Assert.AreEqual(selo, s.AlkuperainenSelo_str);
            Assert.AreEqual(pelimaara, s.AlkuperainenPelimaara_str);
            Assert.AreEqual(vastustajat, s.VastustajienSelot_str);
            Assert.AreEqual(tulos, s.OttelunTulos);

            //
            // parse strings into numbers, create an array of opponents
            //
            int status = so.TarkistaSyote(s);

            Assert.AreEqual(Vakiot.SYOTE_STATUS_OK, status);

            int seloInt;

            if (int.TryParse(selo, out seloInt) == false)
            {
                Assert.AreEqual("Illegal test data (number)", selo);
            }

            Assert.AreEqual(seloInt, s.AlkuperainenSelo);
            Assert.AreEqual(Vakiot.PELIMAARA_TYHJA, s.AlkuperainenPelimaara);

            //
            // Tarkista ottelulista, ensin lukumäärä
            //
            // Huom! Nyt vastustajatStr sisältää myös turnauksen tuloksen, joten vähennettävä lukumäärää yhdellä
            //
            string[] vastustajatStr = vastustajat.Split(' ');
            Assert.AreEqual(vastustajatStr.Length - 1, s.Ottelut.Lukumaara);

            // Käy sitten tallennetut ottelut läpi

            // Huom! Koska vastustajatStr sisältää myös turnauksen tuloksen, aloitetaan indeksistä 1
            int         i     = 1;
            Ottelulista lista = s.Ottelut;

            var ottelu = lista.HaeEnsimmainen(); // vastustajanSelo, ottelunTulos

            while (ottelu.Item2 != Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON)
            {
                // Koska käytetty turnauksen tulosta, niin listaan tallennettuihin otteluihin ei ole annettu tulosta
                Assert.AreEqual(MuodostaOttelu(ottelu.Item1, ottelu.Item2), vastustajatStr[i]);
                ottelu = lista.HaeSeuraava();
                i++;
            }
        }
示例#10
0
        // --------------------------------------------------------------------------------
        // Parametrien tarkistuksen ja laskennan testauksen apurutiinit
        //
        // Näissä kaikissa on string selo ja string vastustajat
        // Muiden parametrien puuttumisen varalta on useita versioita
        // --------------------------------------------------------------------------------

        // Use old Tuple, because Visual Studio Community 2015 has older C#
        public Tuple <int, Selopelaaja> Testaa(Vakiot.Miettimisaika_enum aika, string selo, string pelimaara, string vastustajat, Vakiot.OttelunTulos_enum tulos)
        {
            Syotetiedot syotetiedot = new Syotetiedot(aika, selo, pelimaara, vastustajat, tulos, /*trim input strings*/ true);
            int         status;
            Selopelaaja tulokset = null;

            if ((status = so.TarkistaSyote(syotetiedot)) == Vakiot.SYOTE_STATUS_OK)
            {
                // If the input was OK, continue and calculate
                // If wasn't, then tulokset is left null and error status will be returned
                tulokset = so.SuoritaLaskenta(syotetiedot);
            }
            return(Tuple.Create(status, tulokset));
        }
示例#11
0
 // Jos aikaa, pelimäärää ei annettu, oletuksena 90 minuuttia ja ""
 public Tuple <int, Selopelaaja> Testaa(string selo, string vastustajat, Vakiot.OttelunTulos_enum tulos)
 {
     return(Testaa(Vakiot.Miettimisaika_enum.MIETTIMISAIKA_VAH_90MIN, selo, "", vastustajat, tulos));
 }
示例#12
0
        //  - TESTATTAESSA (UnitTest1.cs)
        //     Syotetiedot ottelu =
        //        new Syotetiedot(Vakiot.Miettimisaika_enum.MIETTIMISAIKA_VAH_90MIN, "1725", "1", "1441", Vakiot.OttelunTulos_enum.TULOS_VOITTO, /*doTrim*/true);
        // Testattaessa doTrim=true, koska välilyöntien poistoa ei tehdä yksikkötestauksessa vaan
        // poiston jättäminen tänne on osa testausta.
        public Syotetiedot(Vakiot.Miettimisaika_enum aika1, string selo1, string pelimaara1, string vastustajat1, Vakiot.OttelunTulos_enum tulos1, bool doTrim)
        {
            // XXX: Could check arguments everywhere: arg == null or sometimes string.IsNullOrEmpty(arg)
            if (selo1 == null)
            {
                throw new ArgumentNullException(nameof(selo1));
            }
            if (pelimaara1 == null)
            {
                throw new ArgumentNullException(nameof(pelimaara1));
            }
            if (vastustajat1 == null)
            {
                throw new ArgumentNullException(nameof(vastustajat1));
            }


            // Copy arguments, might be modified
            Vakiot.Miettimisaika_enum aika = aika1;
            string selo        = String.Copy(selo1);
            string pelimaara   = String.Copy(pelimaara1);
            string vastustajat = String.Copy(vastustajat1);

            Vakiot.OttelunTulos_enum tulos = tulos1;


            // If CSV format, values there will override other parameters
            if (vastustajat.Contains(','))
            {
                List <string> tmp = vastustajat.Split(',').ToList();

                if (tmp.Count != 2 || (tmp.Count == 2 && tmp[0].Trim().Length >= 4))
                {
                    //vastustajat = so.SiistiVastustajatKentta(vastustajat.Trim());
                    List <string> data = vastustajat.Split(',').ToList();

                    if (data.Count == 5)
                    {
                        aika        = this.SelvitaMiettimisaikaCSV(data[0]);
                        selo        = data[1];
                        pelimaara   = data[2];
                        vastustajat = data[3];
                        tulos       = this.SelvitaTulosCSV(data[4]);
                    }
                    else if (data.Count == 4)
                    {
                        // viimeinen osa voi sisältää vastustajat tuloksineen tai jos alkuperäinen pelimäärä on enintään 10,
                        // niin ensin lasketaan uuden pelaajan kaavalla ja loput "/"-merkin jälkeen menevät normaalilaskentaan
                        //  "90,1525,0,+1525 +1441 -1973 +1718 -1784 -1660 -1966 +1321 -1678 -1864 -1944 / -1995 +1695 -1930 1901",
                        aika        = this.SelvitaMiettimisaikaCSV(data[0]);
                        selo        = data[1];
                        pelimaara   = data[2];
                        vastustajat = data[3];
                        tulos       = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON;
                    }
                    else if (data.Count == 3)
                    {
                        //aika = aika;
                        selo        = data[0];
                        pelimaara   = data[1];
                        vastustajat = data[2];
                        tulos       = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON;
                    }
                    else if (data.Count == 2)
                    {
                        //aika = aika;
                        selo        = data[0];
                        pelimaara   = "";
                        vastustajat = data[1];
                        tulos       = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON;
                    }
                    else
                    {
                        // XXX: CHECK WHAT HAPPENS HERE
                        // XXX: Virheen pitää olla Vakiot.SYOTE_VIRHE_CSV_FORMAT

                        //aika = aika;
                        selo        = "";
                        pelimaara   = "";
                        vastustajat = "";
                        tulos       = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON;
                    }
                    // The thinking time might be needed from the form if there are 2 or 3 values in CSV format
                    //return so.SelvitaCSV(aika, vastustajat);
                }
            }

            Miettimisaika = aika;
            // if doTrim -> remove leading and trailing white spaces
            AlkuperainenSelo_str      = doTrim ? selo.Trim() : selo;
            AlkuperainenPelimaara_str = doTrim ? pelimaara.Trim() : pelimaara;
            if (doTrim)
            {
                SelolaskuriOperations so = new SelolaskuriOperations();
                vastustajat = so.SiistiVastustajatKentta(vastustajat.Trim());
            }
            VastustajienSelot_str = vastustajat;
            OttelunTulos          = tulos;

            // Clear these too although not actually needed
            AlkuperainenSelo           = 0;
            AlkuperainenPelimaara      = 0;
            UudenPelaajanPelitEnsinLKM = 0;
            YksiVastustajaTulosnapit   = 0;

            // Create en empty list for matches (opponent's selo, match result)
            Ottelut = new Ottelulista();
        }
示例#13
0
        }                                                  // sis. vastustajien selot ja ottelutulokset


        // Konstruktorin käyttö:
        //  - Lomakkeelta (SelolaskuriForm.cs)
        //     return new Syotetiedot(HaeMiettimisaika(), selo_in.Text, pelimaara_in.Text, vastustajanSelo_comboBox.Text, HaeOttelunTulos());
        // Lomakkeella doTrim=false, koska ylimääräiset välilyönnit poistetaan jo ennen kutsua, jotta
        // ne saadaan päivitettyä myös lomakkeen kenttiin.
        public Syotetiedot(Vakiot.Miettimisaika_enum aika, string selo, string pelimaara, string vastustajat, Vakiot.OttelunTulos_enum tulos)
            : this(aika, selo, pelimaara, vastustajat, tulos, /*doTrim*/ false)
        {
        }