Pop

Curso programación C# - 73. Inteligencia Artificial con C# (2)- Visual Studio 2017

73. Inteligencia Artificial (2). Analizando el motor del juego de Ajedrez

 -  En este capítulo del curso de programación en c# con visual studio 2017 vamos a continuar con nuestra serie de entradas relacionadas con un tema de moda: la inteligencia artificial. En este capítulo del curso empezamos a analizar el motor del juego. Desgranaremos el funcionamiento de algunas de las clases que controlan los movimientos de nuestro ajedrez.

- En concreto en esta entrada vemos el funcionamiento de las clases: Cuadrado.cs, Movimiento.cs ,Pieza.cs y MovimientoPieza.cs. Antes de dejaros con el video en el que vemos el funcionamiento de estas clases, es importante tener claro la manera en que representamos el tablero de forma interna. El tablero no será otra cosa que una matriz de 8x8:

En el video podemos ver brevemente el funcionamiento de las clase anteriormente nombradas:


Como acostumbro os dejo el código de cada una de las clases mencionadas en el vídeo:

  •  Cuadrado.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AjedrezIA.Motor
{
    class Cuadrado
    {
        internal Pieza pieza;

        #region Constructors

        internal Cuadrado(){ }

        internal Cuadrado(Pieza pieza)
        {
            this.pieza = new Pieza(pieza);
        }

        #endregion
    }
}

  •  Movimiento.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AjedrezIA.Motor
{
    public struct MovimientoPieza
    {
        public byte posicionDestino;
        public bool movio;
        public ColorPieza colorPieza;
        public TipoPiezaAjedrez tipoPieza;
        public byte posicionOrigen;

        public MovimientoPieza(ColorPieza colorpieza, TipoPiezaAjedrez tippopieza, bool Movio, byte posOrigen, byte posDestino)
        {
            colorPieza = colorpieza;
            tipoPieza = tippopieza;
            posicionOrigen = posOrigen;
            posicionDestino = posDestino;
            movio = Movio;
        }

        public MovimientoPieza(MovimientoPieza movPieza)
        {
            colorPieza = movPieza.colorPieza;
            tipoPieza = movPieza.tipoPieza;
            posicionOrigen = movPieza.posicionOrigen;
            posicionDestino = movPieza.posicionDestino;
            movio = movPieza.movio;
        }

        public MovimientoPieza(TipoPiezaAjedrez tipoPieza)
        {
            this.tipoPieza = tipoPieza;
            colorPieza = ColorPieza.Blanco;
            posicionOrigen = 0;
            posicionDestino = 0;
            movio = false;
        }
    }

    public struct PiezaComida
    {
        public bool movio;
        public ColorPieza colorPieza;
        public TipoPiezaAjedrez tipoPieza;
        public byte posicion;
        public PiezaComida(ColorPieza colorpieza, TipoPiezaAjedrez tipopieza, bool Movio,byte pos)
        {
            colorPieza = colorpieza;
            tipoPieza = tipopieza;
            posicion = pos;
            movio = Movio;
        }

        public PiezaComida(TipoPiezaAjedrez tipopieza)
        {
            colorPieza = ColorPieza.Blanco;
            tipoPieza = tipopieza;
            posicion = 0;
            movio = false;
        }
    }

    public sealed class Movimiento
    {
        public bool capturaAlPasoOcurrio;
        public MovimientoPieza moviendoPiezaPrincipal;
        public MovimientoPieza moviendoPiezaSecundaria;
        public bool peonPromocionado;
        public PiezaComida piezaComida;

        public Movimiento()
        {
            moviendoPiezaPrincipal = new MovimientoPieza(TipoPiezaAjedrez.Ninguna);
            moviendoPiezaSecundaria = new MovimientoPieza(TipoPiezaAjedrez.Ninguna);
            piezaComida = new PiezaComida(TipoPiezaAjedrez.Ninguna);
        }

        public Movimiento(Movimiento movimiento)
        {
            moviendoPiezaPrincipal = new MovimientoPieza(movimiento.moviendoPiezaPrincipal);
            moviendoPiezaSecundaria = new MovimientoPieza(movimiento.moviendoPiezaSecundaria);

            piezaComida = new PiezaComida(movimiento.piezaComida.colorPieza,movimiento.piezaComida.tipoPieza,movimiento.piezaComida.movio,movimiento.piezaComida.posicion);
            capturaAlPasoOcurrio = movimiento.capturaAlPasoOcurrio;
            peonPromocionado = movimiento.peonPromocionado;
        }

        public Movimiento(string movimiento) : this()
        {
            int columnaOrigen = -1;
            bool comentario = false;
            bool origenEncontrado = false;

            if (movimiento.Contains("=Q"))
                peonPromocionado = true;
           
            foreach (char c in movimiento)
            {
                if (c == '{')
                {
                    comentario = true;
                    continue;
                }
                if (c == '}')
                {
                    comentario = false;
                    continue;
                }

                if (comentario)
                   continue;
                

                if (moviendoPiezaPrincipal.tipoPieza == TipoPiezaAjedrez.Ninguna)
                {
                    //Dame tipo pieza
                    moviendoPiezaPrincipal.tipoPieza = dameTipoPieza(c);

                    if (moviendoPiezaPrincipal.tipoPieza == TipoPiezaAjedrez.Ninguna)
                    {
                       moviendoPiezaPrincipal.tipoPieza = TipoPiezaAjedrez.Peon;
                       columnaOrigen = dameNumeroColumna(c);
                    }
                    continue;
                }
                if (columnaOrigen < 0)
                {
                    columnaOrigen = dameNumeroColumna(c);
                    continue;
                }
                if (columnaOrigen >= 0)
                {
                    int filaOrigen = int.Parse(c.ToString());

                    if (!origenEncontrado)
                    {
                        moviendoPiezaPrincipal.posicionOrigen = damePosicionTablero(columnaOrigen, 8 - filaOrigen);
                        origenEncontrado = true;
                    }
                    else
                    {
                        moviendoPiezaPrincipal.posicionDestino = damePosicionTablero(columnaOrigen, 8 - filaOrigen);
                    }

                    columnaOrigen = -1;
                    continue;
                }
            }
        }

        public new string ToString()
        {
            string valor = "";

            var colOrigen = (byte)(moviendoPiezaPrincipal.posicionOrigen % 8);
            var filaOrigen = (byte)(8 - (moviendoPiezaPrincipal.posicionOrigen / 8));
            var colDestino = (byte)(moviendoPiezaPrincipal.posicionDestino % 8);
            var filaDestino = (byte)(8 - (moviendoPiezaPrincipal.posicionDestino / 8));

            if (moviendoPiezaSecundaria.tipoPieza == TipoPiezaAjedrez.Torre)
            {
                if (moviendoPiezaSecundaria.colorPieza == ColorPieza.Negro)
                {
                    if (moviendoPiezaSecundaria.posicionOrigen == 7)
                    {
                        valor += "O-O";
                    }
                    else if (moviendoPiezaSecundaria.posicionOrigen == 0)
                    {
                        valor += "O-O-O";
                    }
                }
                else if (moviendoPiezaSecundaria.colorPieza == ColorPieza.Blanco)
                {
                    if (moviendoPiezaSecundaria.posicionOrigen == 63)
                    {
                        valor += "O-O";
                    }
                    else if (moviendoPiezaSecundaria.posicionOrigen == 56)
                    {
                        valor += "O-O-O";
                    }
                }
            }
            else
            {
                valor += damePiezaSemueve(moviendoPiezaPrincipal.tipoPieza);

                switch (moviendoPiezaPrincipal.tipoPieza)
                {
                    case TipoPiezaAjedrez.Caballo:
                        valor += dameLetraColumna(colOrigen);
                        valor += filaOrigen;
                        break;
                    case TipoPiezaAjedrez.Torre:
                        valor += dameLetraColumna(colOrigen);
                        valor += filaOrigen;
                        break;
                    case TipoPiezaAjedrez.Peon:
                        if (colOrigen != colDestino)
                        {
                            valor += dameLetraColumna(colOrigen);
                        }
                        break;
                }

                if (piezaComida.tipoPieza != TipoPiezaAjedrez.Ninguna)
                {
                    valor += "x";
                }

                valor += dameLetraColumna(colDestino);

                valor += filaDestino;

                if (peonPromocionado)
                {
                    valor += "=Q";
                }
            }

            return valor;
        }

        private static byte damePosicionTablero(int columna, int fila)
        {
            return (byte)(columna + (fila * 8));
        }

        private static string dameLetraColumna(int columna)
        {
            switch (columna)
            {
                case 0:
                    return "a";
                case 1:
                    return "b";
                case 2:
                    return "c";
                case 3:
                    return "d";
                case 4:
                    return "e";
                case 5:
                    return "f";
                case 6:
                    return "g";
                case 7:
                    return "h";
                default:
                    return "Desconocida";
            }
        }

        private static int dameNumeroColumna(char columna)
        {
            switch (columna)
            {
                case 'a':
                    return 0;
                case 'b':
                    return 1;
                case 'c':
                    return 2;
                case 'd':
                    return 3;
                case 'e':
                    return 4;
                case 'f':
                    return 5;
                case 'g':
                    return 6;
                case 'h':
                    return 7;
                default:
                    return -1;
            }
        }

        private static TipoPiezaAjedrez dameTipoPieza(char c)
        {
            switch (c)
            {
                case 'B':
                    return TipoPiezaAjedrez.Alfil;
                case 'K':
                    return TipoPiezaAjedrez.Rey;
                case 'N':
                    return TipoPiezaAjedrez.Caballo;
                case 'Q':
                    return TipoPiezaAjedrez.Reina;
                case 'R':
                    return TipoPiezaAjedrez.Torre;
                default:
                    return TipoPiezaAjedrez.Ninguna;
            }
        }

        private static string damePiezaSemueve(TipoPiezaAjedrez tipoPieza)
        {
            switch (tipoPieza)
            {
                case TipoPiezaAjedrez.Alfil:
                    return "B";

                case TipoPiezaAjedrez.Rey:
                    return "K";

                case TipoPiezaAjedrez.Caballo:
                    return "N";

                case TipoPiezaAjedrez.Reina:
                    return "Q";

                case TipoPiezaAjedrez.Torre:
                    return "R";
                default:
                    return "";
            }
        }
    }
}

  • Pieza.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AjedrezIA.Motor
{
    #region Enumerados

    #region colorPiezas enum

    public enum ColorPieza
    {
        Blanco,
        Negro
    }

    #endregion

    #region tipoPieza enum

    public enum TipoPiezaAjedrez
    {
        Rey,
        Reina,
        Torre,
        Alfil,
        Caballo,
        Peon,
        Ninguna
    }

    #endregion

    #endregion

    internal sealed class Pieza
    {
        #region InternalMembers

        internal ColorPieza colorPieza;
        internal TipoPiezaAjedrez tipoPieza;

        internal short valorPieza;
        internal short valorAccionPieza;

        internal short valorAtaque;
        internal short valorDefensa;

        internal int ultimoMovimiento;
        internal bool Movida;

        internal bool Seleccionada;

        internal Stack<byte> movimientosValidos;

        #endregion

        #region Constructors

        internal Pieza(Pieza pieza)
        {
            colorPieza = pieza.colorPieza;
            tipoPieza = pieza.tipoPieza;
            Movida = pieza.Movida;
            valorPieza = pieza.valorPieza;
            valorAccionPieza = pieza.valorAccionPieza;

            if (pieza.movimientosValidos != null)
                ultimoMovimiento = pieza.movimientosValidos.Count;
        }

        internal Pieza(TipoPiezaAjedrez tipoPieza, ColorPieza colorPieza)
        {
            this.tipoPieza = tipoPieza;
            this.colorPieza = colorPieza;

            if (this.tipoPieza == TipoPiezaAjedrez.Peon || this.tipoPieza == TipoPiezaAjedrez.Caballo)
            {
                ultimoMovimiento = 2;
            }
            else
            {
                ultimoMovimiento = 0;
            }

            movimientosValidos = new Stack<byte>(ultimoMovimiento);

            valorPieza = calcularValorPieza(this.tipoPieza);
            valorAccionPieza = calcularValorAccionPieza(this.tipoPieza);
        }

        #endregion

        #region internal 

        internal static string dameLetraPieza(TipoPiezaAjedrez tipoPieza)
        {
            switch (tipoPieza)
            {
                case TipoPiezaAjedrez.Peon:
                        return "P";
                case TipoPiezaAjedrez.Caballo:
                        return "N";
                case TipoPiezaAjedrez.Alfil:
                        return "B";
                 case TipoPiezaAjedrez.Torre:
                        return "R";
                 case TipoPiezaAjedrez.Reina:
                        return "Q";
                 case TipoPiezaAjedrez.Rey:
                        return "K";
                default:
                        return "P";
          }
        }

        #endregion

        #region Metodos Privados

        private static short calcularValorPieza(TipoPiezaAjedrez tipoPieza)
        {
            switch (tipoPieza)
            {
                case TipoPiezaAjedrez.Peon:
                      return 100;
                case TipoPiezaAjedrez.Caballo:
                      return 320;
                case TipoPiezaAjedrez.Alfil:
                      return 325;
                case TipoPiezaAjedrez.Torre:
                      return 500;
                case TipoPiezaAjedrez.Reina:
                      return 975;
                case TipoPiezaAjedrez.Rey:
                      return 32767;
                default:
                      return 0;
                    
            }
        }


        private static short calcularValorAccionPieza(TipoPiezaAjedrez tipoPieza)
        {
            switch (tipoPieza)
            {
                case TipoPiezaAjedrez.Peon:
                    return 6;
                case TipoPiezaAjedrez.Caballo:
                    return 3;
                case TipoPiezaAjedrez.Alfil:
                    return 3;
                case TipoPiezaAjedrez.Torre:
                    return 2;
                case TipoPiezaAjedrez.Reina:
                    return 1;
                case TipoPiezaAjedrez.Rey:
                    return 1;
                default:
                   return 0;
                    
            }
        }

        #endregion
    }
}


  • MovimientoPieza.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AjedrezIA.Motor
{
    internal struct AsignarMovimientoPieza
    {
        internal readonly List<byte> Movimientos;
        internal AsignarMovimientoPieza(List<byte> movimientos)
        {
            Movimientos = movimientos;
        }
    }

    internal struct MovimientoArrays
    {
        internal static AsignarMovimientoPieza[] AlfilMovimientos1;
        internal static byte[] AlfilTotalMovimientos1;

        internal static AsignarMovimientoPieza[] AlfilMovimientos2;
        internal static byte[] AlfilTotalMovimientos2;

        internal static AsignarMovimientoPieza[] AlfilMovimientos3;
        internal static byte[] AlfilTotalMovimientos3;

        internal static AsignarMovimientoPieza[] AlfilMovimientos4;
        internal static byte[] AlfilTotalMovimientos4;

        internal static AsignarMovimientoPieza[] peonNegroMovimientos;
        internal static byte[] peonNegroTotalMovimientos;

        internal static AsignarMovimientoPieza[] peonBlancoMovimientos;
        internal static byte[] peonBlancoTotalMovimientos;

        internal static AsignarMovimientoPieza[] caballoMovimientos;
        internal static byte[] caballoTotalMovimientos;

        internal static AsignarMovimientoPieza[] ReinaMovimientos1;
        internal static byte[] ReinaTotalMovimientos1;
        internal static AsignarMovimientoPieza[] ReinaMovimientos2;
        internal static byte[] ReinaTotalMovimientos2;
        internal static AsignarMovimientoPieza[] ReinaMovimientos3;
        internal static byte[] ReinaTotalMovimientos3;
        internal static AsignarMovimientoPieza[] ReinaMovimientos4;
        internal static byte[] ReinaTotalMovimientos4;
        internal static AsignarMovimientoPieza[] ReinaMovimientos5;
        internal static byte[] ReinaTotalMovimientos5;
        internal static AsignarMovimientoPieza[] ReinaMovimientos6;
        internal static byte[] ReinaTotalMovimientos6;
        internal static AsignarMovimientoPieza[] ReinaMovimientos7;
        internal static byte[] ReinaTotalMovimientos7;
        internal static AsignarMovimientoPieza[] ReinaMovimientos8;
        internal static byte[] ReinaTotalMovimientos8;

        internal static AsignarMovimientoPieza[] TorreMovimientos1;
        internal static byte[] TorreTotalMovimientos1;
        internal static AsignarMovimientoPieza[] TorreMovimientos2;
        internal static byte[] TorreTotalMovimientos2;
        internal static AsignarMovimientoPieza[] TorreMovimientos3;
        internal static byte[] TorreTotalMovimientos3;
        internal static AsignarMovimientoPieza[] TorreMovimientos4;
        internal static byte[] TorreTotalMovimientos4;

        internal static AsignarMovimientoPieza[] ReyMovimientos;
        internal static byte[] ReytotalMovimientos;
    }

    internal static class MovimientoPiezas
    {
        private static byte Posicion(byte columna, byte fila)
        {
            return (byte)(columna + (fila * 8));
        }

        #region Iniciliazar Metodos Movimientos

        internal static void IniciarMovimientoPieza()
        {
            MovimientoArrays.peonBlancoMovimientos = new AsignarMovimientoPieza[64];
            MovimientoArrays.peonBlancoTotalMovimientos = new byte[64];

            MovimientoArrays.peonNegroMovimientos = new AsignarMovimientoPieza[64];
            MovimientoArrays.peonNegroTotalMovimientos = new byte[64];

            MovimientoArrays.caballoMovimientos = new AsignarMovimientoPieza[64];
            MovimientoArrays.caballoTotalMovimientos = new byte[64];

            MovimientoArrays.AlfilMovimientos1 = new AsignarMovimientoPieza[64];
            MovimientoArrays.AlfilTotalMovimientos1 = new byte[64];

            MovimientoArrays.AlfilMovimientos2 = new AsignarMovimientoPieza[64];
            MovimientoArrays.AlfilTotalMovimientos2 = new byte[64];

            MovimientoArrays.AlfilMovimientos3 = new AsignarMovimientoPieza[64];
            MovimientoArrays.AlfilTotalMovimientos3 = new byte[64];

            MovimientoArrays.AlfilMovimientos4 = new AsignarMovimientoPieza[64];
            MovimientoArrays.AlfilTotalMovimientos4 = new byte[64];

            MovimientoArrays.TorreMovimientos1 = new AsignarMovimientoPieza[64];
            MovimientoArrays.TorreTotalMovimientos1 = new byte[64];

            MovimientoArrays.TorreMovimientos2 = new AsignarMovimientoPieza[64];
            MovimientoArrays.TorreTotalMovimientos2 = new byte[64];

            MovimientoArrays.TorreMovimientos3 = new AsignarMovimientoPieza[64];
            MovimientoArrays.TorreTotalMovimientos3 = new byte[64];

            MovimientoArrays.TorreMovimientos4 = new AsignarMovimientoPieza[64];
            MovimientoArrays.TorreTotalMovimientos4 = new byte[64];

            MovimientoArrays.ReinaMovimientos1 = new AsignarMovimientoPieza[64];
            MovimientoArrays.ReinaTotalMovimientos1 = new byte[64];

            MovimientoArrays.ReinaMovimientos2 = new AsignarMovimientoPieza[64];
            MovimientoArrays.ReinaTotalMovimientos2 = new byte[64];

            MovimientoArrays.ReinaMovimientos3 = new AsignarMovimientoPieza[64];
            MovimientoArrays.ReinaTotalMovimientos3 = new byte[64];

            MovimientoArrays.ReinaMovimientos4 = new AsignarMovimientoPieza[64];
            MovimientoArrays.ReinaTotalMovimientos4 = new byte[64];

            MovimientoArrays.ReinaMovimientos5 = new AsignarMovimientoPieza[64];
            MovimientoArrays.ReinaTotalMovimientos5 = new byte[64];

            MovimientoArrays.ReinaMovimientos6 = new AsignarMovimientoPieza[64];
            MovimientoArrays.ReinaTotalMovimientos6 = new byte[64];

            MovimientoArrays.ReinaMovimientos7 = new AsignarMovimientoPieza[64];
            MovimientoArrays.ReinaTotalMovimientos7 = new byte[64];

            MovimientoArrays.ReinaMovimientos8 = new AsignarMovimientoPieza[64];
            MovimientoArrays.ReinaTotalMovimientos8 = new byte[64];

            MovimientoArrays.ReyMovimientos = new AsignarMovimientoPieza[64];
            MovimientoArrays.ReytotalMovimientos = new byte[64];

            asignarMovimientoPeonBlanco();
            asignarMovimientoPeonNegro();
            asignarMovimientoCaballo();
            asignarMovimientoAlfil();
            asignarMovimientosTorre();
            asginarMovimientosReina();
            asignarMovimientoRey();
        }

        private static void asignarMovimientoPeonNegro()
        {
            for (byte posicion = 8; posicion <= 55; posicion++)
            {
                var asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());

                byte x = (byte)(posicion % 8);
                byte y = (byte)((posicion / 8));

                //Matar en diagonal
                if (y < 7 && x < 7)
                {
                    asignarMovimiento.Movimientos.Add((byte)(posicion + 8 + 1));
                    MovimientoArrays.peonNegroTotalMovimientos[posicion]++;
                }
                if (x > 0 && y < 7)
                {
                    asignarMovimiento.Movimientos.Add((byte)(posicion + 8 - 1));
                    MovimientoArrays.peonNegroTotalMovimientos[posicion]++;
                }

                //uno hacia delante
                asignarMovimiento.Movimientos.Add((byte)(posicion + 8));
                MovimientoArrays.peonNegroTotalMovimientos[posicion]++;

                //Desde posicion inicial movemos dos
                if (y == 1)
                {
                    asignarMovimiento.Movimientos.Add((byte)(posicion + 16));
                    MovimientoArrays.peonNegroTotalMovimientos[posicion]++;
                }

                MovimientoArrays.peonNegroMovimientos[posicion] = asignarMovimiento;
            }
        }

        private static void asignarMovimientoPeonBlanco()
        {
            for (byte posicion = 8; posicion <= 55; posicion++)
            {
                byte x = (byte)(posicion % 8);
                byte y = (byte)((posicion / 8));

                var asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());

                //Matar en diagonal
                if (x < 7 && y > 0)
                {
                    asignarMovimiento.Movimientos.Add((byte)(posicion - 8 + 1));
                    MovimientoArrays.peonBlancoTotalMovimientos[posicion]++;
                }
                if (x > 0 && y > 0)
                {
                    asignarMovimiento.Movimientos.Add((byte)(posicion - 8 - 1));
                    MovimientoArrays.peonBlancoTotalMovimientos[posicion]++;
                }

                //uno hacia delante
                asignarMovimiento.Movimientos.Add((byte)(posicion - 8));
                MovimientoArrays.peonBlancoTotalMovimientos[posicion]++;

                //Desde posicion inicial movemos dos
                if (y == 6)
                {
                    asignarMovimiento.Movimientos.Add((byte)(posicion - 16));
                    MovimientoArrays.peonBlancoTotalMovimientos[posicion]++;
                }

                MovimientoArrays.peonBlancoMovimientos[posicion] = asignarMovimiento;
            }
        }

        private static void asignarMovimientoCaballo()
        {
            for (byte y = 0; y < 8; y++)
            {
                for (byte x = 0; x < 8; x++)
                {
                    byte posicion = (byte)(y + (x * 8));
                    var asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    byte movimiento;

                    if (y < 6 && x > 0)
                    {
                        movimiento = Posicion((byte)(y + 2), (byte)(x - 1));

                        if (movimiento < 64)
                        {
                            asignarMovimiento.Movimientos.Add(movimiento);
                            MovimientoArrays.caballoTotalMovimientos[posicion]++;
                        }
                    }

                    if (y > 1 && x < 7)
                    {
                        movimiento = Posicion((byte)(y - 2), (byte)(x + 1));

                        if (movimiento < 64)
                        {
                            asignarMovimiento.Movimientos.Add(movimiento);
                            MovimientoArrays.caballoTotalMovimientos[posicion]++;
                        }
                    }

                    if (y > 1 && x > 0)
                    {
                        movimiento = Posicion((byte)(y - 2), (byte)(x - 1));

                        if (movimiento < 64)
                        {
                            asignarMovimiento.Movimientos.Add(movimiento);
                            MovimientoArrays.caballoTotalMovimientos[posicion]++;
                        }
                    }

                    if (y < 6 && x < 7)
                    {
                        movimiento = Posicion((byte)(y + 2), (byte)(x + 1));

                        if (movimiento < 64)
                        {
                            asignarMovimiento.Movimientos.Add(movimiento);
                            MovimientoArrays.caballoTotalMovimientos[posicion]++;
                        }
                    }

                    if (y > 0 && x < 6)
                    {
                        movimiento = Posicion((byte)(y - 1), (byte)(x + 2));

                        if (movimiento < 64)
                        {
                            asignarMovimiento.Movimientos.Add(movimiento);
                            MovimientoArrays.caballoTotalMovimientos[posicion]++;
                        }
                    }

                    if (y < 7 && x > 1)
                    {
                        movimiento = Posicion((byte)(y + 1), (byte)(x - 2));

                        if (movimiento < 64)
                        {
                            asignarMovimiento.Movimientos.Add(movimiento);
                            MovimientoArrays.caballoTotalMovimientos[posicion]++;
                        }
                    }

                    if (y > 0 && x > 1)
                    {
                        movimiento = Posicion((byte)(y - 1), (byte)(x - 2));

                        if (movimiento < 64)
                        {
                            asignarMovimiento.Movimientos.Add(movimiento);
                            MovimientoArrays.caballoTotalMovimientos[posicion]++;
                        }
                    }

                    if (y < 7 && x < 6)
                    {
                        movimiento = Posicion((byte)(y + 1), (byte)(x + 2));

                        if (movimiento < 64)
                        {
                            asignarMovimiento.Movimientos.Add(movimiento);
                            MovimientoArrays.caballoTotalMovimientos[posicion]++;
                        }
                    }

                    MovimientoArrays.caballoMovimientos[posicion] = asignarMovimiento;
                }
            }
        }

        private static void asignarMovimientoAlfil()
        {
            for (byte y = 0; y < 8; y++)
            {
                for (byte x = 0; x < 8; x++)
                {
                    byte posicion = (byte)(y + (x * 8));

                    var asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    byte movimiento;

                    byte fila = x;
                    byte columna = y;

                    while (fila < 7 && columna < 7)
                    {
                        fila++;
                        columna++;

                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.AlfilTotalMovimientos1[posicion]++;
                    }

                    MovimientoArrays.AlfilMovimientos1[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());

                    fila = x;
                    columna = y;

                    while (fila < 7 && columna > 0)
                    {
                        fila++;
                        columna--;

                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.AlfilTotalMovimientos2[posicion]++;
                    }

                    MovimientoArrays.AlfilMovimientos2[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());

                    fila = x;
                    columna = y;

                    while (fila > 0 && columna < 7)
                    {
                        fila--;
                        columna++;

                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.AlfilTotalMovimientos3[posicion]++;
                    }

                    MovimientoArrays.AlfilMovimientos3[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());

                    fila = x;
                    columna = y;

                    while (fila > 0 && columna > 0)
                    {
                        fila--;
                        columna--;

                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.AlfilTotalMovimientos4[posicion]++;
                    }

                    MovimientoArrays.AlfilMovimientos4[posicion] = asignarMovimiento;
                }
            }
        }

        private static void asignarMovimientosTorre()
        {
            for (byte y = 0; y < 8; y++)
            {
                for (byte x = 0; x < 8; x++)
                {
                    byte posicion = (byte)(y + (x * 8));

                    var asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    byte movimiento;

                    byte fila = x;
                    byte columna = y;

                    while (fila < 7)
                    {
                        fila++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.TorreTotalMovimientos1[posicion]++;
                    }

                    MovimientoArrays.TorreMovimientos1[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (fila > 0)
                    {
                        fila--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.TorreTotalMovimientos2[posicion]++;
                    }

                    MovimientoArrays.TorreMovimientos2[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (columna > 0)
                    {
                        columna--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.TorreTotalMovimientos3[posicion]++;
                    }

                    MovimientoArrays.TorreMovimientos3[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (columna < 7)
                    {
                        columna++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.TorreTotalMovimientos4[posicion]++;
                    }

                    MovimientoArrays.TorreMovimientos4[posicion] = asignarMovimiento;
                }
            }
        }

        private static void asginarMovimientosReina()
        {
            for (byte y = 0; y < 8; y++)
            {
                for (byte x = 0; x < 8; x++)
                {
                    byte posicion = (byte)(y + (x * 8));

                    var asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    byte movimiento;

                    byte fila = x;
                    byte columna = y;

                    while (fila < 7)
                    {
                        fila++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReinaTotalMovimientos1[posicion]++;
                    }

                    MovimientoArrays.ReinaMovimientos1[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (fila > 0)
                    {
                        fila--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReinaTotalMovimientos2[posicion]++;
                    }

                    MovimientoArrays.ReinaMovimientos2[posicion] = asignarMovimiento;

                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (columna > 0)
                    {
                        columna--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReinaTotalMovimientos3[posicion]++;
                    }

                    MovimientoArrays.ReinaMovimientos3[posicion] = asignarMovimiento;

                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (columna < 7)
                    {
                        columna++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReinaTotalMovimientos4[posicion]++;
                    }

                    MovimientoArrays.ReinaMovimientos4[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (fila < 7 && columna < 7)
                    {
                        fila++;
                        columna++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReinaTotalMovimientos5[posicion]++;
                    }

                    MovimientoArrays.ReinaMovimientos5[posicion] = asignarMovimiento;

                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (fila < 7 && columna > 0)
                    {
                        fila++;
                        columna--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReinaTotalMovimientos6[posicion]++;
                    }

                    MovimientoArrays.ReinaMovimientos6[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (fila > 0 && columna < 7)
                    {
                        fila--;
                        columna++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReinaTotalMovimientos7[posicion]++;
                    }

                    MovimientoArrays.ReinaMovimientos7[posicion] = asignarMovimiento;
                    asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    fila = x;
                    columna = y;

                    while (fila > 0 && columna > 0)
                    {
                        fila--;
                        columna--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReinaTotalMovimientos8[posicion]++;
                    }

                    MovimientoArrays.ReinaMovimientos8[posicion] = asignarMovimiento;
                }
            }
        }

        private static void asignarMovimientoRey()
        {
            for (byte y = 0; y < 8; y++)
            {
                for (byte x = 0; x < 8; x++)
                {
                    byte posicion = (byte)(y + (x * 8));

                    var asignarMovimiento = new AsignarMovimientoPieza(new List<byte>());
                    byte movimiento;

                    byte fila = x;
                    byte columna = y;

                    if (fila < 7)
                    {
                        fila++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReytotalMovimientos[posicion]++;
                    }

                    fila = x;
                    columna = y;

                    if (fila > 0)
                    {
                        fila--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReytotalMovimientos[posicion]++;
                    }

                    fila = x;
                    columna = y;

                    if (columna > 0)
                    {
                        columna--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReytotalMovimientos[posicion]++;
                    }

                    fila = x;
                    columna = y;

                    if (columna < 7)
                    {
                        columna++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReytotalMovimientos[posicion]++;
                    }

                    fila = x;
                    columna = y;

                    if (fila < 7 && columna < 7)
                    {
                        fila++;
                        columna++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReytotalMovimientos[posicion]++;
                    }

                    fila = x;
                    columna = y;

                    if (fila < 7 && columna > 0)
                    {
                        fila++;
                        columna--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReytotalMovimientos[posicion]++;
                    }

                    fila = x;
                    columna = y;

                    if (fila > 0 && columna < 7)
                    {
                        fila--;
                        columna++;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReytotalMovimientos[posicion]++;
                    }


                    fila = x;
                    columna = y;

                    if (fila > 0 && columna > 0)
                    {
                        fila--;
                        columna--;
                        movimiento = Posicion(columna, fila);
                        asignarMovimiento.Movimientos.Add(movimiento);
                        MovimientoArrays.ReytotalMovimientos[posicion]++;
                    }

                    MovimientoArrays.ReyMovimientos[posicion] = asignarMovimiento;
                }
            }
        }

        #endregion
    }
}


Curso programación C# - 72. Inteligencia Artificial con C# (1)- Visual Studio 2017

72. Inteligencia Artificial (1). Introducción

 -  En este capítulo del curso de programación en c# con visual studio 2017 vamos a empezar una nueva serie de entradas relacionadas con un tema de moda: la inteligencia artificial.El auge de esta tecnología se de debe al deseo de automatizar distintas tareas hasta ahora realizadas por seres humanos.

- Podemos observar que la  IA se aplica en casi todas partes como por ejemplo:  minería de datos para encontrar relaciones entre individuos cuando obtienes una lista de sugerencias de amigos en Facebook,  recomendaciones de compra en Amazon , cuando jugamos contra la máquina en un videojuego etc...

- Os dejo algunas definiciones destacadas de inteligencia artificial:



- Para completar más datos sobre IA podéis consultar también este enlace de la wikipedia. Una vez vistas algunas definiciones sobre inteligencia artificial podemos definir el concepto de agente: Un agente es una entidad capaz de percibir su entorno y actuar sobre él . La diferencia principal entre un agente y un programa común es que el primero debe ser autónomo; es decir, debe funcionar sin intervención directa de humanos u otros. Una diferencia adicional es que el agente realiza tareas concretas en nombre de alguien.

- En la siguientes entradas del blog y en nuestro canal de youtube trataremos de realizar un juego de ajedrez donde nosotros moveremos las piezas blancas y un agente mueva las piezas negras. Nos basaremos en estos tres  enlaces que dejo. Es importante  echarles un vistazo para seguir los siguientes capítulos con fluidez:



- Os dejo el vídeo donde os cuento todo esto:




Curso básico programación C# - 71. Creando nuestro propio buscador (9) - Visual Studio 2017

71. Nuestro propio buscador  de peliculas (9). Acabamos el buscador.

 -  En este capítulo del curso de programación en c# con visual studio 2017 ,  finalizamos nuestro proyecto consistente en crear nuestro propio buscador. Ya estamos utilizando la API que nos proporciona https://www.themoviedb.org , para realizar consultas  y  mostrar los resultados de una manera estructurada en pantalla.

- En esta nueva  entrada preparamos la aplicación para realizar peticiones  al método  https://developers.themoviedb.org/3/discover/movie-discover . En está ocasión  este método  nos devolverá las peliculas más importantes según un año que previamente elijamos y en función de los votos que haya registrada en esta página. En el video se ve en detalle lo que os cuento:

- En esta entrada finalizamos nuestra buscador. Ya hemos visto como utilizar algunos de los métodos disponible en esta API.Existen multitud de métodos más  si queréis seguir practicando. Las llamadas a los diferentse métodos será muy similares a las que ya hemos visto. Como en capítulos anteriores os dejo el código visto en el video:

  • Página Historiacine.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="HistoriaCine.aspx.cs" Inherits="BuscadorWebPeliculas.HistoriaCine" MasterPageFile="~/Site.Master" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
    <div class="row">
      
            <div style="text-align: center; margin-top:5%">

                   <div style="text-align: center; margin-bottom:5%">
                       <asp:Label runat="server" Text="Seleccione fecha:" ></asp:Label>
                       <asp:DropDownList runat="server" ID="cmbAnios" AutoPostBack="True">
                           <asp:ListItem Text="Año 1960" Value="1960"></asp:ListItem>
                           <asp:ListItem Text="Año 1961" Value="1961"></asp:ListItem>
                           <asp:ListItem Text="Año 1962" Value="1962"></asp:ListItem>
                           <asp:ListItem Text="Año 1963" Value="1963"></asp:ListItem>
                           <asp:ListItem Text="Año 1964" Value="1964"></asp:ListItem>
                           <asp:ListItem Text="Año 1965" Value="1965"></asp:ListItem>
                           <asp:ListItem Text="Año 1966" Value="1966"></asp:ListItem>
                           <asp:ListItem Text="Año 1967" Value="1967"></asp:ListItem>
                           <asp:ListItem Text="Año 1968" Value="1968"></asp:ListItem>
                           <asp:ListItem Text="Año 1969" Value="1969"></asp:ListItem>
                           <asp:ListItem Text="Año 1970" Value="1970"></asp:ListItem>
                           <asp:ListItem Text="Año 1971" Value="1971"></asp:ListItem>
                           <asp:ListItem Text="Año 1972" Value="1972"></asp:ListItem>
                           <asp:ListItem Text="Año 1973" Value="1973"></asp:ListItem>
                           <asp:ListItem Text="Año 1974" Value="1974"></asp:ListItem>
                           <asp:ListItem Text="Año 1975" Value="1975"></asp:ListItem>
                           <asp:ListItem Text="Año 1976" Value="1976"></asp:ListItem>
                           <asp:ListItem Text="Año 1977" Value="1977"></asp:ListItem>
                           <asp:ListItem Text="Año 1978" Value="1978"></asp:ListItem>
                           <asp:ListItem Text="Año 1979" Value="1979"></asp:ListItem>
                           <asp:ListItem Text="Año 1970" Value="1970"></asp:ListItem>
                           <asp:ListItem Text="Año 1971" Value="1971"></asp:ListItem>
                           <asp:ListItem Text="Año 1972" Value="1972"></asp:ListItem>
                           <asp:ListItem Text="Año 1973" Value="1973"></asp:ListItem>
                           <asp:ListItem Text="Año 1974" Value="1974"></asp:ListItem>
                           <asp:ListItem Text="Año 1975" Value="1975"></asp:ListItem>
                           <asp:ListItem Text="Año 1976" Value="1976"></asp:ListItem>
                           <asp:ListItem Text="Año 1977" Value="1977"></asp:ListItem>
                           <asp:ListItem Text="Año 1978" Value="1978"></asp:ListItem>
                           <asp:ListItem Text="Año 1979" Value="1979"></asp:ListItem>
                           <asp:ListItem Text="Año 1980" Value="1980"></asp:ListItem>
                           <asp:ListItem Text="Año 1981" Value="1981"></asp:ListItem>
                           <asp:ListItem Text="Año 1982" Value="1982"></asp:ListItem>
                           <asp:ListItem Text="Año 1983" Value="1983"></asp:ListItem>
                           <asp:ListItem Text="Año 1984" Value="1984"></asp:ListItem>
                           <asp:ListItem Text="Año 1985" Value="1985"></asp:ListItem>
                           <asp:ListItem Text="Año 1986" Value="1986"></asp:ListItem>
                           <asp:ListItem Text="Año 1987" Value="1987"></asp:ListItem>
                           <asp:ListItem Text="Año 1988" Value="1988"></asp:ListItem>
                           <asp:ListItem Text="Año 1989" Value="1989"></asp:ListItem>
                           <asp:ListItem Text="Año 1990" Value="1990"></asp:ListItem>
                           <asp:ListItem Text="Año 1991" Value="1991"></asp:ListItem>
                           <asp:ListItem Text="Año 1992" Value="1992"></asp:ListItem>
                           <asp:ListItem Text="Año 1993" Value="1993"></asp:ListItem>
                           <asp:ListItem Text="Año 1994" Value="1994"></asp:ListItem>
                           <asp:ListItem Text="Año 1995" Value="1995"></asp:ListItem>
                           <asp:ListItem Text="Año 1996" Value="1996"></asp:ListItem>
                           <asp:ListItem Text="Año 1997" Value="1997"></asp:ListItem>
                           <asp:ListItem Text="Año 1998" Value="1998"></asp:ListItem>
                           <asp:ListItem Text="Año 1999" Value="1999"></asp:ListItem>
                           <asp:ListItem Text="Año 2000" Value="2000"></asp:ListItem>
                           <asp:ListItem Text="Año 2001" Value="2001"></asp:ListItem>
                           <asp:ListItem Text="Año 2002" Value="2002"></asp:ListItem>
                           <asp:ListItem Text="Año 2003" Value="2003"></asp:ListItem>
                           <asp:ListItem Text="Año 2004" Value="2004"></asp:ListItem>
                           <asp:ListItem Text="Año 2005" Value="2005"></asp:ListItem>
                           <asp:ListItem Text="Año 2006" Value="2006"></asp:ListItem>
                           <asp:ListItem Text="Año 2007" Value="2007"></asp:ListItem>
                           <asp:ListItem Text="Año 2008" Value="2008"></asp:ListItem>
                           <asp:ListItem Text="Año 2009" Value="2009"></asp:ListItem>
                           <asp:ListItem Text="Año 2010" Value="2010"></asp:ListItem>
                           <asp:ListItem Text="Año 2011" Value="2011"></asp:ListItem>
                           <asp:ListItem Text="Año 2012" Value="2012"></asp:ListItem>
                           <asp:ListItem Text="Año 2013" Value="2013"></asp:ListItem>
                           <asp:ListItem Text="Año 2014" Value="2014"></asp:ListItem>
                           <asp:ListItem Text="Año 2015" Value="2015"></asp:ListItem>
                           <asp:ListItem Text="Año 2016" Value="2016"></asp:ListItem>
                           <asp:ListItem Text="Año 2017" Value="2017" Selected="True"></asp:ListItem>
                           <asp:ListItem Text="Año 2018" Value="2018"></asp:ListItem>
          

                       </asp:DropDownList>
                  </div>

                  <div runat="server"  style="text-align: left" >
                      <table id="tableRes" runat="server" style="width: 100%;" enableviewstate="false">
                   
                    </table>
              
                </div>
             </div>
        
    </div>

</asp:Content>


  • Código de la página Historiacine.aspx.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using Newtonsoft.Json;
using BuscadorWebPeliculas.Clases;

namespace BuscadorWebPeliculas
{
    public partial class HistoriaCine : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Util u = new Util();
            String resultado = String.Empty;
            String rutaPeticion = ConfigurationManager.AppSettings["cartelera"].ToString();
            JsonSerializerSettings ConfigJson = new JsonSerializerSettings();
            ConfigJson.NullValueHandling = NullValueHandling.Ignore;
            rutaPeticion += "?api_key=" + ConfigurationManager.AppSettings["claveApi"].ToString() + "&language=es-ES&region=ES&sort_by=vote_average.desc&primary_release_year="+ cmbAnios.SelectedValue+ "&include_video=false&&vote_count.gte=50";
            resultado = u.peticionAPI(rutaPeticion, "GET", null);
            RespuestaSearch rest = JsonConvert.DeserializeObject<RespuestaSearch>(resultado);
            pintarControles(rest);

            rutaPeticion = String.Empty;
            rutaPeticion = ConfigurationManager.AppSettings["cartelera"].ToString();
            rutaPeticion += "?api_key=" + ConfigurationManager.AppSettings["claveApi"].ToString() + "&language=es-ES&region=ES&sort_by=vote_average.desc&primary_release_year=" + cmbAnios.SelectedValue + "&include_video=false&&vote_count.gte=50&page=2";
            resultado = u.peticionAPI(rutaPeticion, "GET", null);
            rest = JsonConvert.DeserializeObject<RespuestaSearch>(resultado);
            pintarControles(rest);




        }

        private void pintarControles(RespuestaSearch rest)
        {
       

       
            for (int i = 0; i < rest.results.Count; i++)
            {

                Image img = new Image();
                img.Width = 100;
                img.Height = 125;
                if (rest.results[i].poster_path != String.Empty)
                    img.ImageUrl = "https://image.tmdb.org/t/p/w500/" + rest.results[i].poster_path;
                Label l = new Label();
                l.Text = "<b>"+rest.results[i].title + " Nota:" + rest.results[i].vote_average.ToString() + "  Votos:" + rest.results[i].vote_count.ToString() + "</b>: " + rest.results[i].overview + "<br>";

                System.Web.UI.HtmlControls.HtmlTableRow tRow = new System.Web.UI.HtmlControls.HtmlTableRow();
                System.Web.UI.HtmlControls.HtmlTableCell tCell = new System.Web.UI.HtmlControls.HtmlTableCell();
                System.Web.UI.HtmlControls.HtmlTableCell tCell2 = new System.Web.UI.HtmlControls.HtmlTableCell();
                tCell.Controls.Add(img);
                tCell2.Controls.Add(l);
                tRow.Cells.Add(tCell);
                tRow.Cells.Add(tCell2);
                tCell2.VAlign = "TOP";
                tableRes.Rows.Add(tRow);

            }
        }
    }
}

Curso .NET Core en C# - 34.Creamos nuestro propio log

34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...