public bool Czy_Rozne(Wierz w)//wykrywa czy nie sa takie same wierzchloki { for (int g = 0; g < 2; g++) { for (int i = 0; i < 12; i++) { if (gra.pionki[g][i].aktywny == w.gra.pionki[g][i].aktywny) { if (gra.pionki[g][i].god != w.gra.pionki[g][i].god) { return(true); } if ((gra.pionki[g][i].w != w.gra.pionki[g][i].w) || (gra.pionki[g][i].r != w.gra.pionki[g][i].r)) { return(true); } } else { return(true); } } } return(false); }
int gracz, wrog; //kto jest kim public Graf(Gra stan, int g) { W = new List <Wierz>(); K = new List <Kraw>(); liscie = new List <Wierz>(); gracz = g; if (gracz == 0) { wrog = 1; } else { wrog = 0; } Wierz w = new Wierz(); w.gra = stan; Wierz ww = new Wierz(w, gracz); W.Add(ww); BudujGraf(Warstw.warstw); Wierz najlepsze; bool over = false; for (int prog = BETA_MAX; prog != ALFA_MIN - 1; prog--) { if (!over) { foreach (Wierz wyn in liscie) { if (!over) { if (prog == wyn.waga) { najlepsze = wyn; foreach (Kraw ruch in K) { if (ruch.k == najlepsze && ruch.p == ww) { wynik = ruch; over = true; break; } } } } } } } }
public void BudujGraf(int glebokosc) { foreach (Wierz w in W) { liscie.Add(w); } liscie = RozwinWarstwe(liscie); foreach (Wierz w in liscie) { Wierz ruch = w; ruch.waga = MinMax(ruch, glebokosc - 1); } }
List <Wierz> RozwinWierz(Wierz w) //robi dla w :-dzieci(zruchem) -dodaje do list { List <Wierz> lw = new List <Wierz>(); //nowe wierzcholki od ojca Pionek p = new Pionek(0); Wierz nowy_wierz = new Wierz(w, gracz); void p_cel(int y, int x) { p.w = y; p.r = x; } foreach (Pionek t in w.gra.pionki[w.gra.kolej]) { if (t.aktywny) { for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) { p_cel(y, x); if (nowy_wierz.Zagraj(t, p)) { Kraw nowa_kraw = new Kraw(w, nowy_wierz); nowa_kraw.p1 = new Pionek(t); nowa_kraw.p2 = new Pionek(p); { lw.Add(nowy_wierz); W.Add(nowy_wierz); K.Add(nowa_kraw); } nowy_wierz = new Wierz(w, gracz); } } } } } w.rozwiniety = true; //dodaje do lisci//czyli swierza nowa warstwa return(lw); }
bool Dolacz(Wierz w, Kraw k) { foreach (Wierz w_w in W) { if (!w_w.Czy_Rozne(w)) { return(false); } } W.Add(w); K.Add(k); return(true); }
int AlfaBeta(Wierz w, int glebokosc, int alfa, int beta) { if ((w.gra.koniec) || (glebokosc == 0)) { return(w.waga); } if (w.gra.kolej == wrog) { List <Wierz> potomki = RozwinWierz(w); foreach (Wierz potomek in potomki) { beta = Math.Min(beta, AlfaBeta(potomek, glebokosc - 1, alfa, beta)); if (alfa >= beta) { //odcinamy galaz alfa break; } } return(beta); } else { List <Wierz> potomki = RozwinWierz(w); foreach (Wierz potomek in potomki) { alfa = Math.Max(alfa, AlfaBeta(potomek, glebokosc - 1, alfa, beta)); if (alfa >= beta) { //odcinamy galaz beta break; } } return(alfa); } }
int MinMax(Wierz w, int glebokosc) { return(AlfaBeta(w, glebokosc, ALFA_MIN, BETA_MAX)); }
public Wierz(Wierz f, int g) { gra = new Gra(f.gra); rozwiniety = false; waga = Waga(gra, g); }
public Kraw(Wierz father, Wierz son) { p = father; k = son; }