C++/빙고 게임 제작

C++ 빙고 게임 제작 : 빙고 데이터 입력

시플마 2024. 6. 12. 09:11

Menu 함수가 호출되고 나면

객체 selectedGameMode의 멤버 변수의 값들이

모두 설정이 되었을 겁니다. 



만약 플레이어가 동물 카테고리를 선택하였다면 

selectedGameMode의 멤버 Mode의 값은 GMAE_MODE_WORD로,

멤버 Category의 값은 GAME_CATEGORY_ANIMAL로 초기화되었을 겁니다.

 

이 경우 23번째 줄에 있는 if 문 안의 코드가 실행되겠죠.

 

이후 cBingoTable형 객체 AnimalBingo_player를 만듭니다.

IS_PLAYER라는 enum class에 있는 PLAYER를 통해 초기화해 주면

해당 빙고 테이블은 플레이어의 빙고 테이블임을 의미하게 됩니다.

 

 

cBingoTable의 멤버 변수를 살펴 봅시다.

 

tBingoInfo형 객체 m_pBingoInfo가 존재하는데

3 x 3 사이즈의 이차원 배열로 구성되었습니다.

 

한 칸 한 칸이 tBingoInfo형으로 이루어져 있는 것이죠.

 

이차원 배열인 m_pBingoInfo에 플레이어가 입력한

데이터를 저장할 것입니다. 

 

m_BingoSize는 빙고 테이블 한 줄에 존재하는 칸의 개수를 의미합니다.

해당 멤버의 값이 승리 조건을 결정합니다.

 

m_BingoCount는 현재 빙고 테이블에서 완성된 빙고의 개수입니다.

이 멤버의 값이 m_BingoSize  값과 같거나 클 때 승리하게 되죠.

 

m_IsPlayer는 해당 빙고 테이블이 플레이어의 것인지, CPU의 것인지

구분하기 위해 존재하는 멤버입니다.

해당 값이 true면 플레이어의 빙고 테이블인 것이죠.

 

 

멤버 m_pBingoInfo의 자료형인 tBingoInfo에 대해 조금 더 알아보자면, 

 

tBingoInfo은 구조체입니다.

 

빙고 테이블의 각 칸마다 데이터를 저장하는 멤버 bingoData가 있고 

빙고 칸의 좌푯값과 해당 빙고 칸이 오픈(선택) 여부를 나타내는

멤버가 존재합니다.

 

 

 


 

 

다시 main 함수로 돌아와서 보시면 28번째 줄에

OutputFrameVisual 함수가 호출되는 것이 보입니다.

 

cBingoTable형으로 이루어진 객체라면 호출할 수 있는 멤버 함수입니다.

 

93번째 줄을 통해 OutputFrameVisual 함수를 호출한 

객체의 멤버 m_IsPlayer의 값이 true면, 즉 플레이어의 빙고 테이블이라면

콘솔에 동그라미로 이루어진 빙고 테이블이 출력되고, 

 

CPU의 빙고 테이블이라면 달러 표시로 이루어진

빙고 테이블이 출력됩니다.

 

 

main 함수의 29번째 줄에서는 InputBingoData 함수가 

호출되고 있습니다.

 

만약 InputBingoData 함수를 호출한 빙고 테이블이 

플레이어의 빙고 테이블이라면 우선 좌표 (10, 5)로 커서를 이동합니다.

 

그리고 빙고 테이블의 [0][0] 칸의 좌푯값부터 초기화해 줍니다.

위 코드에서 알 수 있듯이 [0][0] 칸의 좌푯값은 10, 5겠죠.

 

그리고 wstring형 객체 Data를 선언합니다. 

해당 변수에 플레이어가 입력하는 데이터를 저장하였다가

함수를 통해 각종 조건을 체크한 후 문제가 없는 데이터라면

본격적으로 빙고 테이블의 각 칸에 해당 데이터를 삽입할 겁니다.

 

293번째 줄에 있는 while 문에서 DisallowInsert_inputData 함수와 

IsDuplicated_inputData 함수 둘 중 하나라도 true면

while 문 안의 코드가 실행될 겁니다.

 

우선 InputBingoData 함수를 호출할 때 인자로 받은

tGameMode형 레퍼런스 _type의 멤버 Mode와 Data를

다시 인자로 넘겨 DisallowInsert_inputData 함수를 호출합니다.

 

DisallowInsert_inputData 함수의 내용을 살펴 보면

현재 게임 모드가 단어이면 170번째 if 문 안의 코드가 실행됩니다.

인자로 받은 data의 멤버 함수 length를 호출하여 data의 

길이를 얻어냅니다. 이때 data의 길이가 5 초과일 때 반환값을 true로 합니다.

 

data의 길이가 정상적으로 다섯 글자 이하라면 공백인지, 

한글이 아닌지 체크합니다. 공백이거나 한글이 아니라면 반환값을 true로 합니다.

 

위 조건을 따져 보았을 때 단어 모드는 다섯 글자 이하의 한글 단어만 입력이 가능합니다.

 

 

만약 게임 모드가 숫자라면 

 

data의 길이가 2를 초과한 경우 true를 반환합니다.

 

data의 길이가 2일 때, 즉 두 자리 숫자라면(209번째 줄)

두 번째 자릿수의 문자가 0 ~ 9에 해당하는지 체크합니다. (214번째 줄)

해당하지 않는다면 true를 반환하죠.

 

그리고 첫 번째 자릿수에 있는 문자가 1 ~ 9에 해당하는지 체크합니다. ( 221번째 줄 )

해당하지 않는다면 true를 반환하죠.

 

위 조건을 따져 보았을 때 숫자 모드는 0 ~ 99에 해당하는 숫자만 입력이 가능합니다.

 

 

 


 

 

 

다시 InputBingoData 함수로 돌아와서 DisallowInsert_inputData 함수가

true를 반환하면 293번째 줄에 있는 while 문 안의 코드가 실행될 겁니다. 

(처음 데이터를 입력하는 경우에도 Data의 값은 NULL이므로

DisallowInsert_inputData 함수는 true를 반환하게 되며 while 문 안의 코드가 실행될 겁니다.)

 

이 경우 플레이어는 해당 빙고 칸의 좌푯값으로 커서를 이동하고 데이터를 입력합니다.

 

이때 입력한 데이터가 정상적인 데이터인지 300번째 줄에 있는

DisallowInsert_inputData 함수를 통해 체크하게 되는데 해당 함수가 true를 반환한다면,

즉 입력한 데이터가 정상적인 데이터가 아니라면 게임 모드가 단어인 경우와 숫자인 경우,

서로 다른 경고 메시지를 출력하게 됩니다. 이 역할을 해 주는 것이 WarningText 함수이죠.

 

WarningText 함수는

 

메시지를 출력할 곳으로 커서를 이동시키고, 

(미리 객체 textOutputPos를 외부 변수로 선언하여

메시지를 출력하고자 하는 위치의 x 좌푯값과 y 좌푯값을 저장하였습니다.)

인자로 받은 메시지를 빨간 배경색으로 하여 출력합니다. 

 

 

 

이후 해당 메시지를 다시 지웁니다.

 

경고 메시지를 출력하는 단계가 플레이어가 데이터를 입력하는 과정이라면 (265번째 줄)

Rearrange 함수를 호출합니다. 

 

Rearrange 함수는 빙고를 구성하는 프레임을 다시 출력하고 

 

 

이전에 입력한 데이터가 있을지 모르니 OutputBingoData 함수를 호출하여

 

하나씩 빙고 칸에 접근하여 각 빙고 칸에 해당하는

위치에 커서를 놓고 콘솔상에 데이터를 출력해 줍니다.

 

Rearrange 함수를 통해 빙고 프레임과 데이터를 재출력해 주는 이유는

플레이어가 데이터를 입력하는 과정에서 길게 무언가를 입력하거나

엔터를 누르는 과정에서 콘솔상에 출력된 빙고 프레임이 망가질 수 있기 때문입니다.

 

 


 

 

 

다시 InputBingoData 함수로 돌아와서 293번째 while 문에는

IsDuplicated_inputData 함수도 조건으로 포함되어 있습니다.

 

플레이어가 입력하려는 데이터의 존재 여부를 체크하는 함수이죠.

각 빙고 칸에 존재하는 데이터와 입력하려는 데이터를 하나씩 비교하면서

같은 데이터가 존재한다면 true를 반환하죠.

 

입력하려는 데이터가 이미 존재하여 true를 반환하게 되면 

311번째 줄에 있는 else if 문으로 인해 경고 메시지가 출력될 겁니다.

 

 

플레이어가 빙고 칸에 데이터를 입력할 때마다 조건에 부합하는 데이터인지, 

중복 데이터는 아닌지 체크할 겁니다. 삽입 가능한 데이터라고 판단이 되면

while 문을 빠져나와 해당 빙고 칸에 데이터를 삽입합니다.

 

 

 


 

 

 

 

CPU의 빙고 테이블의 경우, 플레이어가 직접 입력하는 것이 아니고

 

이미 존재하는 메모장 파일의 데이터를 읽어 CPU의 빙고 테이블을 구성합니다.

 

게임 카테고리에 따라 다른 파일을 읽어 CPU의 빙고 테이블을 구성합니다.

 

변수 fileName에 현재 게임 카테고리에 따라 다른 파일의 이름을 저장합니다.

 

현재 게임 카테고리가 동물이라면 346번째 줄에 있는

wifstream형 객체 fin을 통해 아래 파일을 읽어 오겠군요.

 

 

만약 게임 카테고리가 동물인데 "cpuBingoData_animal"이라는 

파일이 존재하지 않아 읽어 올 수 없다면 349번째 줄에 있는 

if 문에 의하여 메시지를 출력하고 프로그램이 종료됩니다.

 

 

읽어 올 수 있는 파일이 존재한다면

 

369번째 줄에 있는 구문을 통해 CPU의 빙고 칸에 하나씩, 읽어 온 데이터를 삽입합니다.

 

 

CPU 빙고 테이블은 기본적으로 오픈 전에는 '?'를 통해 가려져 있습니다.