기존의 Linq를 이용한 카드 셔플 알고리즘을 Random를 이용하여 변경했다.
기존의 코드
// 카드 번호
int[] arr = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
// 카드 셔플
arr = arr.OrderBy(_ => Random.Range(0, 8)).ToArray();
Linq를 사용하여 한 줄로 작성한 카드 기존의 셔플 코드이다.
Linq를 사용하지 않고 for문과 Random를 이용하여 카드 셔플 코드를 작성했다.
수정된 코드
private void Shuffle()
{
int random1, random2;
Card tmp;
// 2개의 랜덤 변수를 저장한 뒤 Swap
for (int index = 0; index < cards.Length; ++index)
{
random1 = Random.Range(0, cards.Length);
random2 = Random.Range(0, cards.Length);
tmp = cards[random1];
cards[random1] = cards[random2];
cards[random2] = tmp;
}
}
Linq를 이용한 코드가 더 효율적이고 가독성이 더 좋은거 같다.
그리고 확장성을 위해서 리스트를 사용하여 코드를 작성했지만 시원님이 리스트보다는 배열을 사용하는 것이 효율적일거같다는 피드백을 주셨다.
그래서 배열로 수정한 후 초기화 함수인 Init함수와 카드 위치 배정 함수인 SetPosition함수를 작성했다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class Board : MonoBehaviour
{
[SerializeField] private Card[] cards;
[SerializeField] private GameObject cardPrefab;
void Start()
{
// 난이도 별로 카드 (Easy = 8, Normal = 16, Hard = 24)
Init(8 * (int)DifficultyManager.instance.difficulty);
SetPosition();
}
private void SetPosition() // 카드 배치 함수
{
// 카드 배정
for (int i = 0; i < cards.Length; i++)
{
float x = (i % 4) * 1.2f - 1.8f;
float y = (i / 4) * 1.2f - 2.6f;
cards[i].transform.position = new Vector3(x, y , 0);
}
// 난이도 별로 카드 위치 조정
if (DifficultyManager.instance.difficulty == Difficulty.Easy)
{
transform.position += new Vector3(0, 1.5f, 0);
}
else if (DifficultyManager.instance.difficulty == Difficulty.Hard)
{
transform.position += new Vector3(0, -1.5f, 0);
}
}
// 초기화 함수
public void Init(int count)
{
// Cards 배열 초기화
cards = new Card[count];
int num = 0;
for (int i = 0; i < count; i++) // 생성된 카드마다 번호 부여
{
// 카드 생성
GameObject card = Instantiate(cardPrefab, transform);
cards[i] = card.GetComponent<Card>();
cards[i].Setting(num); // 번호 부여
if (i % 2 == 1) // 홀수가 됐을때 카드 번호 ++
{
num++;
}
}
Shuffle(); // 카드 섞는 함수
GameManager.instance.CardCount = cards.Length;
}
private void Shuffle()
{
int random1, random2;
Card tmp;
// 2개의 랜덤 변수를 저장한 뒤 Swap
for (int index = 0; index < cards.Length; ++index)
{
random1 = Random.Range(0, cards.Length);
random2 = Random.Range(0, cards.Length);
tmp = cards[random1];
cards[random1] = cards[random2];
cards[random2] = tmp;
}
}
}