static bool MesmoTabuleiro(ClasseMiniMax a, ClasseMiniMax b, bool comparaPlacarRecursivo) { if (a == b) { return(true); } if (a == null || b == null) { return(false); } for (int i = 0; i < a.m_Valores.Length; i++) { if (a.m_Valores[i] != b.m_Valores[i]) { return(false); } } if (a.m_Placar != b.m_Placar) { return(false); } if (comparaPlacarRecursivo && Math.Abs(a.PlacarRecursivo) != Math.Abs(b.PlacarRecursivo)) { return(false); } return(true); }
public ClasseMiniMax EncontraProximoMovimento(int profundidade) { ClasseMiniMax ret01 = null; MiniMax(profundidade, m_TurnoJogadorX, int.MinValue + 1, int.MaxValue - 1, out ret01); return(ret01); }
public void ObtemProximoMovimentoDoUsuario() { if (Atual.noFinal()) { return; } while (true) { try { Console.WriteLine("O tabuleiro atual é:\n{0}\n Informe valor em x:[0-1-2]", Atual); int x = int.Parse(Console.ReadLine()); Console.WriteLine("Informe valor em y:[0-1-2]"); int y = int.Parse(Console.ReadLine()); Console.WriteLine("x={0},y={1}", x, y); Atual = Atual.ObtemFilhoNaPosicao(x, y); Console.WriteLine(Atual); return; } catch (Exception e) { Console.WriteLine(e.Message); } } }
public void MovimentoDoComputador(int profundidade) { ClasseMiniMax proximo = Atual.EncontraProximoMovimento(profundidade); if (proximo != null) { Atual = proximo; } }
public static bool TabuleiroSimilar(ClasseMiniMax a, ClasseMiniMax b) { if (MesmoTabuleiro(a, b, false)) { return(true); } foreach (Transforma t in Transforma.s_Transforma) { ClasseMiniMax novoB = b.TransformaTabuleiro(t); if (MesmoTabuleiro(a, novoB, false)) { return(true); } } return(false); }
public int MiniMax(int profundidade, bool precisaMax, int alpha, int beta, out ClasseMiniMax filhoComMax) { filhoComMax = null; System.Diagnostics.Debug.Assert(m_TurnoJogadorX == precisaMax); if (profundidade == 0 || noFinal()) { PlacarRecursivo = m_Placar; return(m_Placar); } foreach (ClasseMiniMax cur in ObtemFilho()) { ClasseMiniMax burro; int placar = cur.MiniMax(profundidade - 1, !precisaMax, alpha, beta, out burro); if (!precisaMax) { if (beta > placar) { beta = placar; filhoComMax = cur; if (alpha >= beta) { break; } } } else { if (alpha < placar) { alpha = placar; filhoComMax = cur; if (alpha >= beta) { break; } } } } PlacarRecursivo = precisaMax ? alpha : beta; return(PlacarRecursivo); }
public JogoDaVelha() { EntradaGrade[] valores = Enumerable.Repeat(EntradaGrade.Vazio, 9).ToArray(); inicia = new ClasseMiniMax(valores, true); Atual = inicia; }