private void UpdatePlayerScoresArray()
    {
        Array.Sort(playerScores); // Even though the aray *should* be sorted, we sort here incase it was initialized out-of-order via the property inspector

        ScoreElement newScore     = new ScoreElement(PlayerPrefs.GetString("PlayerName", GameManager.Instance.defaultPlayerName), Time.timeSinceLevelLoad - startTimeOffset, currentLevelScore);
        float        newScoreRank = newScore.CalculateScoreRank();

        for (int i = 0; i < playerScores.Length; i++)
        {
            bool  hasInserted      = false;
            float currentScoreRank = playerScores[i].CalculateScoreRank();

            if (newScoreRank > currentScoreRank)
            {
                hasInserted = true;
                currentPlayerScoresEntryIndex = i;

                for (int j = i; j < playerScores.Length; j++)
                {
                    ScoreElement temp = playerScores[j];
                    playerScores[j] = newScore;
                    newScore        = temp;
                }
            }

            if (hasInserted) // If we've inserted the new element, we're done
            {
                break;
            }
        } // End score insertion loop

        SaveScores();
    }
        public ScoreElement GenerateScoreElement(string obtainedText, string searchedText)
        {
            if (string.IsNullOrWhiteSpace(obtainedText))
            {
                throw new System.ArgumentException("message", nameof(obtainedText));
            }

            if (string.IsNullOrWhiteSpace(searchedText))
            {
                throw new System.ArgumentException("message", nameof(searchedText));
            }

            obtainedText = obtainedText.ToLower();
            searchedText = searchedText.ToLower();

            var strLen   = obtainedText.Length;
            var distance = StringHelper.LevenshteinDistance(obtainedText, searchedText);

            var element = new ScoreElement
            {
                Ingresado           = searchedText,
                Obtenido            = obtainedText,
                PesoValor           = this.MatchValue,
                PesoValorUI         = this.MatchValue.ToString("P2"),
                ObtenidoLen         = strLen.ToString(),
                LevenshteinDistante = distance
            };

            //Si la distancia es igual al Len del string obtenido es porque no coincide absolutamente nada.
            //En este caso retorna 0. No ha coincidencia alguna.
            if (distance >= strLen)
            {
                element.CoeficienteParcialUI = (0M).ToString("#0.00");
                element.CoeficienteFinal     = 0;
                element.CoeficienteFinalUI   = (0M).ToString("P2");
                return(element);
            }

            //Si los textos son iguales, retonra el valor del Coeficiente completo.
            if (distance == 0)
            {
                element.CoeficienteParcialUI = (1M).ToString("#0.00");
                element.CoeficienteFinal     = this.MatchValue;
                element.CoeficienteFinalUI   = this.MatchValue.ToString("P2");
                return(element);
            }

            //Si la distancia es menor entonces es necesario el calculo porcentual del coeficiente.
            if (distance < strLen)
            {
                var matchCoef = ((decimal)(strLen - distance) / (decimal)strLen);
                var finalCoef = (matchCoef * this.MatchValue);

                element.CoeficienteParcialUI = matchCoef.ToString("#0.00");
                element.CoeficienteFinal     = finalCoef;
                element.CoeficienteFinalUI   = finalCoef.ToString("P2");
            }

            return(element);
        }
Exemple #3
0
    void FillScores()
    {
        m_scores.Sort(delegate(SaveManager.Score x, SaveManager.Score y) {
            if (x.value < y.value)
            {
                return(1);
            }
            else if (x.value > y.value)
            {
                return(-1);
            }
            else
            {
                return(0);
            }
        });

        for (int i = 0; i < m_scores.Count; ++i)
        {
            ScoreElement se = Instantiate(ScoreUIElement);
            se.transform.SetParent(ScoreLayout.transform);

            if (i < MaxScoreCount)
            {
                se.Init(i + 1, m_scores[i].name, m_scores[i].value);
            }
            else
            {
                se.Init("...");
                break;
            }
        }
    }
Exemple #4
0
    public void CreateScoreElement(string name, int amount, int finalScoreValue, string description)
    {
        GameObject   newElement   = Instantiate(scoreElementPrefab, scoreScreenContentParent.transform);
        ScoreElement scoreElement = newElement.GetComponent <ScoreElement>();

        scoreElements.Add(scoreElement);
        scoreElement.InitializeSetup(name, amount, finalScoreValue, description);
    }
    // Compares this object with the received object:
    //      If this.score > otherScore, return 1
    //      If this.score == otherScore, return 0
    //      If this.score < otherScore, return -1
    public int CompareTo(object obj)
    {
        if (obj == null)
        {
            return(1);
        }

        ScoreElement otherScore = (ScoreElement)obj;

        return((int)Mathf.Sign(otherScore.CalculateScoreRank() - this.CalculateScoreRank())); // Rank is calculated as: points - (time in seconds)
    }
 public void ToggleToolTip(ScoreElement element)
 {
     if (!toggle)
     {
         toggle  = true;
         DataSet = MasterManager.mm.playerData[getElement(MasterManager.mm.playerData, element.id)];
     }
     else
     {
         toggle = false;
     }
     toolTip.SetActive(toggle);
 }
    // Use this for initialization
    void Start()
    {
        List <int> highscores = gameStats.GetHighscores();
        int        count      = 0;

        foreach (int highscore in highscores)
        {
            GameObject   newScoreElement = Instantiate(scoreElementObject, transform);
            ScoreElement scoreElement    = newScoreElement.GetComponent <ScoreElement>();

            scoreElement.setScore(highscore);

            scoreElement.transform.parent        = transform;
            scoreElement.transform.localPosition = new Vector3(0, -count * spacing, 0);


            count++;
        }
    }
    public void scoreboardzeichnen()
    {
        if (obj.Count > 0)
        {
            for (int i = 0; i < obj.Count; i++)
            {
                Destroy(obj[i]);
            }
            obj.Clear();
        }


        foreach (PlayerData data in MasterManager.mm.playerData)
        {
            GameObject   objectS = Instantiate(scoreElement, transform);
            ScoreElement se      = objectS.GetComponent <ScoreElement>();
            se.nameElement.text  = data.name;
            se.scoreElement.text = data.score;
            se.id = data.id;

            obj.Add(objectS);
        }
    }
Exemple #9
0
    // When a score is added, ensure the necessary information is added to the text of `ScoreDetails'
    public void AddElement(string element, int inScoreConst)
    {
        scoreDetails.text = "";

        // If trick already added, increment its count - otherwise add new trick
        if (scoreElements.Exists(e => e.GetElement() == element))
        {
            (scoreElements.Find(x => x.GetElement() == element)).Increment();
        }
        else
        {
            ScoreElement newElement = new ScoreElement(element, inScoreConst);
            scoreElements.Add(newElement);
        }

        // Add information regarding each trick to text
        for (int i = 0; i < scoreElements.Count; i++)
        {
            if (i == 0)
            {
                scoreDetails.text = scoreDetails.text + " (" + scoreElements[i].GetElement() + "*" + scoreElements[i].GetCount() + " (" + scoreElements[i].GetScore() + ")";
            }
            else
            {
                scoreDetails.text = scoreDetails.text + " + " + scoreElements[i].GetElement() + "*" + scoreElements[i].GetCount() + " (" + scoreElements[i].GetScore() + ")";
            }

            if (i == scoreElements.Count - 1)
            {
                scoreDetails.text += ") * " + multiplier;
            }
        }
        // Increase multiplier - ensures trick combos rewarded
        multiplier += .02f;
        // This rounding needs to occur as error can occur with float addition
        multiplier = (float)Math.Round(multiplier, 2);
    }
 private void SwapArrays(ref ScoreElement[] previousRow, ref ScoreElement[] currentRow) {
     var tmp = previousRow;
     previousRow = currentRow;
     currentRow = tmp;
 }
        /// <summary>
        /// This is step (2) in the dynamic programming model - to fill in the scoring matrix
        /// and calculate the traceback entries.  This version is used when the open/extension
        /// gap costs are different (affine gap model).
        /// </summary>
        private IEnumerable<OptScoreMatrixCell> CreateAffineTracebackTable()
        {
            /* We will need a low constant number that is not Int32.MinValue 
             * for the boundaries of the matrix (if we used Int32.MinValue it would 
             * over flow when added to the move score to a very high value and become the max
             * rather than the min).
             */
            int EDGE_MIN_VALUE = Int32.MinValue + Math.Max(Rows, Cols) * Math.Abs (GapOpenCost);


            // Horizontal and vertical gap counts.
            int gapStride = Cols + 1;

            /* These are equivalent to traceback matrices for the 
             * horizontal and vertical "gap" matrices.  However, rather than store
             * an arrow that points in a direction, we store the size of moves,
             * which allows us to transition into and out of the gap matrices in one
             * step, rather than following paths through them.
             */
            var matrixSize = checked((Rows + 1) * gapStride);
            try {
                h_Gap_Length = new int[matrixSize];
                v_Gap_Length = new int[matrixSize];
            }
            catch(OutOfMemoryException oom) {
                throw new OutOfMemoryException (GenerateOOMErrorMessageWhenAllocatingGapTracebacks (), oom);
            }

            /* As we progress through, we only need to know about 
             * the current row and the previous row for the recursions,
             * so we only use these two, rather than a full matrix.
             */
            ScoreElement[] previousScoreRow = new ScoreElement[Cols];
            ScoreElement[] currentScoreRow = new ScoreElement[Cols];
            int[][] matrix = SimilarityMatrix.Matrix;

            // Upper left element is initalized to 0
            currentScoreRow [0] = new ScoreElement () {
                HorizontalGapScore = EDGE_MIN_VALUE,
                VerticalGapScore = EDGE_MIN_VALUE,
                MatchScore = 0
            };
            if (IncludeScoreTable) {
                ScoreTable[0] = 0;

            }
            // Initialize first row
            sbyte[] traceback = Traceback [0];
            for (int j = 1; j < traceback.Length; j++)
            {
                // always have to go left from top
                traceback[j] = SourceDirection.Left;
                h_Gap_Length[j] = j;
                var initialScore = (j - 1) * GapExtensionCost + GapOpenCost;
                currentScoreRow [j] = new ScoreElement () {
                    HorizontalGapScore = initialScore,
                    VerticalGapScore = EDGE_MIN_VALUE,
                    MatchScore = EDGE_MIN_VALUE
                };
                if (IncludeScoreTable)
                   ScoreTable[j] = initialScore;
            }

            for (int i = 1; i < Rows; i++)
            {
                // Create the next TB row
                traceback = new sbyte[Cols];
                Traceback [i] = traceback;
                // Make the current row the last row,
                // reuse the current rows memory for the new row
                SwapArrays(ref currentScoreRow, ref previousScoreRow);
              
                /* Initialize first column
                 * We can't move further back horizontally here (we are at 
                 * the edge), so we set the score to something so low we will
                 * never go this direction on the highest scoring path, and so 
                 * can avoid explicitly checking for an edge
                 */
                currentScoreRow[0] = new ScoreElement() {
                    MatchScore = EDGE_MIN_VALUE, 
                    HorizontalGapScore = EDGE_MIN_VALUE, 
                    VerticalGapScore = (i - 1) * GapExtensionCost + GapOpenCost};
                traceback[0] = SourceDirection.Up;
                v_Gap_Length[i * gapStride] = i;

                for (int j = 1; j < Cols; j++)
                {
                    // Get the three important values
                    var cellAbove = previousScoreRow[j];
                    var cellDiagAbove = previousScoreRow [j - 1];
                    var cellLeft = currentScoreRow [j - 1];

                    // Gap in reference sequence
                    int scoreAbove;
                    int scoreAboveOpen = Math.Max(cellAbove.HorizontalGapScore, cellAbove.MatchScore) + GapOpenCost;
                    int scoreAboveExtend = cellAbove.VerticalGapScore + GapExtensionCost;
                    if (scoreAboveOpen > scoreAboveExtend)
                    {
                        scoreAbove = scoreAboveOpen;
                        v_Gap_Length[i * gapStride + j] = 1;
                    }
                    else
                    {
                        scoreAbove = scoreAboveExtend;
                        v_Gap_Length[i * gapStride + j] = v_Gap_Length[(i - 1) * gapStride + j] + 1;
                    }

                    // Gap in query sequence
                    int scoreLeft;
                    int scoreLeftOpen = Math.Max(cellLeft.MatchScore, cellLeft.VerticalGapScore) + GapOpenCost;
                    int scoreLeftExtend = cellLeft.HorizontalGapScore + GapExtensionCost;
                    if (scoreLeftOpen > scoreLeftExtend)
                    {
                        scoreLeft = scoreLeftOpen;
                        h_Gap_Length[i * gapStride + j] = 1;
                    }
                    else
                    {
                        scoreLeft = scoreLeftExtend;
                        h_Gap_Length[i * gapStride + j] = h_Gap_Length[i * gapStride + (j - 1)] + 1;
                    }

                    // Get the exact match/mismatch score
                    int mScore = (matrix != null) ? matrix[QuerySequence[i - 1]][ReferenceSequence[j - 1]] : SimilarityMatrix[QuerySequence[i - 1], ReferenceSequence[j - 1]];
                    /* Since all possible previous states have the same match score applied, 
                     * we can just add to the previous max */
                    int scoreDiag = cellDiagAbove.BestScore + mScore;

                    // Store the scores for this cell
                    currentScoreRow[j] = new ScoreElement() { HorizontalGapScore = scoreLeft,
                                                              VerticalGapScore = scoreAbove,
                                                              MatchScore = scoreDiag };
                                                              

                    // Get the max S = MAX(diag,above,left) and assign the traceback
                    if ((scoreDiag > scoreAbove) && (scoreDiag > scoreLeft))
                    {
                        traceback[j] = SourceDirection.Diagonal;
                    }
                    else if (scoreLeft > scoreAbove)
                    {
                        traceback[j] = SourceDirection.Left;
                    }
                    else //if (scoreAbove > scoreLeft)
                    {
                        traceback[j] = SourceDirection.Up;
                    }
                }

                if (IncludeScoreTable)
                {
                    Array.Copy(currentScoreRow.Select(x => x.BestScore).ToArray(), 0, ScoreTable, i * Cols, Cols);
                }
            }

            return new[]
            {
                new OptScoreMatrixCell
                {
                    Row = Rows-1, 
                    Col = Cols-1, 
                    Score = currentScoreRow[Cols-1].BestScore,
                }
            };
        }
 public void ToggleToolTip(ScoreElement element)
 {
     board.ToggleToolTip(element);
 }
        /// <summary>
        /// This is step (2) in the dynamic programming model - to fill in the scoring matrix
        /// and calculate the traceback entries.  This version is used when the open/extension
        /// gap costs are different (affine gap model).
        /// </summary>
        private IEnumerable <OptScoreMatrixCell> CreateAffineTracebackTable()
        {
            /* We will need a low constant number that is not Int32.MinValue
             * for the boundaries of the matrix (if we used Int32.MinValue it would
             * over flow when added to the move score to a very high value and become the max
             * rather than the min).
             */
            int EDGE_MIN_VALUE = Int32.MinValue + Math.Max(Rows, Cols) * Math.Abs(GapOpenCost);


            // Horizontal and vertical gap counts.
            int gapStride = Cols + 1;

            /* These are equivalent to traceback matrices for the
             * horizontal and vertical "gap" matrices.  However, rather than store
             * an arrow that points in a direction, we store the size of moves,
             * which allows us to transition into and out of the gap matrices in one
             * step, rather than following paths through them.
             */
            var matrixSize = checked ((Rows + 1) * gapStride);

            try {
                h_Gap_Length = new int[matrixSize];
                v_Gap_Length = new int[matrixSize];
            }
            catch (OutOfMemoryException oom) {
                throw new OutOfMemoryException(GenerateOOMErrorMessageWhenAllocatingGapTracebacks(), oom);
            }

            /* As we progress through, we only need to know about
             * the current row and the previous row for the recursions,
             * so we only use these two, rather than a full matrix.
             */
            ScoreElement[] previousScoreRow = new ScoreElement[Cols];
            ScoreElement[] currentScoreRow  = new ScoreElement[Cols];
            int[][]        matrix           = SimilarityMatrix.Matrix;

            // Upper left element is initalized to 0
            currentScoreRow [0] = new ScoreElement()
            {
                HorizontalGapScore = EDGE_MIN_VALUE,
                VerticalGapScore   = EDGE_MIN_VALUE,
                MatchScore         = 0
            };
            if (IncludeScoreTable)
            {
                ScoreTable[0] = 0;
            }
            // Initialize first row
            sbyte[] traceback = Traceback [0];
            for (int j = 1; j < traceback.Length; j++)
            {
                // always have to go left from top
                traceback[j]    = SourceDirection.Left;
                h_Gap_Length[j] = j;
                var initialScore = (j - 1) * GapExtensionCost + GapOpenCost;
                currentScoreRow [j] = new ScoreElement()
                {
                    HorizontalGapScore = initialScore,
                    VerticalGapScore   = EDGE_MIN_VALUE,
                    MatchScore         = EDGE_MIN_VALUE
                };
                if (IncludeScoreTable)
                {
                    ScoreTable[j] = initialScore;
                }
            }

            for (int i = 1; i < Rows; i++)
            {
                // Create the next TB row
                traceback     = new sbyte[Cols];
                Traceback [i] = traceback;
                // Make the current row the last row,
                // reuse the current rows memory for the new row
                SwapArrays(ref currentScoreRow, ref previousScoreRow);

                /* Initialize first column
                 * We can't move further back horizontally here (we are at
                 * the edge), so we set the score to something so low we will
                 * never go this direction on the highest scoring path, and so
                 * can avoid explicitly checking for an edge
                 */
                currentScoreRow[0] = new ScoreElement()
                {
                    MatchScore         = EDGE_MIN_VALUE,
                    HorizontalGapScore = EDGE_MIN_VALUE,
                    VerticalGapScore   = (i - 1) * GapExtensionCost + GapOpenCost
                };
                traceback[0] = SourceDirection.Up;
                v_Gap_Length[i * gapStride] = i;

                for (int j = 1; j < Cols; j++)
                {
                    // Get the three important values
                    var cellAbove     = previousScoreRow[j];
                    var cellDiagAbove = previousScoreRow [j - 1];
                    var cellLeft      = currentScoreRow [j - 1];

                    // Gap in reference sequence
                    int scoreAbove;
                    int scoreAboveOpen   = Math.Max(cellAbove.HorizontalGapScore, cellAbove.MatchScore) + GapOpenCost;
                    int scoreAboveExtend = cellAbove.VerticalGapScore + GapExtensionCost;
                    if (scoreAboveOpen > scoreAboveExtend)
                    {
                        scoreAbove = scoreAboveOpen;
                        v_Gap_Length[i * gapStride + j] = 1;
                    }
                    else
                    {
                        scoreAbove = scoreAboveExtend;
                        v_Gap_Length[i * gapStride + j] = v_Gap_Length[(i - 1) * gapStride + j] + 1;
                    }

                    // Gap in query sequence
                    int scoreLeft;
                    int scoreLeftOpen   = Math.Max(cellLeft.MatchScore, cellLeft.VerticalGapScore) + GapOpenCost;
                    int scoreLeftExtend = cellLeft.HorizontalGapScore + GapExtensionCost;
                    if (scoreLeftOpen > scoreLeftExtend)
                    {
                        scoreLeft = scoreLeftOpen;
                        h_Gap_Length[i * gapStride + j] = 1;
                    }
                    else
                    {
                        scoreLeft = scoreLeftExtend;
                        h_Gap_Length[i * gapStride + j] = h_Gap_Length[i * gapStride + (j - 1)] + 1;
                    }

                    // Get the exact match/mismatch score
                    int mScore = (matrix != null) ? matrix[QuerySequence[i - 1]][ReferenceSequence[j - 1]] : SimilarityMatrix[QuerySequence[i - 1], ReferenceSequence[j - 1]];

                    /* Since all possible previous states have the same match score applied,
                     * we can just add to the previous max */
                    int scoreDiag = cellDiagAbove.BestScore + mScore;

                    // Store the scores for this cell
                    currentScoreRow[j] = new ScoreElement()
                    {
                        HorizontalGapScore = scoreLeft,
                        VerticalGapScore   = scoreAbove,
                        MatchScore         = scoreDiag
                    };


                    // Get the max S = MAX(diag,above,left) and assign the traceback
                    if ((scoreDiag > scoreAbove) && (scoreDiag > scoreLeft))
                    {
                        traceback[j] = SourceDirection.Diagonal;
                    }
                    else if (scoreLeft > scoreAbove)
                    {
                        traceback[j] = SourceDirection.Left;
                    }
                    else //if (scoreAbove > scoreLeft)
                    {
                        traceback[j] = SourceDirection.Up;
                    }
                }

                if (IncludeScoreTable)
                {
                    Array.Copy(currentScoreRow.Select(x => x.BestScore).ToArray(), 0, ScoreTable, i * Cols, Cols);
                }
            }

            return(new[]
            {
                new OptScoreMatrixCell
                {
                    Row = Rows - 1,
                    Col = Cols - 1,
                    Score = currentScoreRow[Cols - 1].BestScore,
                }
            });
        }