10.6 카드 매칭 게임(1)
카드 매칭 게임 만들어 보기(1)
'26.10.06 오후, 강사님께서 4×4 카드 매칭 게임을 만들어보라고 하셨다.
완성본을 먼저 보고 파트너와 함께 직접 만들어보는 시간이었다.
최근 수업에서는 문제 하나를 풀어도 시간이 너무 오래 걸려서 개인 시간까지 문제를 풀다 보면 하루가 거의 다 지나가는 느낌이었는데, 갑자기 카드 매칭 게임이라니…… 처음부터 조금 막막했다.
처음에는 가장 기본적인 Console.WriteLine("블라블라")부터 시작해서 화면에 필요한 기본 출력값들을 하나씩 만들어 놓았다. 그런데 그다음부터가 문제였다.
카드를 섞어야 하고, 섞은 카드들은 뒤집힌 상태에서 * 모양으로 보여야 하고, 사용자가 값을 입력하면 해당 위치의 카드가 숫자로 나타나야 하고…….
머릿속으로는 대충 어떤 게임인지 알고 있는데, 막상 코드를 직접 작성하려고 하니 어디서부터 어떻게 만들어야 하는지 감이 잡히지 않았다.
결국 한참을 고민하다가 강사님께서 힌트를 주셨다.
Random random = new Random();
Random을 이용해서 카드를 섞는 방법이었다.
그런데 이것도 역시 "Random을 사용한다"는 것과 "그래서 코드를 어디에, 어떤 식으로 작성해야 하는가"는 전혀 다른 문제였다.
결국 조교님의 도움을 받아 겨우 숫자를 섞는 것까지 완성했다.
그다음 우리가 하려고 했던 것은 섞인 카드들이 매번 새롭게 잘 섞이는지 확인하고, 실제 카드판에서는 숫자가 아닌 *가 보이도록 만드는 것이었다.
카드판을 출력하는 부분은 이런 식이었다.
for (int col = 0; col < 4; col++)
{
Console.Write($"{col + 1,2}열");
}
Console.WriteLine();
for (int row = 0; row < 4; row++)
{
Console.Write($"{row + 1,2}행");
for (int col = 0; col < 4; col++)
{
//Console.Write($" {card[row, col],3}");
//Console.Write($" {"** ",3}");
}
Console.WriteLine();
}
Console.WriteLine();
문제는 주석 처리해 놓은 두 부분을 if문을 이용해서 상황에 따라 출력해야 한다는 것이었다.
어떤 식으로 해야 하는지는 대충 알고 있었다.
카드가 뒤집혀 있으면
*
카드가 열려 있으면숫자
그런데 정작 if 안에 어떤 조건을 넣어야 하는지는 도저히 떠오르지 않았다.
한참 고민하다가 결국 수업이 끝났고, 이후 조교님께 다시 질문을 드렸다.
그때 정말 큰 힌트를 하나 얻었다.
원래 카드 배열과 똑같은 크기의 bool 배열을 하나 더 만들어서 카드가 열렸는지 여부를 따로 관리하면 된다는 것이었다.
우리는 처음부터 2차원 배열을 이용해서 카드를 만들고 있었다.
int[,] card = new int[4, 4];
그렇다면 카드가 열렸는지를 저장하는 배열도 같은 크기로 만들 수 있었다.
bool[,] isOpened = new bool[4, 4];
그리고 이것을 이용해서
if (isOpened[row, col])
이라고 조건을 작성하면 된다.
처음에는 이것도 별거 아닌 것처럼 보일 수 있는데, 나에게는 이게 꽤 큰 힌트였다.
isOpened가
false라면 →*출력true라면 →card[row, col]의 숫자 출력
이런 식으로 카드의 실제 값과 카드가 현재 열려 있는지를 따로 관리한다는 개념이었다.
설명을 들었을 때는 아하! 싶었다.
그런데 문제는 역시 설명을 듣는 것과 내가 직접 코드를 작성하는 것은 전혀 다르다는 것이었다.
수업이 끝난 뒤 집에서 혼자 나머지 부분을 만져봤는데, 두 시간 넘게 이것저것 수정하고 고민했던 것 같다.
결국 학원에서 마무리했던 부분 이후로는 아무런 진전도 없었다. 뻘짓한 것 같았다.
다행히 파트너분께서도 집에서 직접 만들어보셨고, 다음 날 아침에 어떻게 값이 나오게 되었는지 설명해주셨다.
덕분에 어느 정도 이해가 된 부분을 바탕으로 함수를 이용해서 카드판을 출력하는 부분과 while()을 이용해서 게임이 반복되도록 하는 부분을 추가해서 일단 커밋까지 했다.
요즘 코딩을 배우면서 계속 느끼는 부분이다.
막상 강사님이나 조교님, 파트너분께서 설명해주시면 한번에 이해하지 못할 때도 있지만, 재차 설명을 듣고 코드를 보다보면
"아 이렇게 작동하는 구나" 하고 이해가 된다.
그런데 다시 내가 직접 코드를 작성하려고 하면 방금 들었던 설명이 머릿속에서 제대로 나오지 않거나 완전히 사라져버린 느낌이다.
이번 카드 매칭 게임도 마찬가지였다.
bool 배열을 이용해서 카드가 열렸는지를 관리한다는 설명을 듣고 나서는 이해가 됐는데, 처음부터 내가 스스로 이런 방법을 떠올릴 수 있었냐고 하면…… 절대 아니다.
그래서 조금 괴롭기도 하다.
이 글을 작성하고 있는 오늘은 10월 7일이고, 오늘은 class를 배웠다.
하루하루 새로운 것을 배우고 있는데, 내가 따라가는 속도가 너무 느린 것 같아서 "이렇게 못해도 괜찮은 건가?"라는 생각이 계속 든다.
자존감이나 자신감도 많이 떨어져 있는 상태다.
그래도 예전부터 배워보고 싶었던 분야였고, 여기까지 시작한 이상 조금 더 해보고 싶다.
일단은 조금 더 악을 쓰고 해보려 한다.
또 새롭게 과제를 내 주신다고 했는데, 조금씩 조금씩 발전해 나간다고 느낄 수 있기만 해도 기쁠 것 같다.


오늘도 멋지게~!