20 ~ 21 강의 하이로우 카드게임을 만드는 강의를 진행중입니다.
[ 질문 1]
// 처음에 선언한 enum 문과
enum E_SHAPE { E_SPADE, E_DIA, E_HEART, E_CLOVER, E_MAX };
enum E_SELECT { E_QUIT, E_HIGH, E_LOW, E_SEVEN };
// 그 밑에 선언한 구조체
struct tagCard
{
char* szShape;
int nNumber;
};
// 그리고 enum과 구조체가 사용될 때.
void InitCards(tagCard* cards)
{
for (E_SHAPE i = E_SPADE; i < E_MAX; i = (E_SHAPE)(i + 1))
{
for (int j = 0; j < 13; j++)
{
switch (i)
{
case E_SPADE:
cards[i * 13 + j].szShape = (char*)"♠";
break;
case E_DIA:
cards[i * 13 + j].szShape = (char*)"◆";
break;
case E_HEART:
cards[i * 13 + j].szShape = (char*)"♥";
break;
case E_CLOVER:
cards[i * 13 + j].szShape = (char*)"♣";
}
cards[i * 13 + j].nNumber = j + 1;
}
}
}
제가 헷갈리는것은...
카드의 초기화 함수에서 enum으로 선언된 카드의 타입마다
일일이 문양을 넣어주고, 숫자를 지정해줍니다.
그리고 이것은 구조체의 szShape 과 nNumber 변수를 이용하여 지정합니다.
이게 이해가 안됩니다.
도대체 이 변수들은 각각의 enum 타입의 어디로 저장이 되는건가요?
정확한 경로..? 정확한 과정을 알고싶습니다. 이해가 안되어서요..
일단은 main() 함수에 선언된 배열.
tagCard stCards[52];
바로 이 배열의 각 인덱스마다 저장이 되는것이라는건 알겠습니다.
그런데 stCards[0] 번째 배열의 카드에 구조체 szShape 과 nNumber 변수가
한 번에 저장이 된다는거 아닌가요?
그 말은 즉..
stCards[0 ~ 51] 번의 인덱스 전부 각. 각. 에 tagCard 구조체가 저장된다는 말인가요?
그러니까 즉.. tagCard 구조체가 총 52개가 생성..? 52번 사용..? 되는것인가요?
stCards[0] 번째 배열의 nNumber 는 도대체 어디에 저장된 건가요.. ㅜ
솔직히 말씀드리면 제가 뭘 모르는지도 모르겠습니다.
저는 그냥.. 배열 52개가 있는데.. 구조체는 한 개 인데
도대체 배열 52개의 각각의 nNumber와 szShape 변수가 어디에 저장된다는건지
잘 모르겠습니다.
[질문 2]
어째서 tagCard 구조체에서 nNumber는 포인터가 아닌가요
[질문 3]
int Betting(int money) 에서 파라메터가 포인트 형식이 아닌데
nBet = Betting(*money); 금액을 베팅할때는 포인터로 넘겼습니다.
void Play(tagCard* cards, int* money, int* index, bool* playing) 함수의 파라메터가 애초에 money를
포인터 형식으로 받기 때문인걸로 보이는데요.
이게 Betting 의 파라메터가 어떤 타입으로 받는지는 상관없는건가요?
물론 같은 int 타입이어야겠지만.
포인터 타입은 변수의 주소를 가리키는 주소값이고
Betting(*money) 는 money의 주소값을 넘긴것이 아닌가요.
그럼 int Betting() 에서는 money의 주소값을 받아
int nBet = 0;
while (nBet < 100 || nBet > money) // 정상적인 배팅이 이루어질 때 까지 무한 반복
{
cout << "금액을 배팅하시오.(100 ~ 배팅 보유 금액까지) : ";
cin >> nBet;
}
이렇게 Betting 금액이 0보다 작은지에 대해 체크하는데만 사용되는데
Play(stCards, &nMyMoney, &nCurrIndex, &isPlaying);
애초에 Play 함수 호출할때 nMyMoney를 &를 이용해서 주소값을 받아오네요!
1. Play() 호출시 &로 nMyMoney 의 주소값을 받아온다.
2. 받아온 nMyMoney의 주소값을 Play 함수 내에서 *로 Betting에 넘겨준다.
3. nMyMoney의 주소값을 넘겨받은 Betting에서 nMyMoney 메모리 주소에 있는 '값'이 0 보다 작은지 체크한다.
이게 맞나요?
안녕하세요 게임클래스 프로그래밍 강사 하민우 입니다.
[답변1]
구조체는 여러개의 데이터를 가지고 있는 그룹 입니다.
struct tagCard
{
char* szShape;
int nNumber;
};
위와 같은 구조체를 선언 했다면
모양 정보(문자열)와 정수값을 가지고 있는 것으로 해당 구조체로 52개 크기의 배열을 선언하면 각 인덱스별로 모양정보와 정수 값을 갖고 있게 되는 겁니다.
[답변2]
포인터로 선언하고 하지 않고는 프로그래머의 설계에 따른 선택이지 꼭 포인터이여야 한다 아닌다가 정해져 있지 않습니다.
[답변3]
int* money;
여기서 money 는 주소값을 가지고 있는 변수이며 *money 는 해당 주소 값이 가르키고 있는 정수 값 입니다.
int Betting(int money) 함수에서는 매개변수로 정수 값을 요구하고 있기 때문에 함수 호출시 정수값을 넘겨야하고
nBet = Betting(*money); 부분은 포인터 변수가 가르키고 있는 정수값을 넘기는 겁니다.
포인터에 대해서 정확히 이해가 되지 않는 경우 15강부터 다시 한번 복습하시고 해당 강의만으로 포인터에 대한 이해가 충분하지 않은 경우 구글, 네이버 등에 C++ 포인터 라고 검색하시면 쉽게 많은 자료를 찾아 보실 수 있습니다.
항상 열공하시고 또 궁금한게 있으시면 언제든지 질문 주시기 바랍니다.
게임 개발자가 되는 가장 빠른 길, 게임클래스!