Visual C++ 을 이용한 TETRIS 구현
본 자료는 6페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
해당 자료는 6페이지 까지만 미리보기를 제공합니다.
6페이지 이후부터 다운로드 후 확인할 수 있습니다.

소개글

Visual C++ 을 이용한 TETRIS 구현에 대한 보고서 자료입니다.

본문내용

다. 이것은ResourceView에 Bitmap을 insert하여 색깔블록(IDB_BITMAP1)과 흰색블록(IDB_BITMAP2)을 만들도록 한다.
(블록의 가로, 세로의 길이는 각각 20으로 한다.)
흰색블록과 색블록 두 가지의 블록을 표현하기 위해서는 이것들을 저장할 저장 장소가 필요하다. 서로 다른 블록들이 한곳에 저장 될 때에는 당연히 에러가 발생한다. 그래서 여기서 각각 저장될 수 있도록 구현을 하겠다. (윈도우 화면이 생성됨과 동시에 선언해주어야 하므로 OnCreat()함수에서 구현한다.)
★OnCreat() 함수의 생성
★ OnCreat() 함수의 내부구현
비주얼 C++에는 그래픽에 관련된 모든 옵션을 한군데에 모아 놓은 DC(Device Context)라는 구조체가 있다. 즉, MFC에서 그래픽 함수는 모두 CDC 클래스의 멤버로 들어가 있다.
위에서 블록을 화면에 보여주기 위해 두 개의 Bitmap을 만들었다. Bitmap을 출력하기위해서는 다른 그래픽 함수들과는 달리 두 개의 DC가 필요하다.
@ 비트맵이 출력될 화면 윈도우의 DC
@ 그냥 메모리에 만들어질 DC
비트맵 블록을 전송 받은 DC에 비트맵이 출력되므로, 비트맵을 화면에 출력하고자한다면 화면의 윈도우로부터 얻어진 DC를 사용해야한다.
화면 DC와 메모리 DC가 서로 호환성을 같기 위해 CreateCompatibleDC 사용(컬러모드를 동일하게 해줌)
우리가 Resource에 만든 비트맵 데이터를 읽어올 때는 CBitmap클래스의 LoadBitmap함수를 사용
읽어온 비트맵을 DC에 선택할 때 SelectObject 함수를 사용
★OnDraw() 함수의 구현
여기에는 블록이 떨어지며 게임이 진행될 곳과 다음 블록을 보여줄 곳(m_Field[][]), 테트리스의 게임정보, 마지막으로 점수가 보여 질 곳이 포함된다.
블록이 떨어질 m_Field[][]를 배열로 선언한다. (블록의 삭제 및 블록의 상태등과 작업을 수행함에 있어 필요함)
제일 처음 화면에 뿌려져야할 것이므로 OnDraw()에 구현한다.
// m_Field[14][24]로 View에 선언한다.
실제로 블록이 떨어질 부분은 노란색부분이므로 노란부분의 테두리를 아래와 같이 벽으로 처리한다.
그러므로 실제 블록이 움직이는 범위는 m_Field[1][0]~m_Field[12][22]이다.
BitBlt(int x, int y, int nWidth, int nHeight, CDC *pStrDC, int xSrc, int ySrc, DWORD dwRop);
@ x, y : 화면에 출력될 x, y 좌표
@ nWidth, nHeight : 화면에 출력할 그림의 폭과 높이
@ pSrcDC : 비트맵 블록을 전송할 소스 DC의 포인터
@ xSrc, ySrc : 소스 비트맵에서 전송을 시작할 x, y 좌표
@ dwRop : 래스터 오퍼레이션 코드
-- 래스터 오퍼레이션 코드 SRCCOPY는 가장 흔히 사용되는 래스터 오퍼레이션 코드로, 기존의 화면의 내용을 무시하고 새로 그려질 비트맵을 덮어 그리라는 코드이다.
★ OnMenuStart() 함수의 구현
시작 버튼을 누르면 위와 같이 m_Field의 테두리가 파란 블록으로 변경된다.
또한 선언된 모든 변수를 초기화한다.
★ Block(int flag) 함수의 구현
★ MoveDown() 함수의 구현
★ OnTimer() 함수의 구현
★ CheckArround(int, int) 함수의 구현
★ CheckFull() 함수의 구현
void CTETRISView::CheckFull()
{
int check, check1;
int i, j, k, l=0;
for(i = 0; i < 4; i++) // m_Field의 배열을 색블록으로 다 채운다
{
m_Field[m_NowX+pattern[m_NowBlock][m_NowRotate*8+i*2]]
[m_NowY+pattern[m_NowBlock][m_NowRotate*8+i*2+1]] = 1;
}
check1 = 0;
for(i = 22; i >= 0; i--) // 위에서부터..
{
check = 0;
for(j = 1; j < 13; j++) //오른쪽에서 왼쪽으로..
{
if(m_Field[j][i] == 0) // m_Field배열에 아무것도 없으면 check = 1
check = 1;
}
if(check == 0) // m_Field 배열이 색블록이면 check 1 = 1
{
l++;
check1 = 1;
for(k = i-1; k > 0; k--) // k변수에 아래부분의 배열부터 차례로..
{
for(j = 1; j < 13; j++) // m_Field배열 오른쪽에서 왼쪽으로..
{
m_Field[j][k+1] = m_Field[j][k]; // m_Field 배열의 아래부분이
// 색블럭이면
// 그 위부분에 블록을 내린다.
}
}
i++; // 한칸씩 아래로 내렸기때문에 그 줄을 다시한번 검사해야함..
}
}
if(check1 == 0) // check1 이 0이면 이문을 빠져나옴..
return;
switch(l)
{
case 1 : m_Score = m_Score + (l*10); // 1줄 삭제 : 10점씩 증가
break;
case 2: m_Score = m_Score + (l*20); // 2줄 삭제 : 40점씩 증가
break;
case 3: m_Score = m_Score + (l*30); // 3줄 삭제 : 90점씩 증가
break;
case 4: m_Score = m_Score + (l*40); // 4줄 삭제 :160점씩 증가
break;
default:
break;
}
if((m_Score%1000) == 0) // m_Score가 100증가할때마다 m_Speed -20;
m_Speed -= 20;
SetTimer(1, m_Speed, NULL);
Invalidate(); // OnDraw에서 다시 그린다.
}
★ MakeNewBlock() 함수의 구현
★ OnKeyDown() 함수의 구현
★ PrintScore() 함수의 구현
★ PrintNextBlock() 함수의 구현
★ OnDestroy() 함수의 구현

키워드

  • 가격10,000
  • 페이지수18페이지
  • 등록일2006.08.21
  • 저작시기2006.01
  • 파일형식한글(hwp)
  • 자료번호#334811
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니