카드 뒤집기 게임

상원·2025년 1월 21일
0

카드를 뒤집어 모든 쌍의 카드를 맞추면 클리어 하는 게임입니다.
시간은 30초 이며 30초안에 클리어 못하거나 클리어 시 "끝" 버튼을 눌러 다시 시작할 수 있습니다.

//보드
using System.Linq;

public GameObject card;

void Start()
{
    int[] arr = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
    arr = arr.OrderBy(x => Random.Range(0f,7f)).ToArray();

    for(int i = 0; i < 16; i++)
    {
        GameObject go = Instantiate(card,this.transform);

        float x = (i % 4) * 1.4f - 2.1f;
        float y = (i / 4) * 1.4f - 3.0f;

        go.transform.position = new Vector2(x,y);
        go.GetComponent<Card>().Setting(arr[i]);
    }

    GameManager.Instance.cardCount = arr.Length;
}

배열 변수를 선언해서 같은 쌍의 카드임을 비교할 수 있도록 같은 숫자를 짝을 맞춰 저장하였고
배열의 수는 랜덤으로 섞어서 다시 저장합니다.
16번 반복을 돌며 16개의 카드의 위치를 정하는데 y는 몫을 저장하므로 4의 배수 반복부터
y의 위치를 기존보다 높여서 생성하게 됩니다.

using UnityEngine.UI;

void Start()
{
    Time.timeScale = 1.0f;
}

void Update()
{
    time += Time.deltaTime;
    timeTxt.text = time.ToString("N2");

    if(time >= 30f)
    {
        Time.timeScale = 0.0f;
        endTxt.SetActive(true);
    }
}

public void Matched()
{
    if(firstCard.idx == secondCard.idx)
    {
        firstCard.DestroyCard();
        secondCard.DestroyCard();
        cardCount -= 2;
        if (cardCount == 0)
        {
            Time.timeScale = 0.0f;
            endTxt.SetActive(true);
        }
    }
    else
    {
        firstCard.CloseCard();
        secondCard.CloseCard();
    }
    firstCard = null; 
    secondCard = null; 
}

time변수로 시간초과 시 게임을 종료하도록 Update함수에 만들어 두었고
Matched 함수를 이용하여 첫 번째와 두 번째 클릭한 카드의 인덱스가 맞다면 삭제하고
틀리다면 다시 카드를 뒷명상태로 돌아가게합니다.

//카드
public void Setting(int number)
{
    idx = number;
    frontImage.sprite = Resources.Load<Sprite>($"rtan{idx}");
}

public void OpenCard()
{
	if (!GameManager.Instance.isCanOpen) return;
    anim.SetBool("isOpen",true);
    front.SetActive(true);
    back.SetActive(false);

    if (GameManager.Instance.firstCard == null) 
    {
        GameManager.Instance.firstCard = this;
    }
    else
    {
        GameManager.Instance.secondCard = this;
        GameManager.Instance.isCanOpen = false;
        GameManager.Instance.Matched();
    }
}

public void DestroyCard()
{
    Invoke("DestroyCardInvoke",1.0f);
}

void DestroyCardInvoke()
{
    Destroy(gameObject);
    GameManager.Instance.isCanOpen = true;
}

public void CloseCard()
{
    Invoke("CloseCardInvoke", 1.0f);
}
void CloseCardInvoke()
{
    anim.SetBool("isOpen", false);
    front.SetActive(false);
    back.SetActive(true);
    GameManager.Instance.isCanOpen = true;
}

보드에서 받아온 인덱스로 인덱스 번호별 카드 앞면의 이미지를 부여하여 세팅해줍니다.
OpenCard함수를 통해서 카드의 뒷면을 클릭하면 카드를 앞면으로 돌리게 되며
bool 변수 isCanOpen변수를 통해 true일때만 뒷면 상태의 카드를 클릭하여 돌려 확인할 수 있게 해주었습니다.
이전에 눌렀던 두번의 카드가 삭제 또는 다시 뒷면이 되기전까지 isCanOpen을 false로 두었습니다.

====================================================================
게임의 난이도를 올리고 싶다면 Card.cs 스크립트에서 CloseCard의 시간을 짧게 두어 두 카드를 비교하더라도 순식간에 다시 뒷면이 되어 어렵게 만들 수 있습니다.

Canvas에 UI의 Image를 붙혔을 경우 MainCamera에 Image의 배경을 부여하면서 화면을 가리지 않게 하고싶다면 ScreenSpace-Camera로 변경후 원하는 카메라를 선택하면 된다.
ScreenSpace-Overlay로 선택하는 것과 다르게 Layer설정도 가능하게 된다.

0개의 댓글