public static bool PinsAreValidOnScale(ref List <Card> myCards) { Card.MySuits mySuits = myCards.FirstOrDefault(c => !c.CanBeJolly).Suit; Debug.Log("" + mySuits); int numOfPin = myCards.Count(c => c.Value == Card.MyValues.due); if (numOfPin < 2) { Debug.Log("ho meno di 2 pinelle"); return(true); } else { Debug.Log("ho più di 2 pinelle"); if (!myCards.Exists(c => c.Value == Card.MyValues.due && c.Suit == mySuits)) { Debug.Log(" non ho nessuna pinella con il seme della scala "); return(false); } else { Debug.Log(" ho una pinella con il seme della scala "); Card pin = myCards.FirstOrDefault(c => c.Value == Card.MyValues.due && c.Suit == mySuits); if ((myCards.Exists(c => c.Value == Card.MyValues.A) && myCards.Exists(c => c.Value == Card.MyValues.tre)) || (myCards.Exists(c => c.Value == Card.MyValues.A) && myCards.Exists(c => c.Value == Card.MyValues.quattro)) || (myCards.Exists(c => c.Value == Card.MyValues.tre) || myCards.Exists(c => c.Value == Card.MyValues.quattro))) { Debug.Log(" se ho un 3, o un 4, o un asso con un 3 o un 4 "); pin.CurrentValue = 2; pin.CanBeJolly = false; pin.CanBePin = false; return(true); } else { Debug.Log(" non ho ne un 3, ne un 4, ne un asso con un 3 o un 4"); return(false); } } } }
public static bool IsCanasta(ref List <Card> card) { bool check = false; //check sui giolly e pinelle int numberOfJolly = card.Count(c => (c.CanBeJolly) && (!c.CanBePin)); Debug.Log("numero di jolly : " + numberOfJolly); if (numberOfJolly > 1) //se ho + di 1 Jolly NON va bene { Debug.Log("numero di jolly maggiore di 1"); return(false); } int numberOfPin = card.Count(c => c.CanBePin); Debug.Log("numero di pinelle : " + numberOfPin); if (numberOfPin > 2) //se ho + di 2 pinelle NON va bene { Debug.Log("numero di pinelle maggiore di 2"); return(false); } if (numberOfJolly > 1 && numberOfPin > 1) //se ho + di 1 jolly e 1 pinella { Debug.Log("più di un jolly e più di una pinella"); return(false); } //check sui tris if (card.Select(c => c.Value).Distinct().Count() == 1) //tris pulito senza jolly { Debug.Log("tris pulito"); return(true); } int myValues = card.FirstOrDefault(c => !c.CanBeJolly).CurrentValue; //tris con jolly Debug.Log(" il valore che ho trovato è : " + myValues); if (card.All(c => c.PossibleValues.Contains(myValues))) //coi possible values { if (card.Where(c => c.CanBeJolly).Count() < 2) { Debug.Log("tris con jolly"); return(true); } else { return(false); } } //check sulla scala Card.MySuits mySuits = card.FirstOrDefault(c => !c.CanBeJolly).Suit; //if (card.Where(c => c.Suit == mySuits).Count() == card.Count - 1) //{ //}; if ((card.All(c => (c.Suit == mySuits) || c.CanBeJolly))) //controllo che siano tutte dello stesso seme (a meno che non sia un jolly) { Debug.Log("sono tutte dello stesso seme (a meno che non ci sia un jolly)"); //controllo che siano elementi distini (visto che voglio fare una scala if (card.Distinct(new CardEqualityComparer()).Count() != card.Count()) { Debug.Log("entro nel ramo in cui gli elementi NON sono distinti"); return(false); } //IEnumerable<Card> query = card.OrderByDescending(c => c, new Specialcomparer()); //metto a posto in caso di pinella dello stesso seme if (card.Exists(c => c.CanBePin)) { Debug.Log("sono entrato nel metodo in cui controllo la pinella"); if (!PinsAreValidOnScale(ref card)) { Debug.Log("se il metodo che controlla le pins ritorna falso esco con il return false"); return(false); } } //if (card.Where(c => c.CanBePin).Count() > 1) return false; //metto a posto l'asso if (card.Exists(c => c.Value == Card.MyValues.A)) { Debug.Log("sono entrato nel metodo in cui controllo l'asso"); CheckAcePosition(ref card); } List <Card> temp = card.OrderByDescending(c => c.CurrentValue).ToList(); card = temp; bool jollyAlreadyUsed = false; // check su quando uso il jolly (se c'è) bool jollyFounded = false; // controllo se c'è un jolly for (int index = 0; index < card.Count() - 1; index++) // dati 'n' elementi devo fare 'n-1' controlli { Debug.Log("entro nel ciclo for in cui controllo le cards"); jollyFounded = (card[index].CanBeJolly); Debug.Log(" sono su un jolly? : " + jollyFounded); if (jollyFounded) { Debug.Log("ho trovato un jolly/pinella, eseguo il continue per skippare un index"); continue; } // se ho più di una pinella allora una delle 2 deve avere la stessa suite delle altre carte if (card[index].CurrentValue - card[index + 1].CurrentValue == 1) { Debug.Log("la differenza tra " + card[index].name + " e " + card[index + 1].name + " è : " + card[index].CurrentValue + " - " + card[index + 1].CurrentValue + " = " + (card[index].CurrentValue - card[index + 1].CurrentValue)); check = true; continue; } else if (card[index].CurrentValue - card[index + 1].CurrentValue == 2 && !jollyAlreadyUsed) { Debug.Log(" sono entrato nel ramo in cui uso il jolly "); card.First(c => c.CanBeJolly).CurrentValue = card[index].CurrentValue - 1; jollyAlreadyUsed = true; check = true; continue; } else { Debug.Log("la differenza tra il valore corrente e il prossimo è maggiore di 1 oppure ho già usato il jolly"); Debug.Log("valore corrente = " + card[index].CurrentValue + " valore prossimo = " + card[index + 1].CurrentValue); return(false); } } } return(check); }
internal bool IsAddable(Card card) { print(" °°°° entro nel metodo che controlla se una carta è aggiungibile °°°°"); if (cards.Exists(c => c.CanBeJolly) && card.CanBeJolly) //check sul numero di pinelle { print(" nella canasta ho già un jolly "); return(false); } if (card.CanBeJolly && !cards.Exists(c => c.CanBeJolly)) { print(" nella canasta non ho un jolly e io sto attaccando un jolly"); cards.Add(card); List <Card> temp = cards.OrderByDescending(c => c.CurrentValue).ToList(); return(true); } if ((card.CurrentValue != TrisValue) && (TrisValue != -1)) //check sul tris { print(" il valore della carta " + card.CurrentValue); print(" è diverso da quello del tris :" + TrisValue); return(false); } Card.MySuits suit = cards.FirstOrDefault(c => !c.CanBeJolly).Suit; //check seme della scala if ((card.Suit != suit) && !card.CanBePin && TrisValue == -1) { print(" il seme della carta è : " + card.Suit); print(" è diverso da quello della scala che è : " + suit); return(false); } if (card.Value == Card.MyValues.A && cards.Exists(c => c.Value == Card.MyValues.A) && TrisValue == -1) { print(" sto tentando di aggiungere un Asso in una scala che ha già un asso"); return(false); } if (cards.Exists(c => c.CurrentValue == card.CurrentValue && c.CanBeJolly)) { print(" sto mettendo la carta dove c'era"); if (cards.Find(c => c.CanBeJolly).Value == Card.MyValues.jolly) { print(" il jolly "); cards.Find(c => c.CanBeJolly).CurrentValue = 16; cards.Add(card); List <Card> temp = cards.OrderByDescending(c => c.CurrentValue).ToList(); cards = temp; } else if (cards.Find(c => c.CanBeJolly).Value == Card.MyValues.due) { print(" la pinella "); cards.Find(c => c.CanBeJolly).CurrentValue = 15; cards.Add(card); List <Card> temp = cards.OrderByDescending(c => c.CurrentValue).ToList(); cards = temp; } return(true); } if (cards.Exists(c => c.CurrentValue == card.CurrentValue && !c.CanBeJolly)) { print(" sto cercando di mettere una carta già presente"); return(false); } if (cards.Exists(c => c.CurrentValue == (card.CurrentValue + 1))) { print("sto inserendo un elemento minore"); int rightIndex = cards.FindIndex(c => c.CurrentValue == card.CurrentValue + 1); //in teoria in fondo alla lista print(" all' indice " + (int)(rightIndex + 1)); cards.Insert(rightIndex + 1, card); return(true); } else if (cards.Exists(c => c.CurrentValue == (card.CurrentValue - 1))) { print(" sto inserendo un elemento maggiore"); //int rightIndex = cards.FindIndex(c => c.CurrentValue == card.CurrentValue + 1); //probabilmente sarà 0 o 1 //print(" all' indice " + rightIndex); //cards.Insert(rightIndex, card); cards.Insert(0, card); return(true); } else if (cards.Exists(c => c.CurrentValue == (card.CurrentValue + 2)) && cards.Exists(c => c.CanBeJolly)) { Card jolly = cards.Find(c => c.CanBeJolly); jolly.CurrentValue = card.CurrentValue + 1; cards.Remove(jolly); cards.Insert(cards.Count - 1, jolly); //metto in ultima posizione il jolly cards.Insert(cards.Count - 1, card); //metto in ultima posizione la mia carta return(true); } else if (cards.Exists(c => c.CurrentValue == (card.CurrentValue - 2)) && cards.Exists(c => c.CanBeJolly)) { Card jolly = cards.Find(c => c.CanBeJolly); jolly.CurrentValue = card.CurrentValue - 1; cards.Remove(jolly); cards.Insert(0, jolly); //metto in prima posizione il jolly cards.Insert(0, card); //metto in prima posizione la mia carta return(true); } else { print(" se sono arrivato qui ho dimenticato qualcosa"); return(false); } }