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); } }