Создание массива известной длины в C#

#c# #unity3d

#c# #unity-game-engine

Вопрос:

В настоящее время я следую руководству по созданию игры в Unity с использованием C #. В нем они показали нам, как отображать счет в центре экрана с помощью

 using UnityEngine;
using UnityEngine.UI;

public class Score : MonoBehaviour
{
    public Transform player;
    public Text scoreText;

    // Update is called once per frame
    void Update()
    {
        scoreText.text = player.position.z.ToString("0");
    }
}
  

Однако я хочу пойти дальше и выяснить, как создать список рекордов в верхнем левом углу. Мой единственный опыт связан с python, поэтому я знаю, что я бы создал пустой массив размером 10, а затем каждый раз при перезапуске игры, если результат превышает любой из 10 наивысших баллов в упомянутом списке, он вставляется в соответствующую позицию (сохраняя порядок элементов), а наименьшее значение удаляется из списка (чтобы сохранить список всего из 10 элементов). Однако меня смущает синтаксис C #.

В настоящее время мой мыслительный процесс над кодом (который был бы включен в мою инструкцию restart), если бы это был python, заключается в следующем

 ##this is how I would write it in python I believe
array = np.zeros[10]
for i in range(0, len(array)):
    if player.position.z.ToString("0") < array[-i]
          continue
    else:
          array[-i-1] = player.position.z.ToString("0")
  

Где, очевидно, оператор player.position взят из c #. Мне было интересно, может ли кто-нибудь помочь мне перевести мыслительный процесс заново. Кажется, мне нужно объявить массив строк, прежде чем я смогу его использовать, но я не уверен.

Спасибо за любую помощь

Комментарии:

1. Говорить вам использовать toString() для каждого фрейма для этого — ужасная идея. Я даже не знаю, как кто-то счел это предложение хотя бы слегка уместным.

2. @Krythic О, я просто следую руководству Брэкки на YouTube, какова замена?

3. Я думаю, если вы обнаружите, что текущий результат выше, чем любой элемент массива, вам нужно будет ввести этот результат, а другие элементы массива следует сдвинуть вниз (а не заменять)

Ответ №1:

Как я понял, вам нужен массив из 10 элементов, в котором вы храните 10 лучших результатов. Таким образом, каждый новый результат, превышающий существующий топ-10, помещается в правильное положение этого топ-10.

Что-то вроде

текущий Top10 => 2, 3, 5, 7, 8, 9, 12, 15, 18, 20

 newScore = 16
  

новый Top10 => 3, 5, 7, 8, 9, 12, 15, 16, 18, 20

Вариант 1:

 string[] scoreArray = new string[10];

//Initializing the score array
for (int i = 0; i < 10; i  )
{
    scoreArray[i] = 0; 
}

//Somewhere in your code a new score will be assigned to this variable
int newScore;

//Checking potentially higher score

boolean replaceFlag = false;
for (int i = 0; i < 10; i  )
{
    if(newScore > scoreArray[i]) 
    {
        replaceFlag = true;
    }else{
        //newScore lower than lowest stored score
        if(i == 0)
        {
            //Stop the loop
            i = 11;
        }else if(replaceFlag){

            //The rest of the elements in the array move one position back
            for(int j = 0 ; j < i-1; j   )
            {
                scoreArray[j] = scoreArray[j 1];
            }
            //Finally we insert the new score in the correct place
            scoreArray[i-1] = newScore;         
        }
    }
}
  

Вариант 2: Использование списка

 //Create and initialize list of scores
List<int> listScores = new List<int>{ 0,0,0,0,0,0,0,0,0,0};



// If later, at some point we have the following scores 2, 3, 5, 7, 8, 9, 12, 15, 18, 20

//When you get a new score (our list will have)
listScores.Add(newScore);

//After inserting 2, 3, 5, 7, 8, 9, 12, 15, 18, 20, 16

//Ordering the list in descending order
listScores.Sort()
//Now we have 2, 3, 5, 7, 8, 9, 12, 15, 16, 18, 20,


//Drop last element of the list to keep the fixed size of 10.
listScores.RemoveAt(0)
//Now we have 3, 5, 7, 8, 9, 12, 15, 16, 18, 20

//In case you want to have the list in descending order
listScores.Sort((a, b) => -1* a.CompareTo(b));
  

Ответ №2:

если Score — это массив, то добавьте оценки к этой переменной массива Score, а затем отсортируйте и переверните этот массив всякий раз, когда вы захотите обновить высокий балл.

 private void UpdateScore(int[] ScoreArray)
{
   Array.Sort(ScoreArray);
   Array.Reverse(ScoreArray);
} 
  

Ответ №3:

Вы бы создали массив известной длины размером 10 примерно так:

 string[] aStringArray = new string[10];
  

Также добавьте это сверху;

 using System.Collections.Generic;
  

Массивы — Руководство по программированию на C #

Комментарии:

1. Что делает комментарий к изменению размера? Кажется, что это увеличивает его с каждым циклом?

2. более типично, что вы бы использовали список<string>: не нужно изменять размер, просто добавляйте / удаляйте элементы в этот список.

3. Я не думаю, что Original poster хочет использовать array, он просто хочет сделать на c # то, что он сделал бы с array в Pyton. При смене языка лучшее предложение — предоставить правильный инструмент для выполнения работы на новом языке. Всего лишь мои 2 цента

Ответ №4:

Массив должен иметь длину, если вы хотите неизвестный размер, тогда используйте List

 List<int> player = new List<int>();
player.Add(1);
  

Комментарии:

1. Привет, Саиф, я прочитал вопрос, но не понял, где он хотел бы использовать list (или массив известного размера).

2. в C # массив должен иметь длину, если хотите использовать неизвестную длину, используйте вместо этого список

3. Да, я это знаю. но где в требовании указано, что он хочет массив неизвестной длины?