Пример #1
0
        public void ProcesarDropCarta(PictureBox picture)
        {
            Carta card = picture.Tag as Carta;

            double cardCenter   = 0;
            double pilaCentro   = 0;
            Carta  tempCard     = null;
            Stack  pilaAnterior = null;
            short  cardIndex    = 0;

            Carta[] cardsToMove = new Carta[15];
            short   moved       = 0;

            //pilaAnterior = card.Stack;


            //if (OrigenValido(card))
            //{
            //Console.WriteLine("Origen Valido");
            pilaAnterior = card.Stack;
            // Calcular el centro de la tarjeta en la posición actual
            cardCenter = picture.Left + picture.Width / 2.0;
            // El destino es la parte de arriba
            if ((picture.Top + picture.Height) < _Pilas[1].Top && card.StackPosicion == pilaAnterior.Cartas.Count)     //Stacks de arriba
            {
                Console.WriteLine("Estoy arriba");
                foreach (Stack pila in _PilasArriba)
                {
                    Stack stack = pila;
                    Console.WriteLine(pila.Left.ToString());
                    pilaCentro = pila.Left + picture.Width / 2.0;
                    short stackpos = Convert.ToInt16(pila.Cartas.Count() + 1);     //posicion de carta

                    // Dentro de la mitad del ancho de la tarjeta
                    if (System.Math.Abs(cardCenter - pilaCentro) < picture.Width / 2.0)
                    {
                        // Movimiento valido?
                        if (ObjetivoValido(pila, card, true))
                        {
                            card.Left = pila.Left;
                            card.Top  = pila.Top;

                            picture.Left = card.Left;
                            picture.Top  = card.Top;
                            picture.BringToFront();
                            card.Stack = pila;

                            card.StackPosicion = Convert.ToInt16(pila.Cartas.Count() + 1);;
                            pilaAnterior.RemovedCard();    //Borrar la carta de la pila anterior
                            pila.AddCartas(card);

                            ActualizarCarta(card);
                            if (pilaAnterior.TopCard != null)
                            {
                                if (pilaAnterior.TopCard.FaceUp == false)
                                {
                                    pilaAnterior.TurnUpTopCard();
                                }
                            }
                            if (!picture.Contains(picture))
                            {
                                pictures.Add(picture);    //Agreagmos el picture box a la lista si este viene de la posicion mano
                            }
                            picturesMano.Remove(picture); //Para q no se elimine al momento de poner PedirMano
                            eliminarDeToda(card);         //Elimino de la lista de arriba
                            MostrarImagenes();
                            return;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
            //El destino es la parte de arriba
            if ((picture.Top + picture.Height) > _Pilas[1].Top)     //Stacks de abajo
            {
                Console.WriteLine("estoy arriba");
                // Encontrar la pila mas cercana de abajo
                foreach (Stack pila in _Pilas)
                {
                    Stack stack = pila;
                    Console.WriteLine(pila.Left.ToString());
                    pilaCentro = pila.Left + picture.Width / 2.0;
                    int   gap2     = 0;                                        //Sirve para separar cartas cuando se llevan varias
                    short stackpos = Convert.ToInt16(pila.Cartas.Count() + 1); //poscicion de carta
                                                                               //
                                                                               // Dentro de la mitad del ancho de la tarjeta
                    if (System.Math.Abs(cardCenter - pilaCentro) < picture.Width / 2.0)
                    {
                        //
                        // Movimiento valido?
                        if (ObjetivoValido(pila, card, false))    //Se envia falso para comprobar los stacks de abajo
                        {
                            card.Left = pila.Left;
                            if (pila.Cartas.Count != 0)    //en caso de que no exista elementos en la lista
                            {
                                card.Top = pila.Cartas.Last().Top + 20;
                            }
                            else
                            {
                                card.Top = pila.Top;
                            }
                            picture.Left = card.Left;
                            picture.Top  = card.Top;
                            picture.BringToFront();
                            moved = 0;

                            for (cardIndex = Convert.ToInt16(pilaAnterior.Cartas.Count); cardIndex >= card.StackPosicion; cardIndex--)
                            {
                                moved = Convert.ToInt16(moved + 1);
                                cardsToMove[moved] = pilaAnterior.RemovedCard();
                                Console.WriteLine(cardsToMove[moved].Rango + cardsToMove[moved].Palo + "Top=" + cardsToMove[moved].Top + "Left=" + cardsToMove[moved].Left);
                            }

                            for (cardIndex = moved; cardIndex >= 1; cardIndex--)
                            {
                                cardsToMove[cardIndex].Left          = card.Left;
                                cardsToMove[cardIndex].Top           = card.Top + gap2;
                                cardsToMove[cardIndex].Stack         = pila;
                                cardsToMove[cardIndex].StackPosicion = stackpos;
                                gap2 += 20;
                                pila.AddCartas(cardsToMove[cardIndex]);
                                stackpos += 1;
                                ActualizarCarta(cardsToMove[cardIndex]);
                            }

                            if (pilaAnterior.TopCard != null)
                            {
                                if (pilaAnterior.TopCard.FaceUp == false)
                                {
                                    pilaAnterior.TurnUpTopCard();
                                }
                            }
                            pictures.Add(picture);        //Agreagmos al stack de abajo

                            picturesMano.Remove(picture); //Para q no se elimine al momento de poner PedirMano
                            eliminarDeToda(card);         //Elimino de la lista de arriba
                            MostrarImagenes();

                            return;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }

            //}
            //

            // Movimiento Ilegal. Regresar la carta(s)
            for (cardIndex = card.StackPosicion; cardIndex <= pilaAnterior.Cartas.Count; cardIndex++)
            {
                tempCard = pilaAnterior.Cartas[cardIndex - 1];
                ActualizarCarta(tempCard);
            }
        }