/// <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); }
//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; * } */ }
//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(); } }
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); } }