/// <summary> /// Calculates required piece count to finish for selected cue as twins. /// </summary> /// <param name="cue"></param> /// <returns></returns> private byte RequiredPieceCountTwin(OkeyCue cue) { byte minPieceRequired = RegularCuePiecesCount; byte twinsCount = 0; for (int i = 0; i < cue.Pieces.Count; i++) { for (int j = i + 1; j < cue.Pieces.Count; j++) { if (!cue.Pieces[i].IsOkey && !cue.Pieces[j].IsOkey && cue.Pieces[i].PieceColor == cue.Pieces[j].PieceColor && cue.Pieces[i].PieceValue == cue.Pieces[j].PieceValue) { twinsCount++; } } } // if cue has okey, use it if (cue.HasOkey) { twinsCount += cue.OkeyCount; } return(Convert.ToByte(minPieceRequired - Convert.ToByte(twinsCount * 2))); }
/// <summary> /// Calculates required piece count to finish for selected cue. /// </summary> /// <param name="cue"></param> /// <returns></returns> private byte RequiredPieceCount(OkeyCue cue) { byte minPieceRequired = RegularCuePiecesCount; // check for twins byte requiredPieceCount = RequiredPieceCountTwin(cue); if (requiredPieceCount < minPieceRequired) { minPieceRequired = requiredPieceCount; } // check for same color series List <OkeyPiece> notInPerPieces = new List <OkeyPiece>(); // store pieces that not suitable for series List <SeriesPiece> colorSeries = new List <SeriesPiece>(); // all available color series in cue List <ValuesSeries> valueSeries = new List <ValuesSeries>(); // all available value series in cue requiredPieceCount = RequiredPieceCountColorSeries(cue, colorSeries, notInPerPieces); requiredPieceCount -= SameValueSeriesPiecesCount(valueSeries, notInPerPieces); if (cue.HasOkey) { requiredPieceCount--; } if (requiredPieceCount < minPieceRequired) { minPieceRequired = requiredPieceCount; } return(minPieceRequired); }
/// <summary> /// Calculates required piece count to finish for selected cue as series. /// </summary> /// <param name="cue"></param> /// <returns></returns> private byte RequiredPieceCountColorSeries(OkeyCue cue, List <SeriesPiece> series, List <OkeyPiece> notInPerPieces) { // create series list for each color ColorSeries colorSeries = new ColorSeries(); // select and fill pieces into series foreach (OkeyPiece piece in cue.Pieces) { foreach (SeriesPiece s in colorSeries.Series) { if (piece.PieceColor == s.Color) { s.Pieces.Add(piece); } } } int perCountInSeries = CalculatePerCountInSeries(colorSeries, series, notInPerPieces); return(Convert.ToByte(cue.Pieces.Count - (perCountInSeries * 3))); }