public Ruch ZnajdzOptymalnyRuch(Plansza plansza, DateTime start) { var stanObecny = this.korzeń.Przeszukaj(plansza, Węzeł.Strona.przeciwnik); if (stanObecny == null) { return(null); } double szansa = -1; Ruch docelowy = null; foreach (var item in stanObecny.dzieci) { var czas = DateTime.Now - start; if (czas.Milliseconds > 400) { return(null); } double szansaNaWygr = (double)item.IloscWygranych / (double)item.IloscRozegranych; if (szansa < szansaNaWygr) { szansa = szansaNaWygr; docelowy = item.ruch; } } return(docelowy); }
/// <summary> /// Metoda pozwala na stworzenie wstępnie uzupełnionej planszy gry /// </summary> /// <param name="rozm"> Rozmiar planszy z zakresu 15-51 </param> /// <param name="wejscie"> String z danymi wcześniej zapełnionych pól </param> /// <returns>Uzupełniona wstepnie plansza gry</returns> public static Plansza WstepneUzupelnianie(int rozm, string wejscie) { //Dzielenie stringa na poledyncze ruchy var zajetePoSplit = wejscie.Split(',').ToList(); var zajete = new List <Koordynaty>(); //Usuwanie klamer i odzielanie współrzędnych foreach (var ciag in zajetePoSplit) { var temp = ciag.Replace("{", string.Empty); temp = temp.Replace("}", string.Empty); var koordynaty = temp.Split(';').ToArray(); zajete.Add(new Koordynaty(int.Parse(koordynaty[0]), int.Parse(koordynaty[1]))); } //Tworzenie planszy var plansza = new Plansza(rozm); //Zapełnianie planszy predefiniowanymi elementami foreach (var item in zajete) { plansza.ZmienStanPola(item.kolumna, item.wiersz, false); } return(plansza); }
static void Start() { #region KOMUNIKACJA_WSTEPNA //Odbieranie komunikatu o rozmiarze planszy try { rozm = int.Parse(Console.ReadLine()); } catch (Exception e) { //Do celów debugowania ZakończProgramPoBłędzie("Błąd w trakcie wczytywania rozmiaru planszy", e.ToString()); } //Potwierdzenie Console.WriteLine("ok"); //Odbieranie komunikatu o wstępnie zajetych polach try { var wstępnieZaj = Console.ReadLine(); plansza = Komunikator.WstepneUzupelnianie(rozm, wstępnieZaj); } catch (Exception e) { //Do debugowania ZakończProgramPoBłędzie("Błąd wstępnego zapłęniania planszy", e.ToString()); } //Potwierdzenie Console.WriteLine("ok"); #endregion #region PETLA GŁOWNA //Pętla główna w której toczy sie gra while (true) { // Odczytywanie ruchu przychodzącego var ruchPrzychodzący = Console.ReadLine(); //Sprawdzanie czy jest to pierwszy ruch, czy nie if (ruchPrzychodzący == "start") { //Brak ruchu przychodzącego (mój program zaczyna) Ruch ruchPrzeciwnika = null; } else { //Ruch przychodzący od przeciwnika Ruch ruchPrzeciwnika = Komunikator.OdczytajRuch(ruchPrzychodzący); plansza.DodajRuchDoPlanszy(ruchPrzeciwnika); } var mojRuch = ObliczRuch(); //Wypisywanie ruchu wychodzącego Console.WriteLine(mojRuch.ToString()); plansza.DodajRuchDoPlanszy(mojRuch); } #endregion }
public Węzeł(Ruch ruch, Węzeł ojciec, Plansza plansza, Strona strona) { this.ruch = ruch; this.ojciec = ojciec; this.plansza = (Plansza)plansza.Clone(); this.strona = strona; dzieci = new List <Węzeł>(); }
public Węzeł Przeszukaj(Plansza plansza, Węzeł.Strona strona) { if (this.plansza.CzyTakieSamePlansze(plansza) == true && this.strona == strona) { return(this); } foreach (var item in this.dzieci) { item.Przeszukaj(plansza, strona); } return(null); }
public bool CzyTakieSamePlansze(Plansza plansza) { for (int i = 0; i < plansza.Rozm; i++) { for (int j = 0; j < plansza.Rozm; j++) { if (this.plansza[i, j].puste != plansza.plansza[i, j].puste) { return(false); } } } return(true); }
public Plansza SkopiujPole(Plansza plansza) { var pl = new Plansza(); pl.Rozm = plansza.Rozm; pl.plansza = new Pole[pl.Rozm, pl.Rozm]; for (int i = 0; i < plansza.Rozm; i++) { for (int j = 0; j < plansza.Rozm; j++) { pl.plansza[i, j] = new Pole(); pl.plansza[i, j].puste = plansza.plansza[i, j].puste; } } return(pl); }