public Card(Card C) { _numberOfCard = C._numberOfCard; open = C.open; X = C.X; Y = C.Y; }
public Player(Player player) { number = player.number; //head = player.head; cards = new List<Card>() ; OpenDeckC = new Card(player.OpenDeckC); TwoWalk = player.TwoWalk; SuidOfJeck = player.SuidOfJeck; for (int i = 0; i < player.cards.Count; i++) { cards.Add(new Card(player.cards[i])); } walks = new List<int>(); for (int i = 0; i < player.walks.Count; i++) { //walks[i] = player.walks[i]; walks.Add(player.walks[i]); } //headWalk = player.headWalk; }
/// <summary> /// Додавання заданої карти в руки гравця /// </summary> /// <param name="card">Карта яку потрібно додати в руки гравця</param> public void PushCard(Card card) { cards.Add(card); SortCards(); }
/// <summary> /// Перевіряє чи можливий хід після чого робить його відповідною картою відповідного гравця /// </summary> /// <param name="cards"> Карта якою ходить гравець</param> /// <param name="player"> Гравець який ходить</param> /// <returns>Повертає true в разі успішності ходу інакше false</returns> private bool Move(Card cards, Player player) { if (!_isSecondMove && //Якщо це перша карта за хід (((cards.Suid() == _openDeck[CountCardsInOpenDeck - 1].Suid() || //Якщо це така ж карта по масті cards.Priority() == _openDeck[CountCardsInOpenDeck - 1].Priority() || //Або це така ж карту за пріорітетом cards.Priority() == 11) && //Або ж ця карта валет _openDeck[CountCardsInOpenDeck - 1].Priority() != 11) || //И якщо остання карта в колоді не валет // Якщо ж валет то перевірити чи відповідає загадіній раніше карті іншим гравцем ((cards.Priority() == 11 || cards.Suid() == _suitOfJeck) && _openDeck[CountCardsInOpenDeck - 1].Priority() == 11)) ) { if (cards.Priority() != 6) _isSecondMove = true; //if (cards.Priority() == 11) // numbJacks++; if (cards.Priority() == 11 && _selectPlayer.Number == 1) _activeChoice = true; _openDeck.Add(cards); //openDeck[HeadOpDeck] = cards; //headOpDeck++; for (int i = 0; i < player.Cards.Count; i++) { if (player[i] == cards) { player.PopCard(i); break; } } ReactionOnCards(cards); _isToCard = true; return true; } return false; }
/// <summary> /// Перевіряє чи знаходиться хоч якась частина card1 над card2 /// </summary> /// <param name="card1">Перша карта</param> /// <param name="card2">Друга карта над якою повинна бити перша</param> /// <returns>Повертає true якщо перша карта перетинає другу</returns> private bool IsCrossedCards(Card card1, Card card2) { int X1 = (int)card1.X; int Y1 = (int)card1.Y; //Координати всіх кутків карти починаючи з верхнього лівого і рухаючись за годинниковою стрілкою int[] x = new int[4] { X1, X1 + _cardWidth, X1 + _cardWidth, X1 }; int[] y = new int[4] { Y1, Y1, Y1 + CardHeight, Y1 + CardHeight }; for (int w = 0; w < 4; w++) if (card2.X < x[w] && x[w] < card2.X + _cardWidth && card2.Y < y[w] && y[w] < card2.Y + CardHeight) return true; return false; }
/// <summary> /// Робить анімований рух карти в задану точку /// </summary> /// <param name="card">Карта яка повинна рухатися</param> /// <param name="Tx">X координата в яку повинна рухатись карта</param> /// <param name="Ty">Y координата в яку повинна рухатися карта</param> /// <param name="speed">Швидкість з якою карта повинна рухатися</param> /// <param name="open">Ознака відкритості карти яка буде рухатися</param> private void Animation(Card card, double Tx, double Ty, bool open) { _movingCard = card; _movingCard.open = open; double Mx = Tx - card.X; double My = Ty - card.Y; Mx /= 50; My /= 50; int speed2 = 100 - _speedAnimation; for (int i = 0; i < 50; i++) { card.X += Mx; card.Y += My; System.Threading.Thread.Sleep(speed2); } _movingCard = null; }
/// <summary> /// Натиснення на стіл в заданих координатах /// </summary> /// <param name="x">Координата ширини</param> /// <param name="y">Координата висоти рухаючись зверху вниз</param> public void MousDown(double x, double y) { if (x > 0 && y > 0 && !_gameOver && _selectPlayer.Number == 1 && !IsDistributionOver) { // Перша карта починається з координат place гравця 0, відстань між картами 1/4 ширини карти, int xRight = (int)(_players[0].Place.X + ( (0.25 * _cardWidth) * _players[0].Cards.Count) ); if (_players[0].Place.X <= x && x < xRight + (_cardWidth * 0.75) && _players[0].Place.Y <= y && y < _players[0].Place.Y + CardHeight) { //якщо вибрано карту в межах 1/4 то вибрати її if (x < xRight) { _indexSelectedCard = (int)((x - _players[0].Place.X) / (_cardWidth * 0.25)); _zx = (x - _players[0].Place.X) % (_cardWidth * 0.25); } // якщо натиснуто останню карту за межею 25 точок але в її межах то вибарти її else { _indexSelectedCard = _players[0].Cards.Count - 1; _zx = x - (_players[0].Place.X + (0.25 * _cardWidth * (_players[0].Cards.Count - 1)) ); } _zy = y - _players[0].Place.Y; _selectedCard = _players[0][_indexSelectedCard]; _isTakenCard = true; } } }
/// <summary> /// Перевіряє чи можливо докласти ще одну карту після того як була покладена карта за заданий хід /// </summary> /// <param name="cards">Карта яку хоче покласти гравець</param> /// <param name="player">Гравець який хоче покласти карту</param> /// <returns>Повертає true в разі успішності ходу інакше false</returns> private bool SecondMove(Card cards, Player player) { if (_isSecondMove && cards.Priority() == _openDeck[CountCardsInOpenDeck - 1].Priority()) { //if (cards.Priority() == 11) // numbJacks++; _openDeck.Add(cards); //openDeck[HeadOpDeck] = cards; //headOpDeck++; for (int i = 0; i < player.Cards.Count; i++) { if (player[i] == cards) { player.PopCard(i); } } ReactionOnCards(cards); return true; } return false; }
/// <summary> /// Робить відповідну реакцію на покладену карту /// </summary> /// <param name="card">Карта на яку потрібно зробити реакцію</param> private void ReactionOnCards(Card card) { //Якщо 7 то наступний гравець бере одну карту if (card.Priority() == 7) { PutCardToPlayer(PopNextPlayer(1)); } //Якщо 8 то наступний гравець бере 2 карти та пропускає хід після чого наступним стає гравець що йде після нього if (card.Priority() == 8) { PutCardToPlayer(_takengTwoCards); PutCardToPlayer(_takengTwoCards); NextTakengTwoCard(); } //Якщо туз то наступним активним гравцем той що йде після теперішнього if (card.Priority() == 1) { NextSelectdPlayer(); } //Якщо дама пікова додати 5 карт if (card.NumberOfCard == 17) { for (int i = 0; i < 5; i++) { PutCardToPlayer(_nextSelectPlayer); } } }