public IEnumerable <Estado> JogadasPossiveisDoOponente(Estado estadoAtual) { EstadoLig4 atual = (estadoAtual as EstadoLig4); List <EstadoLig4> proximosEstados = new List <EstadoLig4>(); // @@@ int idDoOponente; if (id == EstadoLig4.X) { idDoOponente = EstadoLig4.O; } else { idDoOponente = EstadoLig4.X; } for (int coluna = 0; coluna < EstadoLig4.COLUNAS; coluna++) { for (int linha = (EstadoLig4.LINHAS - 1); linha >= 0; linha--) { if (atual.IsCelulaVazia(linha, coluna) == true) { proximosEstados.Add(atual.MarcarCelula(linha, coluna, idDoOponente)); break; } } } return(proximosEstados); }
public override Estado EfetuarJogada(Estado estadoAtual) { // quanto menor for a profundidade máxima de busca do algoritmo Minimax, // menor a chance de encontrarmos a jogada ideal EstadoLig4 atual = (estadoAtual as EstadoLig4); return(Minimax.EfetuarJogada(this, atual, estadoAtual.NumeroMaximoDeTurnos)); }
public override Estado EfetuarJogada(Estado estadoAtual) { // o jogador fácil não utiliza o minimax... // apenas adiciona a peça na primeira coluna vazia EstadoLig4 atual = (estadoAtual as EstadoLig4); for (int coluna = 0; coluna < EstadoLig4.COLUNAS; coluna++) { for (int linha = (EstadoLig4.LINHAS - 1); linha >= 0; linha--) { if (atual.IsCelulaVazia(linha, coluna) == true) { return(atual.MarcarCelula(linha, coluna, Id)); } } } return(null); }
public override Estado EfetuarJogada(Estado estadoAtual) { // o jogador aleatório não utiliza o minimax... // apenas adiciona a peça na em uma coluna aleatória (e vazia) EstadoLig4 atual = (estadoAtual as EstadoLig4); // @@@ for (; ;) { int coluna = random.Next(EstadoLig4.COLUNAS); for (int linha = (EstadoLig4.LINHAS - 1); linha >= 0; linha--) { if (atual.IsCelulaVazia(linha, coluna) == true) { return(atual.MarcarCelula(linha, coluna, Id)); } } } }
public override bool Equals(object obj) { if (obj == this) { return(true); } EstadoLig4 e = (obj as EstadoLig4); if (e == null || e.jogadorDaVez != jogadorDaVez) { return(false); } for (int linha = 0; linha < LINHAS; linha++) { for (int coluna = 0; coluna < COLUNAS; coluna++) { if (e.tabuleiro[linha, coluna] != tabuleiro[linha, coluna]) { return(false); } } } return(true); }
static void Main(string[] args) { int contadorDeJogadas = 0; Estado estadoDoTabuleiro = new EstadoLig4(new int[, ] { { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 } }, X); /* * Estado estadoDoTabuleiro = new EstadoTicTacToe(new int[,] { * { 0, 0, 0 }, * { 0, 0, 0 }, * { 0, 0, 0 } * }, X);*/ // exemplo de resistência (X vai perder, mas não desiste logo de cara) //Estado estadoDoTabuleiro = new EstadoTicTacToe(new int[,] { // { 0, O, 0 }, // { 0, 0, O }, // { X, X, O } //}, X); // mais um empate (ambos X e O são jogadores difíceis... experimente // trocar um deles para fácil) //Estado estadoDoTabuleiro = new EstadoTicTacToe(new int[,] { // { O, 0, 0 }, // { 0, O, 0 }, // { X, 0, 0 } //}, X); Jogador jogadorX = new JogadorLig4Dificil(X); Jogador jogadorO = new JogadorLig4Aleatorio(O); // apenas para debug Minimax.UtilizarPodaAlphaBeta = true; Minimax.EstadosAvaliados = 0; while (estadoDoTabuleiro.IsTerminal == false) { contadorDeJogadas++; Console.WriteLine("Jogada " + contadorDeJogadas); Jogador jogador; if (estadoDoTabuleiro.JogadorDoTurno == EstadoLig4.X) { jogador = jogadorX; } else { jogador = jogadorO; } Console.WriteLine("Vez de " + jogador.Nome); estadoDoTabuleiro = jogador.EfetuarJogada(estadoDoTabuleiro); Console.WriteLine(estadoDoTabuleiro); if (estadoDoTabuleiro.IsTerminal == false) { estadoDoTabuleiro.AlternarJogadorDoTurno(); } Console.WriteLine(); Console.WriteLine(); } Console.WriteLine("Total de estados avaliados: " + Minimax.EstadosAvaliados); switch (estadoDoTabuleiro.Vencedor) { case EstadoLig4.X: Console.WriteLine("Vencedor: " + jogadorX.Nome); break; case EstadoLig4.O: Console.WriteLine("Vencedor: " + jogadorO.Nome); break; default: Console.WriteLine("Empate!"); break; } Console.ReadKey(); }