Problem z listą

Programowanie w Unity.

Problem z listą

Postprzez gregor9131 » 17 Sie 2018, 17:31

Hej, mam mały problem. Mianowicie robię gierkę typu memo. Chcę, żeby karty za każdym razem był inaczej ułożone. Żeby ukończyć grę, trzeba trafić trzy karty podobnym obrazkiem, funkcja ta odbywa się w korutynie. Za mieszanie kart odpowiada funkcja ShuffleTiles. I teraz problem, jak można by przypisać listę w funkcji ShuffleTiles, żeby zmieniały się nie tylko same karty ale też, index w liście w korutnie. Bo jeżeli funcka ShuffleTiles nie będzie aktywna, to wtedy nie ma problemu, w grze jesteśmy w stanie dopasować karty dobrze, natomiast problem jest, kiedy chce wymieszać karty, ktoś coś by zasugerował?? Jeśli, problem nie jest dostatecznie zobrazowany mogę wrzucić filmik z samej gry.

Kod: Zaznacz wszystko
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class Board : MonoBehaviour
{
    public GameObject TilePrefab;

    public Sprite[] sprites;

    Tile[] Tiles;

    public Vector2 TilesOffset = Vector2.one;

    public int Width = 5;
    public int Height = 5;

    public bool CanMove = false;

    public TextMesh WinText;

    IEnumerator Start()
    {
        WinText.GetComponent<Renderer>().enabled = false;
       

        CreateTiles();
        ShuffleTiles();
        PlaceTiles();
        CanMove = false;
        yield return new WaitForSeconds(2f);
        CanMove = true;

        HideTiles();

    }

    void CreateTiles()
    {
        var length = Width * Height;
        Tiles = new Tile[length];

        for (int i = 0; i < length; i++)
        {
            var sprite = sprites[i];
            Tiles[i] = CreateTile(sprite);
        }
    }

    Tile CreateTile(Sprite faceSprite)
    {
        var gameobject = Instantiate(TilePrefab);
        gameobject.transform.parent = transform;

        var tile = gameobject.GetComponent<Tile>();
        tile.Uncovered = true;
        tile.frontFace = faceSprite;

        return tile;
    }

    void ShuffleTiles()
    {
        for (int i = 0; i < Tiles.Length; i++)
        {

            int index1 = Random.Range(0, Tiles.Length);
            int index2 = Random.Range(0, Tiles.Length);

            //int index3 = Random.Range(0, sprites.Length);
            //int index4 = Random.Range(0, sprites.Length);

            var tile1 = Tiles[index1];
            var tile2 = Tiles[index2];

            var tile3 = sprites[index1];
            var tile4 = sprites[index2];

            Tiles[index1] = tile2;
            Tiles[index2] = tile1;

            sprites[index1] = tile3;
            sprites[index2] = tile4;
        }
    }

    void PlaceTiles()
    {
        for (int i = 0; i < Width * Height; i++)
        {
            int x = i % Width;
            int y = i / Width;

            Tiles[i].transform.localPosition = new Vector3(x * TilesOffset.x, y * TilesOffset.y, 10);
        }
    }

    void HideTiles()
    {
        Tiles.ToList().ForEach(tile => tile.Uncovered = false);
    }

    bool CheckIfEnd()
    {
        return Tiles.All(tile => !tile.Active);
    }

    public void CheckPair()
    {
        StartCoroutine(CheckPairCoroutineForThreeCard());
    }

    IEnumerator CheckPairCoroutine()
    {
        var tilesUncovered = Tiles
            .Where(tile => tile.Active)
            .Where(tile => tile.Uncovered)
            .ToArray();

        if (tilesUncovered.Length != 2)
            yield break;

        var tile0 = Tiles[0];
        var tile1 = Tiles[1];
        var tile2 = Tiles[2];
        var tile3 = Tiles[3];
        var tile4 = Tiles[4];
        var tile5 = Tiles[5];
        var tile6 = Tiles[6];
        var tile7 = Tiles[7];
        var tile8 = Tiles[8];

        CanMove = false;
        yield return new WaitForSeconds(0.5f);
        CanMove = true;

        if (tile0.Uncovered==true&& tile3.Uncovered == true)
        {
            tile0.Active = false;
            tile3.Active = false;
        }

        if (tile1.Uncovered == true && tile2.Uncovered == true)
        {
            tile1.Active = false;
            tile2.Active = false;
        }

        if (tile1.Uncovered==true &&tile4.Uncovered==true)
        {
            tile1.Active = false;
            tile4.Active = false;
        }

        if (tile2.Uncovered == true && tile4.Uncovered == true)
        {
            tile2.Active = false;
            tile4.Active = false;
        }

        if (tile0.Uncovered == true && tile5.Uncovered == true)
        {
            tile0.Active = false;
            tile5.Active = false;
        }

        if (tile3.Uncovered == true && tile5.Uncovered == true)
        {
            tile3.Active = false;
            tile5.Active = false;
        }

        if (tile6.Uncovered == true && tile7.Uncovered == true)
        {
            tile6.Active = false;
            tile7.Active = false;
        }

        if (tile6.Uncovered == true && tile8.Uncovered == true)
        {
            tile8.Active = false;
            tile6.Active = false;
        }

        if (tile7.Uncovered == true && tile8.Uncovered == true)
        {
            tile7.Active = false;
            tile8.Active = false;
        }

        else
        {
            tile0.Uncovered = false;
            tile1.Uncovered = false;
            tile2.Uncovered = false;
            tile3.Uncovered = false;
            tile4.Uncovered = false;
            tile5.Uncovered = false;
            tile6.Uncovered = false;
            tile7.Uncovered = false;
            tile8.Uncovered = false;
        }

        if (CheckIfEnd())
        {
            CanMove = true;
            WinText.GetComponent<Renderer>().enabled = true;
            yield return new WaitForSeconds(5f);

            Application.Quit();
        }
    }
    IEnumerator CheckPairCoroutineForThreeCard()
    {
        var tilesUncovered = Tiles
            .Where(tile => tile.Active)
            .Where(tile => tile.Uncovered)
            .ToArray();

        if (tilesUncovered.Length != 3)
            yield break;

        var tile0 = Tiles[0];
        var tile1 = Tiles[1];
        var tile2 = Tiles[2];
        var tile3 = Tiles[3];
        var tile4 = Tiles[4];
        var tile5 = Tiles[5];
        var tile6 = Tiles[6];
        var tile7 = Tiles[7];
        var tile8 = Tiles[8];

        CanMove = false;
        yield return new WaitForSeconds(0.5f);
        CanMove = true;

        if (tile0.Uncovered == true && tile3.Uncovered == true&& tile5.Uncovered==true)
        {
            tile0.Active = false;
            tile3.Active = false;
            tile5.Active = false;
        }

        if (tile1.Uncovered == true && tile2.Uncovered == true && tile4.Uncovered == true)
        {
            tile1.Active = false;
            tile2.Active = false;
            tile4.Active = false;
        }
        if (tile6.Uncovered == true && tile7.Uncovered == true && tile8.Uncovered == true)
        {
            tile6.Active = false;
            tile7.Active = false;
            tile8.Active = false;
        }
        else
        {
            tile0.Uncovered = false;
            tile1.Uncovered = false;
            tile2.Uncovered = false;
            tile3.Uncovered = false;
            tile4.Uncovered = false;
            tile5.Uncovered = false;
            tile6.Uncovered = false;
            tile7.Uncovered = false;
            tile8.Uncovered = false;
        }

        if (CheckIfEnd())
        {
            CanMove = true;
            WinText.GetComponent<Renderer>().enabled = true;
            yield return new WaitForSeconds(5f);

            Application.Quit();
        }
    }
}
gregor9131
 
Posty: 20
Rejestracja: 02 Paź 2017, 18:56
Has thanked: 0 time
Been thanked: 0 time

Re: Problem z listą

Postprzez Wichur » 18 Sie 2018, 20:20

Powinno Cie zainteresować: System.Linq
http://www.ookii.org/Blog/randomizing_a_list_with_linq
Awatar użytkownika
Wichur
 
Posty: 98
Rejestracja: 19 Gru 2017, 10:33
Miejscowość: Pruszcz Gdański
Has thanked: 0 time
Been thanked: 0 time

Re: Problem z listą

Postprzez gregor9131 » 18 Sie 2018, 22:14

Ok, spróbuje z tym to ogarnąć, może mi się uda.
gregor9131
 
Posty: 20
Rejestracja: 02 Paź 2017, 18:56
Has thanked: 0 time
Been thanked: 0 time

Re: Problem z listą

Postprzez gregor9131 » 19 Sie 2018, 15:02

W sumie to zrobiłem to trochę inaczej: tzn do korutyny dodałem podobną funkcję jak shuffleTiles, oznaczyłem flagą, żeby się wykonała tylko raz, i utworzyłem dwie prywatne zmienne int=random.range(0,9). I wszystko działa tylko problem, że trochę mało roszad jest w tych kartach- na ogół zamieniona jest jedna karta z inną kartą- wolałbym, żeby były zamienione 3 karty ze sobą. Jakieś sugestie?
gregor9131
 
Posty: 20
Rejestracja: 02 Paź 2017, 18:56
Has thanked: 0 time
Been thanked: 0 time


Wróć do Skrypty

Kto jest na forum

Użytkownicy przeglądający to forum: Google [Bot] oraz 10 gości