본문 바로가기

Dev-Log

프로젝트 MC #01 - 체스 보드 생성하기

 

최근에 개인적인 일정들이 마무리되어서,
개발 공부 겸으로 아이디어 중 하나였던 체스 베이스 게임을 하나 심심풀이로 만들어보기로 했습니다.

일단 체스 보드부터 시작해요.

 

···

[HideInInspector] public Vector3[,] board = new Vector3[6,6];
[SerializeField] private GameObject tileWhite;
[SerializeField] private GameObject tileBlack;
[SerializeField] private float tileSize = 1;


void GenerateBoard()
{
    bool isBlack = true;

    for(int i = 0; i < 6; i++) // j - Horizontal (A,B,C...) / i = Vertical (1,2,3...)
    {
        for(int j = 0; j < 6; j++)
        {
            board[j ,i] = new Vector3(tileSize * j, 0, tileSize * i);

            GameObject tile;

            if(isBlack)
            {
                tile = Instantiate(tileBlack, board[j,i], Quaternion.identity);
                isBlack = false;
            }
            else
            {
                tile = Instantiate(tileWhite, board[j,i], Quaternion.identity);
                isBlack = true;
            }
        }
    }
}
    
···

 

일단 체스 보드 타일의 위치를 들고있을 배열을 하나 만들고, 보드의 체크무늬를 만들기 위해 bool 형 변수로 흰/검 타일을 번갈아가며 생성하도록 짜보았습니다.

 

검-흰-검 식으로 번갈아가며 생성한 결과

 

그렇게 생성하니 줄무늬로... 생각해보니 행을 바꿀 때 순서 또한 바꿔줘야 했습니다!
행이 바뀔 때마다 isBlack 값을 반전시켜주면, 체크무늬로 생성되겠구나 했어요.

그런데 if / else 문을 통해서 해당 값을 바꿔주는건 너무 길지 않나...? 싶어서 찾아보니, 삼항연산자를 통해서 코드를 간소화할 수 있더라고요.

 

···

void GenerateBoard()
{
    bool isBlack = true;

    for(int i = 0; i < 6; i++) // j - Horizontal (A,B,C...) / i = Vertical (1,2,3...)
    {
        for(int j = 0; j < 6; j++)
        {
            board[j ,i] = new Vector3(tileSize * j, 0, tileSize * i);

            GameObject tile;

            if(isBlack)
            {
                tile = Instantiate(tileBlack, board[j,i], Quaternion.identity);
                isBlack = false;
            }
            else
            {
                tile = Instantiate(tileWhite, board[j,i], Quaternion.identity);
                isBlack = true;
            }
            
            tile.name = (char) (65 + j) + (i + 1).ToString();
            tile.transform.SetParent(this.gameObject.transform);
        }
        
        isBlack = isBlack ? false : true;
    }
}
    
···

 

수정하니 체크무늬로 잘 나왔습니다 😎

 

그리고 넣어볼까 해서 아스키 코드를 통해서 A1, B1 ... 식으로 체스 좌표로 게임오브젝트 네이밍을 해줬어요.
나중에 그냥 정수형으로 바꿔버릴지도 모른다는 생각이 언뜻 들었습니다. 일단 넘기고 나중에 생각하기로.

 

보드의 행이 바뀔 때, bool 값을 바꿔주는게 아닌, * -1로 처리해줘도 된다고 친구에게 피드백을 들었습니다.
칸 또는 행이 변경될 때마다 -1을 값에 곱해주고, 값이 -1 이면 검정색, 1 이면 흰색으로 처리하면 조건문 없이 바꿔줄 수 있다고요.

🧠 지식이 +1 증가했습니다.

 

 

'Dev-Log' 카테고리의 다른 글

프로젝트 MC #02 - 말 이동 가능하게 구조 만들기  (0) 2022.12.18