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 básico programación C# - 70. Creando nuestro propio buscador (8) - Visual Studio 2017

70. Nuestro propio buscador  de peliculas (8)

 -  En este capítulo del curso de programación en c# con visual studio 2017 ,  continuaremos con nuestro nuevo 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 entrada preparamos la aplicación para realizar peticiones  a un nuevo método.En esta ocasión realizamos una petición al método https://developers.themoviedb.org/3/discover/movie-discover que nos devolverá las peliculas que están en los cines(en el país que le pasemos como parametro en la consulta) en un rango de fechas que también especificaremos como parametro en la propia petición.
 
- Os dejo  el video con el código al completo donde sacamos las 5 peliculas más desatcadas que hay en cartelera en España a fecha del 5 de mayo de 2018:



  • Os dejo también el código que hemos modificado de la página Default.aspx.cs para permitir realizar esta nueva petición:
using BuscadorWebPeliculas.Clases;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace BuscadorWebPeliculas
{
    public partial class _Default : 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";
            rutaPeticion += "&primary_release_date.gte="+DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd")+"&primary_release_date.lte=" + DateTime.Now.ToString("yyyy-MM-dd"); ;
            resultado = u.peticionAPI(rutaPeticion, "GET", null);
            RespuestaSearch rest = JsonConvert.DeserializeObject<RespuestaSearch>(resultado);
            pintarControles(rest);

        }

        protected void Unnamed2_Click(object sender, ImageClickEventArgs e)
        {
            if (txtBuscador.Text != String.Empty)
            {
                tableRes.Controls.Clear();
                Util u = new Util();
                String resultado = String.Empty;

                String rutaPeticion = ConfigurationManager.AppSettings["search"].ToString();
                JsonSerializerSettings ConfigJson = new JsonSerializerSettings();
                ConfigJson.NullValueHandling = NullValueHandling.Ignore;
                rutaPeticion += "?api_key=" + ConfigurationManager.AppSettings["claveApi"].ToString() + "&language=es-ES";
                rutaPeticion += "&query=" + txtBuscador.Text;
                resultado = u.peticionAPI(rutaPeticion, "GET", null);
                RespuestaSearch rest = JsonConvert.DeserializeObject<RespuestaSearch>(resultado);
                pintarControles(rest);
                guardarDatosBusquedas();
            }
        }
   

        private void guardarDatosBusquedas()
        {
            try
            {
                string userip = Request.UserHostAddress;
                string navegador = Request.Browser.Browser;
                string plataforma = Request.Browser.Platform;

                //LLAMAR A BBDD
                Util u = new Util();
                u.guardarBusquedasUsuarios(userip, navegador, plataforma, txtBuscador.Text);
            }
            catch (Exception ex)
            {
                //DE MOMENTO LO DEJO VACIA TRATAR COMO SE QUIERA
            }
           
        }

        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].release_date + " " + rest.results[i].title + "</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);

            }
        }

    }
     

}

  •  Os dejo también el código que hemos modificado de la página Default.aspx: 


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

<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="<b>Mis pelis:</b>" Font-Size="Medium"></asp:Label>
            <asp:TextBox ID="txtBuscador" runat="server" Width="30%" placeholder="Busca tus peliculas favoritas"></asp:TextBox>
            <asp:ImageButton runat="server" ImageUrl="images/magnifier-24270_640.png"  width="21px" height="20px" OnClick="Unnamed2_Click"/><br />
           <asp:Label runat="server" Text="" ID="lblResultado"></asp:Label>
             </div>
                <div runat="server"  style="text-align: left" >
                      <table id="tableRes" runat="server" style="width: 100%;" enableviewstate="false">
                   
                    </table>
              
                </div>
           </div>
       </div>
</asp:Content>

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

69. Nuestro propio buscador  de peliculas (7)

 -  En este capítulo del curso de programación en c# con visual studio 2017 ,  continuaremos con nuestro nuevo 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. Además ya tenemos preparada la estructura de base de datos necesaria para almacenar información.

- En esta entrada preparamos la aplicación para realizar peticiones a nuestra base datos para poder almacenar la información en la tabla que preparamos en el capítulo anterior. Este ejemplo pretende ser un simil, a pequeña escala, de lo que hacen los grandes buscadores cada vez que realizamos una petición. Con cada busquedas  que hacemos damos datos con los que crean perfiles orientados al marketing para su propio beneficio.Nada es gratis en internet, aunque lo parezca.
 
- Os dejo  el video con el ejemplo:


- Una vez visto el video os dejo el código de la página aspx que relizan la petición y de nuestra clase Uitl.

  • Clase Util.cs:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;

namespace BuscadorWebPeliculas
{
    public class Util
    {


        public string peticionAPI(string pathPeticion, string tipoPeticion, byte[] Datos)
        {
            string Resultado = String.Empty;
            HttpWebRequest WReq = (HttpWebRequest)HttpWebRequest.Create(pathPeticion);
            WReq.ContentType = "application/json; charset=UTF-8";
            if (Datos != null)
            {
            WReq.ContentLength = Datos.Length;
            WReq.GetRequestStream().Write(Datos, 0, Datos.Length);
            }
            WReq.Method = tipoPeticion;
            HttpWebResponse res = (HttpWebResponse)WReq.GetResponse();
            Encoding Codificacion = ASCIIEncoding.UTF8;
            StreamReader SReader = new StreamReader(res.GetResponseStream(), Codificacion);
            Resultado = SReader.ReadToEnd();

            return Resultado;
        }

        public  object format_json(string json)
        {
            dynamic parsedJson = JsonConvert.DeserializeObject(json);
            return parsedJson;
        }

        public void guardarBusquedasUsuarios(string ip, string navegador, string plataforma, string busqueda)
        {

            SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
             try
            {
                conexion.Open();
                SqlCommand com = conexion.CreateCommand();
                com.CommandType = System.Data.CommandType.StoredProcedure;
                com.CommandText = "dbo.GuardarBusquedas";
                com.Parameters.Add("@ip", SqlDbType.VarChar, 500).Value = ip;
                com.Parameters.Add("@navegador", SqlDbType.VarChar, 500).Value = navegador;
                com.Parameters.Add("@plataforma ", SqlDbType.VarChar, 500).Value = plataforma;
                com.Parameters.Add("@busqueda ", SqlDbType.VarChar, 500).Value = busqueda;
                com.ExecuteNonQuery();
                      }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());

            }
            finally
            {
                if (conexion != null && conexion.State == System.Data.ConnectionState.Open)
                    conexion.Close();

                conexion.Dispose();
            }

        }
    }

}


  • Clase Default.aspx.cs:
 using BuscadorWebPeliculas.Clases;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace BuscadorWebPeliculas
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Unnamed2_Click(object sender, ImageClickEventArgs e)
        {
            if (txtBuscador.Text != String.Empty)
            {
                tableRes.Controls.Clear();
                Util u = new Util();
                String resultado = String.Empty;

                String rutaPeticion = ConfigurationManager.AppSettings["search"].ToString();
                JsonSerializerSettings ConfigJson = new JsonSerializerSettings();
                ConfigJson.NullValueHandling = NullValueHandling.Ignore;
                rutaPeticion += "?api_key=" + ConfigurationManager.AppSettings["claveApi"].ToString() + "&language=es-ES";
                rutaPeticion += "&query=" + txtBuscador.Text;
                resultado = u.peticionAPI(rutaPeticion, "GET", null);
                RespuestaSearch rest = JsonConvert.DeserializeObject<RespuestaSearch>(resultado);

                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].release_date + " " + rest.results[i].title + "</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);

                }
                guardarDatosBusquedas();
            }
        }


        private void guardarDatosBusquedas()
        {
            try
            {
                string userip = Request.UserHostAddress;
                string navegador = Request.Browser.Browser;
                string plataforma = Request.Browser.Platform;

                //LLAMAR A BBDD
                Util u = new Util();
                u.guardarBusquedasUsuarios(userip, navegador, plataforma, txtBuscador.Text);
            }
            catch (Exception ex)
            {
                //DE MOMENTO LO DEJO VACIA TRATAR COMO SE QUIERA
            }
           
        }

    }
     

}



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

68. Nuestro propio buscador  de peliculas (6)

 -  En este capítulo del curso de programación en c# con visual studio 2017 ,  continuaremos con nuestro nuevo 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 entrada nos crearemos una tabla en nuestra base de datos  SQL SERVER  donde almacenaremos algunos datos relevantes de los usuarios que realicen las busquedas en nuestro navegador.En el video lo podemos ver con más detalle:


- La estructura de tabla que hemos utilizado en el video para preparar nuestro entorno de base de datos para almacenar las consultas es la que muestro en la imagen:



- Además hemo creado  un procedimiento almacenado que llamaremos desde el código de nuestra aplicación. Este procedimiento es que realmente ejuctarará la sentencia que introduzca los datos en nuestra tabla. Os dejo el código SQL del procedimiento:

ALTER PROCEDURE [dbo].[GuardarBusquedas]
    @ip varchar(500),
    @navegador varchar(500),
    @plataforma varchar(500),
    @busqueda varchar(500)

AS
BEGIN

    SET NOCOUNT ON;

    INSERT INTO dbo.BUSQUEDAS_HISTORICO
     (IP,Navegador,Plataforma,Busqueda,FechaBusqueda)
     VALUES
           (@ip,@navegador,@plataforma,@busqueda,GETDATE())

END


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...