Example #1
0
        /// <summary>
        /// Fungerande motoder
        /// </summary>
        /// <param name="text"></param>

        //Referens?
        //riktning snett nedåt krasher vid fyra irad
        Point Blocker(List <Rad> rader)
        {
            Rad rad  = rader.First();
            int ends = rad.Ends;
            //Todo om inga änder är lediga ends = 0
            Point svar = new Point();

            if (rad.OpenMid == true)
            {
                svar = rad.Rutor[ends];
                rader.RemoveAt(0);
                return(svar);
            }
            else if (ends == 3)
            {
                svar = new Point(rad.Rutor.First().X - rad.Riktning[0], rad.Rutor.First().Y - rad.Riktning[1]);
                if (rader.First().Irad >= rutnät.Irad - 1)
                {
                    rader.First().Ends = 2;
                }
                else
                {
                    rader.RemoveAt(0);
                }
            }
            else if (ends == 2)
            {
                svar = new Point(rad.Rutor.Last().X + rad.Riktning[0], rad.Rutor.Last().Y + rad.Riktning[1]);
                rader.RemoveAt(0);
            }
            else if (ends == 1)
            {
                svar = new Point(rad.Rutor.First().X - rad.Riktning[0], rad.Rutor.First().Y - rad.Riktning[1]);
                rader.RemoveAt(0);
            }
            return(svar);
        }
Example #2
0
        //primitiv metod för att utföra mittruta attack
        Point Mittrutaattack()
        {
            Point svar;

            // Metoder fungarar i flera steg

            //initialatiion
            if (mittrutasteg == 0)
            {
                bool klar = false;
                do
                {
                    mittImittrutaAttack = new Rad(riktningar[slump.Next(0, 4)], 1, new List <Point>(), 3, false);
                    mittImittrutaAttack.Rutor.Add(new Point(slump.Next(0 + rutnät.Irad, rutnät.Size - rutnät.Irad), slump.Next(0 + rutnät.Irad, rutnät.Size - rutnät.Irad)));
                    if (Iradkollare(horisontelt, rutor[mittImittrutaAttack.Rutor.First().X, mittImittrutaAttack.Rutor.First().Y], -1).First().Irad >= rutnät.Irad)
                    {
                        klar = true;
                    }
                }while (!klar);
                mittrutasteg = 1;
                return(mittImittrutaAttack.Rutor.First());
            }
            //koll innan varje steg;
            List <Rad> temp = Iradkollare(mittImittrutaAttack.Riktning, rutor[mittImittrutaAttack.Rutor.Last().X, mittImittrutaAttack.Rutor.Last().Y], -1);

            if (temp.Count != 0)
            {
                if (temp.First().Irad >= rutnät.Irad)
                {
                    mittrutasteg = 0;
                    return(Mittrutaattack());
                }
            }



            //returnerar punkt +1 i rätt riktning
            if (mittrutasteg == 1)
            {
                svar = new Point(mittImittrutaAttack.Rutor.First().X + mittImittrutaAttack.Riktning[0], mittImittrutaAttack.Rutor.First().Y + mittImittrutaAttack.Riktning[1]);
                mittrutasteg++;
            }
            //returnerar punkt +4 i rätt riktning
            else if (mittrutasteg == 2)
            {
                svar = new Point(mittImittrutaAttack.Rutor.First().X + 4 * mittImittrutaAttack.Riktning[0], mittImittrutaAttack.Rutor.First().Y + 4 * mittImittrutaAttack.Riktning[1]);
                mittrutasteg++;
            }

            //returnerar punkt +3 i rätt riktning
            else if (mittrutasteg == 3)
            {
                svar = new Point(mittImittrutaAttack.Rutor.First().X + 3 * mittImittrutaAttack.Riktning[0], mittImittrutaAttack.Rutor.First().Y + 3 * mittImittrutaAttack.Riktning[1]);
                mittrutasteg++;
            }

            //returnerar punkt +2 i rätt riktning
            else if (mittrutasteg == 4)
            {
                svar = new Point(mittImittrutaAttack.Rutor.First().X + 2 * mittImittrutaAttack.Riktning[0], mittImittrutaAttack.Rutor.First().Y + 2 * mittImittrutaAttack.Riktning[1]);
                mittrutasteg++;
            }
            else
            {
                meddela("mittrutastegfel");
                return(Hörnattack());
            }

            // Om fel uppstår (som alltid...)
            if (rutor[svar.X, svar.Y].Mode != 0)
            {
                mittrutasteg = 0;
                if (mittrutasteg != 0)
                {
                    return(Mittrutaattack());
                }

                return(Hörnattack());
            }
            else
            {
                mittImittrutaAttack.Rutor.Add(svar);
                return(svar);
            }



            /*returnerar punkt +1 i rätt riktning
             * if (mittrutasteg == 5)
             * {
             *  svar = new Point(mittImittrutaAttack.Rutor.First().X + mittImittrutaAttack.Riktning[0], mittImittrutaAttack.Rutor.First().Y + mittImittrutaAttack.Riktning[1]);
             *  mittImittrutaAttack.Rutor.Add(svar);
             *  return svar;
             * }
             */
        }
Example #3
0
        //kod för bräde analys och rutval
        Point AI()
        {
            Point LastRuta = new Point(0, 0);

            if (rutnät.PrePunkt.Count() != 0)
            {
                LastRuta = new Point(rutnät.PrePunkt.First().X, rutnät.PrePunkt.First().Y);
                List <Rad> temp = new List <Rad>();
                foreach (Rad MR in motståndarrader)
                {
                    temp.AddRange(Iradkollare(MR.Riktning, rutor[MR.Rutor.First().X, MR.Rutor.First().Y], rutor[LastRuta.X, LastRuta.Y].Mode));
                    motståndarrader = new List <Rad>();
                    motståndarrader.AddRange(temp);
                }
            }
            else
            {
                motståndarrader     = new List <Rad>();
                egnarader           = new List <Rad>();
                mittImittrutaAttack = new Rad(horisontelt, 0, new List <Point>(), 3, false);
                dödsattack          = new Rad(horisontelt, 0, new List <Point>(), 3, false);
                mittrutasteg        = 0;
                dödrutasteg         = 0;
            }
            //Hämtar info om hur många irad vid senaste utsatta rutan
            if (rutor[LastRuta.X, LastRuta.Y].Mode != 0)
            {
                motståndarrader.AddRange(antalIrad(rutor[LastRuta.X, LastRuta.Y]));
            }

            //Sorterar måtståndarrader
            bool isdone = false;

            while (!isdone)
            {
                isdone = true;
                foreach (Rad MR in motståndarrader)
                {
                    //ändra tillbaka
                    if (!(MR.Irad >= rutnät.Irad - 2))
                    {
                        isdone = false;
                        motståndarrader.Remove(MR);
                        break;
                    }
                }
            }
            motståndarrader = Sortera(motståndarrader);


            //sorterar egna rader
            if (lastegenruta != null)
            {
                egnarader.AddRange(antalIrad(lastegenruta));
            }

            bool isDone = false;

            while (!isDone)
            {
                isDone = true;
                foreach (Rad ER in egnarader)
                {
                    if (!(ER.Irad >= rutnät.Irad - 2))
                    {
                        isDone = false;
                        egnarader.Remove(ER);
                        break;
                    }
                }
            }
            egnarader = Sortera(egnarader);


            //Strategi för vad som ska göras prioritering

            //Om jag kan vinna
            if (egnarader.Count != 0)
            {
                if ((egnarader.First().Irad == rutnät.Irad - 1) ||
                    (egnarader.First().Irad == rutnät.Irad - 1 && motståndarrader.First().Irad < rutnät.Irad - 1))
                {
                    return(Blocker(egnarader));
                }
            }


            //Om det finns motståndarrader som behöver blockar blockeras dem
            if (motståndarrader.Count != 0)
            {
                return(Blocker(motståndarrader));
            }
            else if (egnarader.Count() != 0 && mittrutasteg < 3)
            {
                return(Blocker(egnarader));
            }

            else
            {
                //  return Mittrutaattack();
                return(Dödsradattack());

                //Sätter ut från övre vänstra hörnet om inget bättre finns och kollar om det är möjligt att bilda rad på den raden
                // return Hörnattack();
            }
        }
Example #4
0
        Point Dödsradattack()
        {
            Point svar;

            // Metoder fungarar i flera steg

            //initialatiion
            if (dödrutasteg == 0)
            {
                bool klar = false;
                do
                {
                    dödsattack = new Rad(riktningar[slump.Next(0, 4)], 1, new List <Point>(), 3, false);
                    dödsattack.Rutor.Add(new Point(slump.Next(0 + rutnät.Irad, rutnät.Size - rutnät.Irad), slump.Next(0 + rutnät.Irad, rutnät.Size - rutnät.Irad)));
                    try
                    {
                        List <Rad> test = antalIrad(rutor[dödsattack.Rutor.First().X, dödsattack.Rutor.First().Y], -1);
                        if (test.Count != 0)
                        {
                            if (test.First().Irad >= rutnät.Irad)
                            {
                                klar = true;
                            }
                        }
                    }
                    catch {
                        meddela("Fel vid radkollning inför dödsrutaattack");
                    }
                }while (!klar);
                dödrutasteg = 1;
                return(dödsattack.Rutor.First());
            }



            //returnerar punkt +1 i rätt riktning
            else if (dödrutasteg == 1)
            {
                svar = new Point(dödsattack.Rutor.First().X + dödsattack.Riktning[0], dödsattack.Rutor.First().Y + dödsattack.Riktning[1]);
                dödrutasteg++;
            }



            //returnerar punkt +3 i rätt riktning
            else if (dödrutasteg == 2)
            {
                bool done = false;
                foreach (int[] riktning in riktningar)
                {
                    if (riktning != dödsattack.Riktning)
                    {
                        Point      test       = new Point(dödsattack.Rutor.First().X + 2 * dödsattack.Riktning[0], dödsattack.Rutor.First().Y + 2 * dödsattack.Riktning[1]);
                        List <Rad> nyriktning = Iradkollare(riktning, rutor[dödsattack.Rutor.First().X + 2 * dödsattack.Riktning[0], dödsattack.Rutor.First().Y + 2 * dödsattack.Riktning[1]], -1);
                        Sortera(nyriktning);
                        if (nyriktning.Count != 0)
                        {
                            if (nyriktning.First().Irad >= rutnät.Irad)
                            {
                                dödsriktning = riktning;
                                done         = true;
                                break;
                            }
                        }
                    }
                }
                if (done == true)
                {
                    svar = new Point(dödsattack.Rutor.First().X + 2 * dödsattack.Riktning[0] + 2 * dödsriktning[0], dödsattack.Rutor.First().Y + 2 * dödsattack.Riktning[1] + 2 * dödsriktning[1]);
                    dödrutasteg++;
                }
                else
                {
                    dödrutasteg = 0;
                    return(Dödsradattack());
                }
            }

            //returnerar punkt +2 i rätt riktning
            else if (dödrutasteg == 3)
            {
                svar = new Point(dödsattack.Rutor.First().X + 2 * dödsattack.Riktning[0] + dödsriktning[0], dödsattack.Rutor.First().Y + 2 * dödsattack.Riktning[1] + dödsriktning[1]);
                dödrutasteg++;
            }

            else if (dödrutasteg == 4)
            {
                svar = new Point(dödsattack.Rutor.First().X + 2 * dödsattack.Riktning[0], dödsattack.Rutor.First().Y + 2 * dödsattack.Riktning[1]);
                dödrutasteg++;
            }
            else
            {
                meddela("dödrutastegfel");
                return(Hörnattack());
            }

            // Om fel uppstår (som alltid...)
            if (rutor[svar.X, svar.Y].Mode != -1)
            {
                dödrutasteg = 0;
                if (dödrutasteg != 0)
                {
                    return(Mittrutaattack());
                }

                return(Hörnattack());
            }
            else
            {
                dödsattack.Rutor.Add(svar);
                return(svar);
            }
        }