Advertisement
yacked2

KrizciKrozciBot

Jan 8th, 2015
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.80 KB | None | 0 0
  1. /*
  2. Yacked2, 9.1.2015
  3. */
  4.  
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Diagnostics;
  10.  
  11. namespace _3x3
  12. {
  13.     class Program
  14.     {
  15.         //doloca kdaj je igra neodlocena
  16.         private static bool izenaceno = false;
  17.  
  18.         static void Main(string[] args)
  19.         {
  20.             bool zmaga = false;
  21.             char[] polja = new char[9];
  22.            
  23.             //izbira kdo zacne
  24.             Random rnd = new Random();
  25.             int start = rnd.Next(0, 2);
  26.             if (start == 0)
  27.             {
  28.                 //zacne racunalnik
  29.                 while (!zmaga) //dokler nekdo ne zmaga
  30.                 {
  31.                     polja = CPUPlay(polja); //potezo odigra racunalnik
  32.                     zmaga = check(polja, 'C'); //preverimo ali je zmagal
  33.                     izpis(polja); //izpisemo polje
  34.                     if (zmaga == false)
  35.                     {
  36.                         //na potezi je uporabnik
  37.                         polja = UserPlay(polja);
  38.                         if (izenaceno)
  39.                         {
  40.                             Console.WriteLine("izenaceno!");
  41.                             break;
  42.                         }
  43.                         //je uporabnik zmagal
  44.                         zmaga = check(polja, 'U');
  45.                         izpis(polja);
  46.                         if (zmaga == true)
  47.                         {
  48.                             Console.WriteLine("Zmagali ste!");
  49.                         }
  50.                     }
  51.                     else
  52.                     {
  53.                         Console.WriteLine("Zmagal je racunalnik!");
  54.                     }
  55.                 }
  56.             }
  57.             else
  58.             {
  59.                 //zacne uporabnik
  60.                 izpis(polja); //zaceten izpis za uporabnika
  61.                 while (!zmaga)
  62.                 {
  63.                     //izbira zacetnega polja
  64.                     polja = UserPlay(polja);
  65.                     zmaga = check(polja, 'U'); //preverimo ali smo zmagali
  66.                     izpis(polja);
  67.                     if (zmaga == false)
  68.                     {
  69.                         polja = CPUPlay(polja);
  70.                         if (izenaceno)
  71.                         {
  72.                             Console.WriteLine("izenaceno!");
  73.                             break;
  74.                         }
  75.                         zmaga = check(polja, 'C');
  76.                         izpis(polja);
  77.                         if (zmaga == true)
  78.                         {
  79.                             Console.WriteLine("Zmagal je racunalnik!");
  80.                         }
  81.                     }
  82.                     else
  83.                     {
  84.                         Console.WriteLine("Zmagali ste!");
  85.                     }
  86.                 }
  87.             }
  88.             Console.ReadLine();
  89.         }
  90.  
  91.         private static char[] CPUPlay(char[] polja)
  92.         {
  93.             //poiscemo prosta polja
  94.             List<int> free = prosta(polja);
  95.             if (free.Count == 0)
  96.             {
  97.                 //ce so vsa polja zasedena, vrnemo - izenaceno
  98.                 izenaceno = true;
  99.                 return polja;
  100.             }
  101.             else if(free.Count == 9)
  102.             {
  103.                 Random rnd = new Random();
  104.                 int choosen = rnd.Next(0, free.Count);
  105.                 polja[free[choosen]] = 'C';
  106.                 return polja;
  107.             }
  108.             ////////////////////////////////////////////////////////////////////////////////
  109.             //OSNOVNI SISTEM
  110.             ////////////////////////////////////////////////////////////////////////////////
  111.             //ali lahko zmagamo
  112.             for(int i=0; i < free.Count;i++)
  113.             {
  114.                 char[] backup = new char[9];
  115.                 Array.Copy(polja, backup, 9);
  116.                 backup[free.ElementAt(i)] = 'C';
  117.                 bool preveri = check(backup,'C');
  118.                 if (preveri)
  119.                 {
  120.                     backup[free.ElementAt(i)] = 'C';
  121.                     return backup;
  122.                 }
  123.             }
  124.            
  125.             //ali smo neposredno napadeni
  126.             for (int i = 0; i < free.Count; i++)
  127.             {
  128.                 char[] backup = new char[9];
  129.                 Array.Copy(polja, backup, 9);
  130.                 backup[free.ElementAt(i)] = 'U';
  131.                 bool preveri = check(backup, 'U');
  132.                 if (preveri)
  133.                 {
  134.                     backup[free.ElementAt(i)] = 'C';
  135.                     return backup;
  136.                 }
  137.             }
  138.             ////////////////////////////////////////////////////////////////////////////////
  139.             //NAPREDNI SISTEM PREDVIDEVANJA
  140.             ////////////////////////////////////////////////////////////////////////////////
  141.             //izbira najboljsega nadaljevanja
  142.             //shranjujemo koliko moznosti za zmago imamo v 2. koraku
  143.  
  144.             int[] stResitev = new int[free.Count];
  145.  
  146.             for (int i = 0; i < free.Count; i++)
  147.             {
  148.                 int resitev = 0;
  149.  
  150.                 //naredimo backup 1. nivoja
  151.                 char[] backup = new char[9];
  152.                 Array.Copy(polja, backup, 9);
  153.  
  154.                 //ustavimo element na i-to mesto
  155.                 backup[free.ElementAt(i)] = 'C';
  156.  
  157.                 //naredimo scan prostih mest v drugem koraku
  158.                 List<int> free_nivo2 = prosta(backup);
  159.  
  160.                 //poiskusimo ustaviti na vsa možna mesta
  161.                 for (int j = 0; j < free_nivo2.Count; j++)
  162.                 {
  163.                     //naredimo backup backupa :)
  164.                     char[] backup2 = new char[9];
  165.                     Array.Copy(backup, backup2, 9);
  166.  
  167.                     //ustavimo element na i-to mesto
  168.                     backup2[free_nivo2.ElementAt(j)] = 'C';
  169.  
  170.                     bool preveri = check(backup2, 'C');
  171.                     if (preveri)
  172.                     {
  173.                         //ce zmagamo v 2. koraku pristejemo moznost zmage
  174.                         resitev++;
  175.                     }
  176.                 }
  177.                 stResitev[i] = resitev;
  178.             }
  179.  
  180.             //poiscemo najvecjo verjetnost zmage
  181.             int index = 0; //na katerem indexu je največja številka
  182.             for (int i = 1; i < free.Count; i++)
  183.             {
  184.                 //iscemo najvecjo
  185.                 if (stResitev[i] > stResitev[index])
  186.                 {
  187.                     index = i;
  188.                 }
  189.             }
  190.  
  191.             ////////////////////////////////////////////////////////////////////////////////
  192.             //ZMAGA V DRUGEM NIVOJU
  193.             ////////////////////////////////////////////////////////////////////////////////
  194.             //ce sta nato 2 mozna zakljucka smo ze zmagali
  195.             if (stResitev[index] >= 2)
  196.             {
  197.                 //zmaga v naslednem koraku
  198.                 polja[free[index]] = 'C';
  199.                 return polja;
  200.             }
  201.             else if (free.Contains(4)) //napad na sredo
  202.             {
  203.                 //ce je mozno zasedimo sredino
  204.                 polja[4] = 'C';
  205.                 return polja;
  206.             }
  207.            
  208.  
  209.             ////////////////////////////////////////////////////////////////////////////////
  210.             //PREVERI DIAGONALO
  211.             ////////////////////////////////////////////////////////////////////////////////
  212.            
  213.             bool diagonala = false;
  214.             int steviloZasedenihCPU = 0;
  215.             int steviloZasedenihUSER = 0;
  216.             //preverimo če smo mi v sredino in napad diagonalen
  217.             for(int i=0; i < polja.Length; i++)
  218.             {
  219.                 if(polja[i] == 'C')
  220.                 {
  221.                     steviloZasedenihCPU++;
  222.                 }
  223.                 else if(polja[i] == 'U')
  224.                 {
  225.                     steviloZasedenihUSER++;
  226.                 }
  227.             }
  228.             //ce smo CPU:1, USER:2
  229.             if (steviloZasedenihCPU == 1 && steviloZasedenihUSER == 2)
  230.             {
  231.                 //ali smo diagonalno
  232.                 if (polja[4] == 'C' && polja[0] == 'U' && polja[8] == 'U')
  233.                 {
  234.                     diagonala = true;
  235.                 }
  236.                 else if (polja[4] == 'C' && polja[2] == 'U' && polja[6] == 'U')
  237.                 {
  238.                     diagonala = true;
  239.                 }
  240.             }
  241.  
  242.             //ce smo napadeno diagonalno se postavimo na rob, ce ne pa na kot
  243.             if(diagonala)
  244.             {
  245.                 //izberemo proste robove
  246.                 List<int> ProstiRobovi = new List<int>();
  247.  
  248.                 for (int k = 0; k < free.Count; k++)
  249.                 {
  250.                     if (free[k] == 1 || free[k] == 3 || free[k] == 5 || free[k] == 7)
  251.                     {
  252.                         ProstiRobovi.Add(free[k]); //polja prostih robov
  253.                     }
  254.  
  255.                 }
  256.                 //vsi robovi imajo enako verjetnost, zato izberemo nakjucnega
  257.  
  258.                 Random rnd = new Random();
  259.                 int choosen = rnd.Next(0, ProstiRobovi.Count);
  260.                 polja[ProstiRobovi[choosen]] = 'C';
  261.                
  262.                 return polja;
  263.             }
  264.             else //nismo diagonalno napadeni, poiscemo tiste z najvecjo verjetnostjo zmage, ce je mozno naj bo kot
  265.             {
  266.                 //obstaja 2. hand napad ?
  267.  
  268.                 ////////////////////////////////////////////////////////////////////////////////
  269.                 //OBRAMBA V DRUGEM NIVOJU
  270.                 ////////////////////////////////////////////////////////////////////////////////
  271.                 int[] USERstResitev = new int[free.Count];
  272.  
  273.                 for (int i = 0; i < free.Count; i++)
  274.                 {
  275.                     int USERresitev = 0;
  276.  
  277.                     //naredimo backup 1. nivoja
  278.                     char[] USERbackup = new char[9];
  279.                     Array.Copy(polja, USERbackup, 9);
  280.  
  281.                     //ustavimo element na i-to mesto
  282.                     USERbackup[free.ElementAt(i)] = 'C';
  283.  
  284.                     //naredimo scan prostih mest v drugem koraku
  285.                     List<int> USERfree_nivo2 = prosta(USERbackup);
  286.  
  287.                     //poiskusimo ustaviti na vsa možna mesta
  288.                     for (int j = 0; j < USERfree_nivo2.Count; j++)
  289.                     {
  290.                         //naredimo backup backupa :)
  291.                         char[] USERbackup2 = new char[9];
  292.                         Array.Copy(USERbackup, USERbackup2, 9);
  293.  
  294.                         //ustavimo element na i-to mesto
  295.                         USERbackup2[USERfree_nivo2.ElementAt(j)] = 'U';
  296.  
  297.                         bool preveri = check(USERbackup2, 'U');
  298.                         if (preveri)
  299.                         {
  300.                             //ce zmagamo v 2. koraku pristejemo moznost zmage
  301.                             USERresitev++;
  302.                         }
  303.                     }
  304.                     USERstResitev[i] = USERresitev;
  305.                 }
  306.                 //poiscemo najvecjo verjetnost zmage
  307.                 int USERindex = 0; //na katerem indexu je največja številka
  308.                 for (int i = 1; i < free.Count; i++)
  309.                 {
  310.                     //iscemo najvecjo
  311.                     if (USERstResitev[i] > USERstResitev[USERindex])
  312.                     {
  313.                         USERindex = i;
  314.                     }
  315.                 }
  316.                 if (USERstResitev[USERindex] >= 2)
  317.                 {
  318.                     //zmaga v naslednem koraku
  319.                     polja[free[USERindex]] = 'C';
  320.                     return polja;
  321.                 }
  322.  
  323.                 //nadaljevanje po kotih
  324.                 List<int> ugodna = new List<int>();
  325.                 for (int k = 0; k < free.Count; k++)
  326.                 {
  327.                     if (stResitev[k] == stResitev[index])
  328.                     {
  329.                         ugodna.Add(free[k]);
  330.                     }
  331.  
  332.                 }
  333.                 List<int> ZanesliviKoti = new List<int>();
  334.                 //je med ugodnimi mogoče kot ?
  335.                 if(ugodna.Contains(0) || ugodna.Contains(2) || ugodna.Contains(6) || ugodna.Contains(8))
  336.                 {
  337.                     //izberemo kot :)
  338.                     if(ugodna.Contains(0))
  339.                     {
  340.                         ZanesliviKoti.Add(0);
  341.                     }
  342.                     if(ugodna.Contains(2))
  343.                     {
  344.                         ZanesliviKoti.Add(2);
  345.                     }
  346.                     if(ugodna.Contains(6))
  347.                     {
  348.                         ZanesliviKoti.Add(6);
  349.                     }
  350.                     if(ugodna.Contains(8))
  351.                     {
  352.                         ZanesliviKoti.Add(8);
  353.                     }
  354.                     //izberemo enega izmed nakljucnih
  355.                     Random rnd = new Random();
  356.                     int choosen = rnd.Next(0, ZanesliviKoti.Count);
  357.                     polja[ZanesliviKoti[choosen]] = 'C';
  358.                     return polja;
  359.  
  360.                 }
  361.                 else //izberemo nakjucnega
  362.                 {
  363.                     Random rnd = new Random();
  364.                     int choosen = rnd.Next(0, ugodna.Count);
  365.                     polja[ugodna[choosen]] = 'C';
  366.                     return polja;
  367.                 }
  368.             }
  369.  
  370.         }
  371.  
  372.         private static char[] UserPlay(char[] polja)
  373.         {
  374.             //poiscemo prazne prostore
  375.             List<int> free = new List<int>();
  376.             for (int i = 0; i < polja.Length; i++)
  377.             {
  378.                 if (polja[i] == default(char))
  379.                 {
  380.                     free.Add(i);
  381.                 }
  382.             }
  383.  
  384.             if (free.Count == 0)
  385.             {
  386.                 //izenačeno
  387.                 izenaceno = true;
  388.                 return polja;
  389.             }
  390.  
  391.             //uporabnikov vnos
  392.             Console.WriteLine(string.Join(",",free));
  393.             while(true)
  394.             {
  395.                 int a = Int32.Parse(Console.ReadLine());
  396.                 if (free.Contains(a))
  397.                 {
  398.                     polja[a] = 'U';
  399.                     break;
  400.                 }
  401.             }
  402.             return polja;
  403.         }
  404.  
  405.         private static bool check(char[] polja, char igralec)
  406.         {
  407.             //preverimo ali je igralec zmagal, ima kaksno 3 v vrsto.
  408.             if (polja[0] == igralec && polja[1] == igralec && polja[2] == igralec)
  409.             {
  410.                 return true;
  411.             }
  412.             if (polja[3] == igralec && polja[4] == igralec && polja[5] == igralec)
  413.             {
  414.                 return true;
  415.             }
  416.             if (polja[6] == igralec && polja[7] == igralec && polja[8] == igralec)
  417.             {
  418.                 return true;
  419.             }
  420.             if (polja[0] == igralec && polja[3] == igralec && polja[6] == igralec)
  421.             {
  422.                 return true;
  423.             }
  424.             if (polja[1] == igralec && polja[4] == igralec && polja[7] == igralec)
  425.             {
  426.                 return true;
  427.             }
  428.             if (polja[2] == igralec && polja[5] == igralec && polja[8] == igralec)
  429.             {
  430.                 return true;
  431.             }
  432.             if (polja[0] == igralec && polja[4] == igralec && polja[8] == igralec)
  433.             {
  434.                 return true;
  435.             }
  436.             if (polja[2] == igralec && polja[4] == igralec && polja[6] == igralec)
  437.             {
  438.                 return true;
  439.             }
  440.             //če ni igramo naprej
  441.             return false;
  442.         }
  443.  
  444.         private static List<int> prosta(char[] polja)
  445.         {
  446.             //preverimo katera polja so prosta in jih vrnemo
  447.             List<int> free = new List<int>();
  448.             for (int i = 0; i < polja.Length; i++)
  449.             {
  450.                 if (polja[i] == default(char) && (polja[i] != 'U' || polja[i] != 'C'))
  451.                 {
  452.                     free.Add(i);
  453.  
  454.                 }
  455.             }
  456.             return free;
  457.         }
  458.  
  459.         private static  void izpis(char[] polja)
  460.         {
  461.             //izpisemo trenutno stanje na polju
  462.             char[] backup = new char[9];
  463.             Array.Copy(polja, backup, 9);
  464.  
  465.             for (int i = 0; i < backup.Length; i++)
  466.             {
  467.                 if (backup[i] == default(char))
  468.                 {
  469.                     backup[i] = 'X';
  470.                 }
  471.             }
  472.             for (int i = 1; i <= backup.Length; i++)
  473.             {
  474.                 if (i % 3 == 0)
  475.                 {
  476.                     Console.Write(backup[i - 1]);
  477.                     Console.WriteLine();
  478.                 }
  479.                 else
  480.                 {
  481.                     Console.Write(backup[i - 1]);
  482.                 }
  483.             }
  484.             Console.WriteLine();
  485.         }
  486.     }
  487. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement