[SW기초실습1] #Mission 2, Qt를 이용한 두더지 게임
*두더지 게임 전체설명
<!--[if !supportEmptyParas]--> <!--[endif]-->
label 두 개와 hbox 네 개를 vbox에 붙여, 첫 번째 label은 시간을 나타내고 네 개의 hbox는 두더지가 나올 버튼 16개가 만들어지고 마지막 label은 catch수가 나온다.
임의의 위치에 두더지가 나오는 방법은 버튼들을 배열에 넣고 인덱스값을 rand로 선택하게 만든다. 두더지가 나오면 3초만 유지가 되고 그 전에 눌러야 catch수가 올라간다. 두더지가 나오는 버튼과 내가 누른 버튼이 일치하면 catch++가 되고 “O”가 사라진다. “O"가 사라진 후에도 그 버튼을 누르면 catch++이 되는 문제를 막기위해 사용하지 않는 버튼을 하나 만들고 그 버튼을 배열 맨끝자리에 저장을 해준다. 그다음 두더지를 맞추었으면 인덱스번호를 사용하지 않는 버튼이 저장되어있는 맨끝자리의 인덱스의 번호로 바꾸어주면 ”O“가 사라진후에도 누르면 catch++이 되는 문제를 막을 수 있다. 맞추었거나 두더지가 3초 이상을 유지하였을 때는 다음 두더지의 차례를 위해 reset을 하는 함수를 만들어주었다. 두더지 게임 시간인 1분이 다 되었을 때는 첫 번째 label에 시간이 아닌 ”Done“을 출력하고 게임을 끝낸다.
-code
code |
설명 |
|
변수를 선언해준다. 버튼은 0~16까지 총 17개이고 버튼을저장하기 위한 배열을 button[16]을 만든다. 변수Done은 1분이 다지나가고 나서 label1에 “Done”을 출력해주기 위해서 사용된다. TIMEOUT은 1분인 60(초)로 선언해 준다. |
|
k는 배열의 인덱스이고 0~15까지를 랜덤으로 넣어준다.버튼들을 초기화 시켜주는 reset함수에서는 0~15까지의 버튼을 for문으로 초기화시켜준다. presentQuiz함수는 catch수를 마지막label에 출력해준다. |
|
버튼을 클릭했을 때 랜덤으로 나타나는 두더지 button[k]와 같을 때(두더지 버튼을 맞추었을 때) done은 시간이 다되었는지 확인하는 변수이고 시간 안에 두더지 버튼을 맞추면 먼저 reset함수로 초기화가 되고 catch++가 되고 catch를 출력하는 함수presentQuiz를 불러오고 catch중복체크를 막기 위해 k를 사용하지 않는 버튼번호 16으로 바꾸어준다. 시간이 다된 DONE=1일 경우 시간 label1에 “DONE”을 출력한다. |
|
sec%3==0(3초간격으로)&&remainingTime!=0(남아있는 시간이 있을 때) 초기화를 시키고 k를 랜덤으로 값을 넣어주고 그 버튼에 “O”를 표시한다. remainingTime이 0보다 크면 return 1로 계속 반복되게 하고 0이면 시간이 다 되었다고 변수 done과 DONE에 1을 넣어준다. |
|
rand중복을 막기위해서 srand(time(0))을 써준다. 1000msec(1초)마다 time_handler함수를 부른다. label1에 시작하는 시간 1:00을 출력하고 label1을 vbox맨 위에 올려준다. 버튼 총16개를 만들기 위해 hbox 4개를 만들어준다. |
|
버튼을 만들때 배열에 넣어주고 catch중복을 막기위해 만든 button[16]은 만들기만 한다. |
|
모든 hbox를 차례대로 vbox에 올려주고 마지막으로 catch수를 보여주기 위한 마지막label 'Catch'를 만들어주고 vbox위에 올려준다. 그다음 다 완성된 vbox를 window에 올려준다. |
-결과
|
시간은 1분부터 1초 단위로 줄어든다. 두더지는 랜덤으로 나타난다. |
|
랜덤으로 나타낸 두더지를 잡으면 catch가 올라가고 두더지를 잡으면 두더지가 사라진다. 다른 버튼을 눌렀을 때는 catch가 증가되지 않으며 두더지는 3초만 출연한다. |
|
1분이 지났을 때는 게임이 종료되고 Done이 표시가 된다. 더 이상 버튼을 눌러도 catch수는 유지된다. Done이 떴을 때 보여주는 catch 수는 1분 동안 잡은 총 두더지 수이다. |