메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

묻고 답하기
조회 수 7,628 추천 수 0 댓글 11
?

단축키

Prev이전 문서

Next다음 문서

위로 아래로 댓글로 가기 인쇄 쓰기 목록
?

단축키

Prev이전 문서

Next다음 문서

위로 아래로 댓글로 가기 인쇄 쓰기 목록
?
  • WhiteAT 2011.05.15 21:47

    테트리스 자료를 올린지 꽤 되어서 정확한 함수명은 기억나지 않지만,

    벽돌 생성하는 함수가 있을 겁니다. 아마도 NewBlock() 인듯한데, 거기에 x =1, y=5 정도의 값으로 셋팅되어 있습니다.

    그것을 원하시는 값으로 변경하시면 됩니다.~

     

    위로 쌓이게 하려면,

    타이머 증가할때마다 x 값을 감소하면 됩니다.~

  • C++왕초보 2011.05.15 23:22 글쓴이

    WhiteAT 님에게 달린 댓글

    답변 감사합니다.

     

    제가 벽돌을 위로 가게 하는 거랑, 두번째 벽돌생성 위치를 변경하는데는 성공했습니다.

     

    (On timer함수에 숫자 조정)

     

    그런데, 제일 처음에 생기는 벽돌 위치 조정하는 거랑. 보드판 만들때 구현되는 함수 잘 이해가 안가서

     

    질문 드립니다

     

    지금과 같은 경우라면, 보드판을 뒤집어서 생성해야 되는데, 보드판 함수를 아무리바도 이해가 잘 안갑니다.

  • WhiteAT 2011.05.16 07:46

    void CBoard::NewGame()

    void CBoard::NewGame()

    {

        int tempY;

        int tempX;

     

        for(tempY = 0;tempY<BOARD_Y_SIZE+1;tempY++){

            for(tempX=0; tempX<BOARD_X_SIZE+2; tempX++)

            {

                m_iBoard[tempY][tempX].m_iValue = 0;

            }

        }

     

     

        // 보드의 좌측 벽

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

            m_iBoard[i][0].m_iValue=50;

        }

     

        // 보드의 우측 벽

        for( i=0;i<BOARD_Y_SIZE;i++){

            m_iBoard[i][BOARD_X_SIZE+1].m_iValue=50;

        }

     

        // 보드의 하단 벽

        for( i=0;i<BOARD_X_SIZE+2;i++){

                m_iBoard[BOARD_Y_SIZE][i].m_iValue=50;

        }

     

     

        NewShape();

     

    }

     

     
     
     
     

     

    http://whiteat.com/zbxe/43113  의 NewGame() 함수가 새로운 게임 생성하는 함수 입니다.^^

  • C++왕초보 2011.05.17 23:54 글쓴이

    WhiteAT 님에게 달린 댓글

    아 답변은 감사한데, 제 질문과는 조금 다르네요..

     

    전 2007년도 버전을 보고 있는데...

     

    일단 제가 이해가 안되는 것은

      for(tempY = 0;tempY<BOARD_Y_SIZE+1;tempY++)
     {
       for(int tempX=0; tempX<BOARD_X_SIZE+2; tempX++)
      {
       if(0 != g_BoardInfo[tempY][tempX])
       {
         DrawOneBlock((BOARD_Y_POS+tempY),BOARD_X_POS+tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
     
        }
      }
      }

    이 함수에서 보면,

     

    y값을 0부터 BOARD_Y_SIZE까지 증가시키면서, 회색판을 그리는 건데,...

     

    그러면 제일 마지막에 한줄이 그려지는데

     

    지금 제가 궁금한것은

     

    제일 마지막줄이 제일 위에 그려지고, 밑에가 뚫려있는 그 보드를 그리는 함수가 필요합니다.

     

    그리고 난 뒤에, 벽을 그리는 함수(실제로 게임상에서 벽돌을 못들어가게 하는 함수)를 보려고 합니다.

     

    언제나 빠른 답변 감사합니다.

     

    아 추가적으로,

     

    void CWATTetrisView::OnPaint()
    {
     CPaintDC dc(this); // device context for painting
     
     CClientDC pDC(this); // 현재 화면의 정보를 얻음
     CPen penLine; // 사용할 pen 의 셋팅
     CPen *OldPen; // 기존에 사용하던 설정으로 복구할 변수
     penLine.CreatePen(0,3,RGB(0,0,0));
     OldPen = pDC.SelectObject((&penLine));
     
     //////////////////////////////////////////////////////////////////////////
     // 실제 출력될 내용

     for(int tempY=0;tempY<4;tempY++)
     {
      for(int tempX=0; tempX<4; tempX++)
      {
       if (0 != g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][tempY][tempX])
       {
        DrawOneBlock(BOARD_Y_POS + m_iNowBlockY+tempY,BOARD_X_POS + m_iNowBlockX+tempX,m_iOneBlockSize,&pDC,RGB(250,050,250));
       }
       else
       {
        // 벽돌이 아닌 곳을 회색으로 표시
    //    DrawOneBlock(BOARD_Y_POS + m_iNowBlockY+tempY, BOARD_X_POS+m_iNowBlockX+tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
       }
      }
     }
     //////////////////////////////////////////////////////////////////////////


      for(tempY = 0;tempY<BOARD_Y_SIZE+1;tempY++)
     {
       for(int tempX=0; tempX<BOARD_X_SIZE+2; tempX++)
      {
       if(0 != g_BoardInfo[tempY][tempX])
       {
         DrawOneBlock((BOARD_Y_POS+tempY),BOARD_X_POS+tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
     
        }
      }
      }

     

    이 함수대로 넣고 실행을하면, 제일 처음 벽돌이 생성되는 위치가 위에서 부터 생성이 되는데, 조절되게 하는 방법좀 부탁드립니다...

     

    최초에 시작되는 것만 수정하면 될것같던데..

     

    못찾겠어요...

  • WhiteAT 2011.05.18 13:58

    C++왕초보 님에게 달린 댓글

    조금만 더 보시면 아실거 같은데요.^^

     

    보드의 상단을 막으려면

    현재는 NewBoard() 에서 아래처럼 되어 있는데,

     

      // 보드의 하단 벽

        for( i=0;i<BOARD_X_SIZE+2;i++){

                m_iBoard[BOARD_Y_SIZE][i].m_iValue=50;

        }

     
    이렇게 바꾸면 되겠죠?

        for( i=0;i<BOARD_X_SIZE+2;i++){

                m_iBoard[0][i].m_iValue=50;

        }

     

     

     

     

    OnPaint() 는 현재 보드,벽돌의 상태를 다시 출력해줄 뿐입니다.^^

    앞에서도 답변 드렸었는데, 벽돌을 새로 만드는 함수에서 좌표를 지정하게 되어 있습니다.

    아마도 NewBlock() 인듯 하다고 말씀드렸습니다.^^

     

  • C++왕초보 2011.05.18 23:59 글쓴이

    WhiteAT 님에게 달린 댓글

    답변으로 하나는 해결했습니다.

     

    일단 처음 생성되는 것을 찾아보니까

     

    GAmeStart에 있는

    함수들이었네요...

     

    이런 허접한 질문을 한 제가 죄송할 정도로 너무 쉽게 풀려서

    ㅈㅅ합니다.

     

    그리고

    두번째로

     

    저는 보드판을 그리는 함수따로,

     

    실질적으로 벽으로 막는 함수 따로인줄 알았는데,

     

    그게 아니군요...

     

    아직도 ++을 이해하려면 에휴~~

    ㅠ.ㅠ

    답변은 언제나 감사합니다.

     

     

  • WhiteAT 2011.05.19 07:09

    C++왕초보 님에게 달린 댓글

    구조를 간단하게 설명드리면^^

     

    m_iBoard [][] 라는 변수에 보드의 정보를 넣습니다.

    여기에는 블럭이 쌓인 정보도 함께 있구요^^

    벽돌이 쌓일때마다 계속 변경이 되겠지요...

     

    그리고 보드 또는 벽돌을 그려주는 것은

    m_iBoard [][]를 보고 출력만 해주는 겁니다.^^

     

     

    m_iBoard 를 잘 활용해 보세요.~

     

     

  • C++왕초보 2011.05.27 15:54 글쓴이

    WhiteAT 님에게 달린 댓글

    오랜만에 다시 작업을 하네요..

     

    마무리를 지으려고 합니다.

     

    일단은 모든것이 완료 되었고, 이제 마지막으로 보드판에 저장하는것만 하면 되는데,(블록이 천장에 닿으면)

    그런데...

     

    이게 아예 막히네요..

     

    함수를 해석할수가 없어요...

     

    void CWATTetrisView::ChecknRemove()
    {
     // 벽돌을 보드에 저장하기
     for (int iTempBlockY = 0; iTempBlockY<4 && (m_iNowBlockY+iTempBlockY<BOARD_Y_SIZE); iTempBlockY++)
     {
      for (int iTempBlockX = 0;iTempBlockX<4;iTempBlockX++)
      {
       if(0 == g_BoardInfo[m_iNowBlockY+iTempBlockY][m_iNowBlockX+iTempBlockX] )
       {
        if( 0 !=g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][iTempBlockY][iTempBlockX])
        {
         g_BoardInfo[m_iNowBlockY+iTempBlockY][m_iNowBlockX+iTempBlockX] = g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][iTempBlockY][iTempBlockX];

        }
       }
      }
     }

     // 한줄 없애기
     BOOL bGoodOneLine = TRUE;
     for ( iTempBlockY = 0;iTempBlockY<4 && (m_iNowBlockY+iTempBlockY<BOARD_Y_SIZE);iTempBlockY++)
     {
      bGoodOneLine = TRUE;
      for (int iTempBlockX = 0;iTempBlockX<BOARD_X_SIZE+2;iTempBlockX++)
      {
       if(0 == g_BoardInfo[m_iNowBlockY+iTempBlockY][iTempBlockX] ){ // 한칸이라도 빈칸이 있으면.
        bGoodOneLine = FALSE;
        iTempBlockX = BOARD_X_SIZE + 2;
       }

      }
      if(TRUE == bGoodOneLine){
       int iRemoveLineNum = m_iNowBlockY+iTempBlockY;
       for(int i=iRemoveLineNum ; i>0 ; i--){
        for(int j=1;j<BOARD_X_SIZE+2;j++){
         g_BoardInfo[i][j] =g_BoardInfo[i-1][j] ;
        }
       }
      }
     }


     if(IsGameEnd()){
      KillTimer(1);
      if(IDYES == MessageBox("한판 더 해","게임이 끝났습니다.",MB_YESNOCANCEL)){
       GameStart();
      }

     }
    }

    BOOL CWATTetrisView::IsGameEnd(){
      for(int tempY = 15;tempY>13 ;tempY--){
       for(int tempX=3; tempX<7; tempX++)
      {
       if(0 != g_BoardInfo[tempY][tempX])
       {
        return TRUE;
        }
      }
      }

     return FALSE;

    이 함수 자체가 해석이 안되는데, 해석좀 도와주시고,

    마지막으로 제일 윗 천장부터 시작해서 저장이 될수 있도록 도와주세요...

     

    제가 프로그램을 건드려 보면서 한거는 g_boradinfo라는 것을 건드리면 될것 같던데...

    중요한건

    이 프로그램에서 게임이 끝났는지 체크하는 함수에서


    BOOL CWATTetrisView::IsGameEnd(){
      for(int tempY = 15;tempY>13 ;tempY--){
       for(int tempX=3; tempX<7; tempX++)
      {
       if(0 != g_BoardInfo[tempY][tempX]){
        return TRUE;
        }
      }
      }

     return FALSE;
    }

    이런식으로 상수를 바꾸어서 주면,

    블럭이 전체적으로 쌓이는 것이 아니라. 원래 다음벽돌에 닿으면 바로 쌓여야 되는데, 그렇지 못하고 원래 쌓인 블럭 안으로 들어가서  쌓여버리는 현상이 나타납니다..

     

    뭐가 문젠지... 이해가 잘 안가서..

    도와주십시오

  • WhiteAT 2011.05.30 07:00

    C++왕초보 님에게 달린 댓글

    위에 함수 해석을 다 해드릴수는 없구요;;

    모르는 부부만 체크해 주세요^^

     

    IsGameEnd 함수는 게임이 끝났나 체크만 하는 함수입니다.~~

    10000번 체크해도 보드 상태는 변경되지 않습니다.^^

     

    IsGameEnd 함수를 변경하시면

    게임 종료 체크가 비정상으로 될수 있을겁니다.

     

  • C++왕초보 2011.06.03 01:23 글쓴이

    WhiteAT 님에게 달린 댓글

    아 결국은 프로그램을 완성했네요.. 감사합니다....~!

  • WhiteAT 2011.06.03 10:35

    C++왕초보 님에게 달린 댓글

    잘 해결되셔서 다행입니다.~~

     


List of Articles
번호 분류 제목 날짜
116 전기,전자,펌웨어 baud rate 질문 드립니다.ㅜ 2 2010.12.21
115 일반 실행 질문이요 3 2011.01.28
114 일반 [프로그램 추가/삭제] 리스트 추가 요청입니다. 1 2011.02.06
113 전기,전자,펌웨어 마이컴으로 RS485 통신 구현하는 C프로그램 1 2011.02.08
112 일반 [시작 프로그램]추가요청드려요 1 2011.03.06
111 일반 whiteat 잘쓰고 있었는데 갑자기 안되요 1 file 2011.03.12
110 일반 비밀글 입니다. 1 secret 2011.03.29
109 전기,전자,펌웨어 orcad ic 질문이요 1 2011.03.29
108 전기,전자,펌웨어 비밀글 입니다. 4 secret 2011.04.06
107 일반 인터넷 실행이 안되요 1 2011.04.10
106 프로그래밍 비밀글 입니다. 1 secret 2011.04.18
105 프로그래밍 비밀글 입니다. 1 secret 2011.05.11
104 전기,전자,펌웨어 비밀글 입니다. 3 secret 2011.05.14
» 프로그래밍 MFC 테트리스 만드는것 질문 11 2011.05.15
102 전기,전자,펌웨어 AVR를 이용한 센서값을 LCD와 터미털프로그램에 값 전송하기 3 2011.05.15
목록
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 Next
/ 11