¿Int число не повторяется с единицей random.range? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть 2 числа, которые используются со random.range, что мне нужно, так это то, что комбинация обоих не повторяется 2 раза, то есть комбинация a1, b1 никогда не может быть повторена, но теперь я не могу это понять должно произойти для карточной игры, которую я должен разработать, в которой одна и та же карта не может быть повторена ни в руке, ни в игре.

class Meca

public List<carta> cardPlay2; //current card combination, each update resets the list
public List<carta> cartaJugada; // current combination of cards, these are saved so that in future 
updates the combination is not repeated

public bool isChange;


if (isChange)
    {

        cardPlay2.Clear();


        int num = 5;
        for (int j = 0; j < num; j++)
            {
                cambioCarta();
            }

        isChange = false;
    }

   void cambioCarta()
{
    GameObject temp = Instantiate(carta);
    temp.transform.SetParent(parent);

    GameObject tem2p = Instantiate(carta2);
    tem2p.transform.SetParent(parent2);


}

script carta

 public int Num_cartas, PaloCarta;
 public Mecanic meca;

 void Start()
{
    meca = GameObject.FindObjectOfType<Mecanic>();
    if(gameObject.tag == "carta1")
        cartas();

   if (gameObject.tag == "carta2")
        carta2();

}

void cartas()
{
    Num_cartas = UnityEngine.Random.Range(1, 11);
    PaloCarta = UnityEngine.Random.Range(1, 5);

    carta carta1 = new carta
    {
        numCarta = Num_cartas,
        palo = PaloCarta
    };
 }

[Serializable]
public class carta
{
public int numCarta;
public int palo;
}

то, что я пытаюсь сделать, это

private void controlCartaMano2()
{  
    Num_cartas = UnityEngine.Random.Range(1, 10);
    PaloCarta = UnityEngine.Random.Range(1, 4);

    for (int i = 0; i < meca.cardPlay2.Count; i++)
    {
        while (meca.cardPlay2[i].numCarta == Num_cartas && meca.cardPlay2[i].palo == PaloCarta)
        {
            Num_cartas = UnityEngine.Random.Range(1, 10);
            PaloCarta = UnityEngine.Random.Range(1, 4);
        }
    }
}

 private void controlCartaJugada()
{



    for (int i = 0; i < meca.cartaJugada.Count; i++)
    {
        for(int j = 0; j < meca.cartaJugada.Count; j++)
        {
            if(meca.cartaJugada[i].numCarta == meca.cartaJugada[j].numCarta && 
            meca.cartaJugada[i].palo == meca.cartaJugada[j].palo)
            {
                Num_cartas = UnityEngine.Random.Range(1, 10);
                PaloCarta = UnityEngine.Random.Range(1, 4);
            }
        }
    }
}

если вы знаете, как это сделать, я был бы признателен

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете использовать метод перемешивания Фишера-Йейтса. Это перетасует массив на место. Тогда это простой вопрос постепенного перехода по массиву. Вот общий метод c, который будет перемешивать массив:

static void Shuffle<T> ( T [ ] array )
{
    var _random = new System.Random ( );
    for ( int i = 0, n = array.Length; i < ( n - 1 ); ++i )
    {
        var next = i + _random.Next ( n - i );
        var item = array [ next ];
        array [ next ] = array [ i ];
        array [ i ] = item;
    }
}

Для получения дополнительной информации вот страница Wiki: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

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