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

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

В настоящее время я застрял в колее, пытаясь выяснить, как сгенерировать случайное число один раз для слов. Идет добавление (слово). Например, когда создается объект Word, генерируется случайное число. Затем это случайное число используется в классах, которые зависят от него, таких как getWord_Hiragana и getWord_Romaji. В большинстве игр, набираемых в Интернете, отображается только один объект (английский), поэтому я не смог найти то, что мне нужно.

// WordManager.cs
public class WordManager : MonoBehaviour {

    public List<Word> words;

    public WordSpawner wordSpawner;

    public void AddWord ()
    {
        Word word = new Word (WordGenerator.GetWord_Romaji(), wordSpawner.SpawnWord());

        words.Add (word);
    }
}
// WordGenerator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WordGenerator : MonoBehaviour {

    public static string[] wordList_Hiragana = {    "あ", "い", "う", "え", "お" };

    public static string[] wordList_Katakana = {    "ア", "イ", "ウ", "エ", "オ" };

    public static string[] wordList_Romaji = {      "a", "i", "u", "e", "o" };

    public static int GetIndex ()
    {
        int index = Random.Range (0, wordList_Romaji.Length - 1);   // Get Random number which has the same index for Hiragana, Katakana, and Romaji arrays

        Debug.Log ("Index #" + index + ": " + wordList_Hiragana[index] + " " + wordList_Katakana[index] + " " + wordList_Romaji[index]); // Debug Log

        return index; // Returns the result of the random as a guidance.
    }


    public static string GetWord_Hiragana ()    // A function to return the result of GetIndex as Hiragana word to be used on WordManager and in turn, displays that Hiragana.
    {
        int index = GetIndex ();

        string getWord_Hiragana = wordList_Hiragana [index];
        return getWord_Hiragana;
    }

    public static string GetWord_Romaji ()  
    {
        int index = GetIndex ();
        string getWord_Romaji = wordList_Romaji [index];

        return getWord_Romaji;
    }
}
// Word.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Word {

    public string word;
    private int typeIndex; // Checks for current letter

    WordDisplay display;

    public Word (string _word, WordDisplay _display)  // Displays the word as Hiragana / Katakana
    {
        word = _word;

        display = _display;
        display.SetWord (word);
    }

    public char GetNextLetter ()
    {
        return word[typeIndex]; // Gets the next letter of the Romaji array
    }

    public void TypeLetter ()
    {
        typeIndex++;
    }

    public bool WordTyped ()
    {
        bool wordTyped = (typeIndex >= word.Length); // Checks if the whole word has been typed
        if (wordTyped) 
        {
            display.RemoveWord (); // Remove the whole object on screen
        }
        return wordTyped;
    }
}

Ожидаемый результат для GetIndex, чтобы бросить случайное число один раз для объекта Word. Когда getWord_Romaji выполняется, он получает возвращаемое значение GetIndex. То же самое происходит, когда выполняется getWord_Hiragana. Прямо сейчас GetIndex выполняется дважды и генерирует случайное число дважды в каждом объекте Word, в результате чего слово, появившееся в Debug, отличается от того, которое появляется на экране игры. Как мне сделать эту работу?

Если приведенного выше кода недостаточно для решения проблемы, проект размещается здесь .

Ответы [ 2 ]

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

Я бы изменил ваш конструктор класса Word на следующий:

public class Word
{

    public string word;
    private int typeIndex; // Checks for current letter

    private int wordIndex; // index of word used from WordGenerator

    WordDisplay display;

    public Word(WordDisplay _display)  // Displays the word as Hiragana / Katakana
    {
        wordIndex = WordGenerator.GetIndex(); // now it will only be called ONCE per instance
        word = _WordGenerator.wordList_Romaji[wordIndex];

        // you can get the equivalent? letters similarly...with something like:
        word = _WordGenerator.wordList_Hiragana[wordIndex];

        display = _display;
        display.SetWord(word);
    }

    // ... other existing code ...

}

Обратите внимание, что я добавил еще одно поле для хранения индекса, выбранного для этого конкретного экземпляра слова.

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

Не видя реализации Word Я бы сказал из вашего примера, что на самом деле делает вызов GetIndex() только ровно один раз ... именно для GetWord_Romaji() ...

В любом случае, быстрое простое исправление может быть

private static int randomizedIndex;

public static void NewRandomIndex()
{
    randomizedIndex = Random.Range (0, wordList_Romaji.Length - 1);

    Debug.Log("Index #" + randomizedIndex + ": " + wordList_Hiragana[randomizedIndex] + " " + wordList_Katakana[randomizedIndex] + " " + wordList_Romaji[randomizedIndex]);
}

public static string GetWord_Hiragana()
{
    return wordList_Hiragana[randomizedIndex];
}

public static string GetWord_Romaji ()  
{
    return wordList_Romaji[randomizedIndex];
}

и назовите это

public void AddWord ()
{
    WordGenerator.NewRandomIndex();

    Word word = new Word(WordGenerator.GetWord_Romaji(), wordSpawner.SpawnWord());
    words.Add (word);
}

Если вы хотите, чтобы позже можно было «переводить» слова между этими массивами, тогда вам нужно в Word вместо извлеченного string вместо того, чтобы сохранить использованный randomizedIndex и получить для него значение string » на лету ".

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