Advertisement
kokusz19

MestInt.KetszemelyesV13.Completed.WithComments

Jun 3rd, 2018
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 13.24 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ketszemelyesV3
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             // Fa felépítése
  14.             List<Csucs> fa = new List<Csucs>();
  15.             treeSetup(fa);
  16.  
  17.             // Fa kiíratása
  18.             Console.WriteLine("#####################  LISTA  #####################");
  19.             kiirFullLista(fa);
  20.  
  21.             // A játékfa első elemének megadjuk a fát
  22.             globaljatekfa.Add(new Jatekfa(0, 0, 1, fa));
  23.  
  24.             // A játékfa felépítése a lehetséges állapotokból
  25.             Console.WriteLine("\n\n#####################  JATEKFAK  #####################");
  26.             jatekfaFeltolt(globaljatekfa);
  27.  
  28.             // A játékfa csúcsainak frissítése eredmény szempontjából
  29.             eredmenyszamolas(globaljatekfa);
  30.  
  31.             // A játékfa kiíratása
  32.             foreach (Jatekfa jatekfa in globaljatekfa)
  33.                 jatekfa.kiir();
  34.  
  35.             // Nyertes állapot kiíratása, ha van, ellenkező esetben az egyik vesztes lépés kiíratása
  36.             Console.WriteLine(jolepes(globaljatekfa));
  37.  
  38.  
  39.             Console.ReadKey();
  40.         }
  41.  
  42.         static void treeSetup(List<Csucs> lista)
  43.         {
  44.             /*
  45.              *                  A
  46.              *         B                C
  47.              *     D   E   F        G       H
  48.              *   I   J     K                L
  49.              *
  50.              */
  51.  
  52.             lista.Add(new Csucs(0, 1, "A"));
  53.             lista.Add(new Csucs(1, 2, "B"));
  54.             lista.Add(new Csucs(1, 3, "C"));
  55.             lista.Add(new Csucs(2, 4, "D"));
  56.             lista.Add(new Csucs(2, 5, "E"));
  57.             lista.Add(new Csucs(2, 6, "F"));
  58.             lista.Add(new Csucs(3, 7, "G"));
  59.             lista.Add(new Csucs(3, 8, "H"));
  60.             lista.Add(new Csucs(4, 9, "I"));
  61.             lista.Add(new Csucs(4, 10, "J"));
  62.             lista.Add(new Csucs(6, 11, "K"));
  63.             lista.Add(new Csucs(8, 12, "L"));
  64.             /**/
  65.             foreach (Csucs item in lista)
  66.             {
  67.                 foreach (Csucs item2 in lista)
  68.                 {
  69.                     // Szülő csúcsokban a gyerekei sorszámának és nevének eltárolása
  70.                     if (item.sorszam != item2.sorszam && item.sorszam == item2.szulosorszam)
  71.                     {
  72.                         item.gyerekekInt.Add(item2.sorszam);
  73.                         item.gyerekekString.Add(lista.Where(x => x.sorszam == item2.sorszam).First().nev);
  74.  
  75.                     }
  76.                 }
  77.                 item.letezik = 1;
  78.             }
  79.         }
  80.  
  81.         public static void kiirFullLista(List<Csucs> lista)
  82.         {
  83.             //Console.WriteLine("###############\t   Lista\t##################");
  84.             foreach (Csucs item in lista)
  85.             {
  86.                 if (item.letezik == 1)
  87.                 {
  88.                     if(item.szulosorszam == 0)
  89.                         Console.Write(item.sorszam + ".\t" + item.nev + "\t(szulo: * gyerekei:");
  90.                     else
  91.                         Console.Write(item.sorszam + ".\t" + item.nev + "\t(szulo: " + item.szulosorszam  + " gyerekei:");
  92.                     if (item.gyerekekInt.Count != 0)
  93.                     {
  94.                         foreach (int item2 in item.gyerekekInt)
  95.                         {
  96.                             Console.Write("  " + item2 + "(" + lista.Find(x => x.sorszam == item2).nev + ")");
  97.                         }
  98.                     }
  99.                     else
  100.                         Console.Write("  nincs gyereke");
  101.                     Console.WriteLine(")");
  102.                 }
  103.             }
  104.         }
  105.  
  106.         public static List<Jatekfa> globaljatekfa = new List<Jatekfa>();
  107.  
  108.         static void jatekfaFeltolt(List<Jatekfa> jf)
  109.         {
  110.             List<Jatekfa> localjatekfa = new List<Jatekfa>(jf);
  111.  
  112.             foreach (Jatekfa jatekfa in localjatekfa.Where(x=>x.kiterjesztve == 0))
  113.             {
  114.                 // 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
  115.                 jatekfa.kiterjesztve = 1;
  116.                 globaljatekfa.Find(x => x.sorszam == jatekfa.sorszam).kiterjesztve = 1;
  117.  
  118.                 int lepes = jatekfa.lepes + 1;
  119.  
  120.                 int szulo = jatekfa.sorszam;
  121.                
  122.                 // 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
  123.                 foreach (Csucs csucs in jatekfa.adottFaAllapot.Where(x=>x.letezik == 1 && x.gyerekekInt.Count() != 0))
  124.                 {
  125.                     List<Csucs> localfa = new List<Csucs>();
  126.                     foreach (Csucs node in jatekfa.adottFaAllapot)
  127.                         localfa.Add(new Csucs(node.szulosorszam, node.sorszam, node.nev, node.letezik, node.gyerekekInt.ToList(), node.gyerekekString.ToList()));
  128.  
  129.                     List<int> gyerekek = csucs.gyerekekInt.ToList();
  130.  
  131.                     // A csúcs.gyerekek kiürítése
  132.                     localfa.Find(x => x.sorszam == csucs.sorszam).gyerekekInt.Clear();
  133.                     localfa.Find(x => x.sorszam == csucs.sorszam).gyerekekString.Clear();
  134.  
  135.                     // A csúcs gyerekeinek logikai törlése
  136.                     foreach (Csucs gyerek in localfa)
  137.                         if (gyerekek.Contains(gyerek.sorszam))
  138.                         {
  139.                             localfa.Find(x => x.sorszam == gyerek.sorszam).letezik = 0;
  140.                             localfa.Find(x => x.sorszam == gyerek.sorszam).gyerekekString.Clear();
  141.                             localfa.Find(x => x.sorszam == gyerek.sorszam).gyerekekInt.Clear();
  142.                         }
  143.  
  144.                     // A csúcs unokáinak új fába mozgatása → logikai gyökér (0) megadása szülő sorszámként
  145.                     foreach (Csucs unoka in localfa)
  146.                         if (gyerekek.Contains(unoka.szulosorszam))
  147.                             localfa.Find(x=>x.sorszam == unoka.sorszam).szulosorszam = 0;
  148.  
  149.                     //kiirFullLista(localfa);
  150.                     globaljatekfa.Add(new Jatekfa(szulo, lepes, globaljatekfa.Count()+1, localfa));
  151.  
  152.                     // A játékfa levél elemeinek az eredményeinek meghatározása
  153.                     // 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
  154.                     if ((localfa.Where(x => x.szulosorszam == 0 && x.letezik == 1).Count() == localfa.Where(x => x.letezik == 1).Count()) && (lepes % 2 == 1))
  155.                         globaljatekfa.Find(x => x.sorszam == globaljatekfa.Count()).eredmeny = 1;
  156.  
  157.                     else if ((localfa.Where(x => x.szulosorszam == 0 && x.letezik == 1).Count() == localfa.Where(x => x.letezik == 1).Count()) && (lepes % 2 == 0))
  158.                         globaljatekfa.Find(x => x.sorszam == globaljatekfa.Count()).eredmeny = -1;
  159.  
  160.                     // Eltároljuk, hogy melyik csúcs gyerekeit töröltük ki az adott lépésben
  161.                     globaljatekfa.Find(x => x.sorszam == globaljatekfa.Count()).valasztottCsucsNum = csucs.sorszam;
  162.                     globaljatekfa.Find(x => x.sorszam == globaljatekfa.Count()).valasztottCsucsString = csucs.nev;
  163.  
  164.                     // Az eljárás rekurzív újrahívása
  165.                     jatekfaFeltolt(globaljatekfa);
  166.                 }
  167.             }
  168.         }
  169.  
  170.         static void eredmenyszamolas(List<Jatekfa> jf)
  171.         {
  172.             // Addig megyünk a ciklussal, amíg minden lépésnek meg nincs határozva az eredménye
  173.             while(jf.Count() != jf.Where(x=>x.eredmeny != 0).Count())
  174.             {
  175.                 // Azon csúcsok vizsgálata, ahol nincs még eredmény meghatározva
  176.                 foreach (Jatekfa jatekfa in jf.Where(x=>x.eredmeny == 0))
  177.                 {
  178.                     int lose = 0;
  179.                     int win = 0;
  180.  
  181.                     // A vizsgált csúcsok gyerekeinek vizsgálata
  182.                     // 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
  183.                     // 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
  184.                     // 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)
  185.                     foreach (Jatekfa gyerekjatekfa in jf.Where(x=>x.szulo == jatekfa.sorszam))
  186.                     {
  187.                         if ((jatekfa.lepes % 2 == 1) && gyerekjatekfa.eredmeny == -1)
  188.                             lose++;
  189.                         if ((jatekfa.lepes % 2 == 1) && gyerekjatekfa.eredmeny == 1)
  190.                             win++;
  191.                         if ((jatekfa.lepes % 2 == 0) && gyerekjatekfa.eredmeny == -1)
  192.                             lose++;
  193.                         if ((jatekfa.lepes % 2 == 0) && gyerekjatekfa.eredmeny == 1)
  194.                             win++;
  195.                     }
  196.                     if ((jatekfa.lepes % 2 == 1) && win > 0)
  197.                     {
  198.                         jatekfa.eredmeny = 1;
  199.                         continue;
  200.                     }
  201.                     if ((jatekfa.lepes % 2 == 0) && lose > 0)
  202.                     {
  203.                         jatekfa.eredmeny = -1;
  204.                         continue;
  205.                     }
  206.                     if (win == 0)
  207.                     {
  208.                         jatekfa.eredmeny = -1;
  209.                         continue;
  210.                     }
  211.                     if(lose == 0)
  212.                     {
  213.                         jatekfa.eredmeny = 1;
  214.                         continue;
  215.                     }
  216.                 }
  217.             }
  218.         }
  219.  
  220.         static String jolepes(List<Jatekfa> jf)
  221.         {
  222.             foreach (Jatekfa jatekfa in jf.Where(x=>x.szulo == 1))
  223.             {
  224.                 // 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
  225.                 if (jatekfa.eredmeny == 1)
  226.                     return "A(z) " + jatekfa.valasztottCsucsString + " csúcs (" + jatekfa.valasztottCsucsNum + ".) gyerekeit kell torolni (Nyertes allapot)";
  227.             }
  228.             // Ha nincs nyertes állapot, akkor a legelső vesztes állapot kiíratása
  229.             return "A(z) " + jf.Find(x=>x.szulo == 1).valasztottCsucsString + " csúcs (" + jf.Find(x => x.szulo == 1).valasztottCsucsNum + ".) gyerekeit kell torolni (Vesztes allapot)";
  230.         }
  231.  
  232.     }
  233.  
  234.     public class Csucs
  235.     {
  236.         public int szulosorszam;
  237.         public int sorszam;
  238.         public String nev;
  239.         public int letezik;
  240.  
  241.         public List<int> gyerekekInt = new List<int>();
  242.         public List<String> gyerekekString = new List<string>();
  243.  
  244.         public Csucs(int szulosorszam, int sorszam, String nev)
  245.         {
  246.             this.szulosorszam = szulosorszam;
  247.             this.sorszam = sorszam;
  248.             this.nev = nev;
  249.             this.letezik = 1;
  250.         }
  251.  
  252.         public Csucs(int szulosorszam, int sorszam, String nev, int letezik, List<int> gyerekekInt, List<String> gyerekekString)
  253.         {
  254.             this.szulosorszam = szulosorszam;
  255.             this.sorszam = sorszam;
  256.             this.nev = nev;
  257.             this.letezik = letezik;
  258.             this.gyerekekInt = gyerekekInt.ToList();
  259.             this.gyerekekString = gyerekekString.ToList();
  260.         }
  261.     }
  262.  
  263.     public class Jatekfa
  264.     {
  265.         public int szulo;
  266.         public int lepes;
  267.         public int sorszam;
  268.         public List<Csucs> adottFaAllapot;
  269.         public int kiterjesztve;
  270.         public int eredmeny;
  271.         public int valasztottCsucsNum;
  272.         public String valasztottCsucsString;
  273.  
  274.         public Jatekfa(int szulo, int lepes, int sorszam, List<Csucs> adottFaAllapot)
  275.         {
  276.             this.szulo = szulo;
  277.             this.lepes = lepes;
  278.             this.sorszam = sorszam;
  279.             this.adottFaAllapot = adottFaAllapot;
  280.             this.kiterjesztve = 0;
  281.             this.eredmeny = 0;
  282.         }
  283.  
  284.         public Jatekfa(int szulo, int lepes, int sorszam, List<Csucs> adottFaAllapot, int kiterjesztve)
  285.         {
  286.             this.szulo = szulo;
  287.             this.lepes = lepes;
  288.             this.sorszam = sorszam;
  289.             this.adottFaAllapot = adottFaAllapot;
  290.             this.kiterjesztve = kiterjesztve;
  291.             this.eredmeny = 0;
  292.         }
  293.  
  294.         public void kiir()
  295.         {
  296.              Console.WriteLine("JATEKFA\t" + this.sorszam + ". elem (szulo : " + this.szulo + ", " + this.lepes + ". lepes)" + "\ta valasztott csucs: " + this.valasztottCsucsString);
  297.              ketszemelyesV3.Program.kiirFullLista(this.adottFaAllapot);
  298.             if (this.eredmeny != 0)
  299.                 Console.WriteLine((this.eredmeny == 1) ? "WIN" : "LOSE");
  300.             Console.WriteLine("\n\n");
  301.         }
  302.     }
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement