기존에 만들었던 <짝맞추기 게임>에 기능을 추가해봅시다.


 힌트를 세번 주는 기능을 추가해봅시다. 우선 횟수를 보여주는 버튼을 만듭니다. 

 void CExamCardDlg::OnBnClickedHintBtn()

{

int num = GetDlgItemInt(IDC_HINT_BTN);

if (num > 0){

num--;

SetDlgItemInt(IDC_HINT_BTN, num);

}

}

 어떤 컨트롤에 씌여진 문자를 정수값으로 가져올 수 있는 함수가 GetDlgItemInt입니다. 힌트버튼에 있는 캡션 값을 정수값으로 받아와 그 값이 0보다 큰지 체크를 해줍니다. 그리고 한번 클릭할때마다 -1되도록 수정합니다. GetDlgItemIne의 반대는 SetDlgItemInt입니다.


 그리고 버튼을 클릭했을 시 앞면을 다시 보여주도록 코드를 추가합니다.

void CPairTestDlg::OnBnClickedHintBtn()

{

int num = GetDlgItemInt(IDC_HINT_BTN);

if (num > 0){

num--;

SetDlgItemInt(IDC_HINT_BTN, num);


m_is_visible = 1;//앞면

Invalidate();


m_mouse_disable = 1;//마우스 클릭 못하도록

SetTimer(1, 3000, NULL);

}

}



 Progress Control을 통해 시간 제한을 주고 잘못된 답을 선택하면 시간감소를 정답을 맞추면 추가적으로 시간을 주는 기능을 만들어봅시다.

 Progress Control은 여러가지 기능이 많아서 복잡하고 다양한 함수가 필요합니다. 따라서 함수를 각각 선언해 사용하기 보다는 CProgressCtrl 이 클래스를 활용해 Progress와 연결합니다.

[클래스마법사]->[멤버변수]->[IDC_REMAIN_TIME_PROGRESS]->변수 추가

변수 이름에 내가 쓰고 싶은 변수이름을 쓰고 추가해줍니다(m_remain_time_prgress)

 헤더 파일에 가면 CProgressCtrl m_remain_time_progress;가 추가되어있는 것을 확인할 수 있습니다.



OnInitDialog에 가서 타이머 만들기 전에 루틴을 하나 넣어줍니다.

m_remain_time_progress.SetRange(0,180);//해당 프로그레스 컨트롤에 범위를 설정하는 것 ,3분동안 설정함

m_reamin_time_progress.SetPos(180);//현재값을 설정

progress bar가 꽉차있다가 줄어들도록 하기 위해서 현재값을 180로 합니다.


SetTimer(1,3000,NULL);

SetTimer(10,1000,NULL);//10번아이디타이머, 10초마다 wm_time 메세지


OnTimer에 가서 10번 타이머의 경우를 추가해줍니다.

else if(nIDEvent == 10){

int pos = m_remain_time_progress.GetPos();//현재 프로그레스가 어디 위치에 있는지 얼마값을 갖고 있는지

if(pos > 0){

  m_remain_time_progress.SetPos(pos-1); //1초마다 계속 들어와야하기 때문에 killtime하지 않는다.

}

}


게임이 끝났을 때의 설정을 해줍니다.

else{

killTimer(10);

MessageBox(L“게임에 지셨습니다!”, L“Game Over!!”,MB_ICONSTOP);

...



 사용자가 답을 맞췄을 때 시간을 좀 더 주고 반대의 경우 감소하도록 기능을 추가해봅시다. 

lButtonDown을 수정합니다.

else{

if (m_first_select_index != index){

int pos = m_remain_time_progress.GetPos();


if (m_card_table[m_first_select_index] == m_card_table[index]){

m_card_table[m_first_select_index] = -1;

m_card_table[index] = -1;

m_remain_time_progress.SetPos(pos + 5);

}

else{

if (pos - 3 < 0) m_remain_time_progress.SetPos(0);

//progress 자기 범위를 넘어간 값을 저장하기 않기 때문에 이렇게 하지 않아도 된다

else m_remain_time_progress.SetPos(pos - 5);

}

m_first_select_index = -1;

m_mouse_disable = 1;

SetTimer(2, 1000, NULL);

}


 재시작 기능을 추가해봅시다. 우선 버튼을 하나 추가합니다.

 OnInitDialog 코드를 가져와 수정합니다

void CPairTestDlg::OnBnClickedRestartBtn()

{

if (IDCANCEL == MessageBox(L"게임을 재시작하겠습니까?", L"체크!!", MB_ICONQUESTION | MB_OKCANCEL)) return;

//잘못클릭할 경우 재시작 방지 위한 메세지 박스 추가


KillTimer(2);//게임 도중 재시작 하면 오동작 할 수 있으므로 타이머를 죽인다.


m_is_visible = 1;

m_first_select_index = -1;

m_mouse_disable = 1;


for (int i = 0; i < MAX_CARD_TABLE; i++){

m_card_table[i] = i % (MAX_CARD_TABLE / 2);

}


srand((unsigned int)time(NULL));

char first_index, second_index, temp;


for (int i = 0; i < 100; i++){

first_index = rand() % MAX_CARD_TABLE;

second_index = rand() % MAX_CARD_TABLE;


temp = m_card_table[first_index];

m_card_table[first_index] = m_card_table[second_index];

m_card_table[second_index] = temp;

}



m_remain_time_progress.SetRange(0, 180);

m_remain_time_progress.SetPos(180);



SetTimer(1, 3000, NULL);//3초뒤 wm_timer메세지가 발생

SetTimer(10, 1000, NULL);


Invalidate();//갱신 메세지 추가

}

 중간에 비트맵 긁어오는 코드는 빼주어야합니다.



재시작을 누르면 확인창이 뜹니다.

+ Recent posts