Есть ли более простой способ составить счет и затем дать очки за свою позицию? - PullRequest
0 голосов
/ 26 июня 2019

Я играю в такую ​​игру, как Mario Party, в которой у вас есть несколько мини-игр, а затем, в зависимости от вашей позиции, вы получаете определенное количество очков. Я создал систему, в которой вы упорядочиваете баллы в списке, а затем, в зависимости от вашей пунктуации или от того, что у кого-то такое же количество баллов, вы получаете определенные баллы.

личный список highScoreEntryList; // список очков

private class HighscoreEntry //class for the list
{
    public int score;
    public string name;
}

public void AddToList()
{
    //adding puntuations
    highScoreEntryList = new List<HighscoreEntry>() {
         new HighscoreEntry{score = player1score, name = "Player1" },
         new HighscoreEntry{score = player2score, name = "Player2" },
         new HighscoreEntry{score = player3score, name = "Player3" },
         new HighscoreEntry{score = player4score, name = "Player4" }
     };

    //order the puntuation
    for (int i = 0; i < highScoreEntryList.Count; i++)
    {
        for (int j = i + 1; j < highScoreEntryList.Count; j++)
        {
            if (highScoreEntryList[j].score > highScoreEntryList[i].score)
            {
                HighscoreEntry tmp = highScoreEntryList[i];
                highScoreEntryList[i] = highScoreEntryList[j];
                highScoreEntryList[j] = tmp;
            }
        }
    }


    //check player with same puntuations and giving points, the points are directly changed in the score

    for (int i = 0, tmp = 0; i < highScoreEntryList.Count; i++)
    {
        for (int j = i + 1; highScoreEntryList[i].score == highScoreEntryList[j].score; j++)
        {
            tmp++;
            iqual = true;
        }
        if (iqual == true)
        {
            for (int j = i; j <= tmp; j++)
            {
                if (tmp == 1)
                {
                    highScoreEntryList[j].score = 75;
                }
                else if (tmp == 2)
                {
                    highScoreEntryList[j].score = 50;
                }
                else if (tmp == 3)
                {
                    highScoreEntryList[j].score = 25;
                }
                iqual = false;
            }
        }
        else if (iqual == false)
        {
            if (i == 0)
            {
                highScoreEntryList[0].score = 125;
            }
            else if (i == 1)
            {
                highScoreEntryList[1].score = 75;
            }
            else if (i == 2)
            {
                highScoreEntryList[2].score = 50;
            }
            else if (i == 3)
            {
                highScoreEntryList[3].score = 25;
            }

            tmp++;
        }
        i = tmp - 1;

    }

С добавленной проверкой скрипт больше не работает. Не могли бы вы помочь мне? Спасибо.

1 Ответ

0 голосов
/ 26 июня 2019

Вы можете использовать Linq и его OrderBy методы.

using UnityEngine;
using System.Collections.Generic;
using System.Linq;
public class HighscoreEntry
{
    public int score;
    public string name;
}
public class OrderScores : MonoBehaviour
{
    public List<HighscoreEntry> highScoreEntryList;

    public void Start()
    {
        highScoreEntryList = new List<HighscoreEntry>() {
            new HighscoreEntry{score = 1000, name = "Player5" },
            new HighscoreEntry{score = 1000, name = "Player1" },
            new HighscoreEntry{score = 2222, name = "Player4" },
            new HighscoreEntry{score = 2222, name = "Player2" },
            new HighscoreEntry{score = 1111, name = "Player3" },
            new HighscoreEntry{score = 3333, name = "Player6" }
        };

        List<HighscoreEntry> orderedRoundScores = OrderList(highScoreEntryList);

        foreach (HighscoreEntry entry in orderedRoundScores)
        {
            Debug.Log("Name: " + entry.name + ", Score: " + entry.score);
        }

        List<HighscoreEntry> scores = ScoresBasedOnPosition(orderedRoundScores);


        foreach (HighscoreEntry entry in scores)
        {
            Debug.Log("Name: " + entry.name + ", Score: " + entry.score);
        }
    }

    public List<HighscoreEntry> OrderList(List<HighscoreEntry> list)
    {
        list = list.OrderBy(o => o.name).ToList();
        list = list.OrderByDescending(o => o.score).ToList();
        return list;
    }

    public List<HighscoreEntry> ScoresBasedOnPosition(List<HighscoreEntry> allPlayers)
    {
        int[] positionRelatedScores = new int[] { 125, 75, 50, 25, 10 }; 
        int currentPositionRelatedScoresIndex = 0;

        List<HighscoreEntry> scoresBasedOnPositionList = new List<HighscoreEntry>(); 

        int previousScore = -1; 

        for (int x = 0; x < allPlayers.Count; x++)
        {
            int playerScore = allPlayers[x].score; 

            if (x > 0 && previousScore != playerScore)
            {
                currentPositionRelatedScoresIndex++;
                if (currentPositionRelatedScoresIndex >= positionRelatedScores.Length)
                {
                    break;
                }
            }

            scoresBasedOnPositionList.Add( new HighscoreEntry { name = allPlayers[x].name, score = positionRelatedScores[currentPositionRelatedScoresIndex]});

            previousScore = playerScore; 
        }

        return scoresBasedOnPositionList;
    }

}

В этом примере он сначала упорядочивает их по name , так что соответствующие оценки теперь сортируются в алфавитном порядке, а затем переупорядочивает их по Descending , сохраняя в алфавитном порядке соответствующие имена.

Редактировать : Добавлен новый метод ScoresBasedOnPosition для циклического перемещения по упорядоченному списку, а затем назначать счет в зависимости от их положения в упорядоченном списке и того, соответствует ли их раунд счет предыдущему счету игроков в раунде.

выход

Name: Player6, Score: 3333
Name: Player2, Score: 2222
Name: Player4, Score: 2222
Name: Player3, Score: 1111
Name: Player1, Score: 1000
Name: Player5, Score: 1000

Name: Player6, Score: 125
Name: Player2, Score: 75
Name: Player4, Score: 75
Name: Player3, Score: 50
Name: Player1, Score: 25
Name: Player5, Score: 25

Более подробную информацию можно получить из Документации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...