Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ketszemelyesV3
- {
- class Program
- {
- static void Main(string[] args)
- {
- // Fa felépítése
- List<Csucs> fa = new List<Csucs>();
- treeSetup(fa);
- // Fa kiíratása
- Console.WriteLine("##################### LISTA #####################");
- kiirFullLista(fa);
- // A játékfa első elemének megadjuk a fát
- globaljatekfa.Add(new Jatekfa(0, 0, 1, fa));
- // A játékfa felépítése a lehetséges állapotokból
- Console.WriteLine("\n\n##################### JATEKFAK #####################");
- jatekfaFeltolt(globaljatekfa);
- // A játékfa csúcsainak frissítése eredmény szempontjából
- eredmenyszamolas(globaljatekfa);
- // A játékfa kiíratása
- foreach (Jatekfa jatekfa in globaljatekfa)
- jatekfa.kiir();
- // Nyertes állapot kiíratása, ha van, ellenkező esetben az egyik vesztes lépés kiíratása
- Console.WriteLine(jolepes(globaljatekfa));
- Console.ReadKey();
- }
- static void treeSetup(List<Csucs> lista)
- {
- /*
- * A
- * B C
- * D E F G H
- * I J K L
- *
- */
- lista.Add(new Csucs(0, 1, "A"));
- lista.Add(new Csucs(1, 2, "B"));
- lista.Add(new Csucs(1, 3, "C"));
- lista.Add(new Csucs(2, 4, "D"));
- lista.Add(new Csucs(2, 5, "E"));
- lista.Add(new Csucs(2, 6, "F"));
- lista.Add(new Csucs(3, 7, "G"));
- lista.Add(new Csucs(3, 8, "H"));
- lista.Add(new Csucs(4, 9, "I"));
- lista.Add(new Csucs(4, 10, "J"));
- lista.Add(new Csucs(6, 11, "K"));
- lista.Add(new Csucs(8, 12, "L"));
- /**/
- foreach (Csucs item in lista)
- {
- foreach (Csucs item2 in lista)
- {
- // Szülő csúcsokban a gyerekei sorszámának és nevének eltárolása
- if (item.sorszam != item2.sorszam && item.sorszam == item2.szulosorszam)
- {
- item.gyerekekInt.Add(item2.sorszam);
- item.gyerekekString.Add(lista.Where(x => x.sorszam == item2.sorszam).First().nev);
- }
- }
- item.letezik = 1;
- }
- }
- public static void kiirFullLista(List<Csucs> lista)
- {
- //Console.WriteLine("###############\t Lista\t##################");
- foreach (Csucs item in lista)
- {
- if (item.letezik == 1)
- {
- if(item.szulosorszam == 0)
- Console.Write(item.sorszam + ".\t" + item.nev + "\t(szulo: * gyerekei:");
- else
- Console.Write(item.sorszam + ".\t" + item.nev + "\t(szulo: " + item.szulosorszam + " gyerekei:");
- if (item.gyerekekInt.Count != 0)
- {
- foreach (int item2 in item.gyerekekInt)
- {
- Console.Write(" " + item2 + "(" + lista.Find(x => x.sorszam == item2).nev + ")");
- }
- }
- else
- Console.Write(" nincs gyereke");
- Console.WriteLine(")");
- }
- }
- }
- public static List<Jatekfa> globaljatekfa = new List<Jatekfa>();
- static void jatekfaFeltolt(List<Jatekfa> jf)
- {
- List<Jatekfa> localjatekfa = new List<Jatekfa>(jf);
- foreach (Jatekfa jatekfa in localjatekfa.Where(x=>x.kiterjesztve == 0))
- {
- // Ha egy csúccsal elkezdünk foglalkozni, ezért az elején kiterjesztjük, hogy az eljárás rekurzív meghívása után ne vizsgálja meg ismét ezt a csúcsot
- jatekfa.kiterjesztve = 1;
- globaljatekfa.Find(x => x.sorszam == jatekfa.sorszam).kiterjesztve = 1;
- int lepes = jatekfa.lepes + 1;
- int szulo = jatekfa.sorszam;
- // Az összes olyan csúcson végigmegyünk, ami létezik és van(nak) gyerekei → ezeknek a csúcsoknak a gyerekeit lehetséges törölni
- foreach (Csucs csucs in jatekfa.adottFaAllapot.Where(x=>x.letezik == 1 && x.gyerekekInt.Count() != 0))
- {
- List<Csucs> localfa = new List<Csucs>();
- foreach (Csucs node in jatekfa.adottFaAllapot)
- localfa.Add(new Csucs(node.szulosorszam, node.sorszam, node.nev, node.letezik, node.gyerekekInt.ToList(), node.gyerekekString.ToList()));
- List<int> gyerekek = csucs.gyerekekInt.ToList();
- // A csúcs.gyerekek kiürítése
- localfa.Find(x => x.sorszam == csucs.sorszam).gyerekekInt.Clear();
- localfa.Find(x => x.sorszam == csucs.sorszam).gyerekekString.Clear();
- // A csúcs gyerekeinek logikai törlése
- foreach (Csucs gyerek in localfa)
- if (gyerekek.Contains(gyerek.sorszam))
- {
- localfa.Find(x => x.sorszam == gyerek.sorszam).letezik = 0;
- localfa.Find(x => x.sorszam == gyerek.sorszam).gyerekekString.Clear();
- localfa.Find(x => x.sorszam == gyerek.sorszam).gyerekekInt.Clear();
- }
- // A csúcs unokáinak új fába mozgatása → logikai gyökér (0) megadása szülő sorszámként
- foreach (Csucs unoka in localfa)
- if (gyerekek.Contains(unoka.szulosorszam))
- localfa.Find(x=>x.sorszam == unoka.sorszam).szulosorszam = 0;
- //kiirFullLista(localfa);
- globaljatekfa.Add(new Jatekfa(szulo, lepes, globaljatekfa.Count()+1, localfa));
- // A játékfa levél elemeinek az eredményeinek meghatározása
- // Ha a gyökér elemek száma megegyezik a létező elemekkel → többet nem lehet törölni és páratlan számú lépésnél járunk, akkor nyertes állapot
- if ((localfa.Where(x => x.szulosorszam == 0 && x.letezik == 1).Count() == localfa.Where(x => x.letezik == 1).Count()) && (lepes % 2 == 1))
- globaljatekfa.Find(x => x.sorszam == globaljatekfa.Count()).eredmeny = 1;
- else if ((localfa.Where(x => x.szulosorszam == 0 && x.letezik == 1).Count() == localfa.Where(x => x.letezik == 1).Count()) && (lepes % 2 == 0))
- globaljatekfa.Find(x => x.sorszam == globaljatekfa.Count()).eredmeny = -1;
- // Eltároljuk, hogy melyik csúcs gyerekeit töröltük ki az adott lépésben
- globaljatekfa.Find(x => x.sorszam == globaljatekfa.Count()).valasztottCsucsNum = csucs.sorszam;
- globaljatekfa.Find(x => x.sorszam == globaljatekfa.Count()).valasztottCsucsString = csucs.nev;
- // Az eljárás rekurzív újrahívása
- jatekfaFeltolt(globaljatekfa);
- }
- }
- }
- static void eredmenyszamolas(List<Jatekfa> jf)
- {
- // Addig megyünk a ciklussal, amíg minden lépésnek meg nincs határozva az eredménye
- while(jf.Count() != jf.Where(x=>x.eredmeny != 0).Count())
- {
- // Azon csúcsok vizsgálata, ahol nincs még eredmény meghatározva
- foreach (Jatekfa jatekfa in jf.Where(x=>x.eredmeny == 0))
- {
- int lose = 0;
- int win = 0;
- // A vizsgált csúcsok gyerekeinek vizsgálata
- // Ha páros számú lépésnél járunk és van vesztes állapot, akkor a második játékos biztos azt fogja választani az adott csúcsnál, ezért ez is vesztes állapot
- // Ha páratlan számú lépésnél járunk és van nyertes állapot, akkor az első játékos biztos azt fogja választani az adott csúcsnál, ezért ez is nyertes állapot
- // Ha páratlan számú lépés van, viszont csak vesztes állapotú gyereke van, akkor ez is biztos vesztes állapot (és így igaz fordítva is)
- foreach (Jatekfa gyerekjatekfa in jf.Where(x=>x.szulo == jatekfa.sorszam))
- {
- if ((jatekfa.lepes % 2 == 1) && gyerekjatekfa.eredmeny == -1)
- lose++;
- if ((jatekfa.lepes % 2 == 1) && gyerekjatekfa.eredmeny == 1)
- win++;
- if ((jatekfa.lepes % 2 == 0) && gyerekjatekfa.eredmeny == -1)
- lose++;
- if ((jatekfa.lepes % 2 == 0) && gyerekjatekfa.eredmeny == 1)
- win++;
- }
- if ((jatekfa.lepes % 2 == 1) && win > 0)
- {
- jatekfa.eredmeny = 1;
- continue;
- }
- if ((jatekfa.lepes % 2 == 0) && lose > 0)
- {
- jatekfa.eredmeny = -1;
- continue;
- }
- if (win == 0)
- {
- jatekfa.eredmeny = -1;
- continue;
- }
- if(lose == 0)
- {
- jatekfa.eredmeny = 1;
- continue;
- }
- }
- }
- }
- static String jolepes(List<Jatekfa> jf)
- {
- foreach (Jatekfa jatekfa in jf.Where(x=>x.szulo == 1))
- {
- // Ha a szülőnek van olyan gyereke, amely nyertes állapotba visz, akkor az első játékos biztos azt fogja választani, így nyertes az adott állapot
- if (jatekfa.eredmeny == 1)
- return "A(z) " + jatekfa.valasztottCsucsString + " csúcs (" + jatekfa.valasztottCsucsNum + ".) gyerekeit kell torolni (Nyertes allapot)";
- }
- // Ha nincs nyertes állapot, akkor a legelső vesztes állapot kiíratása
- return "A(z) " + jf.Find(x=>x.szulo == 1).valasztottCsucsString + " csúcs (" + jf.Find(x => x.szulo == 1).valasztottCsucsNum + ".) gyerekeit kell torolni (Vesztes allapot)";
- }
- }
- public class Csucs
- {
- public int szulosorszam;
- public int sorszam;
- public String nev;
- public int letezik;
- public List<int> gyerekekInt = new List<int>();
- public List<String> gyerekekString = new List<string>();
- public Csucs(int szulosorszam, int sorszam, String nev)
- {
- this.szulosorszam = szulosorszam;
- this.sorszam = sorszam;
- this.nev = nev;
- this.letezik = 1;
- }
- public Csucs(int szulosorszam, int sorszam, String nev, int letezik, List<int> gyerekekInt, List<String> gyerekekString)
- {
- this.szulosorszam = szulosorszam;
- this.sorszam = sorszam;
- this.nev = nev;
- this.letezik = letezik;
- this.gyerekekInt = gyerekekInt.ToList();
- this.gyerekekString = gyerekekString.ToList();
- }
- }
- public class Jatekfa
- {
- public int szulo;
- public int lepes;
- public int sorszam;
- public List<Csucs> adottFaAllapot;
- public int kiterjesztve;
- public int eredmeny;
- public int valasztottCsucsNum;
- public String valasztottCsucsString;
- public Jatekfa(int szulo, int lepes, int sorszam, List<Csucs> adottFaAllapot)
- {
- this.szulo = szulo;
- this.lepes = lepes;
- this.sorszam = sorszam;
- this.adottFaAllapot = adottFaAllapot;
- this.kiterjesztve = 0;
- this.eredmeny = 0;
- }
- public Jatekfa(int szulo, int lepes, int sorszam, List<Csucs> adottFaAllapot, int kiterjesztve)
- {
- this.szulo = szulo;
- this.lepes = lepes;
- this.sorszam = sorszam;
- this.adottFaAllapot = adottFaAllapot;
- this.kiterjesztve = kiterjesztve;
- this.eredmeny = 0;
- }
- public void kiir()
- {
- Console.WriteLine("JATEKFA\t" + this.sorszam + ". elem (szulo : " + this.szulo + ", " + this.lepes + ". lepes)" + "\ta valasztott csucs: " + this.valasztottCsucsString);
- ketszemelyesV3.Program.kiirFullLista(this.adottFaAllapot);
- if (this.eredmeny != 0)
- Console.WriteLine((this.eredmeny == 1) ? "WIN" : "LOSE");
- Console.WriteLine("\n\n");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement